基本拼接功能的实现

This commit is contained in:
玉宇清音 2023-12-31 17:38:12 +08:00
parent f7223984aa
commit d12945f7b4
4 changed files with 76 additions and 53 deletions

View File

@ -6,6 +6,7 @@
<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$/SplitPanel.py" beforeDir="false" afterPath="$PROJECT_DIR$/SplitPanel.py" afterDir="false" />
</list>
@ -30,12 +31,12 @@
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="GitHubPullRequestSearchHistory"><![CDATA[{
"lastFilter": {
"state": "OPEN",
"assignee": "heisehuanyin"
<component name="GitHubPullRequestSearchHistory">{
&quot;lastFilter&quot;: {
&quot;state&quot;: &quot;OPEN&quot;,
&quot;assignee&quot;: &quot;heisehuanyin&quot;
}
}]]></component>
}</component>
<component name="GithubPullRequestsUISettings">
<option name="selectedUrlAndAccountId">
<UrlAndAccount>
@ -133,7 +134,7 @@
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/SplitPanel.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
@ -161,6 +162,12 @@
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<list>
<item itemvalue="Python.DockPanel" />
<item itemvalue="Python.Manager" />
<item itemvalue="Python.SplitPanel" />
<item itemvalue="Python.test" />
</list>
<recent_temporary>
<list>
<item itemvalue="Python.SplitPanel" />
@ -201,15 +208,4 @@
<MESSAGE value="删除冗余打印代码" />
<option name="LAST_COMMIT_MESSAGE" value="删除冗余打印代码" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
<url>file://$PROJECT_DIR$/Manager.py</url>
<line>126</line>
<option name="timeStamp" value="9" />
</line-breakpoint>
</breakpoints>
</breakpoint-manager>
</component>
</project>

View File

@ -91,6 +91,7 @@ class DockPanel(QWidget):
self.can_close = True
DragManager.instance().register_dockpanel(self)
self.destroyed.connect(lambda :DragManager.instance().remove_dockpanel(self))
pass
def reset_parent_res(self, pinst):
@ -109,8 +110,6 @@ class DockPanel(QWidget):
drag_trans.setHotSpot(QPoint(5,5))
drag_trans.exec()
def __del__(self):
DragManager.instance().remove_dockpanel(self)
def sync_status(self):
self.drag_header.setVisible(self.default_header)

View File

@ -1,17 +1,17 @@
from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow
from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow, QMessageBox
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 PlaceArea(Enum):
LeftArea = 0,
RightArea = 1,
TopArea = 2,
BottomArea = 3,
CenterArea = 4,
UndefineArea = 5,
class AcceptPanel(QWidget):
@ -29,13 +29,13 @@ class AcceptPanel(QWidget):
self.mgr_inst = mgr
self.target_anchor :QWidget = None
self.target_area = PLACE_AREA.UNDEFINE_AREA
self.target_area = PlaceArea.UndefineArea
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.target_area = PlaceArea.UndefineArea
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))
@ -64,24 +64,24 @@ class AcceptPanel(QWidget):
if self.left_rect.contains(a0.pos()):
self.hover_rect.setWidth(int(self.hover_rect.width() / 3))
self.target_area = PLACE_AREA.LEFT_AREA
self.target_area = PlaceArea.LeftArea
elif self.right_rect.contains(a0.pos()):
self.target_area = PLACE_AREA.RIGHT_AREA
self.target_area = PlaceArea.RightArea
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.target_area = PlaceArea.TopArea
self.hover_rect.setHeight(int(self.hover_rect.height() / 3))
elif self.center_rect.contains(a0.pos()):
self.target_area = PLACE_AREA.CENTER_AREA
self.target_area = PlaceArea.CenterArea
pass
elif self.bottom_rect.contains(a0.pos()):
self.target_area = PLACE_AREA.BOTTOM_AREA
self.target_area = PlaceArea.BottomArea
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.target_area = PlaceArea.UndefineArea
self.update()
@ -100,55 +100,80 @@ class AcceptPanel(QWidget):
from DockPanel import DockPanel
view_id = result.group(1)
adjust_view: DockPanel = self.mgr_inst.get_dockpanel(view_id)
abandon_frame = adjust_view.parent_res
if abandon_frame is None:
QMessageBox.critical(self, "操作无效", "视图不能与自身进行替换和拼接操作!");
self.setVisible(False)
self.setParent(self.__peak_window(self.target_anchor))
return
remains_attach_frame = abandon_frame.parent_res
target_view: DockPanel = self.target_anchor
if self.target_area == PLACE_AREA.CENTER_AREA and not target_view.can_replace:
if self.target_area == PlaceArea.CenterArea and not target_view.can_replace:
self.setVisible(False)
return
if self.target_area == PLACE_AREA.UNDEFINE_AREA:
if self.target_area == PlaceArea.UndefineArea:
self.setVisible(False)
return
# 移除源视图
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()
self_siblings = abandon_frame.child()
if remains_attach_frame is None:
main_window:QMainWindow = abandon_frame.parent()
views = [self_siblings[0], self_siblings[1]]
views.pop(views.index(adjust_view))
main_window.setCentralWidget(views[0])
views[0].setParent(main_window)
views[0].parent_res = None
else:
pparent_frame = parent_frame_rm.parent_res
if self_siblings[0] == adjust_view:
pparent_frame.replace_view(self_siblings[1], parent_frame_rm)
remains_attach_frame.replace_view(self_siblings[1], abandon_frame)
else:
pparent_frame.replace_view(self_siblings[0], parent_frame_rm)
remains_attach_frame.replace_view(self_siblings[0], abandon_frame)
abandon_frame.setParent(None)
abandon_frame.parent_res = None
del abandon_frame
place_frame = target_view.parent_res
split_group:DockPanel = None # 声明类型
if self.target_area == PLACE_AREA.LEFT_AREA:
split_group:QWidget = None # 声明类型
if self.target_area == PlaceArea.LeftArea:
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:
elif self.target_area == PlaceArea.RightArea:
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:
elif self.target_area == PlaceArea.TopArea:
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:
elif self.target_area == PlaceArea.BottomArea:
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:
elif self.target_area == PlaceArea.CenterArea:
split_group = adjust_view
if place_frame is None:
main_window = target_view.parent()
target_view.setVisible(False)
main_window.setCentralWidget(split_group)
split_group.parent_res = None
target_view.setVisible(False)
self.mgr_inst.remove_dockpanel(target_view)
del target_view
else:
place_frame.replace_view(split_group, target_view)
self.setVisible(False)
self.setParent(self.__peak_window(self.target_anchor))
def __peak_window(self, obj: QWidget):
if obj is None:
return None
if obj.__class__.__name__ == "QMainWindow":
return obj
return self.__peak_window(obj.parent())
class DragManager(QObject):

View File

@ -114,8 +114,11 @@ class SplitPanel(QWidget):
else:
self.split_member = (self.split_member[0], new)
new.parent_res = self
new.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].parent_res = self
self.sync_status()
self.update()
pass