source: lliurex-gdrive/trunk/fuentes/lliurex-gdrive-gui.install/usr/share/lliurex-gdrive/ProfileBox.py @ 3994

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

Fix code

File size: 18.2 KB
Line 
1#!/usr/bin/env python
2
3
4import gi
5gi.require_version('Gtk', '3.0')
6from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
7
8import copy
9import gettext
10import Core
11
12import Dialog
13import time
14import threading
15import multiprocessing
16import sys
17import os
18import psutil
19
20import gettext
21gettext.textdomain('lliurex-gdrive')
22_ = gettext.gettext
23
24
25
26RSRC="/usr/share/lliurex-gdrive/"
27CSS_FILE="/usr/share/lliurex-gdrive/lliurex-gdrive.css"
28PROFILE_IMAGE=RSRC+"rsrc/profile.svg"
29FOLDER_IMAGE=RSRC+"rsrc/folder.svg"
30MOUNT_ON_IMAGE=RSRC+"rsrc/mount_on.svg"
31MOUNT_OFF_IMAGE=RSRC+"rsrc/mount_off.svg"
32EDIT_IMAGE=RSRC+"rsrc/edit.svg"
33DELETE_IMAGE=RSRC+"rsrc/trash.svg"
34MAX_RETRY_INTENTS=1200
35MSG_CHANGE_SUCCESS=_("Changes applied successfully")
36MSG_CHANGE_ERROR=_("An error ocurred applying changes. See log file for more information")
37#DISABLE_INDICATOR="~/.config/lliurex-google-drive-profiles/disableIndicator"
38
39
40class ProfileBox(Gtk.VBox):
41       
42        def __init__(self):
43               
44                Gtk.VBox.__init__(self)
45               
46                self.core=Core.Core.get_core()
47               
48                builder=Gtk.Builder()
49                ui_path=RSRC + "/rsrc/lliurex-gdrive.ui"
50                builder.add_from_file(ui_path)
51
52                self.main_box=builder.get_object("profile_data_box")
53                self.profiles_list_label=builder.get_object("profiles_list_label")
54                self.profile_list_box=builder.get_object("profile_list_box")
55                self.profile_list_vp=builder.get_object("profile_list_viewport")
56                self.msg_label=builder.get_object("msg_label")
57
58                image = Gtk.Image()
59                image.set_from_stock(Gtk.STOCK_ADD,Gtk.IconSize.MENU)
60                #self.indicator_label=builder.get_object("indicator_label")
61                #self.indicator_switch=builder.get_object("indicator_switch")
62
63                #self.disable_indicator=os.path.expanduser(DISABLE_INDICATOR)
64                #if os.path.exists(self.disable_indicator):
65                        #self.indicator_switch.set_active(False)
66
67                self.add_new_profile_button=builder.get_object("add_new_profile_button")
68                self.add_new_profile_button.set_image(image)
69                self.new_profile_window=builder.get_object("new_profile_window")
70                self.profile_label=builder.get_object("profile_label")
71                self.profile_entry=builder.get_object("profile_entry")
72                self.email_label=builder.get_object("email_label")
73                self.email_entry=builder.get_object("email_entry")
74                self.mountpoint_label=builder.get_object("mountpoint_label")
75                self.mountpoint_entry=builder.get_object("mountpoint_entry")
76                self.automount_label=builder.get_object("automount_label")
77                self.automount_entry=builder.get_object("automount_entry")
78                self.profile_msg=builder.get_object("profile_msg")
79                self.profile_pbar=builder.get_object("profile_pbar")
80                self.accept_add_profile_button=builder.get_object("accept_add_profile_button")
81                self.cancel_add_profile_button=builder.get_object("cancel_add_profile_button")
82               
83               
84               
85                self.pack_start(self.main_box,True,True,0)
86                self.connect_signals()
87                self.set_css_info()
88
89                self.current_status={}
90                self.edition=False
91                self.profile_pbar.hide()
92
93                self.init_threads()
94
95                #self.current_var=None
96                #self.current_id=None
97               
98                #self.thread=threading.Thread()
99                #self.thread_ret=None
100               
101        #def __init__
102       
103        def init_threads(self):
104
105                self.create_profile_t=multiprocessing.Process(target=self.create_profile)
106                self.create_mountpoint_t=threading.Thread(target=self.create_mountpoint)
107                self.edit_profile_t=threading.Thread(target=self.edit_profile)
108
109               
110                self.create_profile_t.daemon=True
111                self.create_mountpoint_t.daemon=True
112                self.edit_profile_t.daemon=True
113
114                self.create_mountpoint_t.done=False
115                self.edit_profile_t.done=False
116
117                self.create_profile_t.launched=False
118                self.create_mountpoint_t.launched=False
119                self.edit_profile_t.launched=False
120               
121                GObject.threads_init()
122
123
124        def set_css_info(self):
125               
126                self.style_provider=Gtk.CssProvider()
127
128                f=Gio.File.new_for_path(CSS_FILE)
129                self.style_provider.load_from_file(f)
130
131                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
132                self.profiles_list_label.set_name("OPTION_LABEL")
133                self.profile_label.set_name("OPTION_LABEL")
134                self.email_label.set_name("OPTION_LABEL")
135                self.mountpoint_label.set_name("OPTION_LABEL")
136                self.automount_label.set_name("OPTION_LABEL")
137                self.msg_label.set_name("MSG_LABEL")
138                self.profile_msg.set_name("MSG_LABEL")
139               
140                       
141        #def set-css_info
142       
143               
144        def connect_signals(self):
145
146                self.add_new_profile_button.connect("clicked",self.add_new_profile_button_clicked)
147                self.accept_add_profile_button.connect("clicked",self.accept_add_profile_clicked)
148                self.cancel_add_profile_button.connect("clicked",self.cancel_add_profile_clicked)
149                self.new_profile_window.connect("delete_event",self.hide_window)
150
151
152        #def connect_signals
153       
154        def load_info(self,info):
155               
156                self.profiles_info=info
157
158                for item in self.profiles_info:
159                        profile=item
160                        email=self.profiles_info[item]["email"]
161                        mountpoint=self.profiles_info[item]["mountpoint"]
162                        self.new_profile_button(profile,email,mountpoint)
163                        print self.profiles_info[item]["automount"]
164
165
166                print self.profiles_info       
167       
168        #def load_info()               
169
170        def hide_window(self,widget,event):
171               
172                widget.hide()
173                return True
174
175        #def hide_window       
176
177        def init_profile_dialog_button(self):
178
179                self.accept_add_profile_button.show()
180                image = Gtk.Image()
181                image.set_from_stock(Gtk.STOCK_CANCEL,Gtk.IconSize.MENU)
182                self.cancel_add_profile_button.set_image(image)
183                self.cancel_add_profile_button.set_label(_("Cancel"))
184                self.cancel_add_profile_button.show()
185
186        #def init_profile_dialog_button
187
188        def disable_entry_profile_dialog(self):
189
190                self.profile_entry.set_sensitive(False)
191                self.email_entry.set_sensitive(False)
192                self.mountpoint_entry.set_sensitive(False)
193                self.automount_entry.set_sensitive(False)
194
195        #def disable_entry_profile_dialog
196       
197        def enable_entry_profile_dialog(self):
198
199                if not self.edition:
200                       
201                        self.new_profile_window.set_title(_("Create new profile"))
202                        self.profile_entry.set_sensitive(True)
203                        self.profile_entry.grab_focus()
204                        self.email_entry.set_sensitive(True)
205
206                else:
207                        self.new_profile_window.set_title(_("Edit profile"))
208                        self.profile_entry.set_sensitive(False)
209                        self.email_entry.set_sensitive(False)
210
211                self.mountpoint_entry.set_sensitive(True)
212                self.automount_entry.set_sensitive(True)       
213
214        #def enable_entry_profile_dialog       
215
216        def change_cancel_button(self):
217               
218                image = Gtk.Image()
219                image.set_from_stock(Gtk.STOCK_CLOSE,Gtk.IconSize.MENU)
220                self.cancel_add_profile_button.set_image(image)
221                self.cancel_add_profile_button.set_label(_("Close"))   
222                self.cancel_add_profile_button.show()   
223
224        #def change_cancel_button       
225
226        def add_new_profile_button_clicked(self,widget):
227
228                self.edition=False
229
230                self.enable_entry_profile_dialog()
231                self.profile_entry.set_text("")
232                self.email_entry.set_text("")
233                self.mountpoint_entry.set_filename(os.environ["HOME"])
234                self.automount_entry.set_active(False)
235                self.profile_msg.set_text("")
236               
237
238                self.init_threads()
239               
240                self.msg_label.set_text("")
241                self.profile_msg.hide()
242                self.profile_pbar.hide()
243                self.init_profile_dialog_button()
244                self.new_profile_window.show()
245               
246
247        #def add_new_profile_button_clicked     
248
249        def delete_profile_clicked(self,button,hbox):
250
251                self.msg_label.set_text("")
252                profile=hbox.get_children()[1].get_text().split("\n")[0]
253                profile=profile.decode("utf-8")
254                self.profiles_info.pop(profile)
255
256                delete=self.core.LliurexGoogleDriveManager.delete_profile(self.profiles_info,profile)
257                self.msg_label.show()
258
259                if delete:
260                        self.profile_msg.set_name("MSG_LABEL")
261                        self.msg_label.set_text(MSG_CHANGE_SUCCESS)
262                        self.profile_list_box.remove(hbox)
263                else:
264                        self.msg_label.set_name("MSG_ERROR_LABEL")
265                        self.msg_label.set_text(MSG_CHANGE_ERROR)
266
267                self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()
268
269
270        # def delete_profile_clicked
271               
272
273        def sync_profile_clicked(self,button,hbox):
274
275                self.msg_label.set_text("")
276                profile=hbox.get_children()[1].get_text().split("\n")[0]
277                mountpoint=hbox.get_children()[3].get_text()
278                status_info=self.core.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
279                self.msg_label.show()
280                self.msg_label.set_name("MSG_LABEL")
281                if self.current_status[profile]==status_info["status"]:
282
283                        status_mod=self.core.LliurexGoogleDriveManager.sync_profile(profile,mountpoint)
284                        if status_mod["result"]:
285                                status_info=self.core.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
286                                self.msg_label.set_text(MSG_CHANGE_SUCCESS)
287                                # if status_mod["action"]=="Mount":
288                                #       mount_image=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
289                                #       button.set_tooltip_text(_("Dismount profile"))
290                                #       button.set_name("MOUNT_ITEM_BUTTON")
291                                # else:
292                                #       mount_image=Gtk.Image.new_from_file(MOUNT_OFF_IMAGE)
293                                #       button.set_tooltip_text(_("Mount profile"))
294                                #       button.set_name("DELETE_ITEM_BUTTON")
295
296                        else:
297                                self.msg_label.set_name("MSG_ERROR_LABEL")
298                                self.msg_label.set_text(MSG_CHANGE_ERROR)       
299                               
300                       
301
302                info=self.item_status_info(status_info)
303                self.current_status[profile]=status_info["status"]
304                button.set_tooltip_text(info["tooltip"])
305                button.set_name(info["css"])           
306                hbox.get_children()[4].set_image(info["img"])
307
308       
309        #def mount_profile_clicked
310
311        def edit_profile_clicked(self,button,hbox):
312
313                self.edition=True
314                self.enable_entry_profile_dialog()
315
316                self.profile_to_edit=hbox               
317                profile=self.profile_to_edit.get_children()[1].get_text().split("\n")[0]
318                self.profile_entry.set_text(profile)
319                #self.profile_entry.set_editable(False)
320                email=self.profile_to_edit.get_children()[1].get_text().split("\n")[1]
321                self.email_entry.set_text(email)
322                #self.email_entry.set_editable(False)
323                mountpoint=self.profile_to_edit.get_children()[3].get_text()
324                self.mountpoint_entry.set_filename(mountpoint)
325                automount=self.profiles_info[profile.decode("utf-8")]["automount"]
326                self.automount_entry.set_active(automount)
327               
328
329                self.init_threads()
330
331                self.profile_msg.hide()
332                self.profile_pbar.hide()
333                self.msg_label.set_text("")
334                self.init_profile_dialog_button()
335                self.new_profile_window.show() 
336
337        #def edit_profile_clicked
338
339
340        def new_profile_button(self,profile_name,email,mountpoint):
341               
342                hbox=Gtk.HBox()
343                profile_image=Gtk.Image.new_from_file(PROFILE_IMAGE)
344                profile_image.set_margin_left(10)
345                profile_image.set_halign(Gtk.Align.CENTER)
346                profile_image.set_valign(Gtk.Align.CENTER)
347                profile_info="<span font='Roboto'><b>"+profile_name+"</b></span>\n"+"<span font='Roboto'>"+email+"</span>"
348                #profile_info=profile_name
349                profile=Gtk.Label()
350                profile.set_markup(profile_info)
351                profile.set_margin_left(10)
352                profile.set_margin_right(15)
353                profile.set_margin_top(21)
354                profile.set_margin_bottom(21)
355                profile.set_width_chars(25)
356                profile.set_max_width_chars(25)
357                profile.set_xalign(-1)
358                profile.set_ellipsize(Pango.EllipsizeMode.END)
359                folder_image=Gtk.Image.new_from_file(FOLDER_IMAGE)
360                folder_image.set_margin_left(20)
361                folder_image.set_halign(Gtk.Align.CENTER)
362                folder_image.set_valign(Gtk.Align.CENTER)
363                folder=Gtk.Label()
364                folder.set_text(mountpoint)
365                folder.set_margin_left(10)
366                delete=Gtk.Button()
367                delete_image=Gtk.Image.new_from_file(DELETE_IMAGE)
368                delete.add(delete_image)
369                delete.set_halign(Gtk.Align.CENTER)
370                delete.set_valign(Gtk.Align.CENTER)
371                delete.set_name("DELETE_ITEM_BUTTON")
372                delete.connect("clicked",self.delete_profile_clicked,hbox)
373                delete.set_tooltip_text(_("Delete profile"))
374                edit=Gtk.Button()
375                edit_image=Gtk.Image.new_from_file(EDIT_IMAGE)
376                edit.add(edit_image)
377                edit.set_halign(Gtk.Align.CENTER)
378                edit.set_valign(Gtk.Align.CENTER)
379                edit.set_name("EDIT_ITEM_BUTTON")
380                edit.connect("clicked",self.edit_profile_clicked,hbox)
381                edit.set_tooltip_text(_("Edit profile"))
382                mount=Gtk.Button()
383               
384                status_info=self.core.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
385                self.current_status[profile_name.encode("utf-8")]=status_info["status"]
386                print self.current_status
387                info=self.item_status_info(status_info)
388                # if status["status"]:
389                #       mount_image=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
390                #       mount.set_tooltip_text(_("Dismount profile"))
391                #       mount.set_name("MOUNT_ITEM_BUTTON")
392
393                # else:
394                #       mount_image=Gtk.Image.new_from_file(MOUNT_OFF_IMAGE)
395                #       mount.set_tooltip_text(_("Mount profile"))
396                #       mount.set_name("DELETE_ITEM_BUTTON")
397                mount_image=info["img"]
398                mount.set_tooltip_text(info["tooltip"])
399                mount.set_name(info["css"])
400                mount.add(mount_image)
401                mount.set_halign(Gtk.Align.CENTER)
402                mount.set_valign(Gtk.Align.CENTER)
403                #mount.set_name("MOUNT_ITEM_BUTTON")
404                mount.connect("clicked",self.sync_profile_clicked,hbox)
405               
406                hbox.pack_start(profile_image,False,False,0)
407                hbox.pack_start(profile,False,False,0)
408                hbox.pack_start(folder_image,False,False,0)
409                hbox.pack_start(folder,False,False,0)
410                hbox.pack_end(delete,False,False,10)
411                hbox.pack_end(edit,False,False,10)
412                hbox.pack_end(mount,False,False,10)
413                hbox.show_all()
414                hbox.set_name("PROFILE_BOX")
415                self.profile_list_box.pack_start(hbox,False,False,5)
416                self.profile_list_box.queue_draw()
417                hbox.queue_draw()
418               
419        #def new_profile_button
420
421        def item_status_info(self,status_info):
422       
423                size=status_info["size"]
424                used=status_info["used%"]
425
426                if status_info["status"]:
427                        img=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
428                        tooltip=_("Dismount now")
429                        css="MOUNT_ITEM_BUTTON"
430               
431                else:
432                        img=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
433                        tooltip=_("Mount now")
434                        css="DELETE_ITEM_BUTTON"       
435
436                return {"img":img ,"tooltip":tooltip, "css":css}       
437
438        #def item_status_info                   
439
440        def accept_add_profile_clicked(self,widget):
441
442                self.disable_entry_profile_dialog()
443               
444                profile=self.profile_entry.get_text()
445
446                self.new_profile=profile.strip().decode("utf-8")
447                email=self.email_entry.get_text()
448                self.new_email=email.strip()
449                self.new_mountpoint=self.mountpoint_entry.get_filename().decode("utf-8")
450                self.new_automount=self.automount_entry.get_state()
451
452                check_form=self.check_profile_info()
453                self.profile_msg.show()
454
455                if check_form["result"]:
456                        self.profiles_info[self.new_profile]={}
457                        self.profiles_info[self.new_profile]["email"]=self.new_email
458                        self.profiles_info[self.new_profile]["mountpoint"]=self.new_mountpoint
459                        self.profiles_info[self.new_profile]["automount"]=self.new_automount
460                        self.profile_msg.set_name("MSG_LABEL")
461                        if not self.edition:
462                                if not self.create_profile_t.launched:
463                                        self.profile_msg.set_text(_("Connecting with google to get account access..."))
464                                        self.profile_pbar.show()
465                                        self.retry=0
466                                        GLib.timeout_add(100,self.pulsate_add_profile)
467                               
468               
469                        else:
470                                if not self.edit_profile_t.launched:
471                                        self.profile_msg.set_text(_("Apply changes"))
472                                        self.profile_pbar.show()
473                                        GLib.timeout_add(100,self.pulsate_edit_profile) 
474                else:
475                        self.profile_msg.set_name("MSG_ERROR_LABEL")
476                        self.profile_msg.set_text(check_form["msg"])
477                        self.enable_entry_profile_dialog()
478                               
479                               
480               
481       
482        #def accept_add_profile_clicked
483
484        def check_profile_info(self):
485
486                msg_check=""
487
488                check_form=self.core.LliurexGoogleDriveManager.check_profile_info(self.new_profile,self.new_mountpoint,self.edition)
489
490                if not check_form["result"]:
491                        if check_form["code"]==1:
492                                msg_check=_("You must indicate a profile")
493
494                        elif check_form["code"]==2:
495                                msg_check=_("Profile can not contain blanks")
496
497                        elif check_form["code"]==3 :
498                                msg_check=_("Profile already exists")
499                       
500                        else:
501                                msg_check=_("Mounting point already used by another profile")   
502
503
504                return {"result":check_form["result"],"msg":msg_check}
505
506        #def check_profile_info
507
508        def pulsate_add_profile(self):
509
510                self.retry=self.retry+1
511                self.profile_pbar.pulse()
512               
513                if not self.create_profile_t.launched:
514                        self.accept_add_profile_button.hide()
515                        self.cancel_add_profile_button.hide()
516               
517                        self.create_profile_t.start()
518                        self.create_profile_t.launched=True
519
520                if not self.create_profile_t.is_alive():
521                        if not self.create_mountpoint_t.launched:
522                                self.profile_msg.set_name("MSG_LABEL")
523                                self.profile_msg.set_text(_("Creating profile... "))
524                                self.create_mountpoint_t.start()
525                                self.create_mountpoint_t.launched=True
526
527                        if self.create_mountpoint_t.done:
528                                self.profile_pbar.hide()
529                                if self.create_result:
530                                                self.new_profile_button(self.new_profile,self.new_email,self.new_mountpoint)
531                                                self.profile_msg.set_text(_("Profile created successfully"))
532                                                self.change_cancel_button()
533                                               
534                                else:
535                                       
536                                        self.profile_msg.set_name("MSG_ERROR_LABEL")
537                                        self.profile_msg.set_text(_("An error ocurred creating profile. See log file for more information"))
538                                        self.cancel_add_profile_button.show()
539                                       
540                                self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()   
541                                return False   
542                                               
543                if self.create_profile_t.launched:
544                        if self.create_profile_t.is_alive():
545                                self.kill_create_profile()
546                                return True     
547                               
548
549                if self.create_mountpoint_t.launched:
550                        if not self.create_mountpoint_t.done:
551                                return True             
552
553        #def_pulsate_add_profile                                               
554
555        def kill_create_profile(self):
556       
557                if self.retry>MAX_RETRY_INTENTS:
558                        parent=psutil.Process(self.create_profile_t.pid)
559                        for child in parent.children(recursive=True):
560                                child.kill()
561                                self.create_profile_t.terminate()
562                                self.profile_msg.set_name("MSG_ERROR_LABEL")
563                                self.profile_msg.set_text(_("Error getting authorization"))
564
565                return True     
566
567        #def kill_create_profile       
568
569        def create_profile(self):
570
571                result=self.core.LliurexGoogleDriveManager.create_profile(self.new_profile)
572
573        #def create_profile     
574
575        def create_mountpoint(self):
576
577                self.create_result=self.core.LliurexGoogleDriveManager.create_mountpoint(self.profiles_info,self.new_profile)
578                self.create_mountpoint_t.done=True
579               
580        #def create_mountpoint 
581
582        def pulsate_edit_profile(self):
583
584                if not self.edit_profile_t.launched:
585                        self.edit_profile_t.start()
586                        self.edit_profile_t.launched=True
587                        self.accept_add_profile_button.hide()
588                        self.cancel_add_profile_button.hide()
589
590                if self.edit_profile_t.done:
591                        self.profile_pbar.hide()
592                        if self.edit_result:
593                                self.profile_msg.set_name("MSG_LABEL")
594                                self.profile_to_edit.get_children()[3].set_text(self.new_mountpoint)
595                                self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()   
596                                self.profile_msg.set_text(MSG_CHANGE_SUCCESS)
597                                self.change_cancel_button()
598                       
599                        else:
600                                self.profile_msg.set_name("MSG_ERROR_LABEL")
601                                self.profile_msg.set_text(MSG_CHANGE_ERROR)
602                                self.cancel_add_profile_button.show()
603                        return False
604                       
605
606                if self.edit_profile_t.launched:
607                        if not self.edit_profile_t.done:
608                                return True
609
610        #def pulsate_edit_profile                       
611
612        def edit_profile(self):
613
614                self.edit_result=self.core.LliurexGoogleDriveManager.edit_profile(self.profiles_info,self.new_profile)
615                self.edit_profile_t.done=True
616
617        #def edit_profile       
618
619        def cancel_add_profile_clicked(self,widget):
620               
621                self.new_profile_window.hide()
622
623       
624        #def cancel_add_profile_clicked
625               
626#class profilebox
Note: See TracBrowser for help on using the repository browser.