git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24942 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			311 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			311 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#----------------------------------------------------------------------------
 | 
						|
# Name:         floatbar.py
 | 
						|
# Purpose:      Contains floating toolbar class
 | 
						|
#
 | 
						|
# Author:       Bryn Keller
 | 
						|
#
 | 
						|
# Created:      10/4/99
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
# 12/02/2003 - Jeff Grimmett (grimmtooth@softhome.net)
 | 
						|
#
 | 
						|
# o 2.5 Compatability changes
 | 
						|
#
 | 
						|
# 12/07/2003 - Jeff Grimmett (grimmtooth@softhome.net)
 | 
						|
#
 | 
						|
# o Added deprecation warning.
 | 
						|
#
 | 
						|
# 12/18/2003 - Jeff Grimmett (grimmtooth@softhome.net)
 | 
						|
#
 | 
						|
# o wxFloatBar -> FloatBar
 | 
						|
#
 | 
						|
 | 
						|
"""
 | 
						|
NOTE: This module is *not* supported in any way.  Use it however you
 | 
						|
      wish, but be warned that dealing with any consequences is
 | 
						|
      entirly up to you.
 | 
						|
      --Robin
 | 
						|
"""
 | 
						|
 | 
						|
import  warnings
 | 
						|
import  wx
 | 
						|
 | 
						|
warningmsg = r"""\
 | 
						|
 | 
						|
################################################\
 | 
						|
# This module is not supported in any way!      |
 | 
						|
#                                               |
 | 
						|
# See cource code for wx.lib.floatbar for more  |
 | 
						|
# information.                                  |
 | 
						|
################################################/
 | 
						|
 | 
						|
"""
 | 
						|
 | 
						|
warnings.warn(warningmsg, DeprecationWarning, stacklevel=2)
 | 
						|
    
 | 
						|
if wx.Platform == '__WXGTK__':
 | 
						|
    #
 | 
						|
    # For wxGTK all we have to do is set the wxTB_DOCKABLE flag
 | 
						|
    #
 | 
						|
    class FloatBar(wx.ToolBar):
 | 
						|
        def __init__(self, parent, ID,
 | 
						|
                     pos = wx.DefaultPosition,
 | 
						|
                     size = wx.DefaultSize,
 | 
						|
                     style = 0,
 | 
						|
                     name = 'toolbar'):
 | 
						|
            wx.ToolBar.__init__(self, parent, ID, pos, size,
 | 
						|
                               style|wx.TB_DOCKABLE, name)
 | 
						|
 | 
						|
        # these other methods just become no-ops
 | 
						|
        def SetFloatable(self, float):
 | 
						|
            pass
 | 
						|
 | 
						|
        def IsFloating(self):
 | 
						|
            return 1
 | 
						|
 | 
						|
        def GetTitle(self):
 | 
						|
            return ""
 | 
						|
 | 
						|
 | 
						|
        def SetTitle(self, title):
 | 
						|
            pass
 | 
						|
 | 
						|
