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

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

Wip in fix encode

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