StatusIcon.vala
[gitlive] / StatusIcon.vala
1 /**
2  * Status icon and menu for component of gitlive.
3  * 
4  * Implements XObject - however we want to control initialization.
5  * 
6  * 
7  * 
8  * Currently only does a few things
9  * a) Quit
10  * 
11  * b) Pause!??!
12  */
13    
14 // Compile::
15 // valac --pkg gtk+-3.0 StatusIcon.vala -o /tmp/StatusIcon
16    
17 //var gitlive = imports.gitlive;
18
19
20 using Gtk;
21
22
23 static int main (string[] args) {
24     // A reference to our file
25     Gtk.init (ref args);
26
27     var window = new TestWindow();
28     
29     window.show_all ();
30
31     Gtk.main ();
32     return 0;
33      
34
35 }
36
37 public class TestButton : Button {
38     public TestButton()
39     {
40         this.set_label("Click me");
41         
42         
43         this.clicked.connect (() => {
44             this.label = "Thank you";
45         });
46         
47     }
48     
49     
50 }
51
52 public class TestWindow : Window {
53
54     public TestWindow() {
55          this.title = "First GTK+ Program";
56         this.border_width = 10;
57         this.window_position = WindowPosition.CENTER;
58         this.set_default_size (350, 70);
59         
60         // -- connect all
61         this.destroy.connect (Gtk.main_quit);        
62         
63         // add children..
64         this.add(new TestButton());
65
66     }
67    
68     
69  
70    
71 }
72
73
74
75  
76 class StatusIconA : StatusIcon {
77
78     bool paused = false;
79     
80     MenuA menu = null;
81     
82     public StatusIconA() {
83          //title : 'gitlive',
84         this.stock = Gtk.STOCK_REFRESH;
85         this.tooltip_text = "GitLive";
86         this.title = "gitlive";
87         
88         this.set_name("gitlive");
89         
90         this.popup_menu.connect( (button,event_time) =>{
91             
92             //print(Array.prototype.slice.call(arguments).join(','));
93             
94             //var menu = this.get('menu');
95             
96             this.menu.show_all();
97             
98             if (this.paused) {
99                 this.menu.resume.show();
100                 this.menu.pause.hide();
101             } else {
102                 this.menu.resume.hide();
103                 this.menu.pause.show();
104             }
105              
106             //Gtk.get_current_event_device ()
107             this.menu.popup(
108                     
109                         null, null,
110                         null, button,
111                         event_time, null
112             );
113                         
114             
115             
116             this.menu = new MenuA();
117             
118             //var g = { };
119             //var a = new Gdk.Rectangle();
120             //  needs direction=inout setting in gir to work (in bugzilla @present)
121             //this.el.get_geometry(g,a,null);
122              
123             // should check to see if @ top or bottom I guess..
124             //menu.el.get_toplevel().move(a.x, a.y +a.height);
125             //menu.el.get_toplevel().move(10,10);
126               
127         }); 
128         
129     }
130     
131     class MenuA : Menu
132     {
133         public ImageMenuItem pause;
134         public ImageMenuItem resume;
135         
136         public MenuA()
137         {
138             this.pause = new Gtk.ImageMenuItemA();
139             this.add(this.pause);
140             this.resume = new Gtk.ImageMenuItemB();
141             this.add(this.resume);
142         }
143         
144         
145         class ImageMenuItemA : ImageMenuItem {
146             f
147             
148         }
149         
150     }
151     
152          
153     items : [
154        {
155             xtype: Gtk.Menu,
156             id : 'menu',
157             pack: false,
158             items : [
159                 {
160                     init : function() {
161                         
162                         this.el = XObject.isSeed ?
163                             new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_MEDIA_PAUSE)
164                             : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_MEDIA_PAUSE, null);
165                         XObject.prototype.init.call(this);
166                     },
167                     label: 'Pause Commits',
168                    
169                     always_show_image : true,
170                     accel_group : null,
171                     id : 'pause',
172                     //label: 'Pause',
173                     pack:  'append',
174                     listeners : {
175                         activate : function () {
176                             this.parent.parent.paused = true;
177                             imports.GitMonitor.GitMonitor.stop();
178                            // this.el.label  = status ? 'Resume' : 'Pause';
179                             this.parent.parent.el.set_from_stock( Gtk.STOCK_MEDIA_PAUSE );
180                             
181                         }
182                     }
183                 },
184                 
185                 {
186                     init : function() {
187                         this.el = XObject.isSeed ?
188                             new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_MEDIA_PLAY)
189                             : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_MEDIA_PLAY, null);
190                         XObject.prototype.init.call(this);
191                     },
192                     label: 'Resume Commits',
193                     always_show_image : true,
194                     accel_group : null,
195                     id : 'resume',
196                     //label: 'Pause',
197                     pack:  'append',
198                     listeners : {
199                         activate : function () {
200                             this.parent.parent.paused = false;
201                              imports.GitMonitor.GitMonitor.start();
202                             //var status = this.el.label == 'Pause' ? 1 : 0
203                            // this.el.label  = status ? 'Resume' : 'Pause';
204                                
205                             
206                         }
207                     }
208                 },
209                 
210                 {
211                     init : function() {
212                         this.el = XObject.isSeed ?
213                             new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_FULLSCREEN)
214                             : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_FULLSCREEN, null);
215                       
216                         XObject.prototype.init.call(this);
217                     },
218                     label: 'Pull (Refresh) All',
219                     always_show_image : true,
220                     accel_group : null,
221                     //label: 'Pause',
222                     pack:  'append',
223                     listeners : {
224                         activate : function () {
225                             imports.GitMonitor.GitMonitor.stop();
226                            
227                             
228                             var tr = imports.Scm.Repo.Repo.list();
229                             for (var i= 0; i< tr.length;i++) {
230                                 this.parent.parent.el.set_from_stock( i%2 ?  Gtk.STOCK_FULLSCREEN : Gtk.STOCK_LEAVE_FULLSCREEN );
231                                 
232                                 var repo = tr[i];
233                                 if (!repo.autocommit()) {
234                                     //??? should we ignore ones not on autocommit..
235                                     continue;
236                                 }
237                                 try {
238                                     this.parent.parent.el.set_tooltip_text("pull: " + repo.name);
239                                
240                                     var str = repo.pull();
241                                     // do not care if it's already in sycn..
242                                     if (str.match(/Already up-to-date/)) {
243                                         continue;
244                                     }
245                                     var notification = new Notify.Notification({
246                                        summary: "Updated " + repo.name,
247                                        body : str
248                                    });
249                                    notification.set_timeout(20);
250                                    notification.show();
251                                    
252                                 } catch(e) {
253                                     this.parent.parent.el.set_from_stock( Gtk.STOCK_MEDIA_RECORD );
254                                     print(JSON.stringify(e));
255                                     print("notification or push errror- probably to many in queue..");
256                                     imports.gitlive.errorDialog(e.message);
257
258                                 }
259                             }
260                             this.parent.parent.el.set_tooltip_text(this.parent.parent.tooltip_text);
261                                
262                             
263                              
264                           
265                             imports.GitMonitor.GitMonitor.start();
266                         }   
267                     }
268                 },
269                 {
270                     init : function() {
271                         this.el = XObject.isSeed ?
272                             new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_SAVE)
273                             : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_SAVE, null);
274                          
275                         XObject.prototype.init.call(this);
276                     },
277                     label: 'Update Timesheet',
278                     always_show_image : true,
279                     accel_group : null,
280                     
281                     //label: 'Pause',
282                     pack:  'append',
283                     listeners : {
284                         activate : function () {
285                             var ret = imports.FixBug.FixBug.show();
286                             
287                         }
288                     }
289                 },
290                 
291                 
292                 {
293                     init : function() {
294                         this.el = XObject.isSeed ?
295                             new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_FULLSCREEN)
296                             : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_FULLSCREEN, null);
297                          XObject.prototype.init.call(this);
298                     },
299                     label: 'Manage Clones',
300                     always_show_image : true,
301                     accel_group : null,
302                     
303                     //label: 'Pause',
304                     pack:  'append',
305                     listeners : {
306                         activate : function () {
307                              var ret = imports.Clones.Clones.show();
308                             
309                         }
310                     }
311                 },
312                 
313                 
314                 
315             
316                 {
317                     init : function() {
318                         this.el = XObject.isSeed ?
319                             new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_ABOUT)
320                             : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_ABOUT, null);
321                    
322                         XObject.prototype.init.call(this);
323                     },
324                     label: 'About GitLive',
325                     pack:  'append',
326                     listeners : {
327                         activate : function () {
328                             var msg = new Gtk.AboutDialog({
329                                 program_name : "Git Live",
330                                 version: '0.3',
331                                 website: 'http://www.roojs.org/index.php/projects/gitlive.html',
332                                 website_label: 'RooJS Consulting',
333                                 license : 'LGPL'
334                             });
335                             msg.set_authors([ "Alan Knowles <alan@roojs.com>" ]);
336                             msg.run();
337                             msg.destroy();
338                         }
339                     }
340                 },
341                 
342                 {
343                     init : function() {
344                         
345                         this.el = XObject.isSeed ?
346                             new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_QUIT)
347                             : new Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_QUIT, null);
348                      
349                         XObject.prototype.init.call(this);
350                     },
351                     label: 'Quit',
352                     pack:  'append',
353                     listeners : {
354                         activate : function () {
355                             Seed.quit();
356                         }
357                     }
358                 }
359                 
360                 
361             ]
362         }
363     ]
364     
365 });
366 */
367
368