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

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

WIP in gui.Improve result of manage gdrive actions

File size: 12.2 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
17_=gettext.gettext
18
19
20RSRC="./"
21PROFILE_IMAGE=RSRC+"rsrc/profile.svg"
22FOLDER_IMAGE=RSRC+"rsrc/folder.svg"
23MOUNT_ON_IMAGE=RSRC+"rsrc/mount_on.svg"
24MOUNT_OFF_IMAGE=RSRC+"rsrc/mount_off.svg"
25EDIT_IMAGE=RSRC+"rsrc/edit.svg"
26DELETE_IMAGE=RSRC+"rsrc/trash.svg"
27MAX_RETRY_INTENTS=90000
28
29class ProfileBox(Gtk.VBox):
30       
31        def __init__(self):
32               
33                Gtk.VBox.__init__(self)
34               
35                self.core=Core.Core.get_core()
36               
37                builder=Gtk.Builder()
38                ui_path=RSRC + "/rsrc/lliurex-gdrive.ui"
39                builder.add_from_file(ui_path)
40
41                self.main_box=builder.get_object("profile_data_box")
42                self.profiles_list_label=builder.get_object("profiles_list_label")
43                self.profile_list_box=builder.get_object("profile_list_box")
44                self.profile_list_vp=builder.get_object("profile_list_viewport")
45                self.msg_label=builder.get_object("msg_label")
46                self.add_new_profile_button=builder.get_object("add_new_profile_button")
47                self.new_profile_window=builder.get_object("new_profile_window")
48                self.profile_label=builder.get_object("profile_label")
49                self.profile_entry=builder.get_object("profile_entry")
50                self.email_label=builder.get_object("email_label")
51                self.email_entry=builder.get_object("email_entry")
52                self.mountpoint_label=builder.get_object("mountpoint_label")
53                self.mountpoint_entry=builder.get_object("mountpoint_entry")
54                self.automount_label=builder.get_object("automount_label")
55                self.automount_entry=builder.get_object("automount_entry")
56                self.profile_msg=builder.get_object("profile_msg")
57                self.profile_pbar_label=builder.get_object("profile_pbar_label")
58                self.profile_pbar=builder.get_object("profile_pbar")
59                self.accept_add_profile_button=builder.get_object("accept_add_profile_button")
60                self.cancel_add_profile_button=builder.get_object("cancel_add_profile_button")
61               
62               
63               
64                self.pack_start(self.main_box,True,True,0)
65                self.connect_signals()
66                self.set_css_info()
67       
68                self.edition=False
69                self.profile_pbar.hide()
70                self.profile_pbar_label.hide()
71
72                self.init_threads()
73
74                #self.current_var=None
75                #self.current_id=None
76               
77                #self.thread=threading.Thread()
78                #self.thread_ret=None
79               
80        #def __init__
81       
82        def init_threads(self):
83
84                self.create_profile_t=multiprocessing.Process(target=self.create_profile)
85                self.create_mountpoint_t=threading.Thread(target=self.create_mountpoint)
86                self.edit_profile_t=threading.Thread(target=self.edit_profile)
87
88               
89                self.create_profile_t.daemon=True
90                self.create_mountpoint_t.daemon=True
91                self.edit_profile_t.daemon=True
92
93                self.create_mountpoint_t.done=False
94                self.edit_profile_t.done=False
95
96                self.create_profile_t.launched=False
97                self.create_mountpoint_t.launched=False
98                self.edit_profile_t.launched=False
99               
100                GObject.threads_init()
101
102
103        def set_css_info(self):
104               
105                self.style_provider=Gtk.CssProvider()
106
107                f=Gio.File.new_for_path("lliurex-gdrive.css")
108                self.style_provider.load_from_file(f)
109
110                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
111                self.profiles_list_label.set_name("OPTION_LABEL")
112                self.profile_label.set_name("OPTION_LABEL")
113                self.email_label.set_name("OPTION_LABEL")
114                self.mountpoint_label.set_name("OPTION_LABEL")
115                self.automount_label.set_name("OPTION_LABEL")
116                self.msg_label.set_name("OPTION_LABEL")
117               
118               
119               
120                       
121        #def set-css_info
122       
123               
124        def connect_signals(self):
125
126                self.add_new_profile_button.connect("clicked",self.add_new_profile_button_clicked)
127                self.accept_add_profile_button.connect("clicked",self.accept_add_profile_clicked)
128                self.cancel_add_profile_button.connect("clicked",self.cancel_add_profile_clicked)
129                self.new_profile_window.connect("delete_event",self.hide_window)
130
131
132        #def connect_signals
133       
134        def load_info(self,info):
135               
136                self.profiles_info=info
137
138                for item in self.profiles_info:
139                        profile=item
140                        email=self.profiles_info[item]["email"]
141                        mountpoint=self.profiles_info[item]["mountpoint"]
142                        self.new_profile_button(profile,email,mountpoint)
143                        print self.profiles_info[item]["automount"]
144
145        #def load_info()               
146
147        def hide_window(self,widget,event):
148               
149                widget.hide()
150                return True
151
152        #def hide_window       
153
154        def add_new_profile_button_clicked(self,widget):
155
156                self.profile_entry.set_text("")
157                self.profile_entry.set_editable(True)
158                self.email_entry.set_text("")
159                self.email_entry.set_editable(True)
160                self.mountpoint_entry.set_filename(os.environ["HOME"])
161                self.automount_entry.set_state(False)
162                self.profile_msg.set_text("")
163                self.edition=False
164
165                self.init_threads()
166               
167                self.profile_msg.set_text("")
168                self.profile_pbar.hide()
169                self.new_profile_window.show()
170
171        #def add_new_profile_button_clicked     
172
173        def delete_profile_clicked(self,button,hbox):
174
175                profile=hbox.get_children()[1].get_text().split("\n")[0]
176                self.profiles_info.pop(profile)
177
178                self.core.LliurexGoogleDriveManager.delete_profile(self.profiles_info,profile)
179                self.profile_list_box.remove(hbox)
180                self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()
181
182
183        # def delete_profile_clicked
184               
185
186        def sync_profile_clicked(self,button,hbox):
187
188                profile=hbox.get_children()[1].get_text().split("\n")[0]
189                mountpoint=hbox.get_children()[3].get_text()
190
191                status=self.core.LliurexGoogleDriveManager.sync_profile(profile,mountpoint)
192
193                if status:
194                        mount_image=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
195                        button.set_tooltip_text(_("Dismount profile"))
196                else:
197                        mount_image=Gtk.Image.new_from_file(MOUNT_OFF_IMAGE)
198                        button.set_tooltip_text(_("Mount profile"))
199       
200                hbox.get_children()[4].set_image(mount_image)
201
202        #def mount_profile_clicked
203
204        def edit_profile_clicked(self,button,hbox):
205
206                self.profile_to_edit=hbox               
207                profile=self.profile_to_edit.get_children()[1].get_text().split("\n")[0]
208                self.profile_entry.set_text(profile)
209                self.profile_entry.set_editable(False)
210                email=self.profile_to_edit.get_children()[1].get_text().split("\n")[1]
211                self.email_entry.set_text(email)
212                self.email_entry.set_editable(False)
213                mountpoint=self.profile_to_edit.get_children()[3].get_text()
214                self.mountpoint_entry.set_filename(mountpoint)
215                automount=self.profiles_info[profile]["automount"]
216                self.automount_entry.set_state(automount)
217                self.edition=True
218
219                self.init_threads()
220
221                self.profile_msg.set_text("")
222                self.profile_pbar.hide()
223                self.new_profile_window.show() 
224
225        #def edit_profile_clicked
226
227
228        def new_profile_button(self,profile_name,email,mountpoint):
229               
230                hbox=Gtk.HBox()
231                profile_image=Gtk.Image.new_from_file(PROFILE_IMAGE)
232                profile_image.set_margin_left(10)
233                profile_image.set_halign(Gtk.Align.CENTER)
234                profile_image.set_valign(Gtk.Align.CENTER)
235                profile_info="<span font='Roboto'><b>"+profile_name+"</b></span>\n"+"<span font='Roboto'>"+email+"</span>"
236                profile=Gtk.Label()
237                profile.set_markup(profile_info)
238                profile.set_margin_left(10)
239                profile.set_margin_right(20)
240                profile.set_margin_top(21)
241                profile.set_margin_bottom(21)
242                folder_image=Gtk.Image.new_from_file(FOLDER_IMAGE)
243                folder_image.set_margin_left(20)
244                folder_image.set_halign(Gtk.Align.CENTER)
245                folder_image.set_valign(Gtk.Align.CENTER)
246                folder=Gtk.Label()
247                folder.set_text(mountpoint)
248                folder.set_margin_left(10)
249                delete=Gtk.Button()
250                delete_image=Gtk.Image.new_from_file(DELETE_IMAGE)
251                delete.add(delete_image)
252                delete.set_halign(Gtk.Align.CENTER)
253                delete.set_valign(Gtk.Align.CENTER)
254                delete.set_name("DELETE_ITEM_BUTTON")
255                delete.connect("clicked",self.delete_profile_clicked,hbox)
256                delete.set_tooltip_text(_("Delete profile"))
257                edit=Gtk.Button()
258                edit_image=Gtk.Image.new_from_file(EDIT_IMAGE)
259                edit.add(edit_image)
260                edit.set_halign(Gtk.Align.CENTER)
261                edit.set_valign(Gtk.Align.CENTER)
262                edit.set_name("EDIT_ITEM_BUTTON")
263                edit.connect("clicked",self.edit_profile_clicked,hbox)
264                edit.set_tooltip_text(_("Edit profile"))
265                mount=Gtk.Button()
266               
267                status=self.core.LliurexGoogleDriveManager.check_mountpoint_status(mountpoint)
268                if status["status"]:
269                        mount_image=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
270                        mount.set_tooltip_text(_("Dismount profile"))
271                else:
272                        mount_image=Gtk.Image.new_from_file(MOUNT_OFF_IMAGE)
273                        mount.set_tooltip_text(_("Mount profile"))
274       
275                mount.add(mount_image)
276                mount.set_halign(Gtk.Align.CENTER)
277                mount.set_valign(Gtk.Align.CENTER)
278                mount.set_name("MOUNT_ITEM_BUTTON")
279                mount.connect("clicked",self.sync_profile_clicked,hbox)
280               
281                hbox.pack_start(profile_image,False,False,0)
282                hbox.pack_start(profile,False,False,0)
283                hbox.pack_start(folder_image,False,False,0)
284                hbox.pack_start(folder,False,False,0)
285                hbox.pack_end(delete,False,False,10)
286                hbox.pack_end(edit,False,False,10)
287                hbox.pack_end(mount,False,False,10)
288                hbox.show_all()
289                hbox.set_name("PROFILE_BOX")
290                self.profile_list_box.pack_start(hbox,False,False,5)
291                self.profile_list_box.queue_draw()
292                hbox.queue_draw()
293               
294        #def new_profile_button
295
296        def accept_add_profile_clicked(self,widget):
297
298
299                profile=self.profile_entry.get_text()
300                self.new_profile=profile.strip(" ")
301                email=self.email_entry.get_text()
302                self.new_email=email.strip(" ")
303                self.new_mountpoint=self.mountpoint_entry.get_filename()
304                self.new_automount=self.automount_entry.get_state()
305
306                self.profiles_info[self.new_profile]={}
307                self.profiles_info[self.new_profile]["email"]=self.new_email
308                self.profiles_info[self.new_profile]["mountpoint"]=self.new_mountpoint
309                self.profiles_info[self.new_profile]["automount"]=self.new_automount
310
311                if self.core.LliurexGoogleDriveManager.check_profile_info(self.new_profile,self.new_mountpoint,self.edition):
312
313                        if not self.edition:
314                                if not self.create_profile_t.launched:
315                                        self.profile_msg.set_text(_("Now a browser window will be open to grant permison\n.When a google-appear close a browser"))
316                                        self.profile_pbar.show()
317                                        self.retry=0
318                                        GLib.timeout_add(100,self.pulsate_add_profile)
319                               
320               
321                        else:
322                                if not self.edit_profile_t.launched:
323                                        GLib.timeout_add(100,self.pulsate_edit_profile) 
324                else:
325                        self.profile_msg.set_text(_("Error in entry form"))                             
326                               
327               
328       
329        #def accept_add_profile_clickedef       
330
331        def pulsate_add_profile(self):
332
333                self.retry=self.retry+1
334                self.profile_pbar.pulse()
335               
336                if not self.create_profile_t.launched:
337                        self.create_profile_t.start()
338                        self.create_profile_t.launched=True
339
340                if not self.create_profile_t.is_alive():
341                        if not self.create_mountpoint_t.launched:
342                                self.create_mountpoint_t.start()
343                                self.create_mountpoint_t.launched=True
344
345                        if self.create_mountpoint_t.done:
346                                if self.create_result["result"]:
347                                                self.new_profile_button(self.new_profile,self.new_email,self.new_mountpoint)
348                                                self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()   
349                                                self.new_profile_window.hide() 
350                                else:
351                                        self.profile_pbar.hide()
352                                        self.profile_msg.set_text(_("An error ocurrend creating profile:" + str(self.create_result["msg"])))
353
354                                return False
355                                               
356                if self.create_profile_t.launched:
357                        if self.create_profile_t.is_alive():
358                                if self.retry>MAX_RETRY_INTENTS:
359                                        parent=psutil.Process(self.create_profile_t.pid)
360                                        for child in parent.children(recursive=True):
361                                                child.kill()
362                                        self.create_profile_t.terminate()       
363                                        return True
364                                else:   
365                                        return True
366                                       
367                if self.create_mountpoint_t.launched:
368                        if not self.create_mountpoint_t.done:
369                                return True                                     
370
371        def create_profile(self):
372                result=self.core.LliurexGoogleDriveManager.create_profile(self.new_profile)
373
374
375        def create_mountpoint(self):
376
377
378                self.create_result=self.core.LliurexGoogleDriveManager.create_mountpoint(self.profiles_info,self.new_profile)
379                self.create_mountpoint_t.done=True
380               
381
382
383        def pulsate_edit_profile(self):
384
385                if not self.edit_profile_t.launched:
386                        self.edit_profile_t.start()
387                        self.edit_profile_t.launched=True
388
389                if self.edit_profile_t.done:
390                        print self.edit_result
391                        if self.edit_result["result"]:
392                                self.profile_to_edit.get_children()[3].set_text(self.new_mountpoint)
393                                self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()   
394                                self.new_profile_window.hide() 
395                                return False
396                                               
397
398
399                if self.edit_profile_t.launched:
400                        if not self.edit_profile_t.done:
401                                return True
402
403        def edit_profile(self):
404                self.edit_result=self.core.LliurexGoogleDriveManager.edit_profile(self.profiles_info,self.new_profile)
405                self.edit_profile_t.done=True
406
407        def cancel_add_profile_clicked(self,widget):
408               
409                self.new_profile_window.hide()
410
411       
412        #def cancel_add_profile_clicked
413               
414#class profilebox
Note: See TracBrowser for help on using the repository browser.