else:
 | 
						|
    _DOCKTHRESHOLD = 25
 | 
						|
 | 
						|
    class FloatBar(wx.ToolBar):
 | 
						|
        """
 | 
						|
        wxToolBar subclass which can be dragged off its frame and later
 | 
						|
        replaced there.  Drag on the toolbar to release it, close it like
 | 
						|
        a normal window to make it return to its original
 | 
						|
        position. Programmatically, call SetFloatable(True) and then
 | 
						|
        Float(True) to float, Float(False) to dock.
 | 
						|
        """
 | 
						|
 | 
						|
        def __init__(self,*_args,**_kwargs):
 | 
						|
            """
 | 
						|
            In addition to the usual arguments, wxFloatBar accepts keyword
 | 
						|
            args of: title(string): the title that should appear on the
 | 
						|
            toolbar's frame when it is floating.  floatable(bool): whether
 | 
						|
            user actions (i.e., dragging) can float the toolbar or not.
 | 
						|
            """
 | 
						|
            args = (self,) + _args
 | 
						|
            apply(wx.ToolBar.__init__, args, _kwargs)
 | 
						|
            if _kwargs.has_key('floatable'):
 | 
						|
                self.floatable = _kwargs['floatable']
 | 
						|
                assert type(self.floatable) == type(0)
 | 
						|
            else:
 | 
						|
                self.floatable = 0
 | 
						|
            self.floating = 0
 | 
						|
            if _kwargs.has_key('title'):
 | 
						|
                self.title = _kwargs['title']
 | 
						|
                assert type(self.title) == type("")
 | 
						|
            else:
 | 
						|
                self.title = ""
 | 
						|
            self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
 | 
						|
            self.parentframe = args[1]
 | 
						|
 | 
						|
 | 
						|
        def IsFloatable(self):
 | 
						|
            return self.floatable
 | 
						|
 | 
						|
 | 
						|
        def SetFloatable(self, float):
 | 
						|
            self.floatable = float
 | 
						|
            #Find the size of a title bar.
 | 
						|
            if not hasattr(self, 'titleheight'):
 | 
						|
                test = wx.MiniFrame(None, -1, "TEST")
 | 
						|
                test.SetClientSize((0,0))
 | 
						|
                self.titleheight = test.GetSize()[1]
 | 
						|
                test.Destroy()
 | 
						|
 | 
						|
 | 
						|
        def IsFloating(self):
 | 
						|
            return self.floating
 | 
						|
 | 
						|
 | 
						|
        def Realize(self):
 | 
						|
            wx.ToolBar.Realize(self)
 | 
						|
 | 
						|
 | 
						|
        def GetTitle(self):
 | 
						|
            return self.title
 | 
						|
 | 
						|
 | 
						|
        def SetTitle(self, title):
 | 
						|
            print 'SetTitle', title
 | 
						|
            self.title = title
 | 
						|
            if self.IsFloating():
 | 
						|
                self.floatframe.SetTitle(self.title)
 | 
						|
 | 
						|
 | 
						|
    ##     def GetHome(self):
 | 
						|
    ##         """
 | 
						|
    ##         Returns the frame which this toolbar will return to when
 | 
						|
    ##         docked, or the parent if currently docked.
 | 
						|
    ##         """
 | 
						|
    ##         if hasattr(self, 'parentframe'):
 | 
						|
    ##             return self.parentframe
 | 
						|
    ##         else:
 | 
						|
    ##             return (self.GetParent())
 | 
						|
 | 
						|
 | 
						|
    ##     def SetHome(self, frame):
 | 
						|
    ##         """
 | 
						|
    ##         Called when docked, this will remove the toolbar from its
 | 
						|
    ##         current frame and attach it to another.  If called when
 | 
						|
    ##         floating, it will dock to the frame specified when the toolbar
 | 
						|
    ##         window is closed.
 | 
						|
    ##         """
 | 
						|
    ##         if self.IsFloating():
 | 
						|
    ##             self.parentframe = frame
 | 
						|
    ##             self.floatframe.Reparent(frame)
 | 
						|
    ##         else:
 | 
						|
    ##             parent = self.GetParent()
 | 
						|
    ##             self.Reparent(frame)
 | 
						|
    ##             parent.SetToolBar(None)
 | 
						|
    ##             size = parent.GetSize()
 | 
						|
    ##             parent.SetSize(wxSize(0,0))
 | 
						|
    ##             parent.SetSize(size)
 | 
						|
    ##             frame.SetToolBar(self)
 | 
						|
    ##             size = frame.GetSize()
 | 
						|
    ##             frame.SetSize(wxSize(0,0))
 | 
						|
    ##             frame.SetSize(size)
 | 
						|
 | 
						|
 | 
						|
        def Float(self, bool):
 | 
						|
            "Floats or docks the toolbar programmatically."
 | 
						|
            if bool:
 | 
						|
                self.parentframe = self.GetParent()
 | 
						|
                print self.title
 | 
						|
                if self.title:
 | 
						|
                    useStyle = wx.DEFAULT_FRAME_STYLE
 | 
						|
                else:
 | 
						|
                    useStyle = wx.THICK_FRAME
 | 
						|
                self.floatframe = wx.MiniFrame(self.parentframe, -1, self.title,
 | 
						|
                                              style = useStyle)
 | 
						|
 | 
						|
                self.Reparent(self.floatframe)
 | 
						|
                self.parentframe.SetToolBar(None)
 | 
						|
                self.floating = 1
 | 
						|
                psize = self.parentframe.GetSize()
 | 
						|
                self.parentframe.SetSize((0,0))
 | 
						|
                self.parentframe.SetSize(psize)
 | 
						|
                self.floatframe.SetToolBar(self)
 | 
						|
                self.oldcolor = self.GetBackgroundColour()
 | 
						|
 | 
						|
                w = psize[0]
 | 
						|
                h = self.GetSize()[1]
 | 
						|
                if self.title:
 | 
						|
                    h = h + self.titleheight
 | 
						|
                self.floatframe.SetSize((w,h))
 | 
						|
                self.floatframe.SetClientSize(self.GetSize())
 | 
						|
                newpos = self.parentframe.GetPosition()
 | 
						|
                newpos.y = newpos.y + _DOCKTHRESHOLD * 2
 | 
						|
                self.floatframe.SetPosition(newpos)
 | 
						|
                self.floatframe.Show(True)
 | 
						|
 | 
						|
                self.floatframe.Bind(wx.EVT_CLOSE, self.OnDock)
 | 
						|
                #self.floatframe.Bind(wx.EVT_MOVE, self.OnMove)
 | 
						|
 | 
						|
            else:
 | 
						|
                self.Reparent(self.parentframe)
 | 
						|
                self.parentframe.SetToolBar(self)
 | 
						|
                self.floating = 0
 | 
						|
                self.floatframe.SetToolBar(None)
 | 
						|
                self.floatframe.Destroy()
 | 
						|
                size = self.parentframe.GetSize()
 | 
						|
                self.parentframe.SetSize((0,0))
 | 
						|
                self.parentframe.SetSize(size)
 | 
						|
                self.SetBackgroundColour(self.oldcolor)
 | 
						|
 | 
						|
 | 
						|
        def OnDock(self, e):
 | 
						|
            self.Float(0)
 | 
						|
            if hasattr(self, 'oldpos'):
 | 
						|
                del self.oldpos
 | 
						|
 | 
						|
 | 
						|
        def OnMove(self, e):
 | 
						|
            homepos = self.parentframe.ClientToScreen((0,0))
 | 
						|
            floatpos = self.floatframe.GetPosition()
 | 
						|
            if (abs(homepos.x - floatpos.x) < _DOCKTHRESHOLD and
 | 
						|
                abs(homepos.y - floatpos.y) < _DOCKTHRESHOLD):
 | 
						|
                self.Float(0)
 | 
						|
            #homepos = self.parentframe.GetPositionTuple()
 | 
						|
            #homepos = homepos[0], homepos[1] + self.titleheight
 | 
						|
            #floatpos = self.floatframe.GetPositionTuple()
 | 
						|
            #if abs(homepos[0] - floatpos[0]) < 35 and abs(homepos[1] - floatpos[1]) < 35:
 | 
						|
            #    self._SetFauxBarVisible(True)
 | 
						|
            #else:
 | 
						|
            #    self._SetFauxBarVisible(False)
 | 
						|
 | 
						|
 | 
						|
        def OnMouse(self, e):
 | 
						|
            if not self.IsFloatable():
 | 
						|
                e.Skip()
 | 
						|
                return
 | 
						|
 | 
						|
            if e.ButtonDClick(1) or e.ButtonDClick(2) or e.ButtonDClick(3) or e.ButtonDown() or e.ButtonUp():
 | 
						|
                e.Skip()
 | 
						|
 | 
						|
            if e.ButtonDown():
 | 
						|
                self.CaptureMouse()
 | 
						|
                self.oldpos = (e.GetX(), e.GetY())
 | 
						|
 | 
						|
            if e.Entering():
 | 
						|
                self.oldpos = (e.GetX(), e.GetY())
 | 
						|
 | 
						|
            if e.ButtonUp():
 | 
						|
                self.ReleaseMouse()
 | 
						|
                if self.IsFloating():
 | 
						|
                    homepos = self.parentframe.ClientToScreen((0,0))
 | 
						|
                    floatpos = self.floatframe.GetPosition()
 | 
						|
                    if (abs(homepos.x - floatpos.x) < _DOCKTHRESHOLD and
 | 
						|
                        abs(homepos.y - floatpos.y) < _DOCKTHRESHOLD):
 | 
						|
                        self.Float(0)
 | 
						|
                        return
 | 
						|
 | 
						|
            if e.Dragging():
 | 
						|
                if not self.IsFloating():
 | 
						|
                    self.Float(True)
 | 
						|
                    self.oldpos = (e.GetX(), e.GetY())
 | 
						|
                else:
 | 
						|
                    if hasattr(self, 'oldpos'):
 | 
						|
                        loc = self.floatframe.GetPosition()
 | 
						|
                        pt = (loc.x - (self.oldpos[0]-e.GetX()), loc.y - (self.oldpos[1]-e.GetY()))
 | 
						|
                        self.floatframe.Move(pt)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        def _SetFauxBarVisible(self, vis):
 | 
						|
            return
 | 
						|
            if vis:
 | 
						|
                if self.parentframe.GetToolBar() == None:
 | 
						|
                    if not hasattr(self, 'nullbar'):
 | 
						|
                        self.nullbar = wx.ToolBar(self.parentframe, -1)
 | 
						|
                    print "Adding fauxbar."
 | 
						|
                    self.nullbar.Reparent(self.parentframe)
 | 
						|
                    print "Reparented."
 | 
						|
                    self.parentframe.SetToolBar(self.nullbar)
 | 
						|
                    print "Set toolbar"
 | 
						|
                    col = wx.NamedColour("GREY")
 | 
						|
                    self.nullbar.SetBackgroundColour(col)
 | 
						|
                    print "Set color"
 | 
						|
                    size = self.parentframe.GetSize()
 | 
						|
                    self.parentframe.SetSize((0,0))
 | 
						|
                    self.parentframe.SetSize(size)
 | 
						|
                    print "Set size"
 | 
						|
                else:
 | 
						|
                    print self.parentframe.GetToolBar()
 | 
						|
            else:
 | 
						|
                if self.parentframe.GetToolBar() != None:
 | 
						|
                    print "Removing fauxbar"
 | 
						|
                    self.nullbar.Reparent(self.floatframe)
 | 
						|
                    self.parentframe.SetToolBar(None)
 | 
						|
                    size = self.parentframe.GetSize()
 | 
						|
                    self.parentframe.SetSize((0,0))
 | 
						|
                    self.parentframe.SetSize(size)
 | 
						|
 | 
						|
 | 
						|
 |