]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/wxPython/lib/filebrowsebutton.py
Bug fixes, new tests and demos, new generated source...
[wxWidgets.git] / utils / wxPython / lib / filebrowsebutton.py
diff --git a/utils/wxPython/lib/filebrowsebutton.py b/utils/wxPython/lib/filebrowsebutton.py
new file mode 100644 (file)
index 0000000..22e0069
--- /dev/null
@@ -0,0 +1,155 @@
+from wxPython.wx import *
+import os
+
+#----------------------------------------------------------------------
+
+class FileBrowseButton(wxPanel):
+    ''' A control to allow the user to type in a filename
+    or browse with the standard file dialog to select file
+
+    __init__ (
+        parent, id, pos, size -- passed directly to wxPanel initialisation
+        style = wxTAB_TRAVERSAL -- passed directly to wxPanel initialisation
+        labelText -- Text for label to left of text field
+        buttonText -- Text for button which launches the file dialog
+        toolTip -- Help text
+        dialogTitle -- Title used in file dialog
+        startDirectory -- Default directory for file dialog startup
+        fileMask -- File mask (glob pattern, such as *.*) to use in file dialog
+        fileMode -- wxOPEN or wxSAVE, indicates type of file dialog to use
+        changeCallback -- callback receives all changes in value of control
+    )
+    GetValue() -- retrieve current value of text control
+    SetValue(string) -- set current value of text control
+    label -- pointer to internal label widget
+    textControl -- pointer to internal text control
+    browseButton -- pointer to button
+    '''
+    def __init__ (self, parent, id= -1,
+                  pos = wxDefaultPosition, size = wxDefaultSize,
+                  style = wxTAB_TRAVERSAL,
+                  labelText= "File Entry:",
+                  buttonText= "Browse",
+                  toolTip= "Type filename or browse computer to choose file",
+                  # following are the values for a file dialog box
+                  dialogTitle = "Choose a file",
+                  startDirectory = ".",
+                  initialValue = "",
+                  fileMask = "*.*",
+                  fileMode = wxOPEN,
+                  # callback for when value changes (optional)
+                  changeCallback= None
+        ):
+        wxPanel.__init__ (self, parent, id, pos, size, style)
+        # store variables
+        self.dialogTitle = dialogTitle
+        self.startDirectory = startDirectory
+        self.fileMask = fileMask
+        self.fileMode = fileMode
+        self.changeCallback = changeCallback
+
+        box = wxBoxSizer(wxHORIZONTAL)
+        self.label = wxStaticText(self, -1, labelText, style =wxALIGN_RIGHT )
+        font = self.label.GetFont()
+        w, h, d, e = self.GetFullTextExtent(labelText, font)
+        self.label.SetSize(wxSize(w+5, h))
+        box.Add( self.label, 0, wxCENTER )
+
+        ID = wxNewId()
+        self.textControl = wxTextCtrl(self, ID)
+        self.textControl.SetToolTipString( toolTip )
+        box.Add( self.textControl, 1, wxLEFT|wxCENTER, 5)
+        if changeCallback:
+            EVT_TEXT(self.textControl, ID, changeCallback)
+
+        ID = wxNewId()
+        self.browseButton = button =wxButton(self, ID, buttonText)
+        box.Add( button, 0, wxCENTER)
+        button.SetToolTipString( toolTip )
+        EVT_BUTTON(button, ID, self.OnBrowse)
+
+        # add a border around the whole thing and resize the panel to fit
+        outsidebox = wxBoxSizer(wxVERTICAL)
+        outsidebox.Add(box, 1, wxEXPAND|wxALL, 3)
+        outsidebox.Fit(self)
+
+        self.SetAutoLayout(true)
+        self.SetSizer( outsidebox )
+        self.Layout()
+        if size.width != -1 or size.height != -1:
+            self.SetSize(size)
+
+
+
+    def OnBrowse (self, event = None):
+        ''' Going to browse for file... '''
+        current = self.GetValue ()
+        directory = os.path.split(current)
+        if os.path.isdir( current):
+            directory =current
+        elif directory and os.path.isdir( directory[0] ):
+            directory = directory [0]
+        else:
+            directory = self.startDirectory
+        dlg = wxFileDialog(self, self.dialogTitle, directory, current, self.fileMask, self.fileMode)
+        if dlg.ShowModal() == wxID_OK:
+            self.SetValue (dlg.GetPath())
+        dlg.Destroy()
+        self.textControl.SetFocus()
+
+
+    def GetValue (self):
+        ''' Convenient access to text control value '''
+        return self.textControl.GetValue ()
+
+
+    def SetValue (self, value):
+        ''' Convenient setting of text control value '''
+        return self.textControl.SetValue (value)
+
+
+#----------------------------------------------------------------------
+
+
+if __name__ == "__main__":
+    #from skeletonbuilder import rulesfile
+    class DemoFrame( wxFrame ):
+        def __init__(self, parent):
+            wxFrame.__init__(self, parent, 2400, "File entry with browse", size=(500,100) )
+            panel = wxPanel (self,-1)
+            innerbox = wxBoxSizer(wxVERTICAL)
+            control = FileBrowseButton(panel)
+            innerbox.Add(  control, 0, wxEXPAND )
+            control = FileBrowseButton(panel, labelText = "With Callback", style = wxSUNKEN_BORDER  ,changeCallback= self.OnFileNameChanged)
+            innerbox.Add(  control, 0, wxEXPAND|wxALIGN_BOTTOM )
+            panel.SetAutoLayout(true)
+            panel.SetSizer( innerbox )
+
+        def OnFileNameChanged (self, event):
+            print "Filename changed", event.GetString ()
+
+        def OnCloseMe(self, event):
+            self.Close(true)
+
+        def OnCloseWindow(self, event):
+            self.Destroy()
+
+    class DemoApp(wxApp):
+        def OnInit(self):
+            wxImage_AddHandler(wxJPEGHandler())
+            wxImage_AddHandler(wxPNGHandler())
+            wxImage_AddHandler(wxGIFHandler())
+            frame = DemoFrame(NULL)
+            #frame = RulesPanel(NULL )
+            frame.Show(true)
+            self.SetTopWindow(frame)
+            return true
+
+    def test( ):
+        app = DemoApp(0)
+        app.MainLoop()
+    print 'Creating dialogue'
+    test( )
+
+
+