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

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

WIP in indicator

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