Revision: 491 http://rpy.svn.sourceforge.net/rpy/?rev=491&view=rev Author: lgautier Date: 2008-04-16 12:16:28 -0700 (Wed, 16 Apr 2008)
Log Message: ----------- Toy R GUI as an example (might be worth it making a real GUI). Modified Paths: -------------- branches/rpy_nextgen/demos/radmin.py Added Paths: ----------- branches/rpy_nextgen/demos/rpy2_logo.png Modified: branches/rpy_nextgen/demos/radmin.py =================================================================== --- branches/rpy_nextgen/demos/radmin.py 2008-04-16 19:14:12 UTC (rev 490) +++ branches/rpy_nextgen/demos/radmin.py 2008-04-16 19:16:28 UTC (rev 491) @@ -2,17 +2,19 @@ pygtk.require('2.0') import gtk import rpy2.robjects as robjects +import itertools +import gobject - - class LibraryPanel(gtk.VBox): cell = gtk.CellRendererText() cell.set_property('cell-background', 'black') cell.set_property('foreground', 'white') - - def __init__(self): + PACKAGE_I = 0 + + def __init__(self, console=None): super(LibraryPanel, self).__init__() + self._console = console self._table = gtk.ListStore(str, str, str) self.updateInstalledLibraries() self._treeView = gtk.TreeView(model = self._table) @@ -30,10 +32,13 @@ sbox = gtk.HBox(homogeneous=False, spacing=0) sbox.show() + slabel = gtk.Label("Search:") + slabel.show() + sbox.pack_start(slabel, True, True, 0) self.sentry = gtk.Entry() self.sentry.show() sbox.add(self.sentry) - sbutton = gtk.Button("Search") + sbutton = gtk.Button("Refresh") sbutton.connect("clicked", self.searchAction, "search") sbutton.show() sbox.add(sbutton) @@ -44,6 +49,14 @@ s_window.show() s_window.add(self._treeView) self.add(s_window) + + lbox = gtk.HBox(homogeneous=False, spacing=0) + lbox.show() + lbutton = gtk.Button("Load") + lbutton.connect("clicked", self.loadAction, "load") + lbutton.show() + lbox.add(lbutton) + self.pack_start(lbox, expand=False, fill=False, padding=0) def updateInstalledLibraries(self): self._table.clear() @@ -76,9 +89,31 @@ for r in toremove: self._table.remove(self._table.get_iter(r)) + def loadAction(self, widget, data=None): + # Get the selection in the gtk.TreeView + selection = self._treeView.get_selection() + # Get the selection iter + model, selection_iter = selection.get_selected() + if selection_iter: + packName = self._table.get_value(selection_iter, + self.PACKAGE_I) + self._console.append('library("%s")\n' %packName) + + tmp = robjects.baseNameSpaceEnv["fifo"]("") + robjects.baseNameSpaceEnv["sink"](tmp) + + robjects.baseNameSpaceEnv["library"](packName) + out = robjects.baseNameSpaceEnv["readLines"](tmp) + for line in out: + self._console.append(str(line)+"\n") + robjects.r.close(tmp) + self._console.append("> ") + class VignetteExplorer(gtk.VBox): + PACKAGE_I = 0 + ITEM_I = 1 def __init__(self): super(VignetteExplorer, self).__init__() self._table = gtk.ListStore(str, str, str) @@ -95,6 +130,7 @@ col.pack_start(cr, True) self._valueCells.append(cr) col.set_attributes(cr, text=col_i) + sbox = gtk.HBox(homogeneous=False, spacing=0) #sbox.show() sentry = gtk.Entry() @@ -110,6 +146,13 @@ s_window.show() s_window.add(self._treeView) self.add(s_window) + vbox = gtk.HBox(homogeneous=False, spacing=0) + vbox.show() + vbutton = gtk.Button("View") + vbutton.connect("clicked", self.viewAction, "view") + vbutton.show() + vbox.add(vbutton) + self.pack_start(vbox, expand=False, fill=False, padding=0) def updateKnownVignettes(self): self._table.clear() @@ -126,6 +169,76 @@ row.append(pack) self._table.append(row) + def viewAction(self, widget, data=None): + # Get the selection in the gtk.TreeView + selection = self._treeView.get_selection() + # Get the selection iter + model, selection_iter = selection.get_selected() + if selection_iter: + packName = self._table.get_value(selection_iter, + self.PACKAGE_I) + vigName = self._table.get_value(selection_iter, + self.ITEM_I) + robjects.r.vignette(vigName, package = packName) + + +class GraphicalDeviceExplorer(gtk.VBox): + + def __init__(self): + super(GraphicalDeviceExplorer, self).__init__() + self._table = gtk.ListStore(str, int, str, str) + self.updateOpenedDevices() + self._treeView = gtk.TreeView(model = self._table) + self._treeView.show() + self._valueColumns = [gtk.TreeViewColumn('Active'), + gtk.TreeViewColumn('Number'), + gtk.TreeViewColumn('Device'), + gtk.TreeViewColumn('Title')] + self._valueCells = [] + for col_i, col in enumerate(self._valueColumns): + self._treeView.append_column(col) + cr = gtk.CellRendererText() + col.pack_start(cr, True) + self._valueCells.append(cr) + col.set_attributes(cr, text=col_i) + + sbox = gtk.HBox(homogeneous=False, spacing=0) + sbox.show() + sentry = gtk.Entry() + sentry.show() + sbox.add(sentry) + sbutton = gtk.Button("Refresh") + sbutton.connect("clicked", self.searchOpenedDevices, "search") + sbutton.show() + sbox.add(sbutton) + self.pack_start(sbox, expand=False, fill=False, padding=0) + s_window = gtk.ScrolledWindow() + s_window.set_policy(gtk.POLICY_AUTOMATIC, + gtk.POLICY_AUTOMATIC) + s_window.show() + s_window.add(self._treeView) + self.add(s_window) + + def updateOpenedDevices(self): + self._table.clear() + devices = robjects.r["dev.list"]() + names = robjects.r["names"](devices) + current_device = robjects.r["dev.cur"]()._sexp[0] + try: + nrows = len(devices) + except: + return + for dev, name in itertools.izip(devices, names): + if current_device == dev._sexp[0]: + cur = "X" + else: + cur = "" + row = [cur, dev._sexp[0], name._sexp[0], ""] + self._table.append(row) + + def searchOpenedDevices(self, widget, data = None): + self.updateOpenedDevices() + class HelpExplorer(gtk.VBox): def __init__(self): @@ -144,12 +257,21 @@ col.pack_start(cr, True) self._valueCells.append(cr) col.set_attributes(cr, text=col_i) + self._treeView.connect('button_press_event', self.buttonAction) + sbox = gtk.HBox(homogeneous=False, spacing=0) sbox.show() + slabel = gtk.Label("Search:") + slabel.show() + sbox.pack_start(slabel, True, True, 0) self.sentry = gtk.Entry() self.sentry.show() sbox.add(self.sentry) - sbutton = gtk.Button("Search") + fbutton = gtk.CheckButton("fuzzy") + fbutton.show() + sbox.pack_start(fbutton, expand=False, fill=False, padding=0) + self._fuzzyButton = fbutton + sbutton = gtk.Button("Refresh") sbutton.connect("clicked", self.searchAction, "search") sbutton.show() @@ -166,7 +288,8 @@ self._table.clear() if string is None: return - matches = robjects.r["help.search"](string).subset("matches")[0] + agrep = [False, True][self._fuzzyButton.get_active()] + matches = robjects.r["help.search"](string, agrep=agrep).subset("matches")[0] #import pdb; pdb.set_trace() nrows = robjects.r.nrow(matches)[0] ncols = robjects.r.ncol(matches)[0] @@ -183,6 +306,133 @@ def searchAction(self, widget, data=None): self.updateRelevantHelp(self.sentry.get_text()) + def buttonAction(self, widget, data=None): + treeselection = self._treeView.get_selection() + (model, rowiter) = treeselection.get_selected() + if rowiter is None: + return + #import pdb; pdb.set_trace() + row = self._table[rowiter] + helpFile = robjects.r.help(row[0], package=row[2]) + +class CodePanel(gtk.VBox): + + def __init__(self): + super(CodePanel, self).__init__() + label = gtk.Label("Enter R code to evaluate") + label.show() + self.pack_start(label, False, True, 0) + s_window = gtk.ScrolledWindow() + s_window.set_policy(gtk.POLICY_AUTOMATIC, + gtk.POLICY_AUTOMATIC) + s_window.show() + self._rpad = gtk.TextView(buffer=None) + self._rpad.set_editable(True) + self._rpad.show() + s_window.add(self._rpad) + self.add(s_window) + evalButton = gtk.Button("Evaluate") + evalButton.connect("clicked", self.evaluateAction, "evaluate") + evalButton.show() + self.pack_start(evalButton, False, False, 0) + self._evalButton = evalButton + + def evaluateAction(self, widget, data=None): + buffer = self._rpad.get_buffer() + start_iter = buffer.get_iter_at_offset(0) + stop_iter = buffer.get_iter_at_offset(buffer.get_char_count()) + rcode = buffer.get_text(start_iter, stop_iter) + res = robjects.r(rcode) + + +class EnvExplorer(gtk.VBox): + def __init__(self, env): + super(EnvExplorer, self).__init__() + self._env = env + self._table = gtk.ListStore(str, str) + self.updateTable(None) + self._treeView = gtk.TreeView(model = self._table) + self._treeView.show() + self._valueColumns = [gtk.TreeViewColumn('Symbol'), + gtk.TreeViewColumn('Type'),] + self._valueCells = [] + for col_i, col in enumerate(self._valueColumns): + self._treeView.append_column(col) + cr = gtk.CellRendererText() + col.pack_start(cr, True) + self._valueCells.append(cr) + col.set_attributes(cr, text=col_i) + sbox = gtk.HBox(homogeneous=False, spacing=0) + sbox.show() + slabel = gtk.Label("Search:") + slabel.show() + sbox.pack_start(slabel, True, True, 0) + self.sentry = gtk.Entry() + self.sentry.show() + sbox.add(self.sentry) + sbutton = gtk.Button("Refresh") + sbutton.connect("clicked", self.searchAction, "search") + + sbutton.show() + sbox.add(sbutton) + self.pack_start(sbox, expand=False, fill=False, padding=0) + s_window = gtk.ScrolledWindow() + s_window.set_policy(gtk.POLICY_AUTOMATIC, + gtk.POLICY_AUTOMATIC) + s_window.show() + s_window.add(self._treeView) + self.add(s_window) + + def updateTable(self, string): + self._table.clear() + + for symbol in self._env: + stype = robjects.baseNameSpaceEnv["class"](self._env[symbol]) + row = [symbol, stype] + self._table.append(row) + + if string is None: + return + + def searchAction(self, widget, data=None): + self.updateTable(None) + +class ConsolePanel(gtk.VBox): + + def __init__(self): + super(ConsolePanel, self).__init__() + s_window = gtk.ScrolledWindow() + s_window.set_policy(gtk.POLICY_AUTOMATIC, + gtk.POLICY_AUTOMATIC) + s_window.show() + + t_table = gtk.TextTagTable() + + tag_out=gtk.TextTag("output") + tag_out.set_property("foreground","blue") + tag_out.set_property("font","monospace 10") + t_table.add(tag_out) + + tag_in=gtk.TextTag("input") + tag_in.set_property("foreground","black") + tag_in.set_property("font","monospace 10") + t_table.add(tag_in) + + self._buffer = gtk.TextBuffer(t_table) + self._view = gtk.TextView(buffer = self._buffer) + self._view.connect("key_press_event", self.actionKeyPress) + self._view.show() + s_window.add(self._view) + self.add(s_window) + self.append("> ") + + def actionKeyPress(self, view, event): + pass + + def append(self, text): + pos=self._buffer.get_end_iter() + self._buffer.insert(pos, text) + class Main(object): def __init__(self): @@ -191,7 +441,7 @@ window.set_title("R") window.connect("delete_event", self.delete_event) window.connect("destroy", self.destroy) - window.set_size_request(350, 450) + window.set_size_request(450, 500) notebook = gtk.Notebook() notebook.set_tab_pos(gtk.POS_LEFT) @@ -200,8 +450,33 @@ #vbox = gtk.VBox(homogeneous=False, spacing=0) #vbox.show() + + consolePanel = ConsolePanel() + #tmp = robjects.baseNameSpaceEnv["fifo"]("") + #robjects.baseNameSpaceEnv["sink"](tmp) + + #s = r.readLines(tmp) + #r.close(tmp) + #s = str.join(os.linesep, s._sexp) + consolePanel.show() + notebook.append_page(consolePanel, gtk.Label("Console")) + + codePanel = CodePanel() + codePanel.show() + notebook.append_page(codePanel, gtk.Label("Code")) + + # global env + globalEnvPanel = EnvExplorer(robjects.globalEnv) + globalEnvPanel.show() + notebook.append_page(globalEnvPanel, gtk.Label("globalEnv")) + + # global env + grDevPanel = GraphicalDeviceExplorer() + grDevPanel.show() + notebook.append_page(grDevPanel, gtk.Label("Graphics")) + # libraries/packages - libPanel = LibraryPanel() + libPanel = LibraryPanel(console=consolePanel) libPanel.show() notebook.append_page(libPanel, gtk.Label("Libraries")) @@ -225,7 +500,43 @@ def destroy(self, widget, data=None): gtk.main_quit() -w = Main() + +def get_splash(): + splash = gtk.Window(gtk.WINDOW_TOPLEVEL) + splash.set_events(splash.get_events() | gtk.gdk.BUTTON_PRESS_MASK) + def f(widget, data=None): + splash.destroy() + splash.connect('button_press_event', f) + + eb = gtk.EventBox() + eb.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white")) + image = gtk.Image() + image.show() + image.set_from_file("rpy2_logo.png") + splashVBox = gtk.VBox() + + splashVBox.pack_start(image, True, True, 0) + splashVBox.pack_start(gtk.Label("A GTK+ toy user interface"), + True, True, 0) + eb.add(splashVBox) + splash.add(eb) + splash.realize() + splash.window.set_type_hint (gtk.gdk.WINDOW_TYPE_HINT_SPLASHSCREEN) + # needed on Win32 + splash.set_decorated (False) + splash.set_position (gtk.WIN_POS_CENTER) + return splash + +def create_application(splash): + w = Main() + gtk.window_set_auto_startup_notification(True) + +gtk.window_set_auto_startup_notification(False) +splash = get_splash() +splash.show_all() +gobject.idle_add(create_application, splash) gtk.main() + + Added: branches/rpy_nextgen/demos/rpy2_logo.png =================================================================== (Binary files differ) Property changes on: branches/rpy_nextgen/demos/rpy2_logo.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ rpy-list mailing list rpy-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rpy-list