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

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">
<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$/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$/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>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />

View File

@ -96,6 +96,10 @@ class DockPanel(QWidget):
def reset_parent_res(self, 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):
drag_trans = QDrag(self)
mine_data = QMimeData()
@ -111,6 +115,9 @@ class DockPanel(QWidget):
def sync_status(self):
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__":
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.QtGui import QPainter, QColor, QDragEnterEvent, QDropEvent
import re
@ -18,6 +18,7 @@ class AcceptPanel(QWidget):
self.setAcceptDrops(True)
self.mgr_inst = mgr
self.target_anchor :QWidget = None
def resizeEvent(self, a0):
total_rect = self.rect()
@ -32,6 +33,7 @@ class AcceptPanel(QWidget):
def async_with(self, target_view: QWidget):
self.resize(target_view.size())
self.target_anchor = target_view
def paintEvent(self, a0):
super(AcceptPanel, self).paintEvent(a0)
@ -79,8 +81,26 @@ class AcceptPanel(QWidget):
if result:
view_id = result.group(1)
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)
print(adjust_view)
class DragManager(QObject):
__unique_inst: 'DragManager' = None

View File

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

Binary file not shown.