source: bell-scheduler/trunk/fuentes/bell-scheduler/python3-bellscheduler/MainWindow.py @ 7825

Last change on this file since 7825 was 7825, checked in by jrpelegrina, 2 years ago

WIP in start time option

File size: 27.6 KB
Line 
1#!/usr/bin/env python3
2
3import gi
4gi.require_version('Gtk', '3.0')
5from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
6
7
8
9import signal
10import os
11import subprocess
12import json
13import sys
14import syslog
15import time
16import threading
17import tempfile
18from shutil import copyfile
19
20from edupals.ui.n4dgtklogin import *
21import signal
22signal.signal(signal.SIGINT, signal.SIG_DFL)
23
24
25from . import settings
26import gettext
27#gettext.textdomain(settings.TEXT_DOMAIN)
28_ = gettext.gettext
29
30class MainWindow:
31       
32        def __init__(self):
33
34                self.core=Core.Core.get_core()
35                self.config_dir=os.path.expanduser("/etc/bellScheduler/")
36                self.holiday_token=self.config_dir+"enabled_holiday_token"
37
38
39        #def init
40
41       
42        def load_gui(self):
43               
44                gettext.textdomain(settings.TEXT_DOMAIN)
45                builder=Gtk.Builder()
46                builder.set_translation_domain(settings.TEXT_DOMAIN)
47                ui_path=self.core.ui_path
48                builder.add_from_file(ui_path)
49
50                self.css_file=self.core.rsrc_dir+"bell-scheduler.css"
51                               
52                self.stack_window= Gtk.Stack()
53                self.stack_window.set_transition_duration(750)
54                self.stack_window.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
55                self.stack_window.set_margin_top(0)
56                self.stack_window.set_margin_bottom(0)
57               
58                self.main_window=builder.get_object("main_window")
59                self.main_window.set_title("Bell Scheduler")
60                self.main_window.resize(930,770)
61                self.main_box=builder.get_object("main_box")
62                self.login=N4dGtkLogin()
63                self.login.set_allowed_groups(['adm','teachers'])
64                self.login.hide_server_entry()
65                desc=_("Welcome to the Bell Scheduler.\nFrom here you can program multiple alarms for entry, exit, recess or any other event")
66                self.login.set_info_text("<span foreground='black'>Bell Scheduler</span>",_("Bell Scheduler"),"<span foreground='black'>"+desc+"</span>\n")
67                image=os.path.join(self.core.rsrc_dir,"bell.png")
68                self.login.set_info_background(image=image,cover=True)
69                self.login.after_validation_goto(self._signin)
70
71                self.option_box=builder.get_object("options_box")
72                self.add_button=builder.get_object("add_button")
73                self.export_button=builder.get_object("export_button")
74                self.import_button=builder.get_object("import_button")
75                self.manage_bells_button=builder.get_object("manage_bells_button")
76
77                self.popover = Gtk.Popover()
78                vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
79                activate_box=Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
80                activate_box.set_margin_left(10)
81                activate_box.set_margin_right(10)
82                activate_eb=Gtk.EventBox()
83                activate_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
84                activate_eb.connect("button-press-event", self.activate_all_bells)
85                activate_eb.connect("motion-notify-event", self.mouse_over_popover)
86                activate_eb.connect("leave-notify-event", self.mouse_exit_popover)
87                activate_label=Gtk.Label()
88                activate_label.set_text(_("Activate all bells"))
89                activate_eb.add(activate_label)
90                activate_box.add(activate_eb)
91                vbox.pack_start(activate_box, True, True,8)
92                deactivate_box=Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
93                deactivate_box.set_margin_left(10)
94                deactivate_box.set_margin_right(10)
95                deactivate_eb=Gtk.EventBox()
96                deactivate_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
97                deactivate_eb.connect("button-press-event", self.deactivate_all_bells)
98                deactivate_eb.connect("motion-notify-event", self.mouse_over_popover)
99                deactivate_eb.connect("leave-notify-event", self.mouse_exit_popover)
100                deactivate_label=Gtk.Label()
101                deactivate_label.set_text(_("Deactivate all bells"))
102                deactivate_eb.add(deactivate_label)
103                deactivate_box.add(deactivate_eb)
104                vbox.pack_start(deactivate_box, True, True,8)
105
106                separator_popover=Gtk.Separator()
107                separator_popover.set_name("POPOVER_SEPARATOR")
108                separator_popover.set_margin_left(10)
109                separator_popover.set_margin_right(10)
110                vbox.pack_start(separator_popover,True,True,4)
111
112                remove_box=Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
113                remove_box.set_margin_left(10)
114                remove_box.set_margin_right(10)
115                remove_eb=Gtk.EventBox()
116                remove_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
117                remove_eb.connect("button-press-event", self.remove_all_bells)
118                remove_eb.connect("motion-notify-event", self.mouse_over_popover)
119                remove_eb.connect("leave-notify-event", self.mouse_exit_popover)
120                remove_label=Gtk.Label()
121                remove_label.set_text(_("Remove all bells"))
122                remove_eb.add(remove_label)
123                remove_box.add(remove_eb)
124                vbox.pack_start(remove_box, True, True,8)
125
126                self.popover.add(vbox)
127                self.popover.set_position(Gtk.PositionType.BOTTOM)
128                self.popover.set_relative_to(self.manage_bells_button)
129
130                self.manage_holiday_button=builder.get_object("manage_holiday_button")
131                self.help_button=builder.get_object("help_button")
132                self.enable_holiday_label=builder.get_object("enable_holiday_label")
133                self.enable_holiday_switch=builder.get_object("enable_holiday_switch")
134                self.search_entry=builder.get_object("search_entry")
135                self.msg_label=builder.get_object("msg_label")
136                self.save_button=builder.get_object("save_button")
137                self.cancel_button=builder.get_object("cancel_button")
138                self.return_button=builder.get_object("return_button")
139
140                self.waiting_window=builder.get_object("waiting_window")
141                self.waiting_label=builder.get_object("waiting_plabel")
142                self.waiting_pbar=builder.get_object("waiting_pbar")
143                self.waiting_window.set_transient_for(self.main_window)
144
145                self.bellBox=self.core.bellBox
146                self.editBox=self.core.editBox
147                self.holidayBox=self.core.holidayBox
148
149                self.stack_window.add_titled(self.login, "login", "Login")
150                self.stack_window.add_titled(self.option_box,"optionBox", "Option Box")
151                self.stack_window.show_all()
152                self.main_box.pack_start(self.stack_window,True,True,0)
153
154                self.stack_opt= Gtk.Stack()
155                self.stack_opt.set_transition_duration(750)
156                self.stack_opt.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
157
158               
159                self.stack_opt.add_titled(self.bellBox,"bellBox", "Bell Box")
160                self.stack_opt.add_titled(self.editBox,"editBox", "Edit Box")
161                self.stack_opt.add_titled(self.holidayBox,"holidayBox", "Holiday Box")
162
163               
164                self.stack_opt.show_all()
165
166                self.option_box.pack_start(self.stack_opt,True,True,5)
167               
168                self.set_css_info()
169                self.init_threads()
170                self.connect_signals()
171                self.manage_menubar(True,True)
172                self.manage_down_buttons(False)
173                self.cont=0
174                self.main_window.show()
175                self.stack_window.set_transition_type(Gtk.StackTransitionType.NONE)
176                self.stack_window.set_visible_child_name("login")
177                self.return_button.hide()
178                #self.holiday_control=False
179
180               
181        #def load_gui
182
183
184        def init_threads(self):
185
186                self.export_bells_t=threading.Thread(target=self.export_bells)
187                self.import_bells_t=threading.Thread(target=self.import_bells)
188                self.recovery_bells_t=threading.Thread(target=self.recovery_bells)
189                self.enable_holiday_control_t=threading.Thread(target=self.enable_holiday_control)
190                self.change_activation_status_t=threading.Thread(target=self.change_activation_status)
191                self.remove_all_bells_t=threading.Thread(target=self.remove_all_process)
192
193                self.export_bells_t.daemon=True
194                self.import_bells_t.daemon=True
195                self.recovery_bells_t.daemon=True
196                self.enable_holiday_control_t.daemon=True
197                self.change_activation_status_t.daemon=True
198                self.remove_all_bells_t.daemon=True
199
200                GObject.threads_init()
201
202        #def init_threads       
203
204        def set_css_info(self):
205               
206               
207                self.style_provider=Gtk.CssProvider()
208                f=Gio.File.new_for_path(self.css_file)
209                self.style_provider.load_from_file(f)
210                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
211                self.main_window.set_name("WINDOW")
212                self.waiting_label.set_name("WAITING_LABEL")
213
214                #self.banner_box.set_name("BANNER_BOX")
215
216        #def set_css_info       
217                               
218                       
219        def connect_signals(self):
220               
221                self.main_window.connect("destroy",self.quit)
222                self.add_button.connect("clicked",self.add_bell)
223                self.save_button.connect("clicked",self.core.editBox.gather_values)
224                self.cancel_button.connect("clicked",self.cancel_clicked)
225                self.export_button.connect("clicked",self.export_clicked)
226                self.import_button.connect("clicked",self.import_clicked)
227                self.search_entry.connect("changed",self.search_entry_changed)
228                self.manage_bells_button.connect("clicked",self.manage_bells_button_clicked)
229                self.manage_holiday_button.connect("clicked",self.manage_holiday_button_clicked)
230                self.return_button.connect("clicked",self.return_button_clicked)
231                self.enable_holiday_switch.connect("notify::active",self.enable_holiday_switch_clicked)
232                self.help_button.connect("clicked",self.help_clicked)
233
234        #def connect_signals   
235
236                               
237        def _signin(self,user,pwd,server):
238
239                self.core.bellmanager.credentials=[user,pwd]
240                self.core.holidayBox.credentials=[user,pwd]
241                self._init_holiday_switch()
242                self.manage_down_buttons(False)
243                result_sync=self.core.bellmanager.sync_with_cron()
244                if result_sync["status"]:
245                        self.load_info()
246                        self.core.bellBox.draw_bell(False)
247                else:
248                        self.manage_menubar(False)
249                        self.manage_message(True,result_sync["code"])
250
251                self.stack_window.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
252                self.stack_window.set_visible_child_name("optionBox")
253                #self.stack_opt.set_visible_child_name("bellBox")
254
255
256        #def _signin
257
258        def _init_holiday_switch(self):
259
260                self.holiday_control=False
261
262                if os.path.exists(self.holiday_token):
263                        self.enable_holiday_switch.set_active(True)
264                else:
265                        self.enable_holiday_switch.set_active(False)
266
267        #def _init_holiday_switch
268       
269
270        def load_info(self):
271       
272                self.read_conf=self.core.bellmanager.read_conf()
273                self.bells_info=self.core.bellmanager.bells_config.copy()
274                self.order_bells=self.core.bellmanager.get_order_bell() 
275                if not self.read_conf['status']:
276                        if self.cont==0:
277                                self.manage_message(True,self.read_conf['code'])
278                                self.manage_menubar(False,False)       
279                else:
280                        self.manage_menubar(True)                       
281       
282        #def load_info 
283
284        def add_bell(self,widget):
285
286                self.manage_menubar(False)
287                self.manage_down_buttons(True)
288                self.core.editBox.init_form()
289                self.core.editBox.render_form()
290                self.stack_opt.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
291                self.stack_opt.set_visible_child_name("editBox")
292
293        #def add_bell   
294
295
296        def cancel_clicked(self,widget):
297
298                self.manage_menubar(True)
299                self.manage_down_buttons(False)
300                self.core.editBox.remove(self.core.editBox.main_box)
301                self.stack_opt.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
302                self.stack_opt.set_visible_child_name("bellBox")
303               
304        #def cancel_clicked     
305
306        def export_clicked(self,widget):
307
308                dialog = Gtk.FileChooserDialog(_("Please choose a file to save bells list"), None,
309                Gtk.FileChooserAction.SAVE,(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
310                Gtk.STOCK_SAVE, Gtk.ResponseType.OK))
311                dialog.set_do_overwrite_confirmation(True)
312                response = dialog.run()
313               
314                if response == Gtk.ResponseType.OK:
315                        self.dest=dialog.get_filename()
316                        dialog.destroy()
317                        self.waiting_label.set_text(self.get_msg(26))                   
318                        self.waiting_window.show_all()
319                        self.init_threads()
320                        self.export_bells_t.start()
321                        GLib.timeout_add(100,self.pulsate_export_bells)
322                dialog.destroy()       
323
324        #def export_clicked     
325
326        def pulsate_export_bells(self):
327
328                if self.export_bells_t.is_alive():
329                        self.waiting_pbar.pulse()
330                        return True
331
332                else:
333                        self.waiting_window.hide()
334                        self.search_entry.set_text("")
335                        if self.export_result['status']:
336                                self.manage_message(False,self.export_result['code'])
337                        else:
338                                self.manage_message(True,self.export_result['code'])
339
340                return False
341
342        #def pulsate_export_bell       
343
344        def export_bells(self):
345
346                self.export_result=self.core.bellmanager.export_bells_conf(self.dest)                           
347       
348        #def export_bells
349
350        def import_clicked(self,widget):
351
352                self.loading_errors=False
353                self.backup=True
354
355                dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, "BELL SCHEDULER")
356                dialog.format_secondary_text(_("New bells configuration will be loaded and replace the existing configutarion. Do you want to continue?"))
357                response=dialog.run()
358                dialog.destroy()
359                if response == Gtk.ResponseType.YES:
360                        dialog = Gtk.FileChooserDialog(_("Please choose a file to load bells list"), None,
361                        Gtk.FileChooserAction.OPEN,(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
362                        Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
363                        self.add_filter(dialog)
364                        response = dialog.run()
365                        if response == Gtk.ResponseType.OK:
366                                self.recovery=False
367                                self.orig=dialog.get_filename()
368                                dialog.destroy()
369                                self.waiting_label.set_text(self.get_msg(27))                   
370                                self.waiting_window.show_all()
371                                self.init_threads()
372                                self.import_bells_t.start()
373                                GLib.timeout_add(100,self.pulsate_import_bells)
374
375                dialog.destroy()
376                               
377        #def import_clicked
378
379        def add_filter(self,dialog):
380               
381                filter_zip = Gtk.FileFilter()
382                filter_zip.set_name("Zip files")
383                filter_zip.add_mime_type("application/zip")
384                dialog.add_filter(filter_zip)
385
386        #def add_filter
387
388        def pulsate_import_bells(self):
389
390                if self.import_bells_t.is_alive():
391                        self.waiting_pbar.pulse()
392                        return True
393
394                else:
395                        self._init_holiday_switch()
396                        self.waiting_window.hide()
397                        if self.import_result['status']:
398                                self.search_entry.set_text("")
399                                self.load_info()
400                                if self.read_conf['status']:
401                                        try:
402                                                self.core.bellBox.draw_bell(False)
403                                                if not self.loading_errors:
404                                                        self.manage_message(False,self.import_result['code'])
405                                                else:
406                                                        self.manage_message(True,13)   
407                                        except:
408                                                self.recovery=True
409                                                '''
410                                                self.backup=False
411                                                self.orig=self.import_result['data']+".zip"
412                                                self.init_threads()
413                                                self.recovery_bells_t.start()
414                                                self.waiting_label.set_text(self.get_msg(28))
415                                                GLib.timeout_add(100,self.pulsate_recovery_bells)
416                                                return False
417                                                '''     
418                                else:
419                                        self.manage_message(True,self.read_conf['code'])       
420                                        self.cont=0
421                                        return False
422
423                        else:
424                                #self.manage_message(True,self.import_result['code'])   
425                                self.cont=0
426                                self.recovery=True
427                                #return False
428
429                        if self.recovery:
430                                self.backup=False
431                                self.recovery=False
432                                self.orig=self.import_result['data']+".zip"
433                                self.manage_message(True,self.import_result['code'])   
434                                self.init_threads()
435                                self.recovery_bells_t.start()
436                                self.waiting_window.show()
437                                self.waiting_label.set_text(self.get_msg(28))
438                                GLib.timeout_add(100,self.pulsate_recovery_bells)
439                                return False           
440
441        #def pulsate_import_bells
442
443        def import_bells(self):
444
445                self.import_result=self.core.bellmanager.import_bells_conf(self.orig,self.backup)
446
447        #def import_bells               
448
449
450        def pulsate_recovery_bells(self):
451
452                if self.recovery_bells_t.is_alive():
453                        self.waiting_pbar.pulse()
454                        return True
455
456                else:
457                        self.waiting_window.hide()
458                        self.load_info()
459                        try:
460                                self.core.bellBox.draw_bell(False)
461                                if not self.loading_errors:
462                                        self.manage_message(True,9)
463                                else:
464                                        self.manage_message(True,9)     
465                        except:
466                                self.manage_message(True,self.recovery_result['code']) 
467                                return False   
468
469                return False
470       
471        #def pulsate_recovery_bells             
472       
473       
474        def recovery_bells(self):
475
476                self.recovery_result=self.core.bellmanager.recovery_bells_conf(self.orig,self.backup)           
477
478        #def recovery_bells
479
480        def search_entry_changed(self,widget):
481
482                self.core.bellBox.init_bell_list() 
483                self.load_info()
484                self.search_list=self.bells_info.copy()
485
486                search=self.search_entry.get_text().lower()
487                if search=="":
488                        self.core.bellBox.draw_bell(False)
489                else:
490                        for item in self.bells_info:
491                                time=self.core.bellmanager.format_time(item)
492                                hour=str(time[0])
493                                minute=str(time[1])
494                                cron=str(time[2])
495                                name=self.bells_info[item]["name"].lower()
496                                days=[]
497                                if self.bells_info[item]["weekdays"]["0"]:
498                                        days.append(_("Monday"))
499                                        days.append(_("M"))
500                                        days.append(_("Mon"))
501                                if self.bells_info[item]["weekdays"]["1"]:
502                                        days.append(_("Tuesday"))
503                                        days.append(_("T"))
504                                        days.append(_("Tue"))
505                                if self.bells_info[item]["weekdays"]["2"]:
506                                        days.append(_("Wednesday"))     
507                                        days.append(_("W"))
508                                        days.append(_("Wed"))
509                                if self.bells_info[item]["weekdays"]["3"]:
510                                        days.append(_("Thursday"))
511                                        days.append(_("R"))
512                                        days.append(_("Thu"))
513                                if self.bells_info[item]["weekdays"]["4"]:
514                                        days.append(_("Friday"))
515                                        days.append(_("F"))     
516                                        days.append(_("Fri"))
517
518                               
519                                if search in hour or search in minute or search in name or search in cron or search in [ x.lower() for x in days]:
520                                        pass
521                                else:
522                                        self.search_list.pop(item)
523
524                        if len(self.search_list)>0:
525                                        self.search_order=self.core.bellmanager.get_order_bell(self.search_list)               
526                                        self.core.bellBox.draw_bell(True)
527                       
528        #def search_entry_changed                               
529
530        def manage_menubar(self,active,hide=None):
531       
532                if hide:
533                        self.add_button.hide()
534                        self.import_button.hide()
535                        self.export_button.hide()
536                        self.search_entry.hide()
537                        self.manage_bells_button.hide()
538                        self.manage_holiday_button.hide()
539                else:
540                        self.add_button.show()
541                        self.import_button.show()
542                        self.export_button.show()
543                        self.search_entry.show()
544                        self.manage_bells_button.show()
545                        self.manage_holiday_button.show()
546
547                if active:
548                        self.add_button.set_sensitive(True)
549                        self.import_button.set_sensitive(True)
550                        self.export_button.set_sensitive(True)
551                        self.search_entry.set_sensitive(True)
552                        self.manage_bells_button.set_sensitive(True)
553                        self.manage_holiday_button.set_sensitive(True)
554                        self.enable_holiday_switch.set_sensitive(True)
555                else:
556                        self.add_button.set_sensitive(False)
557                        self.import_button.set_sensitive(False)
558                        self.export_button.set_sensitive(False)
559                        self.search_entry.set_sensitive(False)
560                        self.manage_bells_button.set_sensitive(False)
561                        self.manage_holiday_button.set_sensitive(False)
562                        self.enable_holiday_switch.set_sensitive(False)
563
564        #def manage_menubar             
565
566       
567        def manage_down_buttons(self,show):
568       
569                if show:
570                        self.cancel_button.show()
571                        self.cancel_button.set_sensitive(True)
572                        self.save_button.show()
573                        self.save_button.set_sensitive(True)
574                        self.msg_label.set_text("")
575                        self.enable_holiday_switch.hide()
576                        self.enable_holiday_label.hide()
577                else:
578                        self.cancel_button.hide()
579                        self.save_button.hide()
580                        self.msg_label.set_text("")
581                        self.enable_holiday_switch.show()
582                        self.enable_holiday_label.show()
583
584
585        #def manage_down_buttons                                       
586
587                       
588        def manage_message(self,error,code,data=None):
589
590                msg=self.get_msg(code)
591                if data!=None:
592                        msg=msg+data
593
594                if error:
595                        self.msg_label.set_name("MSG_ERROR_LABEL")
596                else:
597                        self.msg_label.set_name("MSG_CORRECT_LABEL")   
598
599                self.msg_label.set_text(msg)
600                #self.msg_label.show()
601
602        #def manage_message             
603
604
605        def get_msg(self,code):
606
607                if      code==1:
608                        msg_text=_("You must indicate a name for the alarm")
609                elif code==2:
610                        msg_text=_("Sound file is not correct")
611                elif code==3:
612                        msg_text=_("You must indicate sound file")
613                elif code==4:
614                        msg_text=_("Image file is not correct")
615                elif code==5:
616                        msg_text=_("You must indicate a image file")
617                elif code==6:
618                        msg_text=_("You must indicate a url")
619                elif code==7:
620                        msg_text=_("You must indicate a directory")     
621                elif code==8:
622                        msg_text=_("The sound file or url indicated is not reproducible")
623                elif code==9:
624                        msg_text=_("File has errors. Unabled to load it")
625                elif code==10:
626                        msg_text=_("File loaded succesfully")
627                elif code==11:
628                        msg_text=_("File saved succcesfully")
629                elif code==12:
630                        msg_text=_("Unable to save file")       
631                elif code==13:
632                        msg_text=_("File loaded with errors")   
633                elif code==14:
634                        msg_text=_("Bell deleted successfully") 
635                elif code==15:
636                        msg_text=_("Bell edited successfully")
637                elif code==16:
638                        msg_text=_("Bell activated successfully")
639                elif code==17:
640                        msg_text=_("Bell deactivated successfully")
641                elif code==18:
642                        msg_text=_("Bell created successfully")         
643                elif code==19:
644                        msg_text=_("Unabled to edit the Bell due to problems with cron sync")   
645                elif code==20:
646                        msg_text=_("Unabled to create the Bell due to problems with cron sync")
647                elif code==21:
648                        msg_text=_("Unabled to delete the Bell due to problems with cron sync") 
649                elif code==22:
650                        msg_text=_("Unabled to activate the Bell due to problems with cron sync")       
651                elif code==23:
652                        msg_text=_("Unabled to deactivate the Bell due to problems with cron sync")     
653                elif code==24:
654                        msg_text=_("Unabled to copy image and/or sound file to work directory") 
655                elif code==25:
656                        msg_text=_("Unabled to read bells configuration file") 
657                elif code==26:
658                        msg_text=_("Exporting bells configuration. Wait a moment...")   
659                elif code==27:
660                        msg_text=_("Importing bells configuration. Wait a moment...")
661                elif code==28:
662                        msg_text=_("Revovering previous bells configuration. Wait a moment...") 
663                elif code==29:
664                        msg_text=_("ERROR: File or directory not available")
665                elif code==30:
666                        msg_text=_("Validating the data entered...")           
667                elif code==31:
668                        msg_text=_("Detected alarms with errors")
669                elif code==32:
670                        msg_text=_("Activating holiday control.Wait a moment...")
671                elif code==33:
672                        msg_text=_("Deactivating holiday control.Wait a moment...")
673                elif code==34:
674                        msg_text=_("Holiday control deactivated successfully")
675                elif code==35:
676                        msg_text=_("Holiday control activated successfully")
677                elif code==36:
678                        msg_text=_("Unabled to apply changes due to problems with cron sync")
679                elif code==37:
680                        msg_text=_("Unabled to load bell list due to problems with cron sync") 
681                elif code==38:
682                        msg_text=_("The specified folder does not contain playable files")     
683                elif code==39:
684                        msg_text=_("You must indicate a urls list file")
685                elif code==40:
686                        msg_text=_("The specified urls list has not valid urls. Errors in lines: ")     
687                elif code==41:
688                        msg_text=_("Unabled to validated the data")                             
689                elif code==42:
690                        msg_text=_("Unabled to validated the data. Internet connection not detected")
691                elif code==43:
692                        msg_text=_("The specified urls list is not valid")
693                elif code==44:
694                        msg_text=_("Activating all bells. Wait a moment...")
695                elif code==45:
696                        msg_text=_("Deactivating all bells. Wait a moment...")
697                elif code==46:
698                        msg_text=_("The bells have been activated successfully")       
699                elif code==47:
700                        msg_text=_("The bells have been deactivated successfully")     
701                elif code==48:
702                        msg_text=_("It is not possible to activate all bells")
703                elif code==49:
704                        msg_text=_("It is not possible to deactivate all bells")                       
705                elif code==50:
706                        msg_text=_("Removing all bells. Wait a moment...")
707                elif code==51:
708                        msg_text=_("The bells have been removed successfully") 
709                elif code==52:
710                        msg_text=_("It is not possible to remove all bells")   
711                return msg_text
712
713        #def get_msg   
714                       
715        def manage_holiday_button_clicked(self,widget):
716
717                self.core.holidayBox.start_api_connect()
718                self.msg_label.set_text("")
719                self.manage_menubar(False)
720                self.enable_holiday_switch.hide()
721                self.enable_holiday_label.hide()
722                self.stack_opt.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
723                self.stack_opt.set_visible_child_name("holidayBox")
724                self.return_button.show()
725
726        #def manage_holiday_button_clicked     
727
728        def return_button_clicked(self,widget):
729
730                gettext.textdomain(settings.TEXT_DOMAIN)
731                self.manage_menubar(True)
732                self.stack_opt.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
733                self.stack_opt.set_visible_child_name("bellBox")
734                self.return_button.hide()
735                self.enable_holiday_switch.show()
736                self.enable_holiday_label.show()
737
738
739        #def return_button_clicked
740
741        def enable_holiday_switch_clicked(self,switch,gparam):
742
743                if switch.get_active():
744                        if not os.path.exists(self.holiday_token):
745                                self.holiday_control=True
746                                self.holiday_action="enable"
747
748                else:
749                        if os.path.exists(self.holiday_token):
750                                self.holiday_control=True
751                                self.holiday_action="disable"
752
753                if self.holiday_control:
754                        self.waiting_label.set_text(self.get_msg(32))                   
755                        self.waiting_window.show_all()
756                        self.init_threads()
757                        self.enable_holiday_control_t.start()
758                        GLib.timeout_add(100,self.pulsate_enable_holiday_control)
759
760
761        #def enable_holiday_switch_clicked
762
763        def pulsate_enable_holiday_control(self):
764
765
766                if self.enable_holiday_control_t.is_alive():
767                        self.waiting_pbar.pulse()
768                        return True
769
770                else:
771                        self.waiting_window.hide()
772                        if self.enable_holiday_result['status']:
773                                self.manage_message(False,self.enable_holiday_result['code'])
774                        else:
775                                self.manage_message(True,self.enable_holiday_result['code'])
776
777                return False
778
779        #def pulsate_enable_holiday_control     
780
781        def enable_holiday_control(self):
782
783                self.enable_holiday_result=self.core.bellmanager.enable_holiday_control(self.holiday_action)           
784       
785        #def enable_holiday_control
786
787        def help_clicked(self,widget):
788
789                lang=os.environ["LANG"]
790
791                if 'ca_ES' in lang:
792                        cmd='xdg-open http://wiki.lliurex.net/tiki-index.php?page=Bell+Scheduler_va'
793                else:
794                        cmd='xdg-open http://wiki.lliurex.net/tiki-index.php?page=Bell%2BScheduler'
795
796                os.system(cmd)
797       
798        #def help_clicked
799                               
800        def manage_bells_button_clicked(self,widget):
801
802                self.popover.show_all()
803
804        #def manage_bells_button_clicked       
805
806        def activate_all_bells(self,widget,event=None):
807               
808                self.activation_action="activate"
809                bells_disabled=0
810                msg_code=44
811                if len(self.bells_info)>0:
812                        for item in self.bells_info:
813                                if not self.bells_info[item]["active"]:
814                                        bells_disabled+=1
815                        if bells_disabled>0:           
816                                self.change_bell_status(msg_code)
817
818        #def activate_all_bells
819
820        def deactivate_all_bells(self,widget,param):
821       
822                self.activation_action="deactivate"
823                bells_activated=0
824                msg_code=45
825                if len(self.bells_info)>0:
826                        for item in self.bells_info:
827                                if self.bells_info[item]["active"]:
828                                        bells_activated+=1
829                        if bells_activated>0:           
830                                self.change_bell_status(msg_code)
831
832        #def deactivate_all_bells               
833
834        def change_bell_status(self,code):
835
836                self.popover.hide()
837                self.waiting_label.set_text(self.get_msg(code))                 
838                self.waiting_window.show_all()
839                self.init_threads()
840                self.change_activation_status_t.start()
841                GLib.timeout_add(100,self.pulsate_change_activation_status)
842
843        #def change_bell_status
844
845
846        def pulsate_change_activation_status(self):
847
848
849                if self.change_activation_status_t.is_alive():
850                        self.waiting_pbar.pulse()
851                        return True
852
853                else:
854                        self.waiting_window.hide()
855                        self.search_entry.set_text("")
856                        self.load_info()
857                        self.core.bellBox.draw_bell(False)
858                        if self.change_activation_status_result['status']:
859                                self.manage_message(False,self.change_activation_status_result['code'])
860                        else:
861                                self.manage_message(True,self.change_activation_status_result['code'])
862
863                return False
864
865        #def pulsate_change_activation_status   
866
867
868        def change_activation_status(self):
869
870                self.change_activation_status_result=self.core.bellmanager.change_activation_status(self.activation_action)
871
872        #def change_activation_status
873
874        def remove_all_bells(self,widget,event=None):
875
876               
877                if len(self.bells_info)>0:
878                        self.popover.hide()
879                        dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, "BELL SCHEDULER")
880                        dialog.format_secondary_text(_("Do you want delete all bell?"))
881                        response=dialog.run()
882                        dialog.destroy()
883               
884                        if response==Gtk.ResponseType.YES:     
885                                self.waiting_label.set_text(self.get_msg(50))                   
886                                self.waiting_window.show_all()
887                                self.init_threads()
888                                self.remove_all_bells_t.start()
889                                GLib.timeout_add(100,self.pulsate_remove_all_process)
890
891        #def remove_all_bells                   
892
893        def pulsate_remove_all_process(self):
894
895                if self.remove_all_bells_t.is_alive():
896                        self.waiting_pbar.pulse()
897                        return True
898
899                else:
900                        self.waiting_window.hide()
901                        self.search_entry.set_text("")
902                        self.load_info()
903                        self.core.bellBox.draw_bell(False)
904                        if self.remove_all_process_result['status']:
905                                self.manage_message(False,self.remove_all_process_result['code'])
906                        else:
907                                self.manage_message(True,self.remove_all_process_result['code'])
908
909                return False   
910
911        #def pulsate_remove_all_process                 
912
913
914        def remove_all_process(self):
915               
916                self.remove_all_process_result=self.core.bellmanager.remove_all_bells()
917
918        #def remove_all_process
919
920        def mouse_over_popover(self,widget,event=None):
921
922                widget.set_name("POPOVER_ON")
923
924        #def mouser_over_popover       
925
926        def mouse_exit_popover(self,widget,event=None):
927
928                widget.set_name("POPOVER_OFF")
929
930        #def mouse_exit_popover
931
932        def quit(self,widget):
933
934                Gtk.main_quit() 
935
936        #def quit       
937
938        def start_gui(self):
939               
940                GObject.threads_init()
941                Gtk.main()
942               
943        #def start_gui
944
945
946       
947#class MainWindow
948
949from . import Core
Note: See TracBrowser for help on using the repository browser.