Sfoglia il codice sorgente

FlatCAMObjs now stored in ListStore. Expected to solve several issues. Some updates to the new architecture still pending.

Juan Pablo Caram 11 anni fa
parent
commit
9740739f05
3 ha cambiato i file con 95 aggiunte e 57 eliminazioni
  1. 90 55
      FlatCAM.py
  2. 4 1
      FlatCAMObj.py
  3. 1 1
      camlib.py

+ 90 - 55
FlatCAM.py

@@ -1956,7 +1956,7 @@ class App:
         self.setup_component_editor()
 
         # Clear list
-        self.collection.build_list()
+        #self.collection.build_list()
 
         # Clear project filename
         self.project_filename = None
@@ -2775,7 +2775,7 @@ class ObjectCollection:
         "geometry": FlatCAMGeometry
     }
 
-    icons = {
+    icon_files = {
         "gerber": "share/flatcam_icon16.png",
         "excellon": "share/drill16.png",
         "cncjob": "share/cnc16.png",
@@ -2784,40 +2784,57 @@ class ObjectCollection:
 
     def __init__(self):
 
-        ### Data
-        # List of FLatCAMObject's
-        self.collection = []
-        self.active = None
+        ### Icons for the list view
+        self.icons = {}
+        for kind in ObjectCollection.icon_files:
+            self.icons[kind] = GdkPixbuf.Pixbuf.new_from_file(ObjectCollection.icon_files[kind])
 
         ### GUI List components
         ## Model
-        self.store = Gtk.ListStore(GdkPixbuf.Pixbuf, str)
+        self.store = Gtk.ListStore(FlatCAMObj)
 
         ## View
         self.view = Gtk.TreeView(model=self.store)
-        self.view.connect("row_activated", self.on_row_activated)
+        #self.view.connect("row_activated", self.on_row_activated)
         self.tree_selection = self.view.get_selection()
         self.change_subscription = self.tree_selection.connect("changed", self.on_list_selection_change)
 
-        # Renderers
+        ## Renderers
+        # Icon
         renderer_pixbuf = Gtk.CellRendererPixbuf()
-        column_pixbuf = Gtk.TreeViewColumn("Type", renderer_pixbuf, pixbuf=0)
+        column_pixbuf = Gtk.TreeViewColumn("Type", renderer_pixbuf)
+
+        def _set_cell_icon(column, cell, model, it, data):
+            obj = model.get_value(it, 0)
+            cell.set_property('pixbuf', self.icons[obj.kind])
+
+        column_pixbuf.set_cell_data_func(renderer_pixbuf, _set_cell_icon)
         self.view.append_column(column_pixbuf)
 
+        # Name
         renderer_text = Gtk.CellRendererText()
-        column_text = Gtk.TreeViewColumn("Name", renderer_text, text=1)
+        column_text = Gtk.TreeViewColumn("Name", renderer_text)
+
+        def _set_cell_text(column, cell, model, it, data):
+            obj = model.get_value(it, 0)
+            cell.set_property('text', obj.options["name"])
+
+        column_text.set_cell_data_func(renderer_text, _set_cell_text)
         self.view.append_column(column_text)
 
     def delete_all(self):
         print "OC.delete_all()"
-        self.collection = []
-        self.active = None
+        # self.collection = []
+        # self.active = None
+        self.store.clear()
 
     def delete_active(self):
         print "OC.delete_active()"
-        self.collection.remove(self.active)
-        self.active = None
-        self.build_list()
+        try:
+            model, treeiter = self.tree_selection.get_selected()
+            self.store.remove(treeiter)
+        except:
+            pass
 
     def on_row_activated(self, *args):
         print "OC.on_row_activated()"
@@ -2825,84 +2842,102 @@ class ObjectCollection:
 
     def on_list_selection_change(self, selection):
         print "OC.on_list_selection_change()"
-        model, treeiter = selection.get_selected()
-
         try:
-            self.get_active().read_form()
-        except:
-            pass
-
-        try:
-            self.set_active(model[treeiter][1])
             self.get_active().build_ui()
         except:
             pass
 
+        # TODO: Now we don't have a reference to the previously
+        # TODO: active, so cannot read form.
+
     def set_active(self, name):
         print "OC.set_active()"
-        for obj in self.collection:
-            if obj.options['name'] == name:
-                self.active = obj
-                return self.active
-        return None
+        self.set_list_selection(name)
 
     def get_active(self):
         print "OC.get_active()"
-        return self.active
+        try:
+            model, treeiter = self.tree_selection.get_selected()
+            return model[treeiter][0]
+        except ValueError:
+            return None
 
     def set_list_selection(self, name):
         print "OC.set_list_selection()"
         iterat = self.store.get_iter_first()
-        while iterat is not None and self.store[iterat][1] != name:
+        while iterat is not None and self.store[iterat][0].options["name"] != name:
             iterat = self.store.iter_next(iterat)
-        self.tree_selection.unselect_all()
         self.tree_selection.select_iter(iterat)
 
     def append(self, obj, active=False):
         print "OC.append()"
-        if obj not in self.collection:
-            self.collection.append(obj)
-            self.build_list()
 
+        self.store.append([obj])
         if active:
             self.set_list_selection(obj.options["name"])
 
     def get_names(self):
         print "OC.get_names()"
-        return [o.options["name"] for o in self.collection]
-
-    def build_list(self):
-        print "OC.build_list()"
-        self.store.clear()
-        for obj in self.collection:
-            icon = GdkPixbuf.Pixbuf.new_from_file(ObjectCollection.icons[obj.kind])
-            self.store.append([icon, obj.options["name"]])
+        names = []
+        iterat = self.store.get_iter_first()
+        while iterat is not None:
+            obj = self.store[iterat][0]
+            names.append(obj.options["name"])
+            iterat = self.store.iter_next(iterat)
+        return names
 
     def get_bounds(self):
         print "OC.get_bounds()"
-        return get_bounds(self.collection)
+
+        # TODO: Move the operation out of here.
+
+        xmin = Inf
+        ymin = Inf
+        xmax = -Inf
+        ymax = -Inf
+
+        iterat = self.store.get_iter_first()
+        while iterat is not None:
+            obj = self.store[iterat][0]
+            try:
+                gxmin, gymin, gxmax, gymax = obj.bounds()
+                xmin = min([xmin, gxmin])
+                ymin = min([ymin, gymin])
+                xmax = max([xmax, gxmax])
+                ymax = max([ymax, gymax])
+            except:
+                print "DEV WARNING: Tried to get bounds of empty geometry."
+            iterat = self.store.iter_next(iterat)
+        return [xmin, ymin, xmax, ymax]
 
     def get_list(self):
-        return self.collection
+        collection_list = []
+        iterat = self.store.get_iter_first()
+        while iterat is not None:
+            obj = self.store[iterat][0]
+            collection_list.append(obj)
+            iterat = self.store.iter_next(iterat)
+        return collection_list
 
     def get_by_name(self, name):
-        for obj in self.collection:
+        iterat = self.store.get_iter_first()
+        while iterat is not None:
+            obj = self.store[iterat][0]
             if obj.options["name"] == name:
                 return obj
+            iterat = self.store.iter_next(iterat)
         return None
 
     def change_name(self, old_name, new_name):
-        self.tree_selection.disconnect(self.change_subscription)
-
-        for obj in self.collection:
+        iterat = self.store.get_iter_first()
+        while iterat is not None:
+            obj = self.store[iterat][0]
             if obj.options["name"] == old_name:
                 obj.options["name"] = new_name
-                self.build_list()
-                self.tree_selection.connect("changed", self.on_list_selection_change)
-                if obj == self.get_active():
-                    self.set_active(new_name)
-                    self.set_list_selection(new_name)
-                break
+                self.store.row_changed(0, iterat)
+                return True
+            iterat = self.store.iter_next(iterat)
+        return False
 
 
 app = App()

+ 4 - 1
FlatCAMObj.py

@@ -9,6 +9,7 @@
 from gi.repository import Gtk
 from gi.repository import Gdk
 from gi.repository import GLib
+from gi.repository import GObject
 
 from camlib import *
 
@@ -16,7 +17,7 @@ from camlib import *
 ########################################
 ##            FlatCAMObj              ##
 ########################################
-class FlatCAMObj:
+class FlatCAMObj(GObject.GObject, object):
     """
     Base type of objects handled in FlatCAM. These become interactive
     in the GUI, can be plotted, and their options can be modified
@@ -28,6 +29,8 @@ class FlatCAMObj:
     app = None
 
     def __init__(self, name):
+        GObject.GObject.__init__(self)
+
         self.options = {"name": name}
         self.form_kinds = {"name": "entry_text"}  # Kind of form element for each option
         self.radios = {}  # Name value pairs for radio sets

+ 1 - 1
camlib.py

@@ -28,7 +28,7 @@ import simplejson as json
 #from matplotlib.pyplot import plot
 
 
-class Geometry:
+class Geometry(object):
     def __init__(self):
         # Units (in or mm)
         self.units = 'in'