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

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

Add zomando and python lib

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