From 9fbad80862fd2e4b5a514c2878be2f5ef7d8073b Mon Sep 17 00:00:00 2001
From: "Michael D. M. Dryden" <mdryden@chem.utoronto.ca>
Date: Thu, 31 Jul 2014 17:48:02 -0400
Subject: [PATCH] Autosave functionality implemented. Removed unused view
 options.

---
 dstatInterface/interface/dstatinterface.glade |  74 ++++++------
 dstatInterface/interface/save.py              | 109 +++++++++++-------
 dstatInterface/interface_test.py              |  20 ++--
 3 files changed, 116 insertions(+), 87 deletions(-)

diff --git a/dstatInterface/interface/dstatinterface.glade b/dstatInterface/interface/dstatinterface.glade
index ba07430..b27fc3a 100644
--- a/dstatInterface/interface/dstatinterface.glade
+++ b/dstatInterface/interface/dstatinterface.glade
@@ -85,18 +85,17 @@
     <property name="can_focus">False</property>
     <property name="stock">gtk-save-as</property>
   </object>
+  <object class="GtkImage" id="image3">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-save</property>
+  </object>
   <object class="GtkListStore" id="serial_liststore">
     <columns>
       <!-- column-name serial -->
       <column type="gchararray"/>
     </columns>
   </object>
-  <object class="GtkAdjustment" id="updatesamples_adj">
-    <property name="upper">100</property>
-    <property name="value">5</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-  </object>
   <object class="GtkWindow" id="window1">
     <property name="can_focus">False</property>
     <property name="border_width">6</property>
@@ -151,12 +150,12 @@
                       </object>
                     </child>
                     <child>
-                      <object class="GtkImageMenuItem" id="gtk-save-as">
-                        <property name="label">gtk-save-as</property>
+                      <object class="GtkImageMenuItem" id="file_save_plot">
+                        <property name="label">Save Plot…</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="use_underline">True</property>
-                        <property name="use_stock">True</property>
+                        <property name="image">image3</property>
+                        <property name="use_stock">False</property>
                       </object>
                     </child>
                     <child>
@@ -426,8 +425,8 @@
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <child>
-                          <object class="GtkCheckButton" id="plotinteractive_checkbutton">
-                            <property name="label" translatable="yes">Plot updates during measurement</property>
+                          <object class="GtkCheckButton" id="autosave_checkbutton">
+                            <property name="label" translatable="yes">Autosave</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <property name="receives_default">False</property>
@@ -440,51 +439,38 @@
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkSpinButton" id="samples_spinbutton">
+                          <object class="GtkFileChooserButton" id="autosavedir_button">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="invisible_char">●</property>
-                            <property name="truncate_multiline">True</property>
-                            <property name="primary_icon_activatable">False</property>
-                            <property name="secondary_icon_activatable">False</property>
-                            <property name="primary_icon_sensitive">True</property>
-                            <property name="secondary_icon_sensitive">True</property>
-                            <property name="adjustment">updatesamples_adj</property>
-                            <property name="snap_to_ticks">True</property>
-                            <property name="numeric">True</property>
-                            <property name="update_policy">if-valid</property>
+                            <property name="can_focus">False</property>
+                            <property name="action">select-folder</property>
+                            <property name="preview_widget_active">False</property>
+                            <property name="title" translatable="yes">Select a Save Folder</property>
                           </object>
                           <packing>
-                            <property name="expand">False</property>
+                            <property name="expand">True</property>
                             <property name="fill">True</property>
-                            <property name="padding">5</property>
                             <property name="position">1</property>
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkLabel" id="label1">
+                          <object class="GtkEntry" id="autosavename">
                             <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="label" translatable="yes">samples per update</property>
+                            <property name="can_focus">True</property>
+                            <property name="max_length">32</property>
+                            <property name="invisible_char">●</property>
+                            <property name="text" translatable="yes">file</property>
+                            <property name="overwrite_mode">True</property>
+                            <property name="primary_icon_activatable">False</property>
+                            <property name="secondary_icon_activatable">False</property>
+                            <property name="primary_icon_sensitive">True</property>
+                            <property name="secondary_icon_sensitive">True</property>
                           </object>
                           <packing>
                             <property name="expand">False</property>
                             <property name="fill">True</property>
-                            <property name="padding">5</property>
                             <property name="position">2</property>
                           </packing>
                         </child>
-                        <child>
-                          <object class="GtkLabel" id="label4">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                          </object>
-                          <packing>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
-                            <property name="position">3</property>
-                          </packing>
-                        </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -648,4 +634,10 @@
       </object>
     </child>
   </object>
+  <object class="GtkAdjustment" id="updatesamples_adj">
+    <property name="upper">100</property>
+    <property name="value">5</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
 </interface>
diff --git a/dstatInterface/interface/save.py b/dstatInterface/interface/save.py
index 4789d40..2eaa6c1 100644
--- a/dstatInterface/interface/save.py
+++ b/dstatInterface/interface/save.py
@@ -1,49 +1,80 @@
 #!/usr/bin/env python
 
-import gtk, io
+import gtk, io, os
 import numpy as np
 
