Mercurial > fife-parpg
diff clients/editor/scripts/gui/dockarea.py @ 255:51cc05d862f2
Merged editor_rewrite branch to trunk.
This contains changes that may break compatibility against existing clients.
For a list of changes that may affect your client, see: http://wiki.fifengine.de/Changes_to_pychan_and_FIFE_in_editor_rewrite_branch
author | cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Mon, 08 Jun 2009 16:00:02 +0000 |
parents | |
children | 6add14ebe9f5 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clients/editor/scripts/gui/dockarea.py Mon Jun 08 16:00:02 2009 +0000 @@ -0,0 +1,159 @@ +import pychan +from pychan import widgets +import scripts.editor +import fife +from panel import Panel +from faketabwidget import FakeTabWidget +from resizablebase import ResizableBase + +class DockArea(widgets.VBox, ResizableBase): + def __init__(self, side, resizable=True, *args, **kwargs): + widgets.VBox.__init__(self, margins=(0,0,0,0), *args, **kwargs) + ResizableBase.__init__(self, *args, **kwargs) + + self.cursor_id = 0 + self.cursor_type = 0 + + self.vexpand=0 + self.hexpand=0 + + self.side = side + self.resizable_top = (side == "bottom") + self.resizable_left = (side == "right") + self.resizable_right = (side == "left") + self.resizable_bottom = (side == "top") + + self.gui = None + + self.buildGui() + self.tabwidgets = [] + self.panels = [] + + def getDockLocation(self, x, y): + placeAfter = None + placeBefore = None + placeIn = None + + if x >= 0 and y >= 0: + # See if widget was dropped on a tabwidget + for tabwidget in self.tabwidgets: + absX, absY = tabwidget.getAbsolutePos() + + if absX <= x and absY <= y \ + and absX+tabwidget.width >= x and absY+tabwidget.height >= y: + # Check if the user tried to place it in front, or after this widget + if self.side == "left" or self.side == "right": + if y < absY+10: + placeBefore = tabwidget + elif y > absY+tabwidget.height-10: + placeAfter = tabwidget + else: + if x < absX+10: + placeBefore = tabwidget + elif x > absX+tabwidget.width-10: + placeAfter = tabwidget + if placeAfter is None and placeBefore is None: + placeIn = tabwidget + break + + return (placeIn, placeBefore, placeAfter) + + def dockChild(self, child, x, y): + for panel in self.panels: + if panel[0] == child: + return + + child.dockarea = self + child.setDocked(True) + + placeIn, placeBefore, placeAfter = self.getDockLocation(x, y) + + if placeIn is None: + tabwidget = FakeTabWidget(resizable=True) + tabwidget.hexpand=1 + tabwidget.vexpand=1 + + if self.side == "left" or self.side == "right": + tabwidget.resizable_bottom = True + else: + tabwidget.resizable_right = True + self.tabwidgets.append(tabwidget) + + if placeBefore: + self.gui.insertChildBefore(tabwidget, placeBefore) + elif placeAfter: + self.gui.insertChild(tabwidget, self.gui.children.index(placeAfter)+1) + else: + self.gui.addChild(tabwidget) + else: + tabwidget = placeIn + + tab = tabwidget.addTab(child, child.title) + self.panels.append( (child, tabwidget) ) + + def undock(event): + if event.getButton() != 2: # Right click + return + + self.undockChild(child) + + tab[2].capture(undock, "mouseClicked") + + def undockChild(self, child, childIsCaller=False): + tabwidget = None + for panel in self.panels: + if panel[0] == child: + tabwidget = panel[1] + self.panels.remove(panel) + break + else: + return + + tabwidget.removeTab(child) + if childIsCaller is False: + child.setDocked(False) + + if len(tabwidget.tabs) <= 0: + self.gui.removeChild(tabwidget) + self.tabwidgets.remove(tabwidget) + + # This stops a guichan exception when a widget with modul focus gets focused. + # It is not pretty, but crashes aren't pretty either + tabwidget.__del__() + del tabwidget + + self.adaptLayout() + + def buildGui(self): + if self.gui: + self.removeChild(self.gui) + + if self.side == "left" or self.side == "right": + self.gui = widgets.VBox() + else: + self.gui = widgets.HBox() + + self.gui.vexpand = 1 + self.gui.hexpand = 1 + + self.addChild(self.gui) + + def mouseReleased(self, event): + if self._resize: + if self._rLeft or self._rRight: + # Resize children + for child in self.gui.findChildren(parent=self.gui): + child.min_size = (self.width, child.min_size[1]) + child.max_size = (self.width, child.max_size[1]) + + if self._rTop or self._rBottom: + # Resize children + for child in self.gui.findChildren(parent=self.gui): + child.min_size = (child.min_size[0], self.height) + child.max_size = (child.max_size[0], self.height) + + self.gui.max_size = (self.width, self.height) + + ResizableBase.mouseReleased(self, event) + self.min_size = (0,0) # Override changes done in ResizableBase + \ No newline at end of file