NewBranch.bjs
[gitlive] / StatusIcon.vala
index 9770850..6419910 100644 (file)
 
 
 using Gtk;
-
+/*
 
 static int main (string[] args) {
     // A reference to our file
     Gtk.init (ref args);
-
-    var window = new TestWindow();
-    
-    window.show_all ();
-
+    new StatusIconA();
     Gtk.main ();
     return 0;
      
 
 }
+ */
 
-public class TestButton : Button {
-    public TestButton()
-    {
-        this.set_label("Click me");
-        
-        
-        this.clicked.connect (() => {
-            this.label = "Thank you";
-        });
-        
-    }
-    
-    
-}
-
-public class TestWindow : Window {
 
-    public TestWindow() {
-         this.title = "First GTK+ Program";
-        this.border_width = 10;
-        this.window_position = WindowPosition.CENTER;
-        this.set_default_size (350, 70);
-        
-        // -- connect all
-        this.destroy.connect (Gtk.main_quit);        
-        
-        // add children..
-        this.add(new TestButton());
-
-    }
-   
-    
+//public StatusIconA statusicon;
  
-   
-}
-
-
+public class StatusIconA : StatusIcon {
 
+    public bool paused = false;
+    public static StatusIconA statusicon;
  
-class StatusIconA : StatusIcon {
-
-    bool paused = false;
-     
+    
     public StatusIconA() {
+        
+        statusicon = this;
+        
          //title : 'gitlive',
-        this.stock = Gtk.STOCK_REFRESH;
+        this.stock = Gtk.Stock.REFRESH;
         this.tooltip_text = "GitLive";
         this.title = "gitlive";
         
         this.set_name("gitlive");
-       
+        this.set_visible(true);      
         
         var menu = new MenuA();
-                 
-         
-        this.popup_menu.connect( (button,event_time) =>{
+        menu.ref();       
+               this.button_press_event.connect( ( ev ) =>{
+             print("button press event called\n");
+            menu.show_all();
             
+            if (this.paused) {
+                menu.resume.show();
+                menu.pause.hide();
+            } else {
+                menu.resume.hide();
+                menu.pause.show();
+            }
+              //               public void popup (Gtk.Widget? parent_menu_shell, Gtk.Widget? parent_menu_item,
+                    // [CCode (scope = "async")] Gtk.MenuPositionFunc? func, uint button, uint32 activate_time);
+            //Gtk.get_current_event_device ()
+            menu.popup(
+
+                        null, null,
+                       this.position_menu,
+                       
+                    ev.button,  ev.time //   time
+            );
+             
+             return true;
+           
+           });
+       this.popup_menu.connect( (  button,   time) =>{
+       //this.button_press_event.connect( (  ) =>{
             //print(Array.prototype.slice.call(arguments).join(','));
-            
+            print("menu activiate called\n");
             //var menu = this.get('menu');
             
-            this.menu.show_all();
+            menu.show_all();
             
             if (this.paused) {
                 menu.resume.show();
@@ -104,17 +97,18 @@ class StatusIconA : StatusIcon {
                 menu.resume.hide();
                 menu.pause.show();
             }
-             
+              //               public void popup (Gtk.Widget? parent_menu_shell, Gtk.Widget? parent_menu_item,
+                    // [CCode (scope = "async")] Gtk.MenuPositionFunc? func, uint button, uint32 activate_time);
             //Gtk.get_current_event_device ()
             menu.popup(
-                    
+
                         null, null,
-                        null, button,
-                        event_time, null
+                       this.position_menu,
+                       
+                    button,  time //   time
             );
                         
             
-            
             //var g = { };
             //var a = new Gdk.Rectangle();
             //  needs direction=inout setting in gir to work (in bugzilla @present)
@@ -123,12 +117,47 @@ class StatusIconA : StatusIcon {
             // should check to see if @ top or bottom I guess..
             //menu.el.get_toplevel().move(a.x, a.y +a.height);
             //menu.el.get_toplevel().move(10,10);
+            //return false;
               
         }); 
         
     }
     
-    class MenuA : Menu
+    public void pause()
+    {
+               this.set_from_stock( Gtk.Stock.MEDIA_PAUSE );
+               this.paused = true;
+    }
+    
+    public void resume()
+    {
+               this.set_from_stock( Gtk.Stock.MEDIA_PLAY );
+               this.paused = false;
+    }
+    
+    public void refreshing()
+    {
+               this.set_from_stock( Gtk.Stock.REFRESH );
+    }
+    
+    public void pauseError()
+    {
+                this.paused = true;
+                var flag = true;
+                Timeout.add_full(Priority.LOW, 500, () => {
+                
+                       if (!this.paused) {
+                               return false;
+                       }
+                       this.set_from_stock( flag == true ? Gtk.Stock.MEDIA_RECORD  
+                                       : Gtk.Stock.MEDIA_PAUSE);
+                       flag = !flag;
+                       return true;
+               });
+                
+    }
+    
+    class MenuA : Gtk.Menu
     {
         public ImageMenuItem pause;
         public ImageMenuItem resume;
@@ -139,6 +168,14 @@ class StatusIconA : StatusIcon {
             this.append(this.pause);
             this.resume = new ImageMenuItemB();
             this.append(this.resume);
+            this.append(new ImageMenuItemC());
+            this.append(new ImageMenuItemD());
+            this.append(new ImageMenuItemE());
+            this.append(new ImageMenuItemF());
+            this.append(new ImageMenuItemG());
+            
+            
+            
         }
         
         
@@ -146,230 +183,288 @@ class StatusIconA : StatusIcon {
             
             public ImageMenuItemA()
             {
-                this.set_from_stock( Gtk.STOCK_MEDIA_PAUSE );
+                //this.set_from_stock( Gtk.Stock.MEDIA_PAUSE );
+                
+                var  image = new Gtk.Image();
+                image.set_from_stock(Gtk.Stock.MEDIA_PAUSE,Gtk.IconSize.MENU );
+                this.set_image (image);
+                
                 this.label= "Pause Commits";
                 this.always_show_image = true;
                 this.accel_group = null;
                 
                 this.activate.connect( () => {
-                    this.parent.parent.paused = true;
-                    imports.GitMonitor.GitMonitor.stop();
+                    statusicon.paused = true;
+                    GitMonitor.gitmonitor.stop();
+
                    // this.el.label  = status ? 'Resume' : 'Pause';
-                    this.parent.parent.el.set_from_stock( Gtk.STOCK_MEDIA_PAUSE );
+                    statusicon.set_from_stock( Gtk.Stock.MEDIA_PAUSE );
                     
                     
-                })
+                });
                 //    id : 'pause',
             }
             
             
         }
-        
-    }
-    
-         
-    items : [
-       {
-            xtype: Gtk.Menu,
-            id : 'menu',
-            pack: false,
-            items : [
-                {
+        class ImageMenuItemB : ImageMenuItem {
+            
+            public ImageMenuItemB()
+            {
+                
+                var  image = new Gtk.Image();
+                image.set_from_stock(Gtk.Stock.MEDIA_PLAY,Gtk.IconSize.MENU );
+                this.set_image (image);
+                this.label= "Start Commits";
+                this.always_show_image = true;
+                this.accel_group = null;
+                
+                this.activate.connect( () => {
+                    GitMonitor.gitmonitor.start();
+                    statusicon.paused = false;
                     
-                    //label: 'Pause',
-                    pack:  'append',
-                    listeners : {
-                        activate : function () {
-                            this.parent.parent.paused = true;
-                            imports.GitMonitor.GitMonitor.stop();
-                           // this.el.label  = status ? 'Resume' : 'Pause';
-                            this.parent.parent.el.set_from_stock( Gtk.STOCK_MEDIA_PAUSE );
-                            
-                        }
-                    }
-                },
+                    //
+                   // this.el.label  = status ? 'Resume' : 'Pause';
+                    statusicon.set_from_stock( Gtk.Stock.MEDIA_PLAY );
+                    
+                    
+                });
+            }
+            
+            
+        }
+        
+        
+        class ImageMenuItemC : ImageMenuItem {
+            
+            public ImageMenuItemC()
+            {
                 
-                {
-                    init : function() {
-                        this.el = XObject.isSeed ?
-                            new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_MEDIA_PLAY)
-                            : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_MEDIA_PLAY, null);
-                        XObject.prototype.init.call(this);
-                    },
-                    label: 'Resume Commits',
-                    always_show_image : true,
-                    accel_group : null,
-                    id : 'resume',
-                    //label: 'Pause',
-                    pack:  'append',
-                    listeners : {
-                        activate : function () {
-                            this.parent.parent.paused = false;
-                             imports.GitMonitor.GitMonitor.start();
-                            //var status = this.el.label == 'Pause' ? 1 : 0
-                           // this.el.label  = status ? 'Resume' : 'Pause';
-                               
-                            
-                        }
-                    }
-                },
+                var  image = new Gtk.Image();
+                image.set_from_stock(Gtk.Stock.FULLSCREEN,Gtk.IconSize.MENU );
+                this.set_image (image);
+                this.label= "Pull (Refresh) All";
+                this.always_show_image = true;
+                this.accel_group = null;
                 
-                {
-                    init : function() {
-                        this.el = XObject.isSeed ?
-                            new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_FULLSCREEN)
-                            : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_FULLSCREEN, null);
-                      
-                        XObject.prototype.init.call(this);
-                    },
-                    label: 'Pull (Refresh) All',
-                    always_show_image : true,
-                    accel_group : null,
-                    //label: 'Pause',
-                    pack:  'append',
-                    listeners : {
-                        activate : function () {
-                            imports.GitMonitor.GitMonitor.stop();
-                           
-                            
-                            var tr = imports.Scm.Repo.Repo.list();
-                            for (var i= 0; i< tr.length;i++) {
-                                this.parent.parent.el.set_from_stock( i%2 ?  Gtk.STOCK_FULLSCREEN : Gtk.STOCK_LEAVE_FULLSCREEN );
+                this.activate.connect( () => {
+                    
+                    this.pullAll();
+                    /*
+                    GitMonitor.gitmonitor.stop();
+                    var tr = GitRepo.list();
+                    
+                    
+                    
+                    for (var i= 0; i< tr.length;i++) {
+                        statusicon.set_from_stock( 
+                               i%2 == 0 ?  Gtk.Stock.FULLSCREEN : Gtk.Stock.LEAVE_FULLSCREEN );
                                 
-                                var repo = tr[i];
-                                if (!repo.autocommit()) {
-                                    //??? should we ignore ones not on autocommit..
-                                    continue;
-                                }
-                                try {
-                                    this.parent.parent.el.set_tooltip_text("pull: " + repo.name);
-                               
-                                    var str = repo.pull();
+                        var repo = tr.index(i);
+                        //if (!repo.autocommit()) {
+                            //??? should we ignore ones not on autocommit..
+                        //    continue;
+                        //}
+                        try {
+                            statusicon.set_tooltip_text("pull: " + repo.name);
+                            var str = repo.pull();
                                     // do not care if it's already in sycn..
-                                    if (str.match(/Already up-to-date/)) {
-                                        continue;
-                                    }
-                                    var notification = new Notify.Notification({
-                                       summary: "Updated " + repo.name,
-                                       body : str
-                                   });
-                                   notification.set_timeout(20);
-                                   notification.show();
-                                   
-                                } catch(e) {
-                                    this.parent.parent.el.set_from_stock( Gtk.STOCK_MEDIA_RECORD );
-                                    print(JSON.stringify(e));
-                                    print("notification or push errror- probably to many in queue..");
-                                    imports.gitlive.errorDialog(e.message);
-
-                                }
+                            if (Regex.match_simple ("Already up-to-date", str) ) {
+                                continue;
                             }
-                            this.parent.parent.el.set_tooltip_text(this.parent.parent.tooltip_text);
-                               
-                            
-                             
-                          
-                            imports.GitMonitor.GitMonitor.start();
-                        }   
-                    }
-                },
-                {
-                    init : function() {
-                        this.el = XObject.isSeed ?
-                            new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_SAVE)
-                            : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_SAVE, null);
-                         
-                        XObject.prototype.init.call(this);
-                    },
-                    label: 'Update Timesheet',
-                    always_show_image : true,
-                    accel_group : null,
-                    
-                    //label: 'Pause',
-                    pack:  'append',
-                    listeners : {
-                        activate : function () {
-                            var ret = imports.FixBug.FixBug.show();
+                            var notification = new Notify.Notification( 
+                                     "Updated " + repo.name,
+                                     str,
+                                       "dialog-information"
+                                   
+                            );
+                        
+                            notification.set_timeout(20);
+                            notification.show();
+                                     
+                        } catch(Error e) {
+                            print("notification or push errror- probably to many in queue..");
+                            statusicon.set_from_stock( Gtk.Stock.MEDIA_RECORD );
+                            print(e.message);
                             
-                        }
-                    }
-                },
-                
+                        }        
+
+                    } 
+                    */
+                           
+                           
+                });
+            }
+            void pullAll()
+            {
+                       var tr = GitRepo.list();
                 
-                {
-                    init : function() {
-                        this.el = XObject.isSeed ?
-                            new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_FULLSCREEN)
-                            : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_FULLSCREEN, null);
-                         XObject.prototype.init.call(this);
-                    },
-                    label: 'Manage Clones',
-                    always_show_image : true,
-                    accel_group : null,
+                GitMonitor.gitmonitor.stop();
                     
-                    //label: 'Pause',
-                    pack:  'append',
-                    listeners : {
-                        activate : function () {
-                             var ret = imports.Clones.Clones.show();
+                
+               this.total = tr.length;
+                this.has_error = 0;
+                this.pull_all_error_message = "";
+                for (var i= 0; i< tr.length;i++) {
+                    statusicon.set_from_stock( 
+                               i%2 == 0 ?  Gtk.Stock.FULLSCREEN : Gtk.Stock.LEAVE_FULLSCREEN );
                             
-                        }
-                    }
-                },
+                    var repo = tr.index(i);
+                    //repo.ref();
+                    //this.ref();
+                    
+                    statusicon.set_tooltip_text("pull: " + repo.name);
+                                       
+                    repo.pull_async(this.pullAllCallback); 
+                                // do not care if it's already in sycn..
+                        
+                     
+
+                } 
+
+                  
+        
+        
+               }
+               uint total = 0; 
+                       uint has_error = 0;
+                       string pull_all_error_message = "";
+               
+               void pullAllCallback(GitRepo repo, int err, string res)
+               {
+                       this.total--;
+                       
+                       if (err > 0) {
+                               this.has_error = 1;
+                               this.pull_all_error_message += this.pull_all_error_message.length > 0 ? "\n" : "";
+                               this.pull_all_error_message += "Error Pulling " + repo.name +"\n" + res;
+                       }
+                       
+                       if (!Regex.match_simple ("Already up-to-date", res) ) {
+                       var notification = new Notify.Notification( 
+                         "Pull completed ",
+                          "Updated: " +repo.name + "\n" + res +"\n",
+                            "dialog-information"
+                    );
+                    notification.set_timeout(20);
+                               notification.show();
+                       
+                       }
+                       if (this.total < 1) {
+                               if (this.has_error > 0) {
+                                       GitMonitor.gitmonitor.pauseError(this.pull_all_error_message);
+                                       return;
+                               }
+                       
+                               statusicon.set_tooltip_text("Gitlive");
+                  
+                               GitMonitor.gitmonitor.start();
+                               //this.unref();
+                               //repo.unref();
+                       }
+                       
+               }
+        
+            
+        }
+        
+        
+        class ImageMenuItemD : ImageMenuItem {
+            
+            public ImageMenuItemD()
+            {
+                
+                var  image = new Gtk.Image();
+                image.set_from_stock(Gtk.Stock.SAVE,Gtk.IconSize.MENU );
+               this.set_image (image);
+                this.label= "Update Timesheet";
+                this.always_show_image = true;
+                this.accel_group = null;
                 
+                this.activate.connect( () => {
+                 //var ret = imports.FixBug.FixBug.show();
+                });
+            }
+            
+            
+        }
+        
+        class ImageMenuItemE : ImageMenuItem {
+            
+            public ImageMenuItemE()
+            {
                 
+                var  image = new Gtk.Image();
+                image.set_from_stock(Gtk.Stock.FULLSCREEN,Gtk.IconSize.MENU );
+                this.set_image (image);
+                this.label= "Manage Clones";
+                this.always_show_image = true;
+                this.accel_group = null;
                 
+                this.activate.connect( () => {
+                      Clones.singleton().show();
+                });
+            }
+            
+            
+        }
+        
+        class ImageMenuItemF : ImageMenuItem {
             
-                {
-                    init : function() {
-                        this.el = XObject.isSeed ?
-                            new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_ABOUT)
-                            : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_ABOUT, null);
-                   
-                        XObject.prototype.init.call(this);
-                    },
-                    label: 'About GitLive',
-                    pack:  'append',
-                    listeners : {
-                        activate : function () {
-                            var msg = new Gtk.AboutDialog({
-                                program_name : "Git Live",
-                                version: '0.3',
-                                website: 'http://www.roojs.org/index.php/projects/gitlive.html',
-                                website_label: 'RooJS Consulting',
-                                license : 'LGPL'
-                            });
-                            msg.set_authors([ "Alan Knowles <alan@roojs.com>" ]);
-                            msg.run();
-                            msg.destroy();
-                        }
-                    }
-                },
+            public ImageMenuItemF()
+            {
                 
-                {
-                    init : function() {
-                        
-                        this.el = XObject.isSeed ?
-                            new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_QUIT)
-                            : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_QUIT, null);
-                     
-                        XObject.prototype.init.call(this);
-                    },
-                    label: 'Quit',
-                    pack:  'append',
-                    listeners : {
-                        activate : function () {
-                            Seed.quit();
-                        }
-                    }
-                }
+                var  image = new Gtk.Image();
+                image.set_from_stock(Gtk.Stock.ABOUT,Gtk.IconSize.MENU );
+                this.set_image (image);
+                this.label= "About Gitlive";
+                this.always_show_image = true;
+                this.accel_group = null;
+                
+                this.activate.connect( () => {
+                 //var ret = imports.Clones.Clones.show();
+                 
+                    var msg = new Gtk.AboutDialog();
+                    msg.program_name = "Git Live";
+                    msg.version= "0.3";
+                    msg.website= "http://www.roojs.org/index.php/projects/gitlive.html";
+                    msg.website_label= "Roo J Solutions Ltd.";
+                    msg.license = "LGPL";
+                    msg.authors = { "Alan Knowles <alan@roojs.com>" };
+                    msg.run();
+                    msg.destroy();
+                });
+            }
+            
+            
+        }
+        
+         class ImageMenuItemG : ImageMenuItem {
+            
+            public ImageMenuItemG()
+            {
                 
+                var  image = new Gtk.Image();
+                image.set_from_stock(Gtk.Stock.QUIT,Gtk.IconSize.MENU );
+               this.set_image (image);
+                this.label= "Quit";
+                this.always_show_image = true;
+                this.accel_group = null;
                 
-            ]
+                this.activate.connect( () => {
+                    // confirm?
+                    Gtk.main_quit();
+                 //var ret = imports.Clones.Clones.show();
+                 });
+            }
+            
+            
         }
-    ]
-    
-});
-*/
-
-
+        
+    }
+}
+      
+                
+                  
\ No newline at end of file