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

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

Add lock control to gui

  • 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                print type(mountpoint)
234                if self.current_status[profile]==status_info["status"]:
235
236                        status_mod=self.LliurexGoogleDriveManager.sync_profile(profile.encode("utf-8"),mountpoint.encode("utf-8"))
237
238                        if status_mod["result"]:
239                                status_info=self.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
240                                       
241                info=self.item_status_info(status_info)
242                self.current_status[profile]=status_info["status"]
243                for item in self.menu.get_children():
244                        if item.size:
245                                if item.profile==profile:
246                                        item.set_label(info["used_size"])
247               
248
249                widget.set_tooltip_text(info["tooltip"])
250                widget.set_image(info["img"])
251               
252               
253        #def item_clicked
254
255        def open_folder(self,widget,profile):
256
257               
258                mountpoint=self.profiles_info[profile]["mountpoint"]
259                cmd="caja " + mountpoint.encode("utf-8")
260
261                os.system(cmd) 
262
263        #def open_folder       
264
265        def open_gui(self,widget):
266               
267                if not os.path.exists(LOCK_GUI):
268                        cmd='/usr/bin/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_INDICATOR):
319                        os.remove(LOCK_INDICATOR)
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.