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

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

Fix autostart, reorder bin and connect gui with indicator

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