comparison tools/editor/scripts/gui/mainwindow.py @ 378:64738befdf3b

bringing in the changes from the build_system_rework branch in preparation for the 0.3.0 release. This commit will require the Jan2010 devkit. Clients will also need to be modified to the new way to import fife.
author vtchill@33b003aa-7bff-0310-803a-e67f0ece8222
date Mon, 11 Jan 2010 23:34:52 +0000
parents
children
comparison
equal deleted inserted replaced
377:fe6fb0e0ed23 378:64738befdf3b
1 # -*- coding: utf-8 -*-
2
3 # ####################################################################
4 # Copyright (C) 2005-2009 by the FIFE team
5 # http://www.fifengine.de
6 # This file is part of FIFE.
7 #
8 # FIFE is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU Lesser General Public
10 # License as published by the Free Software Foundation; either
11 # version 2.1 of the License, or (at your option) any later version.
12 #
13 # This library is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 # Lesser General Public License for more details.
17 #
18 # You should have received a copy of the GNU Lesser General Public
19 # License along with this library; if not, write to the
20 # Free Software Foundation, Inc.,
21 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 # ####################################################################
23
24 from fife.extensions import pychan
25 from menubar import MenuBar, Menu
26 from panel import Panel
27 from dockarea import DockArea
28 import toolbar
29 from toolbar import ToolBar
30 from statusbar import StatusBar
31 from fife import fife
32
33 DOCKAREA = {
34 'left' : 'left',
35 'right' : 'right',
36 'top' : 'top',
37 'bottom': 'bottom'
38 }
39
40 class MainWindow(object):
41
42 def __init__(self, *args, **kwargs):
43 self._toolbar = None
44 self._menubar = None
45 self._statusbar = None
46
47 self._rootwidget = None
48 self._centralwidget = None
49 self._dockareas = {
50 DOCKAREA['left']:None,
51 DOCKAREA['right']:None,
52 DOCKAREA['top']:None,
53 DOCKAREA['bottom']:None
54 }
55
56 self._toolbarareas = {
57 DOCKAREA['left']:None,
58 DOCKAREA['right']:None,
59 DOCKAREA['top']:None,
60 DOCKAREA['bottom']:None
61 }
62
63 self.dockareamarker = None
64
65 def initGui(self, screen_width, screen_height):
66 bar_height = 30
67
68 self._statusbar = StatusBar(text=u"", panel_size=bar_height)
69 self._toolbar = ToolBar(title=u"Toolbar", button_style=0)
70 self._menubar = MenuBar(min_size=(screen_width, bar_height), position=(0, 0))
71
72 # Set up root widget
73 self._rootwidget = pychan.widgets.VBox(padding=0, vexpand=1, hexpand=1)
74 self._rootwidget.min_size = \
75 self._rootwidget.max_size = (screen_width, screen_height)
76 self._rootwidget.opaque = False
77
78 self._dockareas[DOCKAREA['left']] = DockArea("left")
79 self._dockareas[DOCKAREA['right']] = DockArea("right")
80 self._dockareas[DOCKAREA['top']] = DockArea("top")
81 self._dockareas[DOCKAREA['bottom']] = DockArea("bottom")
82
83 self._toolbarareas[DOCKAREA['left']] = pychan.widgets.VBox(margins=(0,0,0,0))
84 self._toolbarareas[DOCKAREA['right']] = pychan.widgets.VBox(margins=(0,0,0,0))
85 self._toolbarareas[DOCKAREA['top']] = pychan.widgets.HBox(margins=(0,0,0,0))
86 self._toolbarareas[DOCKAREA['bottom']] = pychan.widgets.HBox(margins=(0,0,0,0))
87
88 # This is where the map will be displayed
89 self._centralwidget = pychan.widgets.VBox(vexpand=1, hexpand=1)
90 self._centralwidget.opaque = False
91
92 middle = pychan.widgets.HBox(padding=0, vexpand=1, hexpand=1)
93 middle.opaque = False
94
95 # Pychan bug? Adding a spacer instead of a container creates
96 # a gap after the right dockarea
97 middle.addChild(self._toolbarareas['left'])
98 middle.addChild(self._dockareas['left'])
99 middle.addChild(self._centralwidget)
100 #middle.addSpacer(pychan.widgets.Spacer())
101 middle.addChild(self._dockareas['right'])
102 middle.addChild(self._toolbarareas['right'])
103
104 self._rootwidget.addChild(self._menubar)
105 #self._rootwidget.addChild(self._toolbar)
106 self._rootwidget.addChild(self._toolbarareas['top'])
107 self._rootwidget.addChild(self._dockareas['top'])
108 self._rootwidget.addChild(middle)
109 self._rootwidget.addChild(self._dockareas['bottom'])
110 self._rootwidget.addChild(self._toolbarareas['bottom'])
111 self._rootwidget.addChild(self._statusbar)
112
113 self._toolbar.setDocked(True)
114 self.dockWidgetTo(self._toolbar, "top")
115
116 self._rootwidget.show()
117
118 def getCentralWidget(self):
119 return self._centralwidget
120
121 def getStatusBar(self):
122 return self._statusbar
123
124 def getMenuBar(self):
125 return self._menubar
126
127 def getToolBar(self):
128 return self._toolbar
129
130 def dockWidgetTo(self, widget, dockarea, x=-1, y=-1):
131 if isinstance(widget, pychan.widgets.Widget) is False:
132 print "Argument is not a valid widget"
133 return
134
135 if widget.parent:
136 widgetParent = widget.parent
137 widgetParent.removeChild(widget)
138 widgetParent.adaptLayout()
139
140 # We must hide the widget before adding it to the dockarea,
141 # or we will get a duplicate copy of the widget in the top left corner
142 # of screen.
143 widget.hide()
144 dockareas = self._dockareas
145 if isinstance(widget, ToolBar):
146 dockareas = self._toolbarareas
147 if dockarea == DOCKAREA['left'] or dockarea == DOCKAREA['right']:
148 widget.setOrientation(ToolBar.ORIENTATION["Vertical"])
149 elif dockarea == DOCKAREA['top'] or dockarea == DOCKAREA['bottom']:
150 widget.setOrientation(ToolBar.ORIENTATION["Horizontal"])
151
152 if isinstance(widget, ToolBar):
153 if dockarea == DOCKAREA['left']:
154 widget.setDocked(True)
155 dockareas[DOCKAREA['left']].addChild(widget)
156 dockareas[DOCKAREA['left']].adaptLayout()
157
158 elif dockarea == DOCKAREA['right']:
159 widget.setDocked(True)
160 dockareas[DOCKAREA['right']].addChild(widget)
161 dockareas[DOCKAREA['right']].adaptLayout()
162
163 elif dockarea == DOCKAREA['top']:
164 widget.setDocked(True)
165 dockareas[DOCKAREA['top']].addChild(widget)
166 dockareas[DOCKAREA['top']].adaptLayout()
167
168 elif dockarea == DOCKAREA['bottom']:
169 widget.setDocked(True)
170 dockareas[DOCKAREA['bottom']].addChild(widget)
171 dockareas[DOCKAREA['bottom']].adaptLayout()
172
173 else:
174 print "Invalid dockarea"
175 else:
176 if dockarea == DOCKAREA['left']:
177 dockareas[DOCKAREA['left']].dockChild(widget, x, y)
178
179 elif dockarea == DOCKAREA['right']:
180 dockareas[DOCKAREA['right']].dockChild(widget, x, y)
181
182 elif dockarea == DOCKAREA['top']:
183 dockareas[DOCKAREA['top']].dockChild(widget, x, y)
184
185 elif dockarea == DOCKAREA['bottom']:
186 dockareas[DOCKAREA['bottom']].dockChild(widget, x, y)
187
188 else:
189 print "Invalid dockarea"
190
191 def getToolbarAreaAt(self, x, y, mark=False):
192 if self.dockareamarker is None:
193 self.dockareamarker = pychan.widgets.Container()
194 self.dockareamarker.base_color = fife.Color(200, 0, 0, 100)
195 if mark is False:
196 self.dockareamarker.hide()
197
198 # Mouse wasn't over any dockwidgets. See if it is near any edge of the screen instead
199 if x <= self._toolbarareas["left"].getAbsolutePos()[0]+10:
200 if mark:
201 self.dockareamarker.position = self._toolbarareas["left"].getAbsolutePos()
202 self.dockareamarker.size = (10, self._toolbarareas["left"].height)
203 self.dockareamarker.show()
204 return DOCKAREA["left"]
205
206 elif x >= self._toolbarareas["right"].getAbsolutePos()[0]-10:
207 if mark:
208 self.dockareamarker.position = self._toolbarareas["right"].getAbsolutePos()
209 self.dockareamarker.size = (10, self._toolbarareas["right"].height)
210 self.dockareamarker.x -= 10
211 self.dockareamarker.show()
212 return DOCKAREA["right"]
213
214 elif y <= self._toolbarareas["top"].getAbsolutePos()[1]+10:
215 if mark:
216 self.dockareamarker.position = self._toolbarareas["top"].getAbsolutePos()
217 self.dockareamarker.size = (self._toolbarareas["top"].width, 10)
218 self.dockareamarker.show()
219 return DOCKAREA["top"]
220
221 elif y >= self._toolbarareas["bottom"].getAbsolutePos()[1]-10:
222 if mark:
223 self.dockareamarker.position = self._toolbarareas["bottom"].getAbsolutePos()
224 self.dockareamarker.y -= 10
225 self.dockareamarker.size = (self._toolbarareas["bottom"].width, 10)
226 self.dockareamarker.show()
227 return DOCKAREA["bottom"]
228
229 if mark is True:
230 self.dockareamarker.hide()
231 return None
232
233 def getDockAreaAt(self, x, y, mark=False):
234 if self.dockareamarker is None:
235 self.dockareamarker = pychan.widgets.Container()
236 self.dockareamarker.base_color = fife.Color(200, 0, 0, 100)
237 if mark is False:
238 self.dockareamarker.hide()
239
240 for key in DOCKAREA:
241 side = DOCKAREA[key]
242
243 dockarea = self._dockareas[side]
244 #absX, absY = dockarea.getAbsolutePos()
245 #if absX <= x and absY <= y \
246 # and absX+dockarea.width >= x and absX+dockarea.height >= y:
247 # return side
248 placeIn, placeBefore, placeAfter = dockarea.getDockLocation(x, y)
249 if placeIn or placeBefore or placeAfter:
250 if mark is True:
251 if placeIn:
252 self.dockareamarker.position = placeIn.getAbsolutePos()
253 self.dockareamarker.size = placeIn.size
254 elif placeBefore:
255 self.dockareamarker.position = placeBefore.getAbsolutePos()
256 if side == "left" or side == "right":
257 self.dockareamarker.size = (placeBefore.width, 10)
258 else:
259 self.dockareamarker.size = (10, placeBefore.height)
260 elif placeAfter:
261 self.dockareamarker.position = placeAfter.getAbsolutePos()
262
263 if side == "left" or side == "right":
264 self.dockareamarker.size = (placeAfter.width, 10)
265 self.dockareamarker.y += placeAfter.height-10
266 else:
267 self.dockareamarker.size = (10, placeAfter.height)
268 self.dockareamarker.x += placeAfter.width-10
269
270 self.dockareamarker.show()
271 return side
272
273
274 # Mouse wasn't over any dockwidgets. See if it is near any edge of the screen instead
275 if x <= self._dockareas["left"].getAbsolutePos()[0]+10:
276 if mark:
277 self.dockareamarker.position = self._dockareas["left"].getAbsolutePos()
278 self.dockareamarker.size = (10, self._dockareas["left"].height)
279 self.dockareamarker.show()
280 return DOCKAREA["left"]
281
282 elif x >= self._dockareas["right"].getAbsolutePos()[0]-10:
283 if mark:
284 self.dockareamarker.position = self._dockareas["right"].getAbsolutePos()
285 self.dockareamarker.size = (10, self._dockareas["right"].height)
286 self.dockareamarker.x -= 10
287 self.dockareamarker.show()
288 return DOCKAREA["right"]
289
290 elif y <= self._dockareas["top"].getAbsolutePos()[1]+10:
291 if mark:
292 self.dockareamarker.position = self._dockareas["top"].getAbsolutePos()
293 self.dockareamarker.size = (self._dockareas["top"].width, 10)
294 self.dockareamarker.show()
295 return DOCKAREA["top"]
296
297 elif y >= self._dockareas["bottom"].getAbsolutePos()[1]-10:
298 if mark:
299 self.dockareamarker.position = self._dockareas["bottom"].getAbsolutePos()
300 self.dockareamarker.y -= 10
301 self.dockareamarker.size = (self._dockareas["bottom"].width, 10)
302 self.dockareamarker.show()
303 return DOCKAREA["bottom"]
304
305 if mark is True:
306 self.dockareamarker.hide()
307 return None