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

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

Fix some files

  • 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="~/.config/lliurex-google-drive-profiles/lgdIndicator.lock"
28
29
30class LlliurexGdriveIndicator:
31
32        WATCH_DIR=os.path.expanduser("~/.config/lliurex-google-drive-profiles/config")
33       
34        def __init__(self,icon_name):
35               
36                self.LliurexGoogleDriveManager=lliurex.lliurexgdrive.LliurexGoogleDriveManager()
37                self.app_indicator=appindicator.Indicator.new("lliurex-gdrive",icon_name,appindicator.IndicatorCategory.APPLICATION_STATUS)
38                self.app_indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
39                self.menu = Gtk.Menu()
40               
41                self.menu.add_events(Gdk.EventMask.ALL_EVENTS_MASK)
42                self.app_indicator.set_menu(self.menu)
43               
44                self.profiles_info=self.LliurexGoogleDriveManager.profiles_config.copy()
45                self.current_status={}
46
47                       
48                self.createLockToken()
49                self.populate_menu()
50                self.start_inotify()
51
52                GLib.timeout_add(60000,self.check_status)
53               
54        #def __init__
55
56
57        def createLockToken(self):
58
59                self.lockpath=R=os.path.expanduser(LOCK_PATH)
60                if not os.path.exists(self.lockpath):
61                        f=open(self.lockpath,'w')
62                        f.close
63
64        #def createLockToken
65                       
66        def start_inotify(self):
67
68                t=threading.Thread(target=self._inotify)
69                t.daemon=True
70                t.start()
71
72        #def start_inotif
73
74
75        def _inotify(self):
76               
77               
78                wm=WatchManager()
79                mask=pyinotify.IN_CLOSE_WRITE
80                       
81                class Process_handler(ProcessEvent):
82                               
83                        def __init__(self,main):
84                               
85                                self.main=main
86                               
87                        def process_IN_CLOSE_WRITE(self,event):
88
89                                self.main.update_info()
90                                print self.main.update_profiles
91                                for profile in self.main.update_profiles:
92                                        if not profile in self.main.profiles_info:
93                                                mountpoint=self.main.update_profiles[profile]["mountpoint"]
94                                                print 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                                print 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                print self.current_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,mountpoint)
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("/home/lliurex/Descargas/mount_on.png")
280                        tooltip=_("Dismount now")
281                        used_size=_("Used: %s of %s")%(used,size)
282               
283                else:
284                        img=Gtk.Image.new_from_file("/home/lliurex/Descargas/mount_off.png")
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(self.lockpath):
319                        os.remove(self.lockpath)
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.