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

Last change on this file since 3997 was 3997, checked in by jrpelegrina, 3 years ago

Add po files

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