Mercurial > fife-parpg
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 |