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

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

Fix log file and msg error

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