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

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

WIP in gui. Improve manage gdrive functions

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