source: lliurex-gdrive/trunk/fuentes/lliurex-gdrive-indicator.install/usr/sbin/lliurexGdriveIndicator.py @ 3942

Last change on this file since 3942 was 3942, checked in by jrpelegrina, 4 years ago

Fix indicator code

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