source: bell-scheduler/trunk/fuentes/bell-scheduler/python3-bellscheduler/EditBox.py @ 6952

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

Wip in improve performance

File size: 12.6 KB
Line 
1#!/usr/bin/env python3
2
3
4import gi
5gi.require_version('Gtk', '3.0')
6from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib,Gdk
7
8from . import settings
9import gettext
10gettext.textdomain(settings.TEXT_DOMAIN)
11_ = gettext.gettext
12
13import os
14import json
15import codecs
16import io
17import glob
18import threading
19
20BANNERS_PATH="/usr/share/bell-scheduler/banners/"
21
22class EditBox(Gtk.VBox):
23       
24        def __init__(self):
25               
26                Gtk.VBox.__init__(self)
27               
28                self.core=Core.Core.get_core()
29       
30        #def __init__   
31               
32        def init_form(self):
33
34                try:
35                        self.editBox.remove(self.editBox.main_box)
36                except:
37                        pass
38
39        #def init_form         
40
41        def render_form(self): 
42
43                builder=Gtk.Builder()
44                builder.set_translation_domain(settings.TEXT_DOMAIN)
45
46                ui_path=self.core.ui_path
47                builder.add_from_file(ui_path)
48
49                self.css_file=self.core.rsrc_dir+"bell-scheduler.css"
50
51                self.main_box=builder.get_object("bell_edit_box")
52                self.cron_frame=builder.get_object("cron_frame")
53                self.hour_spinbutton=builder.get_object("hour_spinbutton")
54                self.minute_spinbutton=builder.get_object("minute_spinbutton")
55                self.monday_tb=builder.get_object("monday_togglebutton")
56                self.tuesday_tb=builder.get_object("tuesday_togglebutton")
57                self.wednesday_tb=builder.get_object("wednesday_togglebutton")
58                self.thursday_tb=builder.get_object("thursday_togglebutton")
59                self.friday_tb=builder.get_object("friday_togglebutton")
60
61                self.data_frame=builder.get_object("data_frame")
62                self.name_label=builder.get_object("name_label")
63                self.name_entry=builder.get_object("name_entry")
64                self.image_label=builder.get_object("image_label")
65                self.stock_rb=builder.get_object("stock_radiobutton")
66                self.custom_rb=builder.get_object("custom_radiobutton")
67                self.image_fc=builder.get_object("image_filechosser")
68                self.sound_label=builder.get_object("sound_label")
69                self.random_rb=builder.get_object("random_radiobutton")
70                self.file_rb=builder.get_object("file_radiobutton")
71                self.url_rb=builder.get_object("url_radiobutton")
72                self.sound_dc=builder.get_object("sound_folderchosser")
73                self.sound_fc=builder.get_object("sound_filechosser")
74                self.sound_url=builder.get_object("url_entry")
75
76                self.duration_label=builder.get_object("duration_label")
77                self.duration_entry=builder.get_object("duration_entry")
78                self.note_label=builder.get_object("note_label")
79       
80                self.weekdays=[]
81                self.weekdays.append(self.monday_tb)
82                self.weekdays.append(self.tuesday_tb)
83                self.weekdays.append(self.wednesday_tb)
84                self.weekdays.append(self.thursday_tb)
85                self.weekdays.append(self.friday_tb)
86               
87                self.image_cb=builder.get_object("image_combobox")
88                self.image_store=Gtk.ListStore(GdkPixbuf.Pixbuf,str)
89               
90                for x in glob.glob(BANNERS_PATH+"*.png"):
91                        f_name=x.replace(BANNERS_PATH,"").split(".png")[0]
92                        image=Gtk.Image()
93                        image.set_from_file(x)
94                        pixbuf=image.get_pixbuf()
95                        pixbuf=pixbuf.scale_simple(64,64,GdkPixbuf.InterpType.BILINEAR)
96                        self.image_store.append([pixbuf,f_name])
97                       
98                       
99                self.image_cb.set_model(self.image_store)
100                pixbuf_renderer=Gtk.CellRendererPixbuf()
101               
102                self.image_cb.pack_start(pixbuf_renderer,True)
103                self.image_cb.add_attribute(pixbuf_renderer,"pixbuf",0)
104       
105                self.edit=False
106                self.bell_to_edit=""
107                self.pack_start(self.main_box,True,True,0)
108                self.set_css_info()
109                self.connect_signals()
110                self.init_data_form()
111                               
112        #def render_form_
113
114        def set_css_info(self):
115               
116                self.style_provider=Gtk.CssProvider()
117
118                f=Gio.File.new_for_path(self.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.name_label.set_name("EDIT_LABEL")
123                self.image_label.set_name("EDIT_LABEL")
124                self.sound_label.set_name("EDIT_LABEL")
125                self.duration_label.set_name("EDIT_LABEL")
126                self.note_label.set_name("NOTE_LABEL")
127       
128        #def set-css_info
129
130        def connect_signals(self):
131
132                self.stock_rb.connect("toggled",self.image_toggled_button,"stock")
133                self.custom_rb.connect("toggled",self.image_toggled_button,"custom")
134                self.random_rb.connect("toggled",self.sound_toggled_button,"random")
135                self.file_rb.connect("toggled",self.sound_toggled_button,"file")
136                self.url_rb.connect("toggled",self.sound_toggled_button,"url")
137                self.image_fc.connect("file-set",self.check_mimetype_image)
138                self.sound_fc.connect("file-set",self.check_mimetype_sound)
139
140        #def connect_signals   
141
142        def init_threads(self):
143
144                self.checking_data_t=threading.Thread(target=self.checking_data)
145
146                self.checking_data_t.daemon=True
147
148                self.checking_data_t.launched=False
149
150                GObject.threads_init()
151               
152        #def init_threads       
153
154        def init_data_form(self):
155
156                self.image_op="stock"
157                self.image_fc.set_sensitive(False)
158                self.sound_op="file"
159                self.sound_dc.set_sensitive(False)
160                self.sound_url.set_sensitive(False)
161<<<<<<< .mine
162                self.duration_entry.set_value(30)
163                self.init_threads()
164||||||| .r6943
165=======
166                self.duration_entry.set_value(30)
167>>>>>>> .r6950
168
169        #def init_data_form     
170
171
172        def image_toggled_button(self,button,name):
173
174                if button.get_active():
175                        if name=="stock":
176                                self.image_cb.set_sensitive(True)
177                                self.image_fc.set_sensitive(False)
178                                self.image_op="stock"
179
180                        else:
181                                self.image_cb.set_sensitive(False)
182                                self.image_fc.set_sensitive(True)       
183                                self.image_op="custom"
184
185        #def image_toggled_button                       
186
187       
188        def sound_toggled_button(self,button,name):
189
190                if button.get_active():
191                        if name=="random":
192                                self.sound_dc.set_sensitive(True)
193                                self.sound_fc.set_sensitive(False)
194                                self.sound_url.set_sensitive(False)
195                                self.sound_op="random"
196
197                        else:
198                                if name=="file":
199                                        self.sound_dc.set_sensitive(False)
200                                        self.sound_fc.set_sensitive(True)
201                                        self.sound_url.set_sensitive(False)
202                                        self.sound_op="file"
203                                else:
204                                        self.sound_dc.set_sensitive(False)
205                                        self.sound_fc.set_sensitive(False)
206                                        self.sound_url.set_sensitive(True)     
207                                        self.sound_op="url"     
208
209        #def sound_toggled_button                                       
210       
211       
212        def load_values(self,bell):
213       
214                bell_to_edit=self.core.mainWindow.bells_info[bell]
215
216                self.hour_spinbutton.set_value(bell_to_edit["hour"])   
217                self.minute_spinbutton.set_value(bell_to_edit["minute"])
218                self.name_entry.set_text(bell_to_edit["name"]) 
219               
220                weekdays=bell_to_edit["weekdays"]
221                if weekdays["0"]:
222                        self.monday_tb.set_active(True)
223                if weekdays["1"]:
224                        self.tuesday_tb.set_active(True)       
225                if weekdays["2"]:
226                        self.wednesday_tb.set_active(True)     
227                if weekdays["3"]:
228                        self.thursday_tb.set_active(True)       
229                if weekdays["4"]:
230                        self.friday_tb.set_active(True) 
231
232                image_op=bell_to_edit["image"]["option"]
233
234                if image_op=="stock":
235                        self.stock_rb.set_active(True)
236                        if os.path.exists(bell_to_edit["image"]["path"]):
237                                c=0
238                                for i in self.image_store:
239                                        if os.path.basename(bell_to_edit["image"]["path"]).split(".")[0]==i[1]:
240                                                break
241                                        c+=1
242                                self.image_cb.set_active(c)                             
243                else:
244                        self.custom_rb.set_active(True)
245                        if os.path.exists(bell_to_edit["image"]["path"]):
246                                self.image_fc.set_filename(bell_to_edit["image"]["path"])
247
248                sound_op=bell_to_edit["sound"]["option"]
249
250                if sound_op=="random":
251                        self.random_rb.set_active(True)
252                        if os.path.exists(bell_to_edit["sound"]["path"]):
253                                self.sound_dc.set_filename(bell_to_edit["sound"]["path"])
254                elif sound_op=="file":
255                        self.file_rb.set_active(True)
256                        if os.path.exists(bell_to_edit["sound"]["path"]):
257                                self.sound_fc.set_filename(bell_to_edit["sound"]["path"])       
258                else:
259                        self.url_rb.set_active(True)
260                        self.sound_url.set_text(bell_to_edit["sound"]["path"])
261
262                self.duration_entry.set_value(bell_to_edit["play"]["duration"])
263               
264                self.edit=True
265                self.bell_to_edit=bell
266                self.active_bell=bell_to_edit["active"]
267
268        #def load_values       
269       
270        def gather_values(self,widget):
271
272                self.files_tocheck={}
273                self.files_tocheck["sound"]=""
274                self.files_tocheck["image"]=""
275                self.files_tocheck["url"]=None
276                self.files_tocheck["directory"]=""
277
278               
279                if self.image_op=="stock":
280                        self.image_path=BANNERS_PATH+self.image_store[self.image_cb.get_active()][1]+".png"
281                else:
282                        self.image_path=self.image_fc.get_filename()
283                        self.files_tocheck["image"]=self.image_path
284
285                if self.sound_op=="random":
286                        self.sound_path=self.sound_dc.get_filename()
287                        self.files_tocheck["directory"]=self.sound_path
288                elif self.sound_op=="file":
289                        self.sound_path=self.sound_fc.get_filename()
290                        self.files_tocheck["sound"]=self.sound_path
291                else:   
292                        self.sound_path=self.sound_url.get_text()
293                        self.files_tocheck["url"]=self.sound_path
294                       
295                self.duration=self.duration_entry.get_value_as_int()
296               
297                self.core.mainWindow.waiting_label.set_text(self.core.mainWindow.get_msg(30))                   
298                self.core.mainWindow.waiting_window.show_all()
299                self.init_threads()
300                self.checking_data_t.start()
301                GLib.timeout_add(100,self.pulsate_checking_data)
302               
303        #def gather_values     
304
305        def pulsate_checking_data(self):
306               
307                if self.checking_data_t.is_alive():
308                        self.core.mainWindow.waiting_pbar.pulse()
309                        return True
310                       
311                else:
312                        self.core.mainWindow.waiting_window.hide()
313                        if not self.check["result"]:
314                                self.core.mainWindow.manage_message(True,self.check["code"])
315                        else:   
316                                self.save_values()
317               
318                return False
319               
320        #def pulsate_checking_data     
321               
322        def checking_data(self):
323               
324                self.check=self.core.bellmanager.check_data(self.name_entry.get_text(),self.files_tocheck)
325       
326        #def checking_data
327               
328        def save_values(self):         
329               
330                bell=self.core.mainWindow.bells_info.copy()
331
332       
333                if self.edit:
334                        order=self.bell_to_edit
335                        action="edit"
336                else:           
337                        if len(bell)>0:
338                                keys=bell.keys()
339                                order=str(int(max(keys))+1)
340                        else:
341                                order="1"
342                        action="add"   
343                       
344                minute=self.minute_spinbutton.get_value_as_int()
345                hour=self.hour_spinbutton.get_value_as_int()
346                               
347
348                bell[order]={}         
349                bell[order]["hour"]=hour
350                bell[order]["minute"]=minute
351                bell[order]["weekdays"]={}                     
352                bell[order]["weekdays"]["0"]=self.monday_tb.get_active()
353                bell[order]["weekdays"]["1"]=self.tuesday_tb.get_active()
354                bell[order]["weekdays"]["2"]=self.wednesday_tb.get_active()
355                bell[order]["weekdays"]["3"]=self.thursday_tb.get_active()
356                bell[order]["weekdays"]["4"]=self.friday_tb.get_active()
357
358                count=0
359                if self.monday_tb.get_active():
360                        count=count+1
361                if self.tuesday_tb.get_active():
362                        count+=count+1
363                if self.wednesday_tb.get_active():
364                        count+=count+1         
365                if self.thursday_tb.get_active():
366                        count+=count+1
367                if self.friday_tb.get_active():
368                        count+=count+1 
369
370
371                if count>0:
372                        if self.edit:
373                                active_bell=self.active_bell
374                        else:
375                                active_bell=True       
376                else:
377                        active_bell=False       
378
379                               
380                bell[order]["name"]=self.name_entry.get_text()
381
382                bell[order]["image"]={}
383                bell[order]["image"]["option"]=self.image_op
384                if self.image_op=="custom":
385                        orig_image_path=self.image_path
386                        dest_image_path=os.path.join(self.core.images_path,os.path.basename(orig_image_path))
387                else:
388                        orig_image_path=""
389                        dest_image_path=self.image_path
390
391                bell[order]["image"]["path"]=dest_image_path
392
393                bell[order]["sound"]={}
394                bell[order]["sound"]["option"]=self.sound_op
395                if self.sound_op=="file":
396                        orig_sound_path=self.sound_path
397                        dest_sound_path=os.path.join(self.core.sounds_path,os.path.basename(orig_sound_path))
398                else:
399                        orig_sound_path=""
400                        dest_sound_path=self.sound_path
401
402                bell[order]["sound"]["path"]=dest_sound_path   
403
404
405                bell[order]["play"]={}
406                bell[order]["play"]["duration"]=self.duration
407
408
409                bell[order]["active"]=active_bell
410               
411
412                result_copy=self.core.bellmanager.copy_media_files(orig_image_path,orig_sound_path)
413                if result_copy['status']:
414                        result=self.core.bellmanager.save_conf(bell,order,action)
415                        if result['status']:
416                                self.core.mainWindow.load_info()
417                                self.core.bellBox.draw_bell(False,order)
418
419                        else:
420                                self.core.bellBox.draw_bell(False)
421
422
423                self.core.mainWindow.search_entry.set_text("")
424                self.core.mainWindow.manage_menubar(True)       
425                self.core.mainWindow.manage_down_buttons(False)
426                self.core.mainWindow.stack_opt.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
427                self.core.mainWindow.stack_opt.set_visible_child_name("bellBox")
428                self.core.editBox.remove(self.core.editBox.main_box)
429
430                if result_copy['status']:
431                        if result['status']:
432                                if self.edit:
433                                        self.core.mainWindow.manage_message(False,15)
434                                else:
435                                        self.core.mainWindow.manage_message(False,18)   
436                        else:
437                                self.core.mainWindow.manage_message(True,result['code'])       
438                else:
439                        self.core.mainWindow.manage_message(True,result['code'])               
440
441
442        #def save_values               
443       
444       
445        def check_mimetype_image(self,widget):
446       
447                check=self.core.bellmanager.check_mimetypes(self.image_fc.get_filename(),"image")
448                if check !=None:
449                        self.core.mainWindow.manage_message(True,check["code"])
450                else:
451                        self.core.mainWindow.msg_label.hide()
452
453        #def check_mimetype_image               
454       
455        def check_mimetype_sound(self,widget):
456       
457                check=self.core.bellmanager.check_mimetypes(self.sound_fc.get_filename(),"audio")
458                if check !=None:
459                        self.core.mainWindow.manage_message(True,check["code"])
460                else:
461                        self.core.mainWindow.msg_label.hide()
462
463        #def check_mimetype_sound               
464
465
466       
467#class EditBox
468
469from . import Core
Note: See TracBrowser for help on using the repository browser.