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

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

Improved button management during process execution

File size: 28.1 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.stack_window.add_titled(self.login, "login", "Login")
146                self.stack_window.add_titled(self.option_box,"optionBox", "Option Box")
147                self.stack_window.show_all()
148                self.main_box.pack_start(self.stack_window,True,True,0)
149
150                self.stack_opt= Gtk.Stack()
151                self.stack_opt.set_transition_duration(750)
152                self.stack_opt.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
153
154               
155                self.stack_opt.add_titled(self.core.bellBox,"bellBox", "Bell Box")
156                self.stack_opt.add_titled(self.core.editBox,"editBox", "Edit Box")
157                self.stack_opt.add_titled(self.core.holidayBox,"holidayBox", "Holiday Box")
158
159               
160                self.stack_opt.show_all()
161
162                self.option_box.pack_start(self.stack_opt,True,True,5)
163               
164                self.set_css_info()
165                self.init_threads()
166                self.connect_signals()
167                self.manage_menubar(True,True)
168                self.manage_down_buttons(False)
169                self.cont=0
170                self.main_window.show()
171                self.stack_window.set_transition_type(Gtk.StackTransitionType.NONE)
172                self.stack_window.set_visible_child_name("login")
173                self.return_button.hide()
174                #self.holiday_control=False
175
176               
177        #def load_gui
178
179
180        def init_threads(self):
181
182                self.export_bells_t=threading.Thread(target=self.export_bells)
183                self.import_bells_t=threading.Thread(target=self.import_bells)
184                self.recovery_bells_t=threading.Thread(target=self.recovery_bells)
185                self.enable_holiday_control_t=threading.Thread(target=self.enable_holiday_control)
186                self.change_activation_status_t=threading.Thread(target=self.change_activation_status)
187                self.remove_all_bells_t=threading.Thread(target=self.remove_all_process)
188
189                self.export_bells_t.daemon=True
190                self.import_bells_t.daemon=True
191                self.recovery_bells_t.daemon=True
192                self.enable_holiday_control_t.daemon=True
193                self.change_activation_status_t.daemon=True
194                self.remove_all_bells_t.daemon=True
195
196                GObject.threads_init()
197
198        #def init_threads       
199
200        def set_css_info(self):
201               
202               
203                self.style_provider=Gtk.CssProvider()
204                f=Gio.File.new_for_path(self.css_file)
205                self.style_provider.load_from_file(f)
206                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
207                self.main_window.set_name("WINDOW")
208                self.waiting_label.set_name("WAITING_LABEL")
209
210                #self.banner_box.set_name("BANNER_BOX")
211
212        #def set_css_info       
213                               
214                       
215        def connect_signals(self):
216               
217                self.main_window.connect("destroy",self.quit)
218                self.add_button.connect("clicked",self.add_bell)
219                self.save_button.connect("clicked",self.core.editBox.gather_values)
220                self.cancel_button.connect("clicked",self.cancel_clicked)
221                self.export_button.connect("clicked",self.export_clicked)
222                self.import_button.connect("clicked",self.import_clicked)
223                self.search_entry.connect("changed",self.search_entry_changed)
224                self.manage_bells_button.connect("clicked",self.manage_bells_button_clicked)
225                self.manage_holiday_button.connect("clicked",self.manage_holiday_button_clicked)
226                self.return_button.connect("clicked",self.return_button_clicked)
227                self.enable_holiday_switch.connect("notify::active",self.enable_holiday_switch_clicked)
228                self.help_button.connect("clicked",self.help_clicked)
229
230        #def connect_signals   
231
232                               
233        def _signin(self,user,pwd,server):
234
235                self.core.bellmanager.credentials=[user,pwd]
236                self.core.holidayBox.credentials=[user,pwd]
237                self._init_holiday_switch()
238                self.manage_down_buttons(False)
239                result_sync=self.core.bellmanager.sync_with_cron()
240                if result_sync["status"]:
241                        self.load_info()
242                        self.core.bellBox.draw_bell(False)
243                else:
244                        self.manage_menubar(False)
245                        self.manage_message(True,result_sync["code"])
246
247                self.stack_window.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
248                self.stack_window.set_visible_child_name("optionBox")
249                #self.stack_opt.set_visible_child_name("bellBox")
250
251
252        #def _signin
253
254        def _init_holiday_switch(self):
255
256                self.holiday_control=False
257
258                if os.path.exists(self.holiday_token):
259                        self.enable_holiday_switch.set_active(True)
260                else:
261                        self.enable_holiday_switch.set_active(False)
262
263        #def _init_holiday_switch
264       
265
266        def load_info(self):
267       
268                self.read_conf=self.core.bellmanager.read_conf()
269                self.bells_info=self.core.bellmanager.bells_config.copy()
270                self.order_bells=self.core.bellmanager.get_order_bell() 
271                if not self.read_conf['status']:
272                        if self.cont==0:
273                                self.manage_message(True,self.read_conf['code'])
274                                self.manage_menubar(False,False)       
275                else:
276                        self.manage_menubar(True)                       
277       
278        #def load_info 
279
280        def add_bell(self,widget):
281
282                self.manage_menubar(False)
283                self.manage_down_buttons(True)
284                self.core.editBox.init_form()
285                self.core.editBox.render_form()
286                self.stack_opt.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
287                self.stack_opt.set_visible_child_name("editBox")
288
289        #def add_bell   
290
291
292        def cancel_clicked(self,widget):
293
294                self.manage_menubar(True)
295                self.manage_down_buttons(False)
296                self.core.editBox.remove(self.core.editBox.main_box)
297                self.stack_opt.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
298                self.stack_opt.set_visible_child_name("bellBox")
299               
300        #def cancel_clicked     
301
302        def export_clicked(self,widget):
303
304                dialog = Gtk.FileChooserDialog(_("Please choose a file to save bells list"), None,
305                Gtk.FileChooserAction.SAVE,(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
306                Gtk.STOCK_SAVE, Gtk.ResponseType.OK))
307                dialog.set_do_overwrite_confirmation(True)
308                response = dialog.run()
309               
310                if response == Gtk.ResponseType.OK:
311                        self.dest=dialog.get_filename()
312                        dialog.destroy()
313                        self.manage_menubar(False)
314                        self.msg_label.set_text("")
315                        self.core.bellBox.manage_bells_buttons(False)
316                        self.waiting_label.set_text(self.get_msg(26))                   
317                        self.waiting_window.show_all()
318                        self.init_threads()
319                        self.export_bells_t.start()
320                        GLib.timeout_add(100,self.pulsate_export_bells)
321                dialog.destroy()       
322
323        #def export_clicked     
324
325        def pulsate_export_bells(self):
326
327                if self.export_bells_t.is_alive():
328                        self.waiting_pbar.pulse()
329                        return True
330
331                else:
332                        self.waiting_window.hide()
333                        self.manage_menubar(True)
334                        self.core.bellBox.manage_bells_buttons(True)
335                        self.search_entry.set_text("")
336                        if self.export_result['status']:
337                                self.manage_message(False,self.export_result['code'])
338                        else:
339                                self.manage_message(True,self.export_result['code'])
340
341                return False
342
343        #def pulsate_export_bell       
344
345        def export_bells(self):
346
347                self.export_result=self.core.bellmanager.export_bells_conf(self.dest)                           
348       
349        #def export_bells
350
351        def import_clicked(self,widget):
352
353                self.loading_errors=False
354                self.backup=True
355
356                dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, "BELL SCHEDULER")
357                dialog.format_secondary_text(_("New bells configuration will be loaded and replace the existing configutarion. Do you want to continue?"))
358                response=dialog.run()
359                dialog.destroy()
360                if response == Gtk.ResponseType.YES:
361                        dialog = Gtk.FileChooserDialog(_("Please choose a file to load bells list"), None,
362                        Gtk.FileChooserAction.OPEN,(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
363                        Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
364                        self.add_filter(dialog)
365                        response = dialog.run()
366                        if response == Gtk.ResponseType.OK:
367                                self.recovery=False
368                                self.orig=dialog.get_filename()
369                                dialog.destroy()
370                                self.manage_menubar(False)
371                                self.msg_label.set_text("")
372                                self.core.bellBox.manage_bells_buttons(False)
373                                self.waiting_label.set_text(self.get_msg(27))                   
374                                self.waiting_window.show_all()
375                                self.init_threads()
376                                self.import_bells_t.start()
377                                GLib.timeout_add(100,self.pulsate_import_bells)
378
379                dialog.destroy()
380                               
381        #def import_clicked
382
383        def add_filter(self,dialog):
384               
385                filter_zip = Gtk.FileFilter()
386                filter_zip.set_name("Zip files")
387                filter_zip.add_mime_type("application/zip")
388                dialog.add_filter(filter_zip)
389
390        #def add_filter
391
392        def pulsate_import_bells(self):
393
394                if self.import_bells_t.is_alive():
395                        self.waiting_pbar.pulse()
396                        return True
397
398                else:
399                        self._init_holiday_switch()
400                        self.waiting_window.hide()
401                        if self.import_result['status']:
402                                self.search_entry.set_text("")
403                                self.load_info()
404                                if self.read_conf['status']:
405                                        try:
406                                                self.core.bellBox.draw_bell(False)
407                                                self.manage_menubar(True)
408                                                if not self.loading_errors:
409                                                        self.manage_message(False,self.import_result['code'])
410                                                else:
411                                                        self.manage_message(True,13)   
412                                        except:
413                                                self.manage_menubar(False)
414                                                self.recovery=True
415                                                '''
416                                                self.backup=False
417                                                self.orig=self.import_result['data']+".zip"
418                                                self.init_threads()
419                                                self.recovery_bells_t.start()
420                                                self.waiting_label.set_text(self.get_msg(28))
421                                                GLib.timeout_add(100,self.pulsate_recovery_bells)
422                                                return False
423                                                '''     
424                                else:
425                                        self.manage_message(True,self.read_conf['code'])       
426                                        self.cont=0
427                                        return False
428
429                        else:
430                                #self.manage_message(True,self.import_result['code'])   
431                                self.cont=0
432                                self.recovery=True
433                                #return False
434
435                        if self.recovery:
436                                self.backup=False
437                                self.recovery=False
438                                self.orig=self.import_result['data']+".zip"
439                                self.manage_message(True,self.import_result['code'])   
440                                self.init_threads()
441                                self.recovery_bells_t.start()
442                                self.waiting_window.show()
443                                self.waiting_label.set_text(self.get_msg(28))
444                                GLib.timeout_add(100,self.pulsate_recovery_bells)
445                                return False           
446
447        #def pulsate_import_bells
448
449        def import_bells(self):
450
451                self.import_result=self.core.bellmanager.import_bells_conf(self.orig,self.backup)
452
453        #def import_bells               
454
455
456        def pulsate_recovery_bells(self):
457
458                if self.recovery_bells_t.is_alive():
459                        self.waiting_pbar.pulse()
460                        return True
461
462                else:
463                        self.waiting_window.hide()
464                        self.load_info()
465                        self.manage_menubar(True)
466                        try:
467                                self.core.bellBox.draw_bell(False)
468                                if not self.loading_errors:
469                                        self.manage_message(True,9)
470                                else:
471                                        self.manage_message(True,9)     
472                        except:
473                                self.manage_message(True,self.recovery_result['code']) 
474                                return False   
475
476                return False
477       
478        #def pulsate_recovery_bells             
479       
480       
481        def recovery_bells(self):
482
483                self.recovery_result=self.core.bellmanager.recovery_bells_conf(self.orig,self.backup)           
484
485        #def recovery_bells
486
487        def search_entry_changed(self,widget):
488
489                self.core.bellBox.init_bell_list() 
490                self.load_info()
491                self.search_list=self.bells_info.copy()
492
493                search=self.search_entry.get_text().lower()
494                if search=="":
495                        self.core.bellBox.draw_bell(False)
496                else:
497                        for item in self.bells_info:
498                                time=self.core.bellmanager.format_time(item)
499                                hour=str(time[0])
500                                minute=str(time[1])
501                                cron=str(time[2])
502                                name=self.bells_info[item]["name"].lower()
503                                days=[]
504                                if self.bells_info[item]["weekdays"]["0"]:
505                                        days.append(_("Monday"))
506                                        days.append(_("M"))
507                                        days.append(_("Mon"))
508                                if self.bells_info[item]["weekdays"]["1"]:
509                                        days.append(_("Tuesday"))
510                                        days.append(_("T"))
511                                        days.append(_("Tue"))
512                                if self.bells_info[item]["weekdays"]["2"]:
513                                        days.append(_("Wednesday"))     
514                                        days.append(_("W"))
515                                        days.append(_("Wed"))
516                                if self.bells_info[item]["weekdays"]["3"]:
517                                        days.append(_("Thursday"))
518                                        days.append(_("R"))
519                                        days.append(_("Thu"))
520                                if self.bells_info[item]["weekdays"]["4"]:
521                                        days.append(_("Friday"))
522                                        days.append(_("F"))     
523                                        days.append(_("Fri"))
524
525                               
526                                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]:
527                                        pass
528                                else:
529                                        self.search_list.pop(item)
530
531                        if len(self.search_list)>0:
532                                        self.search_order=self.core.bellmanager.get_order_bell(self.search_list)               
533                                        self.core.bellBox.draw_bell(True)
534                       
535        #def search_entry_changed                               
536
537        def manage_menubar(self,sensitive,hide=None):
538       
539                if hide:
540                        self.add_button.hide()
541                        self.import_button.hide()
542                        self.export_button.hide()
543                        self.search_entry.hide()
544                        self.manage_bells_button.hide()
545                        self.manage_holiday_button.hide()
546                else:
547                        self.add_button.show()
548                        self.import_button.show()
549                        self.export_button.show()
550                        self.search_entry.show()
551                        self.manage_bells_button.show()
552                        self.manage_holiday_button.show()
553
554               
555                self.add_button.set_sensitive(sensitive)
556                self.import_button.set_sensitive(sensitive)
557                self.export_button.set_sensitive(sensitive)
558                self.search_entry.set_sensitive(sensitive)
559                self.manage_bells_button.set_sensitive(sensitive)
560                self.manage_holiday_button.set_sensitive(sensitive)
561                self.enable_holiday_switch.set_sensitive(sensitive)
562               
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.manage_menubar(False)
755                        self.msg_label.set_text("")
756                        self.core.bellBox.manage_bells_buttons(False)
757                        self.waiting_label.set_text(self.get_msg(32))                   
758                        self.waiting_window.show_all()
759                        self.init_threads()
760                        self.enable_holiday_control_t.start()
761                        GLib.timeout_add(100,self.pulsate_enable_holiday_control)
762
763
764        #def enable_holiday_switch_clicked
765
766        def pulsate_enable_holiday_control(self):
767
768
769                if self.enable_holiday_control_t.is_alive():
770                        self.waiting_pbar.pulse()
771                        return True
772
773                else:
774                        self.waiting_window.hide()
775                        self.manage_menubar(True)
776                        self.core.bellBox.manage_bells_buttons(True)
777                        if self.enable_holiday_result['status']:
778                                self.manage_message(False,self.enable_holiday_result['code'])
779                        else:
780                                self.manage_message(True,self.enable_holiday_result['code'])
781
782                return False
783
784        #def pulsate_enable_holiday_control     
785
786        def enable_holiday_control(self):
787
788                self.enable_holiday_result=self.core.bellmanager.enable_holiday_control(self.holiday_action)           
789       
790        #def enable_holiday_control
791
792        def help_clicked(self,widget):
793
794                lang=os.environ["LANG"]
795
796                if 'ca_ES' in lang:
797                        cmd='xdg-open http://wiki.lliurex.net/tiki-index.php?page=Bell+Scheduler_va'
798                else:
799                        cmd='xdg-open http://wiki.lliurex.net/tiki-index.php?page=Bell%2BScheduler'
800
801                os.system(cmd)
802       
803        #def help_clicked
804                               
805        def manage_bells_button_clicked(self,widget):
806
807                self.popover.show_all()
808
809        #def manage_bells_button_clicked       
810
811        def activate_all_bells(self,widget,event=None):
812               
813                self.activation_action="activate"
814                bells_disabled=0
815                msg_code=44
816                if len(self.bells_info)>0:
817                        for item in self.bells_info:
818                                if not self.bells_info[item]["active"]:
819                                        bells_disabled+=1
820                        if bells_disabled>0:           
821                                self.change_bell_status(msg_code)
822
823        #def activate_all_bells
824
825        def deactivate_all_bells(self,widget,param):
826       
827                self.activation_action="deactivate"
828                bells_activated=0
829                msg_code=45
830                if len(self.bells_info)>0:
831                        for item in self.bells_info:
832                                if self.bells_info[item]["active"]:
833                                        bells_activated+=1
834                        if bells_activated>0:           
835                                self.change_bell_status(msg_code)
836
837        #def deactivate_all_bells               
838
839        def change_bell_status(self,code):
840
841                self.popover.hide()
842                self.manage_menubar(False)
843                self.core.bellBox.manage_bells_buttons(False)
844                self.msg_label.set_text("")
845                self.waiting_label.set_text(self.get_msg(code))                 
846                self.waiting_window.show_all()
847                self.init_threads()
848                self.change_activation_status_t.start()
849                GLib.timeout_add(100,self.pulsate_change_activation_status)
850
851        #def change_bell_status
852
853
854        def pulsate_change_activation_status(self):
855
856
857                if self.change_activation_status_t.is_alive():
858                        self.waiting_pbar.pulse()
859                        return True
860
861                else:
862                        self.waiting_window.hide()
863                        self.manage_menubar(True)
864                        self.core.bellBox.manage_bells_buttons(True)
865                        self.search_entry.set_text("")
866                        self.load_info()
867                        self.core.bellBox.draw_bell(False)
868                        if self.change_activation_status_result['status']:
869                                self.manage_message(False,self.change_activation_status_result['code'])
870                        else:
871                                self.manage_message(True,self.change_activation_status_result['code'])
872
873                return False
874
875        #def pulsate_change_activation_status   
876
877
878        def change_activation_status(self):
879
880                self.change_activation_status_result=self.core.bellmanager.change_activation_status(self.activation_action)
881
882        #def change_activation_status
883
884        def remove_all_bells(self,widget,event=None):
885
886               
887                if len(self.bells_info)>0:
888                        self.popover.hide()
889                        dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, "BELL SCHEDULER")
890                        dialog.format_secondary_text(_("Do you want delete all bell?"))
891                        response=dialog.run()
892                        dialog.destroy()
893               
894                        if response==Gtk.ResponseType.YES:     
895                                self.manage_menubar(False)
896                                self.msg_label.set_text("")
897                                self.core.bellBox.manage_bells_buttons(False)
898                                self.waiting_label.set_text(self.get_msg(50))                   
899                                self.waiting_window.show_all()
900                                self.init_threads()
901                                self.remove_all_bells_t.start()
902                                GLib.timeout_add(100,self.pulsate_remove_all_process)
903
904        #def remove_all_bells                   
905
906        def pulsate_remove_all_process(self):
907
908                if self.remove_all_bells_t.is_alive():
909                        self.waiting_pbar.pulse()
910                        return True
911
912                else:
913                        self.waiting_window.hide()
914                        self.manage_menubar(True)
915                        self.search_entry.set_text("")
916                        self.load_info()
917                        self.core.bellBox.draw_bell(False)
918                        if self.remove_all_process_result['status']:
919                                self.manage_message(False,self.remove_all_process_result['code'])
920                        else:
921                                self.manage_message(True,self.remove_all_process_result['code'])
922
923                return False   
924
925        #def pulsate_remove_all_process                 
926
927
928        def remove_all_process(self):
929               
930                self.remove_all_process_result=self.core.bellmanager.remove_all_bells()
931
932        #def remove_all_process
933
934        def mouse_over_popover(self,widget,event=None):
935
936                widget.set_name("POPOVER_ON")
937
938        #def mouser_over_popover       
939
940        def mouse_exit_popover(self,widget,event=None):
941
942                widget.set_name("POPOVER_OFF")
943
944        #def mouse_exit_popover
945
946        def quit(self,widget):
947
948                Gtk.main_quit() 
949
950        #def quit       
951
952        def start_gui(self):
953               
954                GObject.threads_init()
955                Gtk.main()
956               
957        #def start_gui
958
959
960       
961#class MainWindow
962
963from . import Core
Note: See TracBrowser for help on using the repository browser.