基本拼接功能的实现

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

View File

@ -91,6 +91,7 @@ class DockPanel(QWidget):
self.can_close = True self.can_close = True
DragManager.instance().register_dockpanel(self) DragManager.instance().register_dockpanel(self)
self.destroyed.connect(lambda :DragManager.instance().remove_dockpanel(self))
pass pass
def reset_parent_res(self, pinst): def reset_parent_res(self, pinst):
@ -109,8 +110,6 @@ class DockPanel(QWidget):
drag_trans.setHotSpot(QPoint(5,5)) drag_trans.setHotSpot(QPoint(5,5))
drag_trans.exec() drag_trans.exec()
def __del__(self):
DragManager.instance().remove_dockpanel(self)
def sync_status(self): def sync_status(self):
self.drag_header.setVisible(self.default_header) 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.QtCore import QObject, QEvent, QRect, QMargins, Qt, QMimeData
from PyQt5.QtGui import QPainter, QColor, QDragEnterEvent, QDropEvent from PyQt5.QtGui import QPainter, QColor, QDragEnterEvent, QDropEvent
from enum import Enum from enum import Enum
import re import re
class PLACE_AREA(Enum): class PlaceArea(Enum):
LEFT_AREA = 0, LeftArea = 0,
RIGHT_AREA = 1, RightArea = 1,
TOP_AREA = 2, TopArea = 2,
BOTTOM_AREA = 3, BottomArea = 3,
CENTER_AREA = 4, CenterArea = 4,
UNDEFINE_AREA = 5, UndefineArea = 5,
class AcceptPanel(QWidget): class AcceptPanel(QWidget):
@ -29,13 +29,13 @@ class AcceptPanel(QWidget):
self.mgr_inst = mgr self.mgr_inst = mgr
self.target_anchor :QWidget = None self.target_anchor :QWidget = None
self.target_area = PLACE_AREA.UNDEFINE_AREA self.target_area = PlaceArea.UndefineArea
def resizeEvent(self, a0): def resizeEvent(self, a0):
total_rect = self.rect() total_rect = self.rect()
total_rect = total_rect - QMargins(5, 5, 5, 5) total_rect = total_rect - QMargins(5, 5, 5, 5)
anchor_width = 30 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.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)) 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()): if self.left_rect.contains(a0.pos()):
self.hover_rect.setWidth(int(self.hover_rect.width() / 3)) 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()): 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.setWidth(int(self.hover_rect.width() / 3))
self.hover_rect.moveLeft(int(self.rect().right() - self.hover_rect.width())) self.hover_rect.moveLeft(int(self.rect().right() - self.hover_rect.width()))
elif self.top_rect.contains(a0.pos()): 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)) self.hover_rect.setHeight(int(self.hover_rect.height() / 3))
elif self.center_rect.contains(a0.pos()): elif self.center_rect.contains(a0.pos()):
self.target_area = PLACE_AREA.CENTER_AREA self.target_area = PlaceArea.CenterArea
pass pass
elif self.bottom_rect.contains(a0.pos()): 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.setHeight(int(self.hover_rect.height() / 3))
self.hover_rect.moveTop(int(self.rect().bottom() - self.hover_rect.height())) self.hover_rect.moveTop(int(self.rect().bottom() - self.hover_rect.height()))
else: else:
self.hover_rect = QRect() self.hover_rect = QRect()
self.target_area = PLACE_AREA.UNDEFINE_AREA self.target_area = PlaceArea.UndefineArea
self.update() self.update()
@ -100,55 +100,80 @@ class AcceptPanel(QWidget):
from DockPanel import DockPanel from DockPanel import DockPanel
view_id = result.group(1) view_id = result.group(1)
adjust_view: DockPanel = self.mgr_inst.get_dockpanel(view_id) 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 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) self.setVisible(False)
return return
if self.target_area == PLACE_AREA.UNDEFINE_AREA: if self.target_area == PlaceArea.UndefineArea:
self.setVisible(False) self.setVisible(False)
return return
# 移除源视图 # 移除源视图
parent_frame_rm = adjust_view.parent_res self_siblings = abandon_frame.child()
self_siblings = parent_frame_rm.child() if remains_attach_frame is None:
if parent_frame_rm.parent_res is None: main_window:QMainWindow = abandon_frame.parent()
main_window:QMainWindow = parent_frame_rm.parent()
views = [self_siblings[0], self_siblings[1]] views = [self_siblings[0], self_siblings[1]]
views.pop(views.index(adjust_view)) views.pop(views.index(adjust_view))
main_window.setCentralWidget(views[0]) main_window.setCentralWidget(views[0])
views[0].setParent(main_window)
views[0].parent_res = None
else: else:
pparent_frame = parent_frame_rm.parent_res
if self_siblings[0] == adjust_view: 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: 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 place_frame = target_view.parent_res
split_group:DockPanel = None # 声明类型 split_group:QWidget = None # 声明类型
if self.target_area == PLACE_AREA.LEFT_AREA: if self.target_area == PlaceArea.LeftArea:
split_group = SplitPanel(adjust_view, target_view, SplitType.SPLIT_H) split_group = SplitPanel(adjust_view, target_view, SplitType.SPLIT_H)
split_group.set_split_info(SplitType.SPLIT_H, 1/3) 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 = SplitPanel(target_view, adjust_view, SplitType.SPLIT_H)
split_group.set_split_info(SplitType.SPLIT_H, 2/3) 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 = SplitPanel(adjust_view, target_view, SplitType.SPLIT_V)
split_group.set_split_info(SplitType.SPLIT_V, 1/3) 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 = SplitPanel(target_view, adjust_view, SplitType.SPLIT_V)
split_group.set_split_info(SplitType.SPLIT_V, 2/3) 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 split_group = adjust_view
if place_frame is None: if place_frame is None:
main_window = target_view.parent() main_window = target_view.parent()
target_view.setVisible(False)
main_window.setCentralWidget(split_group) 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: else:
place_frame.replace_view(split_group, target_view) place_frame.replace_view(split_group, target_view)
self.setVisible(False) 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): class DragManager(QObject):

View File

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