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
[email protected]
https://lists.sourceforge.net/lists/listinfo/rpy-list