Mercurial > fife-parpg
view clients/editor/scripts/gui/panel.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 | 21999e058c7b |
line wrap: on
line source
import pychan from pychan import widgets import scripts.editor import fife from resizablebase import ResizableBase class Panel(widgets.Window, ResizableBase): """ Panel is a window which can be resized and docked. """ def __init__(self, dockable=True, *args, **kwargs): widgets.Window.__init__(self, *args, **kwargs) ResizableBase.__init__(self, *args, **kwargs) self.dockable = dockable self._movable = self.real_widget.isMovable() self._resizable = self.resizable self._floating = True self._titlebarheight = 16 self.dockarea = None self._editor = scripts.editor.getEditor() def setDocked(self, docked): """ Dock or undock the panel setDocked(True) will disable resizing and moving of this panel, but will not dock it in a dockarea. setDocked(False) will enable resizing and moving. If this panel is docked in a dockarea or widget, it will undock itself. The new position will be offset by panelSize. """ if self.dockable is False: return if docked is True and self._floating == True: self._floating = False self.real_widget.setTitleBarHeight(0) self.real_widget.setMovable(False) self._movable = False self.resizable = False elif docked is False and self._floating is False: self._floating = True self._movable = True self.real_widget.setMovable(True) self.resizable = self._resizable # Since x and y coordinates are reset if the widget gets hidden, # we need to store them absX, absY = self.getAbsolutePos() # Remove from parent widget if self.dockarea is not None: # Use dockareas undock method self.dockarea.undockChild(self, True) self.dockarea = None elif self.parent is not None: # Force removal widgetParent = self.parent widgetParent.removeChild(self) widgetParent.adaptLayout() self.hide() self.real_widget.setTitleBarHeight(self._titlebarheight) self.show() # Slighly offset toolbar when undocking mw = pychan.internal.screen_width() / 2 mh = pychan.internal.screen_height() / 2 if absX < mw: self.x = absX + self._titlebarheight else: self.x = absX - self._titlebarheight if absY < mh: self.y = absY + self._titlebarheight else: self.y = absY - self._titlebarheight def isDocked(self): """ Returns true if the panel is docked """ return self._floating == False def mousePressed(self, event): if self.resizable is False: return ResizableBase.mousePressed(self, event) if self._rLeft or self._rRight or self._rTop or self._rBottom: self._movable = self.real_widget.isMovable() self.real_widget.setMovable(False) # Don't let guichan move window while we resize def mouseDragged(self, event): if self._resize is False and self.isDocked() is False: mouseX = self.x+event.getX() mouseY = self.y+event.getY() self._editor.getDockAreaAt(mouseX, mouseY, True) else: ResizableBase.mouseDragged(self, event) def mouseReleased(self, event): # Resize/move done self.real_widget.setMovable(self._movable) if self._resize: ResizableBase.mouseReleased(self, event) elif self._movable: mouseX = self.x+event.getX() mouseY = self.y+event.getY() dockArea = self._editor.getDockAreaAt(mouseX, mouseY) if dockArea is not None: self._editor.dockWidgetTo(self, dockArea, mouseX, mouseY) def hide(self): """ Hides the panel. If the widget is docked, it is first undocked """ if self.isDocked(): self.setDocked(False) widgets.Window.hide(self) def show(self): """ Show the panel. """ if self.isDocked(): return widgets.Window.show(self) # Register widget to pychan if 'Panel' not in widgets.WIDGETS: widgets.WIDGETS['Panel'] = Panel