Adding some management functions to the focus point list:
[cascardo/movie.git] / gzv.py
diff --git a/gzv.py b/gzv.py
index 78f3929..2d5c926 100644 (file)
--- a/gzv.py
+++ b/gzv.py
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 
+import os
 import gtk
 import gtk.glade
 import math
 import cairo
+from ConfigParser import ConfigParser
 
 _ = lambda x:x
 
@@ -66,11 +68,55 @@ class GladeLoader(object):
     def gtk_main(self, *args):
         gtk.main()
 
+class Project(object):
+    def __init__(self, image, width, height):
+        self.image = image
+        self.width = width
+        self.height = height
+        self.focus_points_file = ''
+
+    def save_to_file(self, path):
+        bn = os.path.basename(path)
+        name = os.path.splitext(bn)[0]
+
+        cp = ConfigParser()
+        cp.set('Project', 'image', self.image)
+        cp.set('Project', 'width', self.width)
+        cp.set('Project', 'height', self.height)
+        cp.set('Project', 'focus_points', self.focus_points_file)
+        
+        cp.write(open(path, 'w'))
+
+    @staticmethod
+    def parse_file(path):
+        cp = ConfigParser()
+        cp.read(path)
+
+        image = cp.get('Project', 'image')
+        width = cp.getint('Project', 'width')
+        height = cp.getint('Project', 'height')
+        x = cp.getint('Project', 'height')
+
+        proj = Project(image, width, height)
+        proj.focus_points_file = cp.get('Project', 'focus_points')
+
+        return proj
+
 class NewProject(GladeLoader):
     def __init__(self, parent=None):
         super(NewProject, self).__init__('gzv.glade', 'new-project')
+        self.dialog = self.wid('new-project')
         if parent:
-            self.wid('new-project').set_transient_for(parent)
+            self.dialog.set_transient_for(parent)
+
+    def get_project(self):
+        fname = self.wid('image').get_filename()
+        width = self.wid('width').get_text()
+        height = self.wid('height').get_text()
+        return Project(fname, width, height)
+
+    def destroy(self):
+        self.dialog.destroy()
 
 class Gzv(GladeLoader):
     def __init__(self):
@@ -90,14 +136,17 @@ class Gzv(GladeLoader):
         self.draw = self.wid('draw')
         self.draw.connect('expose-event', self.expose_draw)
 
-        # FIXME: Hardcoded.
-        self.image = 'skol.jpg'
-        self.balls = self.load_balls_from_file('xxx')
-        self.load_balls_to_treeview()
+        # Starting with an empty project with no image loaded
+        self.project = None
+        self.image = None
+
+        # This attr may be overriten, if so, call the method (load_balls_to_treeview)
+        self.balls = BallManager()
 
-        # this *MUST* be called *AFTER* load_balls_to_treeview
+        self.load_balls_to_treeview()
         self.setup_treeview()
 
+        # drawing stuff
         self.ball_width = Ball.DEFAULT_WIDTH
         self.selecting = False
         self.start_x = -1
@@ -108,6 +157,7 @@ class Gzv(GladeLoader):
 
         renderer = gtk.CellRendererText()
         column = gtk.TreeViewColumn(_('Position'), renderer, text=0)
+        column.set_property('visible', False)
         self.treeview.append_column(column)
 
         renderer = gtk.CellRendererText()
@@ -123,22 +173,29 @@ class Gzv(GladeLoader):
         print args
 
     def new_project(self, button):
-        dialog = NewProject(self.window).wid('new-project')
+        proj = NewProject(self.window)
 
         # This '1' was defined in the glade file
-        if dialog.run() == 1:
-            pass
-        dialog.destroy()
+        if proj.dialog.run() == 1:
+            self.load_project(proj.get_project())
+        proj.destroy()
 
-    def open_file_chooser(self, button):
+    def open_project(self, *args):
         fc = gtk.FileChooserDialog(_('Choose a gzv project'), self.window,
                                    buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                             gtk.STOCK_OK, gtk.RESPONSE_OK))
         if fc.run() == gtk.RESPONSE_OK:
-            self.image = fc.get_filename()
-
+            proj_file = fc.get_filename()
+            self.load_project(Project.parse_file(proj_file))
         fc.destroy()
 
+    def load_project(self, project):
+        self.project = project
+        self.balls = self.load_balls_from_file(project.focus_points_file)
+        self.image = project.image
+        self.load_balls_to_treeview()
+        self.draw.queue_draw()
+
     def load_balls_to_treeview(self):
         model = self.treeview.get_model()
         for i in self.balls:
@@ -146,6 +203,9 @@ class Gzv(GladeLoader):
 
     def load_balls_from_file(self, fname):
         balls = BallManager()
+        if not os.path.exists(fname):
+            return balls
+
         for index, line in enumerate(file(fname)):
             if not line:
                 continue
@@ -154,6 +214,37 @@ class Gzv(GladeLoader):
             balls.append(Ball(int(x), int(y), int(radios), name, index))
         return balls
 
+    def remove_fp(self, *args):
+        selection = self.treeview.get_selection()
+        model, path = selection.get_selected()
+        if path:
+            position = model[path][0]
+            for i in self.balls:
+                if i.position == int(position):
+                    self.balls.remove(i)
+            del model[path]
+
+    def save_fp_list(self, *args):
+        assert self.project is not None
+
+        # if the project has no
+        if self.project and not self.project.focus_points_file:
+            fc = gtk.FileChooserDialog(_('Save the focus points file'),
+                                       self.window,
+                                       action=gtk.FILE_CHOOSER_ACTION_SAVE,
+                                       buttons=(gtk.STOCK_CANCEL,
+                                                gtk.RESPONSE_CANCEL,
+                                                gtk.STOCK_SAVE,
+                                                gtk.RESPONSE_OK))
+            if fc.run() == gtk.RESPONSE_OK:
+                self.project.focus_points_file = fc.get_filename()
+                fc.destroy()
+            else:
+                fc.destroy()
+                return
+
+        self.balls.save_to_file(self.project.focus_points_file)
+
     def expose_draw(self, draw, event):
         if not self.image:
             return
@@ -217,9 +308,9 @@ class Gzv(GladeLoader):
         self.draw.queue_draw()
 
         if event.x > self.last_x:
-            self.ball_width += 2
+            self.ball_width += 3
         else:
-            self.ball_width -= 2
+            self.ball_width -= 3
 
         self.last_x = event.x