基本拼接功能的实现
This commit is contained in:
parent
f7223984aa
commit
d12945f7b4
|
@ -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">{
|
||||
"lastFilter": {
|
||||
"state": "OPEN",
|
||||
"assignee": "heisehuanyin"
|
||||
}
|
||||
}]]></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>
|
|
@ -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)
|
||||
|
|
89
Manager.py
89
Manager.py
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue