Fix #5725 - disable create branch until ticket selected
[gitlive] / StatusIcon.vala
index e0c27e3..d6b34d1 100644 (file)
@@ -39,7 +39,8 @@ public class StatusIconA : StatusIcon {
 
     public bool paused = false;
     public static StatusIconA statusicon;
-     
+    
     public StatusIconA() {
         
         statusicon = this;
@@ -52,11 +53,11 @@ public class StatusIconA : StatusIcon {
         this.set_name("gitlive");
         this.set_visible(true);      
         
-        var menu = new MenuA();
+        var menu = new GitliveMenu();
         menu.ref();       
                this.button_press_event.connect( ( ev ) =>{
              print("button press event called\n");
-             
+                       menu.updateMerges();
             menu.show_all();
             
             if (this.paused) {
@@ -82,9 +83,10 @@ public class StatusIconA : StatusIcon {
            });
        this.popup_menu.connect( (  button,   time) =>{
        //this.button_press_event.connect( (  ) =>{
-               
             //print(Array.prototype.slice.call(arguments).join(','));
             print("menu activiate called\n");
+                       menu.updateMerges();
             //var menu = this.get('menu');
             
             menu.show_all();
@@ -156,31 +158,86 @@ public class StatusIconA : StatusIcon {
                 
     }
     
-    class MenuA : Gtk.Menu
+    class GitliveMenu : Gtk.Menu
     {
         public ImageMenuItem pause;
         public ImageMenuItem resume;
+        public Gtk.MenuItem before_seperator;
+        public Gtk.MenuItem after_seperator;        
+        
         
-        public MenuA()
+        public GitliveMenu()
         {
-            this.pause = new ImageMenuItemA();
+            this.pause = new MenuItemPause();
             this.append(this.pause);
-            this.resume = new ImageMenuItemB();
+            this.resume = new MenuItemStartCommits();
             this.append(this.resume);
-            this.append(new ImageMenuItemC());
-            this.append(new ImageMenuItemD());
-            this.append(new ImageMenuItemE());
-            this.append(new ImageMenuItemF());
-            this.append(new ImageMenuItemG());
-            
-            
-            
+            this.append(new MenuItemPullAll());
+            this.before_seperator = new Gtk.SeparatorMenuItem();
+            this.append(this.before_seperator);
+
+            this.after_seperator = new Gtk.SeparatorMenuItem();
+            this.append(this.after_seperator);
+            //this.append(new MenuItemUpdateTimesheet());            
+            this.append(new MenuItemManageClones());
+            this.append(new MenuItemNewTicket());            
+            this.append(new MenuItemAbout());
+            this.append(new MenuItemQuit());
+            this.merge_items = new  Gee.ArrayList<Gtk.MenuItem>();
         }
+        public Gee.ArrayList<Gtk.MenuItem> merge_items;
         
         
-        class ImageMenuItemA : ImageMenuItem {
+        public void updateMerges()
+        {
+               // show a list of possible merges on the menu.
+               foreach (var m in this.merge_items) {
+                       this.remove(m);
+               }
+               foreach(var r in GitRepo.singleton().cache.values ) {
+                       GLib.debug("checking %s for branch = %s", r.name, r.currentBranch.name);
+                       if (r.is_master_branch()) {
+                               continue;
+                               }
+                       GLib.debug("checking  for activeTicket");                               
+                               var t = r.activeTicket;
+                               if (t == null) { 
+                                       continue;
+                               }
+                               var mi = new MergeMenuItem(r,t);
+                               this.insert (mi,4); //backwards.
+                               this.merge_items.add(mi);                       
+                                
+               }
+               
+        }
+        
+       
+        class MergeMenuItem : Gtk.MenuItem {        
+        
+               GitRepo repo;
+               RooTicket ticket;
+        
+               public MergeMenuItem(GitRepo r, RooTicket t)
+               {
+                       this.repo = r;
+                       this.ticket = t;
+                       
+                       this.label = ("Merge [%s] #%s %s".printf(r.name, t.id , t.summary));
+
+                               this.activate.connect(() => {
+                                       MergeBranch.singleton().show(this.ticket, null);
+                                       // show merge dialog..
+                               });
+               
+               }
+               
+       }
+        
+        
+        class MenuItemPause : ImageMenuItem {
             
-            public ImageMenuItemA()
+            public MenuItemPause()
             {
                 //this.set_from_stock( Gtk.Stock.MEDIA_PAUSE );
                 
@@ -206,9 +263,9 @@ public class StatusIconA : StatusIcon {
             
             
         }
-        class ImageMenuItemB : ImageMenuItem {
+        class MenuItemStartCommits : ImageMenuItem {
             
-            public ImageMenuItemB()
+            public MenuItemStartCommits()
             {
                 
                 var  image = new Gtk.Image();
@@ -234,26 +291,27 @@ public class StatusIconA : StatusIcon {
         }
         
         
-        class ImageMenuItemC : ImageMenuItem {
+        class MenuItemPullAll : ImageMenuItem {
             
-            public ImageMenuItemC()
+            public MenuItemPullAll()
             {
                 
                 var  image = new Gtk.Image();
-                image.set_from_stock(Gtk.Stock.FULLSCREEN,Gtk.IconSize.MENU );
+                image.set_from_stock(Gtk.Stock.GOTO_BOTTOM,Gtk.IconSize.MENU );
                 this.set_image (image);
                 this.label= "Pull (Refresh) All";
                 this.always_show_image = true;
                 this.accel_group = null;
                 
                 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 );
@@ -288,6 +346,7 @@ public class StatusIconA : StatusIcon {
                         }        
 
                     } 
+                    */
                            
                            
                 });
@@ -299,73 +358,83 @@ public class StatusIconA : StatusIcon {
                 GitMonitor.gitmonitor.stop();
                     
                 
-                var total = tr.length;
-                
+               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);
-                    //if (!repo.autocommit()) {
-                        //??? should we ignore ones not on autocommit..
-                    //    continue;
-                    //}
-                    //try {
-                        statusicon.set_tooltip_text("pull: " + repo.name);
-                        var str = "";
-                        repo.pull_async.begin((obj, res) => {
-                               total--;`
-                               if (!Regex.match_simple ("Already up-to-date", str) ) {
-                                        
-                               
-                                               str += str.length > 0 ? "\n" : "";
-                                               str += "Updated: " +repo.name + "\n" + res +"\n";
-                                       }
-                                       if (total < 1) {
-                                       var notification = new Notify.Notification( 
-                                            "Pull completed ",
-                                            str,
-                                            "dialog-information"
-                                       );
-                                       notification.set_timeout(20);
-                                       notification.show();
-                                       statusicon.set_tooltip_text("Gitlive");
-                             
-                            
-                                               GitMonitor.gitmonitor.start();
-                               }
-                        });
-                                // do not care if it's already in sycn..
-                        
+                    //repo.ref();
+                    //this.ref();
                     
-                       
-                                 
-                    //} catch(Error e) {
-                   //     print("notification or push errror- probably to many in queue..");
-                    //    statusicon.set_from_stock( Gtk.Stock.MEDIA_RECORD );
-                    //    print(e.message);
+                    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 {
+        class MenuItemUpdateTimesheet : ImageMenuItem {
             
-            public ImageMenuItemD()
+            public MenuItemUpdateTimesheet()
             {
                 
                 var  image = new Gtk.Image();
                 image.set_from_stock(Gtk.Stock.SAVE,Gtk.IconSize.MENU );
-               this.set_image (image);
+                               this.set_image (image);
                 this.label= "Update Timesheet";
                 this.always_show_image = true;
                 this.accel_group = null;
@@ -378,29 +447,56 @@ public class StatusIconA : StatusIcon {
             
         }
         
-        class ImageMenuItemE : ImageMenuItem {
+        class MenuItemManageClones : ImageMenuItem {
             
-            public ImageMenuItemE()
+            public MenuItemManageClones()
             {
                 
                 var  image = new Gtk.Image();
-                image.set_from_stock(Gtk.Stock.FULLSCREEN,Gtk.IconSize.MENU );
+                image.set_from_stock(Gtk.Stock.JUSTIFY_FILL,Gtk.IconSize.MENU );
                 this.set_image (image);
                 this.label= "Manage Clones";
                 this.always_show_image = true;
                 this.accel_group = null;
                 
                 this.activate.connect( () => {
-                 //var ret = imports.Clones.Clones.show();
+                       //GitRepo.updateAll("show_clones");
+                       Clones.singleton().loadAndShow();
+                
+                     // Clones.singleton().show();
                 });
             }
             
             
         }
         
-        class ImageMenuItemF : ImageMenuItem {
+        class MenuItemNewTicket : ImageMenuItem {
+            
+            public MenuItemNewTicket()
+            {
+                
+                var  image = new Gtk.Image();
+                image.set_from_stock(Gtk.Stock.NEW,Gtk.IconSize.MENU );
+                this.set_image (image);
+                this.label= "New Ticket";
+                this.always_show_image = true;
+                this.accel_group = null;
+                
+                this.activate.connect( () => {
+                       Ticket.singleton().show(null);
+
+                
+                     // Clones.singleton().show();
+                });
+            }
+            
+            
+        }
+        
+        
+        class MenuItemAbout : ImageMenuItem {
             
-            public ImageMenuItemF()
+            public MenuItemAbout()
             {
                 
                 var  image = new Gtk.Image();
@@ -428,9 +524,9 @@ public class StatusIconA : StatusIcon {
             
         }
         
-         class ImageMenuItemG : ImageMenuItem {
+         class MenuItemQuit : ImageMenuItem {
             
-            public ImageMenuItemG()
+            public MenuItemQuit()
             {
                 
                 var  image = new Gtk.Image();