From f7223984aa5f989008c1e52c022dc56e24ccff6b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=89=E5=AE=87=E6=B8=85=E9=9F=B3?= <2422523675@qq.com>
Date: Sun, 31 Dec 2023 10:53:10 +0800
Subject: [PATCH] =?UTF-8?q?=E6=90=BA=E5=B8=A6bug=E7=9A=84=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD=E5=AE=9E=E7=8E=B0=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/workspace.xml | 73 ++++++++++++++++++++------
Manager.py | 58 ++++++++++++++++++--
SplitPanel.py | 6 +--
__pycache__/DockPanel.cpython-312.pyc | Bin 9280 -> 8890 bytes
__pycache__/Manager.cpython-312.pyc | Bin 12746 -> 15301 bytes
5 files changed, 115 insertions(+), 22 deletions(-)
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index a497318..3e53c31 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,9 +4,8 @@
-
+
-
@@ -23,8 +22,28 @@
+
+
+
+
+
+
+
+
+
+
@@ -39,20 +58,20 @@
- {
- "keyToString": {
- "Python.DockPanel.executor": "Debug",
- "Python.Manager.executor": "Run",
- "Python.SplitPanel.executor": "Run",
- "Python.Widget.executor": "Run",
- "Python.test.executor": "Run",
- "RunOnceActivity.OpenProjectViewOnStart": "true",
- "RunOnceActivity.ShowReadmeOnStart": "true",
- "SHARE_PROJECT_CONFIGURATION_FILES": "true",
- "git-widget-placeholder": "main",
- "settings.editor.selected.configurable": "preferences.sourceCode"
+
+}]]>
@@ -167,6 +186,30 @@
1703843144486
+
+
+ 1703944526835
+
+
+
+ 1703944526835
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/Manager.py
+ 126
+
+
+
+
+
\ No newline at end of file
diff --git a/Manager.py b/Manager.py
index 4d102d8..9da0e2d 100644
--- a/Manager.py
+++ b/Manager.py
@@ -1,9 +1,19 @@
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
+from enum import Enum
import re
+class PLACE_AREA(Enum):
+ LEFT_AREA = 0,
+ RIGHT_AREA = 1,
+ TOP_AREA = 2,
+ BOTTOM_AREA = 3,
+ CENTER_AREA = 4,
+ UNDEFINE_AREA = 5,
+
+
class AcceptPanel(QWidget):
def __init__(self, mgr):
@@ -19,11 +29,13 @@ class AcceptPanel(QWidget):
self.mgr_inst = mgr
self.target_anchor :QWidget = None
+ self.target_area = PLACE_AREA.UNDEFINE_AREA
def resizeEvent(self, a0):
total_rect = self.rect()
total_rect = total_rect - QMargins(5, 5, 5, 5)
anchor_width = 30
+ self.target_area = PLACE_AREA.UNDEFINE_AREA
self.left_rect = QRect(int(total_rect.left()), int(total_rect.center().y() - anchor_width / 2), int(anchor_width), int(anchor_width))
self.right_rect = QRect(int(total_rect.right() - anchor_width), int(total_rect.center().y() - anchor_width / 2), int(anchor_width), int(anchor_width))
@@ -47,24 +59,29 @@ class AcceptPanel(QWidget):
painter.fillRect(self.right_rect, Qt.green)
painter.fillRect(self.center_rect, Qt.green)
- def mouseMoveEvent(self, a0):
+ def dragMoveEvent(self, a0):
self.hover_rect = self.rect()
- print(a0.pos())
if self.left_rect.contains(a0.pos()):
self.hover_rect.setWidth(int(self.hover_rect.width() / 3))
+ self.target_area = PLACE_AREA.LEFT_AREA
elif self.right_rect.contains(a0.pos()):
+ self.target_area = PLACE_AREA.RIGHT_AREA
self.hover_rect.setWidth(int(self.hover_rect.width() / 3))
self.hover_rect.moveLeft(int(self.rect().right() - self.hover_rect.width()))
elif self.top_rect.contains(a0.pos()):
+ self.target_area = PLACE_AREA.TOP_AREA
self.hover_rect.setHeight(int(self.hover_rect.height() / 3))
elif self.center_rect.contains(a0.pos()):
+ self.target_area = PLACE_AREA.CENTER_AREA
pass
elif self.bottom_rect.contains(a0.pos()):
+ self.target_area = PLACE_AREA.BOTTOM_AREA
self.hover_rect.setHeight(int(self.hover_rect.height() / 3))
self.hover_rect.moveTop(int(self.rect().bottom() - self.hover_rect.height()))
else:
self.hover_rect = QRect()
+ self.target_area = PLACE_AREA.UNDEFINE_AREA
self.update()
@@ -79,9 +96,18 @@ class AcceptPanel(QWidget):
regex = re.compile("view-drags\\(([^\\(\\)]+)\\)")
result = regex.match(a0.mimeData().text())
if result:
+ from SplitPanel import SplitPanel, SplitType
+ from DockPanel import DockPanel
view_id = result.group(1)
- adjust_view = self.mgr_inst.get_dockpanel(view_id)
- target_view = self.target_anchor
+ adjust_view: DockPanel = self.mgr_inst.get_dockpanel(view_id)
+ target_view: DockPanel = self.target_anchor
+
+ if self.target_area == PLACE_AREA.CENTER_AREA and not target_view.can_replace:
+ self.setVisible(False)
+ return
+ if self.target_area == PLACE_AREA.UNDEFINE_AREA:
+ self.setVisible(False)
+ return
# 移除源视图
parent_frame_rm = adjust_view.parent_res
@@ -98,6 +124,30 @@ class AcceptPanel(QWidget):
else:
pparent_frame.replace_view(self_siblings[0], parent_frame_rm)
+ place_frame = target_view.parent_res
+ split_group:DockPanel = None # 声明类型
+ if self.target_area == PLACE_AREA.LEFT_AREA:
+ split_group = SplitPanel(adjust_view, target_view, SplitType.SPLIT_H)
+ split_group.set_split_info(SplitType.SPLIT_H, 1/3)
+ elif self.target_area == PLACE_AREA.RIGHT_AREA:
+ split_group = SplitPanel(target_view, adjust_view, SplitType.SPLIT_H)
+ split_group.set_split_info(SplitType.SPLIT_H, 2/3)
+ elif self.target_area == PLACE_AREA.TOP_AREA:
+ split_group = SplitPanel(adjust_view, target_view, SplitType.SPLIT_V)
+ split_group.set_split_info(SplitType.SPLIT_V, 1/3)
+ elif self.target_area == PLACE_AREA.BOTTOM_AREA:
+ split_group = SplitPanel(target_view, adjust_view, SplitType.SPLIT_V)
+ split_group.set_split_info(SplitType.SPLIT_V, 2/3)
+ elif self.target_area == PLACE_AREA.CENTER_AREA:
+ split_group = adjust_view
+
+ if place_frame is None:
+ main_window = target_view.parent()
+ target_view.setVisible(False)
+ main_window.setCentralWidget(split_group)
+ else:
+ place_frame.replace_view(split_group, target_view)
+
self.setVisible(False)
diff --git a/SplitPanel.py b/SplitPanel.py
index 69b65db..112bb37 100644
--- a/SplitPanel.py
+++ b/SplitPanel.py
@@ -1,4 +1,4 @@
-import Manager
+from Manager import DragManager
from DockPanel import DockPanel
from PyQt5.QtWidgets import QApplication, QWidget, QFrame
from enum import Enum
@@ -113,9 +113,9 @@ class SplitPanel(QWidget):
self.split_member = (new, self.split_member[1])
else:
self.split_member = (self.split_member[0], new)
+
new.parent_res = self
new.setParent(self)
- old.setParent(None)
self.sync_status()
self.update()
pass
@@ -124,7 +124,7 @@ class SplitPanel(QWidget):
if __name__ == "__main__":
app = QApplication([])
ow = QMainWindow()
- app.installEventFilter(Manager.DragManager.instance())
+ app.installEventFilter(DragManager.instance())
a = DockPanel("docka", None, None)
b = DockPanel("dockb", None, None)
diff --git a/__pycache__/DockPanel.cpython-312.pyc b/__pycache__/DockPanel.cpython-312.pyc
index fec4cbec21298088abd13c17033027f57e51ea62..7b09cf9d9074338a6070c449ea81046c30edb11d 100644
GIT binary patch
delta 102
zcmX@$vCEb3G%qg~0}xzOn2=f^xRGzWAY;PhV}h|96^v0l!3>(bn@xp$`It0$C%;v+
zovg2<%;-BgSjn698yh35<>d8B@40$_x*37ExNq_bWm_I|M#~B8Ul@SYhmy&km3;xg
CXdOHN
delta 377
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