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

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

WIP in gui

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