summaryrefslogtreecommitdiff
path: root/gr-wxgui/src/python/gui.py
diff options
context:
space:
mode:
authorjcorgan2009-02-22 20:20:34 +0000
committerjcorgan2009-02-22 20:20:34 +0000
commitf92986d6ff10330ee4608510f7baaa895e6772e0 (patch)
treec8776b9a8fe748619c8374605d0c70771c75f919 /gr-wxgui/src/python/gui.py
parent6d26c7b1a39fa0c2b4559fb4e81b12f4f447b4ec (diff)
downloadgnuradio-f92986d6ff10330ee4608510f7baaa895e6772e0.tar.gz
gnuradio-f92986d6ff10330ee4608510f7baaa895e6772e0.tar.bz2
gnuradio-f92986d6ff10330ee4608510f7baaa895e6772e0.zip
Adds new simple gui class to gr-wxgui. Apps using it to come.
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10474 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'gr-wxgui/src/python/gui.py')
-rw-r--r--gr-wxgui/src/python/gui.py126
1 files changed, 126 insertions, 0 deletions
diff --git a/gr-wxgui/src/python/gui.py b/gr-wxgui/src/python/gui.py
new file mode 100644
index 000000000..9cb66c4a1
--- /dev/null
+++ b/gr-wxgui/src/python/gui.py
@@ -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