2 * Status icon and menu for component of gitlive.
4 * Implements XObject - however we want to control initialization.
8 * Currently only does a few things
14 var Gtk = imports.gi.Gtk;
15 var Gdk = imports.gi.Gdk;
16 var Gio = imports.gi.Gio;
17 var GLib = imports.gi.GLib;
18 var Notify = imports.gi.Notify;
20 var XObject = imports.XObject.XObject;
22 //var gitlive = imports.gitlive;
25 var StatusIcon = new XObject({
27 paused : false, // on!
28 xtype : Gtk.StatusIcon,
30 stock : Gtk.STOCK_MEDIA_PLAY,
31 tooltip_text : 'GitLive',
33 XObject.prototype.init.call(this);
34 this.el.set_name('gitlive');
37 //'popup-menu' : function( w, event, event_time) {
38 'activate' : function( w, event, event_time) {
39 print(Array.prototype.slice.call(arguments).join(','));
41 var menu = this.get('menu');
45 this.get(!this.paused ? 'resume' : 'pause' ).el.hide();
47 menu.el.popup(null, null,Gtk.StatusIcon.position_menu , this.el , 1, Gtk.get_current_event_time());
48 //menu.el.popup(null, null,null, null, 1, Gtk.get_current_event_time());
53 var a = new Gdk.Rectangle();
54 // needs direction=inout setting in gir to work (in bugzilla @present)
55 this.el.get_geometry(g,a,null);
57 // should check to see if @ top or bottom I guess..
58 menu.el.get_toplevel().move(a.x, a.y +a.height);
70 this.el = new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_MEDIA_PAUSE);
71 XObject.prototype.init.call(this);
73 label: 'Pause Commits',
75 always_show_image : true,
81 activate : function () {
82 this.parent.parent.paused = true;
83 imports.GitMonitor.GitMonitor.stop();
84 // this.el.label = status ? 'Resume' : 'Pause';
85 this.parent.parent.el.set_from_stock( Gtk.STOCK_MEDIA_PAUSE );
93 this.el = new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_MEDIA_PLAY);
94 XObject.prototype.init.call(this);
96 label: 'Resume Commits',
97 always_show_image : true,
103 activate : function () {
104 this.parent.parent.paused = false;
105 imports.GitMonitor.GitMonitor.start();
106 //var status = this.el.label == 'Pause' ? 1 : 0
107 // this.el.label = status ? 'Resume' : 'Pause';
108 this.parent.parent.el.set_from_stock( Gtk.STOCK_MEDIA_PLAY);
116 this.el = new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_RELOAD);
117 XObject.prototype.init.call(this);
119 label: 'Pull (Refresh) All',
120 always_show_image : true,
125 activate : function () {
126 imports.GitMonitor.GitMonitor.stop();
128 var f = Gio.file_new_for_path(imports.GitMonitor.GitMonitor.gitlive);
129 var file_enum = f.enumerate_children(
130 Gio.FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, Gio.FileQueryInfoFlags.NONE, null);
132 var next_file = null;
134 while ((next_file = file_enum.next_file(null)) != null) {
136 var fn = imports.GitMonitor.GitMonitor.gitlive + '/' + next_file.get_display_name();
137 if (! GLib.file_test(fn + '/.git', GLib.FileTest.IS_DIR)) {
141 var repo = new imports.Scm.Git.Repo.Repo({
145 var str = repo.pull();
146 // do not care if it's already in sycn..
147 if (str.match(/Already up-to-date/)) {
151 var notification = new Notify.Notification({
152 summary: "Updated " + fn,
155 notification.set_timeout(20);
159 print(JSON.stringify(e));
160 print("notification or push errror- probably to many in queue..");
161 imports.gitlive.errorDialog(e.message);
165 // should also update modules ideally.
170 file_enum.close(null);
173 imports.GitMonitor.GitMonitor.start();
180 this.el = new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_RELOAD);
181 XObject.prototype.init.call(this);
183 label: 'Manage Clones',
184 always_show_image : true,
190 activate : function () {
191 var ret = imports.Clones.Clones.show();
202 this.el = new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_ABOUT);
203 XObject.prototype.init.call(this);
205 label: 'About GitLive',
208 activate : function () {
209 var msg = new Gtk.AboutDialog({
210 program_name : "Git Live",
212 website: 'http://www.roojs.org/index.php/projects/gitlive.html',
213 website_label: 'RooJS Consulting',
216 msg.set_authors([ "Alan Knowles <alan@roojs.com>" ]);
225 this.el = new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_QUIT);
226 XObject.prototype.init.call(this);
231 activate : function () {