拖拽释放前的移除操作完成了

This commit is contained in:
玉宇清音 2023-12-30 21:46:14 +08:00
parent 1bd5fd9a29
commit c878240d9e
6 changed files with 54 additions and 7 deletions

View File

@ -6,8 +6,9 @@
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="55c45e43-6fd9-4244-902d-86f83a348f5b" name="Changes" comment=""> <list default="true" id="55c45e43-6fd9-4244-902d-86f83a348f5b" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/DockPanel.py" beforeDir="false" afterPath="$PROJECT_DIR$/DockPanel.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Manager.py" beforeDir="false" afterPath="$PROJECT_DIR$/Manager.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Manager.py" beforeDir="false" afterPath="$PROJECT_DIR$/Manager.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/test.py" beforeDir="false" afterPath="$PROJECT_DIR$/test.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/SplitPanel.py" beforeDir="false" afterPath="$PROJECT_DIR$/SplitPanel.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />

View File

@ -96,6 +96,10 @@ class DockPanel(QWidget):
def reset_parent_res(self, pinst): def reset_parent_res(self, pinst):
self.parent_res = pinst self.parent_res = pinst
def setParent(self, a0):
self.drag_header.setParent(self)
super(DockPanel, self).setParent(a0)
def __adjust_accept(self, view: QWidget, pt: QPoint): def __adjust_accept(self, view: QWidget, pt: QPoint):
drag_trans = QDrag(self) drag_trans = QDrag(self)
mine_data = QMimeData() mine_data = QMimeData()
@ -111,6 +115,9 @@ class DockPanel(QWidget):
def sync_status(self): def sync_status(self):
self.drag_header.setVisible(self.default_header) self.drag_header.setVisible(self.default_header)
def paintEvent(self, a0):
super(DockPanel, self).paintEvent(a0)
print(self.windowTitle() + "::" + str(self.isVisible()))
if __name__ == "__main__": if __name__ == "__main__":
app=QApplication([]) app=QApplication([])

View File

@ -1,4 +1,4 @@
from PyQt5.QtWidgets import QWidget, QApplication from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow
from PyQt5.QtCore import QObject, QEvent, QRect, QMargins, Qt, QMimeData from PyQt5.QtCore import QObject, QEvent, QRect, QMargins, Qt, QMimeData
from PyQt5.QtGui import QPainter, QColor, QDragEnterEvent, QDropEvent from PyQt5.QtGui import QPainter, QColor, QDragEnterEvent, QDropEvent
import re import re
@ -18,6 +18,7 @@ class AcceptPanel(QWidget):
self.setAcceptDrops(True) self.setAcceptDrops(True)
self.mgr_inst = mgr self.mgr_inst = mgr
self.target_anchor :QWidget = None
def resizeEvent(self, a0): def resizeEvent(self, a0):
total_rect = self.rect() total_rect = self.rect()
@ -32,6 +33,7 @@ class AcceptPanel(QWidget):
def async_with(self, target_view: QWidget): def async_with(self, target_view: QWidget):
self.resize(target_view.size()) self.resize(target_view.size())
self.target_anchor = target_view
def paintEvent(self, a0): def paintEvent(self, a0):
super(AcceptPanel, self).paintEvent(a0) super(AcceptPanel, self).paintEvent(a0)
@ -79,8 +81,26 @@ class AcceptPanel(QWidget):
if result: if result:
view_id = result.group(1) view_id = result.group(1)
adjust_view = self.mgr_inst.get_dockpanel(view_id) adjust_view = self.mgr_inst.get_dockpanel(view_id)
target_view = self.target_anchor
# 移除源视图
parent_frame_rm = adjust_view.parent_res
self_siblings = parent_frame_rm.child()
if parent_frame_rm.parent_res is None:
main_window:QMainWindow = parent_frame_rm.parent()
views = [self_siblings[0], self_siblings[1]]
views.pop(views.index(adjust_view))
main_window.setCentralWidget(views[0])
else:
pparent_frame = parent_frame_rm.parent_res
if self_siblings[0] == adjust_view:
pparent_frame.replace_view(self_siblings[1], parent_frame_rm)
else:
pparent_frame.replace_view(self_siblings[0], parent_frame_rm)
self.setVisible(False) self.setVisible(False)
print(adjust_view)
class DragManager(QObject): class DragManager(QObject):
__unique_inst: 'DragManager' = None __unique_inst: 'DragManager' = None

