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

Last change on this file since 4009 was 4009, checked in by jrpelegrina, 2 years ago

WIP in fix encode

  • 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                                for profile in self.main.update_profiles:
93                                        if not profile in self.main.profiles_info:
94                                                mountpoint=self.main.update_profiles[profile]["mountpoint"]
95                                                self.main.add_menu_item(profile,mountpoint)
96
97                                for item in self.main.menu.get_children():
98                                        if item.profile !="":
99                                                if not item.profile in self.main.update_profiles:
100                                                        self.main.menu.remove(item)     
101                               
102                                self.main.profiles_info=self.main.update_profiles.copy()
103                                self.main.menu.show_all()                                       
104                                                               
105       
106                notifier=Notifier(wm,Process_handler(self))
107                wdd=wm.add_watch(LlliurexGdriveIndicator.WATCH_DIR,mask,rec=True)
108                       
109                while True:
110                        try:
111                                       
112                                notifier.process_events()
113                                if notifier.check_events():
114                                        notifier.read_events()
115                               
116                        except Exception as e:
117                                notifier.stop()
118                                       
119                return False
120       
121        #def _inotify
122
123        def update_info(self):
124
125                f=open(self.LliurexGoogleDriveManager.config_file)
126
127                try:
128                        self.update_profiles=json.load(f)
129                except:
130                        self.update_profiles={}
131               
132                f.close()
133
134        #def update_info       
135       
136        def add_menu_item(self,profile,mountpoint):
137
138                status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
139                info=self.item_status_info(status_info)
140                self.current_status[profile]=status_info["status"]     
141
142                label_item=profile     
143                item=Gtk.ImageMenuItem()
144                item.set_label(label_item)
145                item.set_image(info["img"])
146                item.set_tooltip_text(info["tooltip"])
147                item.profile=profile
148                item.size=False
149                item.status=True
150                item.set_always_show_image(True)
151                item.connect("activate",self.item_clicked,profile)
152                self.menu.insert(item,0)
153
154               
155                item=Gtk.MenuItem()
156                label_item=info["used_size"]
157                item.set_label(label_item)
158                item.profile=profile
159                item.size=True
160                item.status=False
161                self.menu.insert(item,1)
162
163                item=Gtk.MenuItem()
164                label_item=_("Open folder")
165                item.set_label(label_item)
166                item.connect("activate",self.open_folder,profile)
167                item.profile=profile
168                item.size=False
169                item.status=False
170                self.menu.insert(item,2)
171
172                item=Gtk.SeparatorMenuItem()
173                item.profile=profile
174                item.size=False
175                item.status=False
176                self.menu.insert(item,3)
177
178        #def add_menu_item     
179
180
181        def populate_menu(self,empty=True):
182               
183               
184                if empty:
185                        for c in self.menu.get_children():
186                                self.menu.remove(c)
187               
188               
189                for profile in self.profiles_info:
190                        mountpoint=self.profiles_info[profile]["mountpoint"]
191                        self.add_menu_item(profile,mountpoint)
192                       
193                       
194                item=Gtk.ImageMenuItem()
195                label_item=_("Open Lliurex Gdrive")
196                item.set_label(label_item)
197                img=Gtk.Image()
198                img.set_from_stock(Gtk.STOCK_PREFERENCES,Gtk.IconSize.MENU)
199                item.set_image(img)
200                item.set_always_show_image(True)
201                item.connect("activate",self.open_gui)
202                item.profile=""
203                item.size=False
204                item.status=False
205                self.menu.append(item)
206
207                item=Gtk.ImageMenuItem()
208                img=Gtk.Image()
209                img.set_from_stock(Gtk.STOCK_CLOSE,Gtk.IconSize.MENU)
210                item.set_image(img)
211                item.set_always_show_image(True)
212                label_item=_("Close")
213                item.set_label(label_item)
214                item.connect("activate",self.quit)
215                item.profile=""
216                item.size=False
217                item.status=False
218                self.menu.append(item)
219
220
221                self.menu.show_all()
222               
223               
224        #def populate_menu
225       
226       
227        def item_clicked(self,widget,profile):
228               
229                mountpoint=self.profiles_info[profile]["mountpoint"]
230                status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
231
232                if self.current_status[profile]==status_info["status"]:
233
234                        status_mod=self.LliurexGoogleDriveManager.sync_profile(profile.encode("utf-8"),mountpoint.encode("utf-8"))
235
236                        if status_mod["result"]:
237                                status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
238                                       
239                info=self.item_status_info(status_info)
240                self.current_status[profile]=status_info["status"]
241                for item in self.menu.get_children():
242                        if item.size:
243                                if item.profile==profile:
244                                        item.set_label(info["used_size"])
245               
246
247                widget.set_tooltip_text(info["tooltip"])
248                widget.set_image(info["img"])
249               
250               
251        #def item_clicked
252
253        def open_folder(self,widget,profile):
254
255               
256                mountpoint=self.profiles_info[profile]["mountpoint"]
257                cmd="caja " + mountpoint.encode("utf-8")
258
259                os.system(cmd) 
260
261        #def open_folder       
262
263        def open_gui(self,widget):
264               
265                cmd='lliurex-gdrive' +"&" 
266                os.system(cmd)
267
268        #def open_gui
269               
270        def item_status_info(self,status_info):
271       
272                size=status_info["size"]
273                used=status_info["used"]
274
275                if status_info["status"]:
276                        img=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
277                        tooltip=_("Dismount now")
278                        used_size=_("Used: %s of %s")%(used,size)
279               
280                else:
281                        img=Gtk.Image.new_from_file(MOUNT_OFF_IMAGE)
282                        tooltip=_("Mount now")
283                        used_size=_("Used: not available")     
284
285                return {"img":img ,"tooltip":tooltip, "used_size":used_size}   
286
287        #def item_status_info                   
288
289        def check_status(self):
290               
291       
292                for profile in self.profiles_info:
293                        mountpoint=self.profiles_info[profile]["mountpoint"]
294                        status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
295                        info=self.item_status_info(status_info)
296                        self.current_status[profile]=status_info["status"]
297
298                        for item in self.menu.get_children():
299                                if item.profile==profile:
300                                        if item.size:
301                                                item.set_label(info["used_size"])
302                                       
303                                        if item.status:
304                                                item.set_tooltip_text(info["tooltip"])
305                                                item.set_image(info["img"])
306               
307                return True
308               
309               
310        #def check_status
311
312
313        def cleanIndicatorLock(self):
314
315                if os.path.exists(LOCK_PATH):
316                        os.remove(LOCK_PATH)
317
318        #def cleanIndicatorLock                 
319       
320        def quit(self,widget):
321
322                self.cleanIndicatorLock()
323                Gtk.main_quit() 
324
325        #def quit       
326
327       
328#class LlliurexGdriveIndicator
329
330if __name__=="__main__":
331       
332        lliurexgdrive=LlliurexGdriveIndicator("gdrive")
333        GObject.threads_init()
334        Gtk.main()
335       
Note: See TracBrowser for help on using the repository browser.