-class npSave:
-    def __init__(self, current_exp):
-        self.exp = current_exp
-        self.fcd = gtk.FileChooserDialog("Save...", None, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK))
-        
-        self.filters = [gtk.FileFilter()]
-        self.filters[0].set_name("NumPy binary (.npy)")
-        self.filters[0].add_pattern("*.npy")
-        self.filters.append(gtk.FileFilter())
-        self.filters[1].set_name("Space separated text (.txt)")
-        self.filters[1].add_pattern("*.txt")
+def manSave(current_exp):
+    exp = current_exp
+    fcd = gtk.FileChooserDialog("Save...", None, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK))
+    
+    filters = [gtk.FileFilter()]
+    filters[0].set_name("NumPy binary (.npy)")
+    filters[0].add_pattern("*.npy")
+    filters.append(gtk.FileFilter())
+    filters[1].set_name("Space separated text (.txt)")
+    filters[1].add_pattern("*.txt")
+    
+    fcd.set_do_overwrite_confirmation(True)
+    for i in filters:
+        fcd.add_filter(i)
+                 
+    response = fcd.run()
+    
+    if response == gtk.RESPONSE_OK:
+        path = fcd.get_filename()
+        print "Selected filepath: %s" % path
+        filter_selection = fcd.get_filter().get_name()
         
-        self.fcd.set_do_overwrite_confirmation(True)
-        for i in self.filters:
-            self.fcd.add_filter(i)
-                     
-        self.response = self.fcd.run()
+        if filter_selection.endswith("(.npy)"):
+            npy(exp, path)
+        elif filter_selection.endswith("(.txt)"):
+            text(exp, path)
+        fcd.destroy()
         
-        if self.response == gtk.RESPONSE_OK:
-            self.path = self.fcd.get_filename()
-            print "Selected filepath: %s" % self.path
-            filter_selection = self.fcd.get_filter().get_name()
-            
-            if filter_selection.endswith("(.npy)"):
-                self.npy()
-            elif filter_selection.endswith("(.txt)"):
-                self.text()
-            self.fcd.destroy()
+
+def autoSave(current_exp, dir_button, name, expnumber):
+    if name == "":
+        name = "file"
+    path = dir_button.get_filename()
+    path += '/'
+    path += name
+    path += str(expnumber)
+
+    text(current_exp, path)
+
+
+def npy(exp, path):
+    if path.endswith(".npy"):
+        path = path.rstrip(".npy")
+
+    data = np.array(exp.data)
+    j = 1
+    while os.path.exists("".join([path, ".npy"])):
+        if j > 1:
+            path = path[:-len(str(j))]
+        path += str(j)
+        j += 1
+    np.save(path, data)
+
+def text(exp, path):
+    if path.endswith(".txt"):
+        path = path.rstrip(".txt")
+    
+    j = 1
     
-    def npy(self):
-        self.data = np.array(self.exp.data)
-        np.save(self.path, self.data())
+    while os.path.exists("".join([path, ".txt"])):
+        if j > 1:
+            path = path[:-len(str(j))]
+        path += str(j)
+        j += 1
+    
+    path += ".txt"
+    
+    data = np.array(exp.data)
+    header = ""
+    for i in exp.commands:
+        header += i
 
-    def text(self):
-        if not self.path.endswith(".txt"):
-            self.path += ".txt"
-        
-        self.data = np.array(self.exp.data)
-        header = ""
-        for i in self.exp.commands:
-            header += i
-        np.savetxt(self.path, self.data.transpose(), header=header, newline='\n')
+    np.savetxt(path, data.transpose(), header=header, newline='\n')
 
 
diff --git a/dstatInterface/interface_test.py b/dstatInterface/interface_test.py
index 4907636..e4b7b05 100644
--- a/dstatInterface/interface_test.py
+++ b/dstatInterface/interface_test.py
@@ -78,8 +78,12 @@ class main:
         self.error_context_id = self.statusbar.get_context_id("error")
         
         self.plotwindow = self.builder.get_object('plotbox')
-        self.plotint_checkbox = self.builder.get_object('plotinteractive_checkbutton')
-        self.updatelimit_adj = self.builder.get_object('updatesamples_adj')
+        
+        #setup autosave
+        self.autosave_checkbox = self.builder.get_object('autosave_checkbutton')
+        self.autosavedir_button = self.builder.get_object('autosavedir_button')
+        self.autosavename = self.builder.get_object('autosavename')
+        
         self.plot = mpltest.plotbox(self.plotwindow)
         
         #fill exp_section
@@ -138,6 +142,8 @@ class main:
         self.acv_container.hide()
         self.pd_container.hide()
 
+        self.expnumber = 0
+
     def exp_param_show(self, selection):
         self.chronoamp_container.hide()
         self.lsv_container.hide()
@@ -207,9 +213,6 @@ class main:
         parameters['adc_pga'] = pga_model.get_value(self.adc_pot.pga_combobox.get_active_iter(), 2)
         parameters['gain'] = gain_model.get_value(self.adc_pot.gain_combobox.get_active_iter(), 2)
         
-        view_parameters['update'] = self.plotint_checkbox.get_active()
-        view_parameters['updatelimit'] = int(self.updatelimit_adj.get_value())
-        
         self.line = 0
         self.lastline = 0
         self.lastdataline = 0
@@ -537,7 +540,10 @@ class main:
                 for row in col:
                     self.databuffer.insert_at_cursor(str(row)+ "\t")
                 self.databuffer.insert_at_cursor("\n")
-        
+    
+        if self.autosave_checkbox.get_active():
+            save_inst = save.autoSave(self.current_exp, self.autosavedir_button, self.autosavename.get_text(), self.expnumber)
+            self.expnumber += 1
         
         self.spinner.stop()
         self.startbutton.set_sensitive(True)
@@ -550,7 +556,7 @@ class main:
     
     def on_file_save_exp_activate(self, menuitem, data=None):
         if self.current_exp:
-            self.save = save.npSave(self.current_exp)
+            save_inst = save.manSave(self.current_exp)
 
 
 if __name__ == "__main__":
-- 
GitLab