From 68186d284bf770ecd458475d621634e0210ec322 Mon Sep 17 00:00:00 2001
From: Jiri Kalvoda <jirikalvoda@kam.mff.cuni.cz>
Date: Sat, 27 Aug 2022 21:23:18 +0200
Subject: [PATCH] Qt: I3Tree commands: wrap_if_is_root

---
 woman/qt.py | 44 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 35 insertions(+), 9 deletions(-)

diff --git a/woman/qt.py b/woman/qt.py
index 19e16ca..ceb6e0b 100755
--- a/woman/qt.py
+++ b/woman/qt.py
@@ -125,8 +125,9 @@ def qt_main():
 
 
     class I3NodeWidget(QFrame, DragFeature):
-        def __init__(self, t, workspace_widget, parent=None):
+        def __init__(self, t, workspace_widget, is_root, parent=None):
             super().__init__(parent)
+            self.is_root = is_root
             self.workspace_widget = workspace_widget
             self.container_id = t.id
             self.shortcut = None
@@ -153,6 +154,27 @@ def qt_main():
         def focus(self):
             shared.i3_cmd(f'[con_id={self.container_id}] focus')
 
+        def wrap_if_is_root(self):
+            if self.is_root:
+                self.is_root = False
+                master, slave = (self.workspace_widget.master, self.workspace_widget.slave)
+                shared.i3_cmd(f'[con_id={self.container_id}] move container to workspace tmp')
+                # ID is changed, need reload
+                t = shared.i3.value.get_tree()
+                def go(x):
+                    if x.type == "workspace":
+                        print(x.name)
+                        if x.name == "tmp":
+                            self.container_id = x.nodes[0].id
+                    else:
+                        for y in x.nodes:
+                            go(y)
+                go(t)
+                shared.i3_cmd(f'[con_id={self.container_id}] move container to workspace {workspace(master, slave)}')
+                for f in self.workspace_widget._tree.floating_nodes:
+                    shared.i3_cmd(f'[con_id={f.container_id}] move container to workspace {workspace(master, slave)}')
+            return self
+
         def move_to_workspace(self, master, slave, expand=False):
             self.workspace_widget.screenshot_changed()
             m_win._workspaces[(master, slave)].screenshot_changed()
@@ -175,11 +197,15 @@ def qt_main():
             self.workspace_widget.screenshot_changed()
             target.workspace_widget.screenshot_changed()
             if swap:
+                self.wrap_if_is_root()
+                target.wrap_if_is_root()
                 shared.i3_cmd(f'[con_id={self.container_id}] mark tmp')
                 shared.i3_cmd(f'[con_id={target.container_id}] swap container with mark tmp')
             else:
                 if new_container is not None:
                     target.put_in_new_container(None if new_container is True else new_container)
+                else:
+                    target.wrap_if_is_root()
                 if expand and type(self) != I3InnerNodeWidget:
                     if before:
                         self.move(target, expand=True)
@@ -326,8 +352,8 @@ def qt_main():
                 self.setStyleSheet(f"#{id(self)} {{ {style} }}");
 
     class I3WindowNodeWidget(I3NodeWidget):
-        def __init__(self, t, workspace_widget, parent=None):
-            super().__init__(t, workspace_widget, parent)
+        def __init__(self, t, workspace_widget, is_root, parent=None):
+            super().__init__(t, workspace_widget, is_root, parent)
             self._hlay = no_space(QHBoxLayout(self))
             self.title = t.name
             self.urgent = t.urgent
@@ -370,8 +396,8 @@ def qt_main():
 
 
     class I3InnerNodeWidget(I3NodeWidget):
-        def __init__(self, t, workspace_widget, parent=None):
-            super().__init__(t, workspace_widget, parent)
+        def __init__(self, t, workspace_widget, is_root, parent=None):
+            super().__init__(t, workspace_widget, is_root, parent)
             self._hlay = no_space(QHBoxLayout(self))
             self._head = QLabel(self)
             self._list = no_space(QVBoxLayout())
@@ -429,11 +455,11 @@ def qt_main():
             else:
                 super().clicked(pos, buttons)
 
-    def i3_tree_widget_create(t, workspace_widget, parent):
+    def i3_tree_widget_create(t, workspace_widget, parent, is_root=False):
         if t.nodes:
-            return I3InnerNodeWidget(t, workspace_widget, parent)
+            return I3InnerNodeWidget(t, workspace_widget, is_root, parent)
         else:
-            return I3WindowNodeWidget(t, workspace_widget, parent)
+            return I3WindowNodeWidget(t, workspace_widget, is_root, parent)
 
     class I3TreeWidget(QWidget):
         def __init__(self, parent=None):
@@ -469,7 +495,7 @@ def qt_main():
                     self.all_inner_nides.append(x)
                     for i in x.nodes:
                         go(i)
-            r = i3_tree_widget_create(t, self.workspace_widget, self)
+            r = i3_tree_widget_create(t, self.workspace_widget, self, is_root=True)
             self.root_node = r
             go(r)
             self._lay.addWidget(r)
-- 
GitLab