]>
Commit | Line | Data |
---|---|---|
1 | #---------------------------------------------------------------------------- | |
2 | # Name: floatbar.py | |
3 | # Purpose: Contains floating toolbar class | |
4 | # | |
5 | # Author: Bryn Keller | |
6 | # | |
7 | # Created: 10/4/99 | |
8 | #---------------------------------------------------------------------------- | |
9 | # 12/02/2003 - Jeff Grimmett (grimmtooth@softhome.net) | |
10 | # | |
11 | # o 2.5 Compatability changes | |
12 | # | |
13 | # 12/07/2003 - Jeff Grimmett (grimmtooth@softhome.net) | |
14 | # | |
15 | # o Added deprecation warning. | |
16 | # | |
17 | # 12/18/2003 - Jeff Grimmett (grimmtooth@softhome.net) | |
18 | # | |
19 | # o wxFloatBar -> FloatBar | |
20 | # | |
21 | ||
22 | """ | |
23 | NOTE: This module is *not* supported in any way. Use it however you | |
24 | wish, but be warned that dealing with any consequences is | |
25 | entirly up to you. | |
26 | --Robin | |
27 | """ | |
28 | ||
29 | import warnings | |
30 | import wx | |
31 | ||
32 | warningmsg = r"""\ | |
33 | ||
34 | ################################################\ | |
35 | # This module is not supported in any way! | | |
36 | # | | |
37 | # See cource code for wx.lib.floatbar for more | | |
38 | # information. | | |
39 | ################################################/ | |
40 | ||
41 | """ | |
42 | ||
43 | warnings.warn(warningmsg, DeprecationWarning, stacklevel=2) | |
44 | ||
45 | if wx.Platform == '__WXGTK__': | |
46 | # | |
47 | # For wxGTK all we have to do is set the wxTB_DOCKABLE flag | |
48 | # | |
49 | class FloatBar(wx.ToolBar): | |
50 | def __init__(self, parent, ID, | |
51 | pos = wx.DefaultPosition, | |
52 | size = wx.DefaultSize, | |
53 | style = 0, | |
54 | name = 'toolbar'): | |
55 | wx.ToolBar.__init__(self, parent, ID, pos, size, | |
56 | style|wx.TB_DOCKABLE, name) | |
57 | ||
58 | # these other methods just become no-ops | |
59 | def SetFloatable(self, float): | |
60 | pass | |
61 | ||
62 | def IsFloating(self): | |
63 | return 1 | |
64 | ||
65 | def GetTitle(self): | |
66 | return "" | |
67 | ||
68 | ||
69 | def SetTitle(self, title): | |
70 | pass | |
71 | ||
72 | else: | |
73 | _DOCKTHRESHOLD = 25 | |
74 | ||
75 | class FloatBar(wx.ToolBar): | |
76 | """ | |
77 | wxToolBar subclass which can be dragged off its frame and later | |
78 | replaced there. Drag on the toolbar to release it, close it like | |
79 | a normal window to make it return to its original | |
80 | position. Programmatically, call SetFloatable(True) and then | |
81 | Float(True) to float, Float(False) to dock. | |
82 | """ | |
83 | ||
84 | def __init__(self,*_args,**_kwargs): | |
85 | """ | |
86 | In addition to the usual arguments, wxFloatBar accepts keyword | |
87 | args of: title(string): the title that should appear on the | |
88 | toolbar's frame when it is floating. floatable(bool): whether | |
89 | user actions (i.e., dragging) can float the toolbar or not. | |
90 | """ | |
91 | args = (self,) + _args | |
92 | apply(wx.ToolBar.__init__, args, _kwargs) | |
93 | if _kwargs.has_key('floatable'): | |
94 | self.floatable = _kwargs['floatable'] | |
95 | assert type(self.floatable) == type(0) | |
96 | else: | |
97 | self.floatable = 0 | |
98 | self.floating = 0 | |
99 | if _kwargs.has_key('title'): | |
100 | self.title = _kwargs['title'] | |
101 | assert type(self.title) == type("") | |
102 | else: | |
103 | self.title = "" | |
104 | self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse) | |
105 | self.parentframe = args[1] | |
106 | ||
107 | ||
108 | def IsFloatable(self): | |
109 | return self.floatable | |
110 | ||
111 | ||
112 | def SetFloatable(self, float): | |
113 | self.floatable = float | |
114 | #Find the size of a title bar. | |
115 | if not hasattr(self, 'titleheight'): | |
116 | test = wx.MiniFrame(None, -1, "TEST") | |
117 | test.SetClientSize((0,0)) | |
118 | self.titleheight = test.GetSize()[1] | |
119 | test.Destroy() | |
120 | ||
121 | ||
122 | def IsFloating(self): | |
123 | return self.floating | |
124 | ||
125 | ||
126 | def Realize(self): | |
127 | wx.ToolBar.Realize(self) | |
128 | ||
129 | ||
130 | def GetTitle(self): | |
131 | return self.title | |
132 | ||
133 | ||
134 | def SetTitle(self, title): | |
135 | print 'SetTitle', title | |
136 | self.title = title | |
137 | if self.IsFloating(): | |
138 | self.floatframe.SetTitle(self.title) | |
139 | ||
140 | ||
141 | ## def GetHome(self): | |
142 | ## """ | |
143 | ## Returns the frame which this toolbar will return to when | |
144 | ## docked, or the parent if currently docked. | |
145 | ## """ | |
146 | ## if hasattr(self, 'parentframe'): | |
147 | ## return self.parentframe | |
148 | ## else: | |
149 | ## return (self.GetParent()) | |
150 | ||
151 | ||
152 | ## def SetHome(self, frame): | |
153 | ## """ | |
154 | ## Called when docked, this will remove the toolbar from its | |
155 | ## current frame and attach it to another. If called when | |
156 | ## floating, it will dock to the frame specified when the toolbar | |
157 | ## window is closed. | |
158 | ## """ | |
159 | ## if self.IsFloating(): | |
160 | ## self.parentframe = frame | |
161 | ## self.floatframe.Reparent(frame) | |
162 | ## else: | |
163 | ## parent = self.GetParent() | |
164 | ## self.Reparent(frame) | |
165 | ## parent.SetToolBar(None) | |
166 | ## size = parent.GetSize() | |
167 | ## parent.SetSize(wxSize(0,0)) | |
168 | ## parent.SetSize(size) | |
169 | ## frame.SetToolBar(self) | |
170 | ## size = frame.GetSize() | |
171 | ## frame.SetSize(wxSize(0,0)) | |
172 | ## frame.SetSize(size) | |
173 | ||
174 | ||
175 | def Float(self, bool): | |
176 | "Floats or docks the toolbar programmatically." | |
177 | if bool: | |
178 | self.parentframe = self.GetParent() | |
179 | print self.title | |
180 | if self.title: | |
181 | useStyle = wx.DEFAULT_FRAME_STYLE | |
182 | else: | |
183 | useStyle = wx.THICK_FRAME | |
184 | self.floatframe = wx.MiniFrame(self.parentframe, -1, self.title, | |
185 | style = useStyle) | |
186 | ||
187 | self.Reparent(self.floatframe) | |
188 | self.parentframe.SetToolBar(None) | |
189 | self.floating = 1 | |
190 | psize = self.parentframe.GetSize() | |
191 | self.parentframe.SetSize((0,0)) | |
192 | self.parentframe.SetSize(psize) | |
193 | self.floatframe.SetToolBar(self) | |
194 | self.oldcolor = self.GetBackgroundColour() | |
195 | ||
196 | w = psize[0] | |
197 | h = self.GetSize()[1] | |
198 | if self.title: | |
199 | h = h + self.titleheight | |
200 | self.floatframe.SetSize((w,h)) | |
201 | self.floatframe.SetClientSize(self.GetSize()) | |
202 | newpos = self.parentframe.GetPosition() | |
203 | newpos.y = newpos.y + _DOCKTHRESHOLD * 2 | |
204 | self.floatframe.SetPosition(newpos) | |
205 | self.floatframe.Show(True) | |
206 | ||
207 | self.floatframe.Bind(wx.EVT_CLOSE, self.OnDock) | |
208 | #self.floatframe.Bind(wx.EVT_MOVE, self.OnMove) | |
209 | ||
210 | else: | |
211 | self.Reparent(self.parentframe) | |
212 | self.parentframe.SetToolBar(self) | |
213 | self.floating = 0 | |
214 | self.floatframe.SetToolBar(None) | |
215 | self.floatframe.Destroy() | |
216 | size = self.parentframe.GetSize() | |
217 | self.parentframe.SetSize((0,0)) | |
218 | self.parentframe.SetSize(size) | |
219 | self.SetBackgroundColour(self.oldcolor) | |
220 | ||
221 | ||
222 | def OnDock(self, e): | |
223 | self.Float(0) | |
224 | if hasattr(self, 'oldpos'): | |
225 | del self.oldpos | |
226 | ||
227 | ||
228 | def OnMove(self, e): | |
229 | homepos = self.parentframe.ClientToScreen((0,0)) | |
230 | floatpos = self.floatframe.GetPosition() | |
231 | if (abs(homepos.x - floatpos.x) < _DOCKTHRESHOLD and | |
232 | abs(homepos.y - floatpos.y) < _DOCKTHRESHOLD): | |
233 | self.Float(0) | |
234 | #homepos = self.parentframe.GetPositionTuple() | |
235 | #homepos = homepos[0], homepos[1] + self.titleheight | |
236 | #floatpos = self.floatframe.GetPositionTuple() | |
237 | #if abs(homepos[0] - floatpos[0]) < 35 and abs(homepos[1] - floatpos[1]) < 35: | |
238 | # self._SetFauxBarVisible(True) | |
239 | #else: | |
240 | # self._SetFauxBarVisible(False) | |
241 | ||
242 | ||
243 | def OnMouse(self, e): | |
244 | if not self.IsFloatable(): | |
245 | e.Skip() | |
246 | return | |
247 | ||
248 | if e.ButtonDClick(1) or e.ButtonDClick(2) or e.ButtonDClick(3) or e.ButtonDown() or e.ButtonUp(): | |
249 | e.Skip() | |
250 | ||
251 | if e.ButtonDown(): | |
252 | self.CaptureMouse() | |
253 | self.oldpos = (e.GetX(), e.GetY()) | |
254 | ||
255 | if e.Entering(): | |
256 | self.oldpos = (e.GetX(), e.GetY()) | |
257 | ||
258 | if e.ButtonUp(): | |
259 | self.ReleaseMouse() | |
260 | if self.IsFloating(): | |
261 | homepos = self.parentframe.ClientToScreen((0,0)) | |
262 | floatpos = self.floatframe.GetPosition() | |
263 | if (abs(homepos.x - floatpos.x) < _DOCKTHRESHOLD and | |
264 | abs(homepos.y - floatpos.y) < _DOCKTHRESHOLD): | |
265 | self.Float(0) | |
266 | return | |
267 | ||
268 | if e.Dragging(): | |
269 | if not self.IsFloating(): | |
270 | self.Float(True) | |
271 | self.oldpos = (e.GetX(), e.GetY()) | |
272 | else: | |
273 | if hasattr(self, 'oldpos'): | |
274 | loc = self.floatframe.GetPosition() | |
275 | pt = (loc.x - (self.oldpos[0]-e.GetX()), loc.y - (self.oldpos[1]-e.GetY())) | |
276 | self.floatframe.Move(pt) | |
277 | ||
278 | ||
279 | ||
280 | def _SetFauxBarVisible(self, vis): | |
281 | return | |
282 | if vis: | |
283 | if self.parentframe.GetToolBar() == None: | |
284 | if not hasattr(self, 'nullbar'): | |
285 | self.nullbar = wx.ToolBar(self.parentframe, -1) | |
286 | print "Adding fauxbar." | |
287 | self.nullbar.Reparent(self.parentframe) | |
288 | print "Reparented." | |
289 | self.parentframe.SetToolBar(self.nullbar) | |
290 | print "Set toolbar" | |
291 | col = wx.NamedColour("GREY") | |
292 | self.nullbar.SetBackgroundColour(col) | |
293 | print "Set color" | |
294 | size = self.parentframe.GetSize() | |
295 | self.parentframe.SetSize((0,0)) | |
296 | self.parentframe.SetSize(size) | |
297 | print "Set size" | |
298 | else: | |
299 | print self.parentframe.GetToolBar() | |
300 | else: | |
301 | if self.parentframe.GetToolBar() != None: | |
302 | print "Removing fauxbar" | |
303 | self.nullbar.Reparent(self.floatframe) | |
304 | self.parentframe.SetToolBar(None) | |
305 | size = self.parentframe.GetSize() | |
306 | self.parentframe.SetSize((0,0)) | |
307 | self.parentframe.SetSize(size) | |
308 | ||
309 | ||
310 |