Mercurial > fife-parpg
comparison 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 |
comparison
equal
deleted
inserted
replaced
254:10b5f7f36dd4 | 255:51cc05d862f2 |
---|---|
1 import pychan | |
2 from menubar import MenuBar, Menu | |
3 from panel import Panel | |
4 from dockarea import DockArea | |
5 import toolbar | |
6 from toolbar import ToolBar | |
7 from statusbar import StatusBar | |
8 import fife | |
9 | |
10 DOCKAREA = { | |
11 'left' : 'left', | |
12 'right' : 'right', | |
13 'top' : 'top', | |
14 'bottom': 'bottom' | |
15 } | |
16 | |
17 class MainWindow(object): | |
18 | |
19 def __init__(self, *args, **kwargs): | |
20 self._toolbar = None | |
21 self._menubar = None | |
22 self._statusbar = None | |
23 | |
24 self._rootwidget = None | |
25 self._centralwidget = None | |
26 self._dockareas = { | |
27 DOCKAREA['left']:None, | |
28 DOCKAREA['right']:None, | |
29 DOCKAREA['top']:None, | |
30 DOCKAREA['bottom']:None | |
31 } | |
32 | |
33 self._toolbarareas = { | |
34 DOCKAREA['left']:None, | |
35 DOCKAREA['right']:None, | |
36 DOCKAREA['top']:None, | |
37 DOCKAREA['bottom']:None | |
38 } | |
39 | |
40 self.dockareamarker = None | |
41 | |
42 def initGui(self, screen_width, screen_height): | |
43 bar_height = 30 | |
44 | |
45 self._statusbar = StatusBar(text=u"", panel_size=bar_height) | |
46 self._toolbar = ToolBar(title=u"Toolbar", button_style=0) | |
47 self._menubar = MenuBar(min_size=(screen_width, bar_height), position=(0, 0)) | |
48 | |
49 # Set up root widget | |
50 self._rootwidget = pychan.widgets.VBox(padding=0, vexpand=1, hexpand=1) | |
51 self._rootwidget.min_size = \ | |
52 self._rootwidget.max_size = (screen_width, screen_height) | |
53 self._rootwidget.opaque = False | |
54 | |
55 self._dockareas[DOCKAREA['left']] = DockArea("left") | |
56 self._dockareas[DOCKAREA['right']] = DockArea("right") | |
57 self._dockareas[DOCKAREA['top']] = DockArea("top") | |
58 self._dockareas[DOCKAREA['bottom']] = DockArea("bottom") | |
59 | |
60 self._toolbarareas[DOCKAREA['left']] = pychan.widgets.VBox(margins=(0,0,0,0)) | |
61 self._toolbarareas[DOCKAREA['right']] = pychan.widgets.VBox(margins=(0,0,0,0)) | |
62 self._toolbarareas[DOCKAREA['top']] = pychan.widgets.HBox(margins=(0,0,0,0)) | |
63 self._toolbarareas[DOCKAREA['bottom']] = pychan.widgets.HBox(margins=(0,0,0,0)) | |
64 | |
65 # This is where the map will be displayed | |
66 self._centralwidget = pychan.widgets.VBox(vexpand=1, hexpand=1) | |
67 self._centralwidget.opaque = False | |
68 | |
69 middle = pychan.widgets.HBox(padding=0, vexpand=1, hexpand=1) | |
70 middle.opaque = False | |
71 | |
72 # Pychan bug? Adding a spacer instead of a container creates | |
73 # a gap after the right dockarea | |
74 middle.addChild(self._toolbarareas['left']) | |
75 middle.addChild(self._dockareas['left']) | |
76 middle.addChild(self._centralwidget) | |
77 #middle.addSpacer(pychan.widgets.Spacer()) | |
78 middle.addChild(self._dockareas['right']) | |
79 middle.addChild(self._toolbarareas['right']) | |
80 | |
81 self._rootwidget.addChild(self._menubar) | |
82 #self._rootwidget.addChild(self._toolbar) | |
83 self._rootwidget.addChild(self._toolbarareas['top']) | |
84 self._rootwidget.addChild(self._dockareas['top']) | |
85 self._rootwidget.addChild(middle) | |
86 self._rootwidget.addChild(self._dockareas['bottom']) | |
87 self._rootwidget.addChild(self._toolbarareas['bottom']) | |
88 self._rootwidget.addChild(self._statusbar) | |
89 | |
90 self._toolbar.setDocked(True) | |
91 self.dockWidgetTo(self._toolbar, "top") | |
92 | |
93 self._rootwidget.show() | |
94 | |
95 def getCentralWidget(self): | |
96 return self._centralwidget | |
97 | |
98 def getStatusBar(self): | |
99 return self._statusbar | |
100 | |
101 def getMenuBar(self): | |
102 return self._menubar | |
103 | |
104 def getToolBar(self): | |
105 return self._toolbar | |
106 | |
107 def dockWidgetTo(self, widget, dockarea, x=-1, y=-1): | |
108 if isinstance(widget, pychan.widgets.Widget) is False: | |
109 print "Argument is not a valid widget" | |
110 return | |
111 | |
112 if widget.parent: | |
113 widgetParent = widget.parent | |
114 widgetParent.removeChild(widget) | |
115 widgetParent.adaptLayout() | |
116 | |
117 # We must hide the widget before adding it to the dockarea, | |
118 # or we will get a duplicate copy of the widget in the top left corner | |
119 # of screen. | |
120 widget.hide() | |
121 dockareas = self._dockareas | |
122 if isinstance(widget, ToolBar): | |
123 dockareas = self._toolbarareas | |
124 if dockarea == DOCKAREA['left'] or dockarea == DOCKAREA['right']: | |
125 widget.setOrientation(ToolBar.ORIENTATION["Vertical"]) | |
126 elif dockarea == DOCKAREA['top'] or dockarea == DOCKAREA['bottom']: | |
127 widget.setOrientation(ToolBar.ORIENTATION["Horizontal"]) | |
128 | |
129 if isinstance(widget, ToolBar): | |
130 if dockarea == DOCKAREA['left']: | |
131 widget.setDocked(True) | |
132 dockareas[DOCKAREA['left']].addChild(widget) | |
133 dockareas[DOCKAREA['left']].adaptLayout() | |
134 | |
135 elif dockarea == DOCKAREA['right']: | |
136 widget.setDocked(True) | |
137 dockareas[DOCKAREA['right']].addChild(widget) | |
138 dockareas[DOCKAREA['right']].adaptLayout() | |
139 | |
140 elif dockarea == DOCKAREA['top']: | |
141 widget.setDocked(True) | |
142 dockareas[DOCKAREA['top']].addChild(widget) | |
143 dockareas[DOCKAREA['top']].adaptLayout() | |
144 | |
145 elif dockarea == DOCKAREA['bottom']: | |
146 widget.setDocked(True) | |
147 dockareas[DOCKAREA['bottom']].addChild(widget) | |
148 dockareas[DOCKAREA['bottom']].adaptLayout() | |
149 | |
150 else: | |
151 print "Invalid dockarea" | |
152 else: | |
153 if dockarea == DOCKAREA['left']: | |
154 dockareas[DOCKAREA['left']].dockChild(widget, x, y) | |
155 | |
156 elif dockarea == DOCKAREA['right']: | |
157 dockareas[DOCKAREA['right']].dockChild(widget, x, y) | |
158 | |
159 elif dockarea == DOCKAREA['top']: | |
160 dockareas[DOCKAREA['top']].dockChild(widget, x, y) | |
161 | |
162 elif dockarea == DOCKAREA['bottom']: | |
163 dockareas[DOCKAREA['bottom']].dockChild(widget, x, y) | |
164 | |
165 else: | |
166 print "Invalid dockarea" | |
167 | |
168 def getToolbarAreaAt(self, x, y, mark=False): | |
169 if self.dockareamarker is None: | |
170 self.dockareamarker = pychan.widgets.Container() | |
171 self.dockareamarker.base_color = fife.Color(200, 0, 0, 100) | |
172 if mark is False: | |
173 self.dockareamarker.hide() | |
174 | |
175 # Mouse wasn't over any dockwidgets. See if it is near any edge of the screen instead | |
176 if x <= self._toolbarareas["left"].getAbsolutePos()[0]+10: | |
177 if mark: | |
178 self.dockareamarker.position = self._toolbarareas["left"].getAbsolutePos() | |
179 self.dockareamarker.size = (10, self._toolbarareas["left"].height) | |
180 self.dockareamarker.show() | |
181 return DOCKAREA["left"] | |
182 | |
183 elif x >= self._toolbarareas["right"].getAbsolutePos()[0]-10: | |
184 if mark: | |
185 self.dockareamarker.position = self._toolbarareas["right"].getAbsolutePos() | |
186 self.dockareamarker.size = (10, self._toolbarareas["right"].height) | |
187 self.dockareamarker.x -= 10 | |
188 self.dockareamarker.show() | |
189 return DOCKAREA["right"] | |
190 | |
191 elif y <= self._toolbarareas["top"].getAbsolutePos()[1]+10: | |
192 if mark: | |
193 self.dockareamarker.position = self._toolbarareas["top"].getAbsolutePos() | |
194 self.dockareamarker.size = (self._toolbarareas["top"].width, 10) | |
195 self.dockareamarker.show() | |
196 return DOCKAREA["top"] | |
197 | |
198 elif y >= self._toolbarareas["bottom"].getAbsolutePos()[1]-10: | |
199 if mark: | |
200 self.dockareamarker.position = self._toolbarareas["bottom"].getAbsolutePos() | |
201 self.dockareamarker.y -= 10 | |
202 self.dockareamarker.size = (self._toolbarareas["bottom"].width, 10) | |
203 self.dockareamarker.show() | |
204 return DOCKAREA["bottom"] | |
205 | |
206 if mark is True: | |
207 self.dockareamarker.hide() | |
208 return None | |
209 | |
210 def getDockAreaAt(self, x, y, mark=False): | |
211 if self.dockareamarker is None: | |
212 self.dockareamarker = pychan.widgets.Container() | |
213 self.dockareamarker.base_color = fife.Color(200, 0, 0, 100) | |
214 if mark is False: | |
215 self.dockareamarker.hide() | |
216 | |
217 for key in DOCKAREA: | |
218 side = DOCKAREA[key] | |
219 | |
220 dockarea = self._dockareas[side] | |
221 #absX, absY = dockarea.getAbsolutePos() | |
222 #if absX <= x and absY <= y \ | |
223 # and absX+dockarea.width >= x and absX+dockarea.height >= y: | |
224 # return side | |
225 placeIn, placeBefore, placeAfter = dockarea.getDockLocation(x, y) | |
226 if placeIn or placeBefore or placeAfter: | |
227 if mark is True: | |
228 if placeIn: | |
229 self.dockareamarker.position = placeIn.getAbsolutePos() | |
230 self.dockareamarker.size = placeIn.size | |
231 elif placeBefore: | |
232 self.dockareamarker.position = placeBefore.getAbsolutePos() | |
233 if side == "left" or side == "right": | |
234 self.dockareamarker.size = (placeBefore.width, 10) | |
235 else: | |
236 self.dockareamarker.size = (10, placeBefore.height) | |
237 elif placeAfter: | |
238 self.dockareamarker.position = placeAfter.getAbsolutePos() | |
239 | |
240 if side == "left" or side == "right": | |
241 self.dockareamarker.size = (placeAfter.width, 10) | |
242 self.dockareamarker.y += placeAfter.height-10 | |
243 else: | |
244 self.dockareamarker.size = (10, placeAfter.height) | |
245 self.dockareamarker.x += placeAfter.width-10 | |
246 | |
247 self.dockareamarker.show() | |
248 return side | |
249 | |
250 | |
251 # Mouse wasn't over any dockwidgets. See if it is near any edge of the screen instead | |
252 if x <= self._dockareas["left"].getAbsolutePos()[0]+10: | |
253 if mark: | |
254 self.dockareamarker.position = self._dockareas["left"].getAbsolutePos() | |
255 self.dockareamarker.size = (10, self._dockareas["left"].height) | |
256 self.dockareamarker.show() | |
257 return DOCKAREA["left"] | |
258 | |
259 elif x >= self._dockareas["right"].getAbsolutePos()[0]-10: | |
260 if mark: | |
261 self.dockareamarker.position = self._dockareas["right"].getAbsolutePos() | |
262 self.dockareamarker.size = (10, self._dockareas["right"].height) | |
263 self.dockareamarker.x -= 10 | |
264 self.dockareamarker.show() | |
265 return DOCKAREA["right"] | |
266 | |
267 elif y <= self._dockareas["top"].getAbsolutePos()[1]+10: | |
268 if mark: | |
269 self.dockareamarker.position = self._dockareas["top"].getAbsolutePos() | |
270 self.dockareamarker.size = (self._dockareas["top"].width, 10) | |
271 self.dockareamarker.show() | |
272 return DOCKAREA["top"] | |
273 | |
274 elif y >= self._dockareas["bottom"].getAbsolutePos()[1]-10: | |
275 if mark: | |
276 self.dockareamarker.position = self._dockareas["bottom"].getAbsolutePos() | |
277 self.dockareamarker.y -= 10 | |
278 self.dockareamarker.size = (self._dockareas["bottom"].width, 10) | |
279 self.dockareamarker.show() | |
280 return DOCKAREA["bottom"] | |
281 | |
282 if mark is True: | |
283 self.dockareamarker.hide() | |
284 return None |