source: lliurex-gdrive/trunk/fuentes/lliurex-gdrive-indicator.install/usr/bin/lliurexGdriveIndicator @ 4003

Last change on this file since 4003 was 4003, checked in by jrpelegrina, 3 years ago

WIP in fix bug in indicator

  • Property svn:executable set to *
File size: 7.5 KB
Line 
1#!/usr/bin/env python
2
3import gi
4gi.require_version('Gtk', '3.0')
5from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject, GLib
6gi.require_version('AppIndicator3', '0.1')
7from gi.repository import AppIndicator3 as appindicator
8
9import os
10import threading
11import sys
12import gettext
13import json
14
15import pyinotify
16from pyinotify import WatchManager, Notifier, ThreadedNotifier, EventsCodes, ProcessEvent
17
18import signal
19signal.signal(signal.SIGINT, signal.SIG_DFL)
20
21import lliurex.lliurexgdrive
22
23import gettext
24gettext.textdomain('lliurex-gdrive')
25_ = gettext.gettext
26
27LOCK_PATH="/tmp/lgdIndicator.lock"
28RSRC="/usr/share/lliurex-gdrive/"
29MOUNT_ON_IMAGE=RSRC+"rsrc/mount_on.png"
30MOUNT_OFF_IMAGE=RSRC+"rsrc/mount_off.png"
31
32class LlliurexGdriveIndicator:
33
34        WATCH_DIR=os.path.expanduser("~/.config/lliurex-google-drive-profiles/configProfiles")
35       
36        def __init__(self,icon_name):
37               
38                self.LliurexGoogleDriveManager=lliurex.lliurexgdrive.LliurexGoogleDriveManager()
39                self.app_indicator=appindicator.Indicator.new("lliurex-gdrive",icon_name,appindicator.IndicatorCategory.APPLICATION_STATUS)
40                self.app_indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
41                self.menu = Gtk.Menu()
42               
43                self.menu.add_events(Gdk.EventMask.ALL_EVENTS_MASK)
44                self.app_indicator.set_menu(self.menu)
45               
46                self.profiles_info=self.LliurexGoogleDriveManager.profiles_config.copy()
47                self.current_status={}
48
49                       
50                self.createLockToken()
51                self.populate_menu()
52                self.start_inotify()
53
54                GLib.timeout_add(60000,self.check_status)
55               
56        #def __init__
57
58
59        def createLockToken(self):
60
61                #self.lockpath=os.path(LOCK_PATH)
62                if not os.path.exists(LOCK_PATH):
63                        f=open(LOCK_PATH,'w')
64                        f.close
65
66        #def createLockToken
67                       
68        def start_inotify(self):
69
70                t=threading.Thread(target=self._inotify)
71                t.daemon=True
72                t.start()
73
74        #def start_inotif
75
76
77        def _inotify(self):
78               
79               
80                wm=WatchManager()
81                mask=pyinotify.IN_CLOSE_WRITE
82                       
83                class Process_handler(ProcessEvent):
84                               
85                        def __init__(self,main):
86                               
87                                self.main=main
88                               
89                        def process_IN_CLOSE_WRITE(self,event):
90
91                                self.main.update_info()
92                                print self.main.update_profiles
93                                for profile in self.main.update_profiles:
94                                        if not profile in self.main.profiles_info:
95                                                mountpoint=self.main.update_profiles[profile]["mountpoint"]
96                                                print mountpoint
97                                                self.main.add_menu_item(profile,mountpoint)
98
99                                for item in self.main.menu.get_children():
100                                        if item.profile !="":
101                                                if not item.profile in self.main.update_profiles:
102                                                        self.main.menu.remove(item)     
103                               
104                                self.main.profiles_info=self.main.update_profiles.copy()
105                                self.main.menu.show_all()                                       
106                                                               
107       
108                notifier=Notifier(wm,Process_handler(self))
109                wdd=wm.add_watch(LlliurexGdriveIndicator.WATCH_DIR,mask,rec=True)
110                       
111                while True:
112                        try:
113                                       
114                                notifier.process_events()
115                                if notifier.check_events():
116                                        notifier.read_events()
117                               
118                        except Exception as e:
119                                print e
120                                notifier.stop()
121                                       
122                return False
123       
124        #def _inotify
125
126        def update_info(self):
127
128                f=open(self.LliurexGoogleDriveManager.config_file)
129
130                try:
131                        self.update_profiles=json.load(f)
132                except:
133                        self.update_profiles={}
134               
135                f.close()
136
137        #def update_info       
138       
139        def add_menu_item(self,profile,mountpoint):
140
141                status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
142                info=self.item_status_info(status_info)
143                self.current_status[profile]=status_info["status"]     
144
145                label_item=profile     
146                item=Gtk.ImageMenuItem()
147                item.set_label(label_item)
148                item.set_image(info["img"])
149                item.set_tooltip_text(info["tooltip"])
150                item.profile=profile
151                item.size=False
152                item.status=True
153                item.set_always_show_image(True)
154                item.connect("activate",self.item_clicked,profile)
155                self.menu.insert(item,0)
156
157               
158                item=Gtk.MenuItem()
159                label_item=info["used_size"]
160                item.set_label(label_item)
161                item.profile=profile
162                item.size=True
163                item.status=False
164                self.menu.insert(item,1)
165
166                item=Gtk.MenuItem()
167                label_item=_("Open folder")
168                item.set_label(label_item)
169                item.connect("activate",self.open_folder,profile)
170                item.profile=profile
171                item.size=False
172                item.status=False
173                self.menu.insert(item,2)
174
175                item=Gtk.SeparatorMenuItem()
176                item.profile=profile
177                item.size=False
178                item.status=False
179                self.menu.insert(item,3)
180
181        #def add_menu_item     
182
183
184        def populate_menu(self,empty=True):
185               
186               
187                if empty:
188                        for c in self.menu.get_children():
189                                self.menu.remove(c)
190               
191               
192                for profile in self.profiles_info:
193                        mountpoint=self.profiles_info[profile]["mountpoint"]
194                        self.add_menu_item(profile,mountpoint)
195                       
196                       
197                item=Gtk.ImageMenuItem()
198                label_item=_("Open Lliurex Gdrive")
199                item.set_label(label_item)
200                img=Gtk.Image()
201                img.set_from_stock(Gtk.STOCK_PREFERENCES,Gtk.IconSize.MENU)
202                item.set_image(img)
203                item.set_always_show_image(True)
204                item.connect("activate",self.open_gui)
205                item.profile=""
206                item.size=False
207                item.status=False
208                self.menu.append(item)
209
210                item=Gtk.ImageMenuItem()
211                img=Gtk.Image()
212                img.set_from_stock(Gtk.STOCK_CLOSE,Gtk.IconSize.MENU)
213                item.set_image(img)
214                item.set_always_show_image(True)
215                label_item=_("Close")
216                item.set_label(label_item)
217                item.connect("activate",self.quit)
218                item.profile=""
219                item.size=False
220                item.status=False
221                self.menu.append(item)
222
223
224                self.menu.show_all()
225               
226               
227        #def populate_menu
228       
229       
230        def item_clicked(self,widget,profile):
231               
232                mountpoint=self.profiles_info[profile]["mountpoint"]
233                status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
234
235                if self.current_status[profile]==status_info["status"]:
236
237                        status_mod=self.LliurexGoogleDriveManager.sync_profile(profile.encode("utf-8"),mountpoint.encode("utf-8"))
238
239                        if status_mod["result"]:
240                                status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
241                                       
242                info=self.item_status_info(status_info)
243                self.current_status[profile]=status_info["status"]
244                for item in self.menu.get_children():
245                        if item.size:
246                                if item.profile==profile:
247                                        item.set_label(info["used_size"])
248               
249
250                widget.set_tooltip_text(info["tooltip"])
251                widget.set_image(info["img"])
252               
253               
254        #def item_clicked
255
256        def open_folder(self,widget,profile):
257
258               
259                mountpoint=self.profiles_info[profile]["mountpoint"]
260                cmd="caja " + mountpoint.encode("utf-8")
261
262                os.system(cmd) 
263
264        #def open_folder       
265
266        def open_gui(self,widget):
267               
268                cmd='lliurex-gdrive' +"&" 
269                os.system(cmd)
270
271        #def open_gui
272               
273        def item_status_info(self,status_info):
274       
275                size=status_info["size"]
276                used=status_info["used"]
277
278                if status_info["status"]:
279                        img=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
280                        tooltip=_("Dismount now")
281                        used_size=_("Used: %s of %s")%(used,size)
282               
283                else:
284                        img=Gtk.Image.new_from_file(MOUNT_OFF_IMAGE)
285                        tooltip=_("Mount now")
286                        used_size=_("Used: not available")     
287
288                return {"img":img ,"tooltip":tooltip, "used_size":used_size}   
289
290        #def item_status_info                   
291
292        def check_status(self):
293               
294       
295                for profile in self.profiles_info:
296                        mountpoint=self.profiles_info[profile]["mountpoint"]
297                        status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
298                        info=self.item_status_info(status_info)
299                        self.current_status[profile]=status_info["status"]
300
301                        for item in self.menu.get_children():
302                                if item.profile==profile:
303                                        if item.size:
304                                                item.set_label(info["used_size"])
305                                       
306                                        if item.status:
307                                                item.set_tooltip_text(info["tooltip"])
308                                                item.set_image(info["img"])
309               
310                return True
311               
312               
313        #def check_status
314
315
316        def cleanIndicatorLock(self):
317
318                if os.path.exists(LOCK_PATH):
319                        os.remove(LOCK_PATH)
320
321        #def cleanIndicatorLock                 
322       
323        def quit(self,widget):
324
325                self.cleanIndicatorLock()
326                Gtk.main_quit() 
327
328        #def quit       
329
330       
331#class LlliurexGdriveIndicator
332
333if __name__=="__main__":
334       
335        lliurexgdrive=LlliurexGdriveIndicator("gdrive")
336        GObject.threads_init()
337        Gtk.main()
338       
Note: See TracBrowser for help on using the repository browser.