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

Reply via email to