Adds new simple gui class to gr-wxgui. Apps using it to come.
authorjcorgan <jcorgan@221aa14e-8319-0410-a670-987f0aec2ac5>
Sun, 22 Feb 2009 20:20:34 +0000 (20:20 +0000)
committerjcorgan <jcorgan@221aa14e-8319-0410-a670-987f0aec2ac5>
Sun, 22 Feb 2009 20:20:34 +0000 (20:20 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10474 221aa14e-8319-0410-a670-987f0aec2ac5

gr-wxgui/src/python/Makefile.am
gr-wxgui/src/python/form.py
gr-wxgui/src/python/gui.py [new file with mode: 0644]

index a85bd0920686adb3b41478b269329f42ab4a683b..58a9f57549d597a631d6bcec7f32ce28b4c29bf0 100644 (file)
@@ -41,6 +41,7 @@ ourpython_PYTHON =                    \
        fftsink_nongl.py                \
        fftsink_gl.py                   \
        fft_window.py                   \
+       gui.py                          \
        numbersink2.py                  \
        number_window.py                \
        plot.py                         \
index 3e303554d6509ec1070af1f388be383945556e48..e635c546156eaa01f4566b5b83a3311ae6c318c2 100644 (file)
@@ -273,7 +273,7 @@ class radiobox_field(field):
         else:
             style=wx.RA_SPECIFY_COLS | wx.RA_HORIZONTAL
             
-        w = wx.RadioBox(parent, new_id, label, style=style, majorDimension=major_dimension,
+        w = wx.RadioBox(parent, new_id, label="", style=style, majorDimension=major_dimension,
                         choices=choices)
         self.f = self._pair_with_label(w, parent=parent, sizer=sizer, label=label, weight=weight)
         if callback:
diff --git a/gr-wxgui/src/python/gui.py b/gr-wxgui/src/python/gui.py
new file mode 100644 (file)
index 0000000..9cb66c4
--- /dev/null
@@ -0,0 +1,126 @@
+#
+# Copyright 2009 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+import wx
+from gnuradio import gr
+
+#
+# Top-level display panel with vertical box sizer.  User does not create or
+# subclass this class; rather, the user supplies his own class constructor
+# that gets invoked with needed parameters.
+#
+class top_panel(wx.Panel):
+    def __init__(self, frame, top_block, gui, options, args):
+        wx.Panel.__init__(self, frame, -1)
+        vbox = wx.BoxSizer(wx.VERTICAL)
+
+        # Create the user's GUI class
+        if gui is not None:
+            self.gui = gui(frame,          # Top-level window frame
+                           self,           # Parent class for user created windows
+                           vbox,           # Sizer for user to add windows to
+                           top_block,      # GUI-unaware flowgraph to manipulate
+                           options,        # Command-line options
+                           args)           # Command-line arguments
+
+        else:
+            # User hasn't made their own GUI, create our default
+            # We don't have a default GUI yet either :)
+            p = wx.Panel(self)
+            p.SetSize((640,480))
+            vbox.Add(p, 1, wx.EXPAND)
+            
+        self.SetSizer(vbox)
+        self.SetAutoLayout(True)
+        vbox.Fit(self)
+
+
+#
+# Top-level window frame with menu and status bars.
+#
+class top_frame(wx.Frame):
+    def __init__ (self, top_block, gui, options, args, 
+                  title, nstatus, start, realtime):
+
+        wx.Frame.__init__(self, None, -1, title)
+        self.top_block = top_block
+
+        self.CreateStatusBar(nstatus)
+        mainmenu = wx.MenuBar()
+        self.SetMenuBar(mainmenu)
+
+        menu = wx.Menu()
+
+        item = menu.Append(200, 'E&xit', 'Exit Application') # FIXME magic ID
+        self.Bind(wx.EVT_MENU, self.OnCloseWindow, item)
+        mainmenu.Append(menu, "&File")
+        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
+
+        # Create main panel, creates user GUI class with supplied parameters
+        self.panel = top_panel(self, top_block, gui, options, args)
+
+        vbox = wx.BoxSizer(wx.VERTICAL)
+        vbox.Add(self.panel, 1, wx.EXPAND)
+        self.SetSizer(vbox)
+        self.SetAutoLayout(True)
+        vbox.Fit(self)
+
+        if realtime:
+            if gr.enable_realtime_scheduling() != gr.RT_OK:
+                self.SetStatusText("Failed to enable realtime scheduling")
+
+        if start and self.top_block is not None:
+            self.top_block.start()
+
+    def OnCloseWindow(self, event):
+        self.SetStatusText("Ensuring flowgraph has completed before exiting...")
+        if self.top_block is not None:
+            self.top_block.stop()
+            self.top_block.wait()
+
+        self.Destroy()
+
+
+#
+# Top-level wxPython application object.  User creates or subclasses this 
+# in their GUI script.
+#
+class app(wx.App):
+    def __init__ (self, top_block=None, gui=None, options=None, args=None, 
+                  title="GNU Radio", nstatus=1, start=False, realtime=False):
+        self.top_block = top_block
+        self.gui = gui
+        self.options = options
+        self.args = args
+        self.title = title
+        self.nstatus = nstatus
+        self.start = start
+        self.realtime = realtime
+
+        wx.App.__init__ (self, redirect=False)
+
+    def OnInit(self):
+        # Pass user parameters to top window frame
+        frame = top_frame(self.top_block, self.gui, self.options, self.args,
+                          self.title, self.nstatus, self.start, self.realtime)
+        frame.Show(True)
+        self.SetTopWindow(frame)
+        return True