Mercurial > fife-parpg
diff clients/editor/scripts/gui/mainwindow.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 | 8b125ec749d7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clients/editor/scripts/gui/mainwindow.py Mon Jun 08 16:00:02 2009 +0000 @@ -0,0 +1,284 @@ +import pychan +from menubar import MenuBar, Menu +from panel import Panel +from dockarea import DockArea +import toolbar +from toolbar import ToolBar +from statusbar import StatusBar +import fife + +DOCKAREA = { + 'left' : 'left', + 'right' : 'right', + 'top' : 'top', + 'bottom': 'bottom' +} + +class MainWindow(object): + + def __init__(self, *args, **kwargs): + self._toolbar = None + self._menubar = None + self._statusbar = None + + self._rootwidget = None + self._centralwidget = None + self._dockareas = { + DOCKAREA['left']:None, + DOCKAREA['right']:None, + DOCKAREA['top']:None, + DOCKAREA['bottom']:None + } + + self._toolbarareas = { + DOCKAREA['left']:None, + DOCKAREA['right']:None, + DOCKAREA['top']:None, + DOCKAREA['bottom']:None + } + + self.dockareamarker = None + + def initGui(self, screen_width, screen_height): + bar_height = 30 + + self._statusbar = StatusBar(text=u"", panel_size=bar_height) + self._toolbar = ToolBar(title=u"Toolbar", button_style=0) + self._menubar = MenuBar(min_size=(screen_width, bar_height), position=(0, 0)) + + # Set up root widget + self._rootwidget = pychan.widgets.VBox(padding=0, vexpand=1, hexpand=1) + self._rootwidget.min_size = \ + self._rootwidget.max_size = (screen_width, screen_height) + self._rootwidget.opaque = False + + self._dockareas[DOCKAREA['left']] = DockArea("left") + self._dockareas[DOCKAREA['right']] = DockArea("right") + self._dockareas[DOCKAREA['top']] = DockArea("top") + self._dockareas[DOCKAREA['bottom']] = DockArea("bottom") + + self._toolbarareas[DOCKAREA['left']] = pychan.widgets.VBox(margins=(0,0,0,0)) + self._toolbarareas[DOCKAREA['right']] = pychan.widgets.VBox(margins=(0,0,0,0)) + self._toolbarareas[DOCKAREA['top']] = pychan.widgets.HBox(margins=(0,0,0,0)) + self._toolbarareas[DOCKAREA['bottom']] = pychan.widgets.HBox(margins=(0,0,0,0)) + + # This is where the map will be displayed + self._centralwidget = pychan.widgets.VBox(vexpand=1, hexpand=1) + self._centralwidget.opaque = False + + middle = pychan.widgets.HBox(padding=0, vexpand=1, hexpand=1) + middle.opaque = False + + # Pychan bug? Adding a spacer instead of a container creates + # a gap after the right dockarea + middle.addChild(self._toolbarareas['left']) + middle.addChild(self._dockareas['left']) + middle.addChild(self._centralwidget) + #middle.addSpacer(pychan.widgets.Spacer()) + middle.addChild(self._dockareas['right']) + middle.addChild(self._toolbarareas['right']) + + self._rootwidget.addChild(self._menubar) + #self._rootwidget.addChild(self._toolbar) + self._rootwidget.addChild(self._toolbarareas['top']) + self._rootwidget.addChild(self._dockareas['top']) + self._rootwidget.addChild(middle) + self._rootwidget.addChild(self._dockareas['bottom']) + self._rootwidget.addChild(self._toolbarareas['bottom']) + self._rootwidget.addChild(self._statusbar) + + self._toolbar.setDocked(True) + self.dockWidgetTo(self._toolbar, "top") + + self._rootwidget.show() + + def getCentralWidget(self): + return self._centralwidget + + def getStatusBar(self): + return self._statusbar + + def getMenuBar(self): + return self._menubar + + def getToolBar(self): + return self._toolbar + + def dockWidgetTo(self, widget, dockarea, x=-1, y=-1): + if isinstance(widget, pychan.widgets.Widget) is False: + print "Argument is not a valid widget" + return + + if widget.parent: + widgetParent = widget.parent + widgetParent.removeChild(widget) + widgetParent.adaptLayout() + + # We must hide the widget before adding it to the dockarea, + # or we will get a duplicate copy of the widget in the top left corner + # of screen. + widget.hide() + dockareas = self._dockareas + if isinstance(widget, ToolBar): + dockareas = self._toolbarareas + if dockarea == DOCKAREA['left'] or dockarea == DOCKAREA['right']: + widget.setOrientation(ToolBar.ORIENTATION["Vertical"]) + elif dockarea == DOCKAREA['top'] or dockarea == DOCKAREA['bottom']: + widget.setOrientation(ToolBar.ORIENTATION["Horizontal"]) + + if isinstance(widget, ToolBar): + if dockarea == DOCKAREA['left']: + widget.setDocked(True) + dockareas[DOCKAREA['left']].addChild(widget) + dockareas[DOCKAREA['left']].adaptLayout() + + elif dockarea == DOCKAREA['right']: + widget.setDocked(True) + dockareas[DOCKAREA['right']].addChild(widget) + dockareas[DOCKAREA['right']].adaptLayout() + + elif dockarea == DOCKAREA['top']: + widget.setDocked(True) + dockareas[DOCKAREA['top']].addChild(widget) + dockareas[DOCKAREA['top']].adaptLayout() + + elif dockarea == DOCKAREA['bottom']: + widget.setDocked(True) + dockareas[DOCKAREA['bottom']].addChild(widget) + dockareas[DOCKAREA['bottom']].adaptLayout() + + else: + print "Invalid dockarea" + else: + if dockarea == DOCKAREA['left']: + dockareas[DOCKAREA['left']].dockChild(widget, x, y) + + elif dockarea == DOCKAREA['right']: + dockareas[DOCKAREA['right']].dockChild(widget, x, y) + + elif dockarea == DOCKAREA['top']: + dockareas[DOCKAREA['top']].dockChild(widget, x, y) + + elif dockarea == DOCKAREA['bottom']: + dockareas[DOCKAREA['bottom']].dockChild(widget, x, y) + + else: + print "Invalid dockarea" + + def getToolbarAreaAt(self, x, y, mark=False): + if self.dockareamarker is None: + self.dockareamarker = pychan.widgets.Container() + self.dockareamarker.base_color = fife.Color(200, 0, 0, 100) + if mark is False: + self.dockareamarker.hide() + + # Mouse wasn't over any dockwidgets. See if it is near any edge of the screen instead + if x <= self._toolbarareas["left"].getAbsolutePos()[0]+10: + if mark: + self.dockareamarker.position = self._toolbarareas["left"].getAbsolutePos() + self.dockareamarker.size = (10, self._toolbarareas["left"].height) + self.dockareamarker.show() + return DOCKAREA["left"] + + elif x >= self._toolbarareas["right"].getAbsolutePos()[0]-10: + if mark: + self.dockareamarker.position = self._toolbarareas["right"].getAbsolutePos() + self.dockareamarker.size = (10, self._toolbarareas["right"].height) + self.dockareamarker.x -= 10 + self.dockareamarker.show() + return DOCKAREA["right"] + + elif y <= self._toolbarareas["top"].getAbsolutePos()[1]+10: + if mark: + self.dockareamarker.position = self._toolbarareas["top"].getAbsolutePos() + self.dockareamarker.size = (self._toolbarareas["top"].width, 10) + self.dockareamarker.show() + return DOCKAREA["top"] + + elif y >= self._toolbarareas["bottom"].getAbsolutePos()[1]-10: + if mark: + self.dockareamarker.position = self._toolbarareas["bottom"].getAbsolutePos() + self.dockareamarker.y -= 10 + self.dockareamarker.size = (self._toolbarareas["bottom"].width, 10) + self.dockareamarker.show() + return DOCKAREA["bottom"] + + if mark is True: + self.dockareamarker.hide() + return None + + def getDockAreaAt(self, x, y, mark=False): + if self.dockareamarker is None: + self.dockareamarker = pychan.widgets.Container() + self.dockareamarker.base_color = fife.Color(200, 0, 0, 100) + if mark is False: + self.dockareamarker.hide() + + for key in DOCKAREA: + side = DOCKAREA[key] + + dockarea = self._dockareas[side] + #absX, absY = dockarea.getAbsolutePos() + #if absX <= x and absY <= y \ + # and absX+dockarea.width >= x and absX+dockarea.height >= y: + # return side + placeIn, placeBefore, placeAfter = dockarea.getDockLocation(x, y) + if placeIn or placeBefore or placeAfter: + if mark is True: + if placeIn: + self.dockareamarker.position = placeIn.getAbsolutePos() + self.dockareamarker.size = placeIn.size + elif placeBefore: + self.dockareamarker.position = placeBefore.getAbsolutePos() + if side == "left" or side == "right": + self.dockareamarker.size = (placeBefore.width, 10) + else: + self.dockareamarker.size = (10, placeBefore.height) + elif placeAfter: + self.dockareamarker.position = placeAfter.getAbsolutePos() + + if side == "left" or side == "right": + self.dockareamarker.size = (placeAfter.width, 10) + self.dockareamarker.y += placeAfter.height-10 + else: + self.dockareamarker.size = (10, placeAfter.height) + self.dockareamarker.x += placeAfter.width-10 + + self.dockareamarker.show() + return side + + + # Mouse wasn't over any dockwidgets. See if it is near any edge of the screen instead + if x <= self._dockareas["left"].getAbsolutePos()[0]+10: + if mark: + self.dockareamarker.position = self._dockareas["left"].getAbsolutePos() + self.dockareamarker.size = (10, self._dockareas["left"].height) + self.dockareamarker.show() + return DOCKAREA["left"] + + elif x >= self._dockareas["right"].getAbsolutePos()[0]-10: + if mark: + self.dockareamarker.position = self._dockareas["right"].getAbsolutePos() + self.dockareamarker.size = (10, self._dockareas["right"].height) + self.dockareamarker.x -= 10 + self.dockareamarker.show() + return DOCKAREA["right"] + + elif y <= self._dockareas["top"].getAbsolutePos()[1]+10: + if mark: + self.dockareamarker.position = self._dockareas["top"].getAbsolutePos() + self.dockareamarker.size = (self._dockareas["top"].width, 10) + self.dockareamarker.show() + return DOCKAREA["top"] + + elif y >= self._dockareas["bottom"].getAbsolutePos()[1]-10: + if mark: + self.dockareamarker.position = self._dockareas["bottom"].getAbsolutePos() + self.dockareamarker.y -= 10 + self.dockareamarker.size = (self._dockareas["bottom"].width, 10) + self.dockareamarker.show() + return DOCKAREA["bottom"] + + if mark is True: + self.dockareamarker.hide() + return None