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