source: lliurex-gdrive/trunk/fuentes/lliurex-gdrive-gui.install/usr/share/lliurex-gdrive/ProfileBox.py @ 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

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