View File

@ -35,15 +35,19 @@ class DragSplitter(QFrame):
class SplitPanel(QWidget): class SplitPanel(QWidget):
def __init__(self, a: DockPanel, b: DockPanel, split: SplitType, parent:QWidget = None): def __init__(self, a: DockPanel, b: DockPanel, split: SplitType, parent:'SplitPanel' = None):
super(SplitPanel, self).__init__(parent) super(SplitPanel, self).__init__(parent)
self.splitter_widget = DragSplitter(split, self) self.splitter_widget = DragSplitter(split, self)
self.splitter_widget.adjustSignal[QPoint].connect(self.__splitter_adjust) self.splitter_widget.adjustSignal[QPoint].connect(self.__splitter_adjust)
self.parent_res = parent
self.split_member = (a, b) self.split_member = (a, b)
self.split_member[0].setParent(self) self.split_member[0].setParent(self)
self.split_member[0].parent_res = self
self.split_member[1].setParent(self) self.split_member[1].setParent(self)
self.split_member[1].parent_res = self
self.split_info = (split, 0.5, 7) self.split_info = (split, 0.5, 7)
self.sync_status() self.sync_status()
@ -78,8 +82,18 @@ class SplitPanel(QWidget):
handle_rect = QRect(0, int(height_a), self.width(), int(self.split_info[2])) handle_rect = QRect(0, int(height_a), self.width(), int(self.split_info[2]))
self.splitter_widget.setGeometry(handle_rect) self.splitter_widget.setGeometry(handle_rect)
self.split_member[0].setVisible(True)
self.split_member[1].setVisible(True)
pass pass
def paintEvent(self, a0):
super(SplitPanel, self).paintEvent(a0)
print(self.split_member[0].windowTitle() + "\\" + self.split_member[1].windowTitle())
def child(self):
return self.split_member[0], self.split_member[1], self.split_info[0]
def resizeEvent(self, a0): def resizeEvent(self, a0):
super().resizeEvent(a0) super().resizeEvent(a0)
self.sync_status() self.sync_status()
@ -100,11 +114,14 @@ class SplitPanel(QWidget):
def replace_view(self, new: DockPanel, old: DockPanel): def replace_view(self, new: DockPanel, old: DockPanel):
if old in self.__view_list() and new not in self.__view_list(): if old in self.__view_list() and new not in self.__view_list():
if self.split_member[0] == old: if self.split_member[0] == old:
self.split_member = (new, self.split_member[1], self.split_member[2]) self.split_member = (new, self.split_member[1])
else: else:
self.split_member = (self.split_member[0], new, self.split_member[2]) self.split_member = (self.split_member[0], new)
new.parent_res = self
new.setParent(self)
old.setParent(None) old.setParent(None)
self.sync_status() self.sync_status()
self.update()
pass pass
@ -115,8 +132,10 @@ if __name__ == "__main__":
a = DockPanel("docka", None, None) a = DockPanel("docka", None, None)
b = DockPanel("dockb", None, None) b = DockPanel("dockb", None, None)
c = DockPanel("dockc", None, None)
win = SplitPanel(a, b, SplitType.SPLIT_H) win = SplitPanel(a, b, SplitType.SPLIT_H)
ow.setCentralWidget(win) wino = SplitPanel(win, c, SplitType.SPLIT_V)
ow.setCentralWidget(wino)
ow.show() ow.show()
app.exec() app.exec()

Binary file not shown.