def _inicia_cerca(self): self.set_response_sensitive(self.RESPONSE_ATURA, True) self.set_response_sensitive(self.RESPONSE_CERCA, False) self._min_assig.set_sensitive(False) self._max_solap.set_sensitive(False) self._cerca = Cerca(self._grups, self._min_assig.get_value(), self._max_solap.get_value()) self._n_horaris = 0 self._combinacio = 0 self._n_combinacions = self._cerca.n_combinacions() self._atura = False gobject.timeout_add(100, self._actualitza_barra_cb) self._llista.actualitza(horaris=self._cerca_horaris()) self.set_response_sensitive(self.RESPONSE_ATURA, False) self.set_response_sensitive(self.RESPONSE_CERCA, True) self._min_assig.set_sensitive(True) self._max_solap.set_sensitive(True)
class FinestraCerca(gtk.Dialog): RESPONSE_CERCA = 1 RESPONSE_ATURA = 2 def __init__(self, finestra, llista): self._finestra = finestra self._grups = () self._assigs = () self._llista = llista flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT buttons = (gtk.STOCK_FIND, self.RESPONSE_CERCA, gtk.STOCK_STOP, self.RESPONSE_ATURA, gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) gtk.Dialog.__init__(self, "Cerca", finestra, flags, buttons) self.set_icon_name(gtk.STOCK_FIND) self.set_response_sensitive(self.RESPONSE_ATURA, False) self.connect('response', self._accio) self.connect("delete_event", lambda widget, event: True) self.set_has_separator(False) self.set_border_width(6) self.vbox.set_spacing(12) self._prepara_parametres() self._prepara_progres() self.set_resizable(False) self.vbox.show_all() def actualitza_grups(self, widget, grups): self._grups = tuple(grups) self._assigs = tuple(set(assig for assig, grup in grups)) self._min_assig.set_range(2, len(self._assigs)) self._min_assig.set_value(len(self._assigs)) def mostra(self, widget=None): if len(self._assigs) < 2: d = gtk.MessageDialog(self._finestra, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, "Heu de seleccionar grups de dues o més assignatures!") d.run() d.destroy() return self.show() def _prepara_parametres(self): l = gtk.Label(u"<big>Paràmetres de cerca</big>") l.set_use_markup(True) l.set_alignment(0, 0) self.vbox.pack_start(l, expand=False) table = gtk.Table(2, 2) table.set_row_spacings(12) table.set_col_spacings(12) self._min_assig = gtk.SpinButton() self._min_assig.set_increments(1, 1) self._min_assig.set_alignment(1.0) table.attach(self._min_assig, 1, 2, 0, 1, 0, 0) label = gtk.Label("Mínim nombre d'_assignatures:") label.set_use_underline(True) label.set_alignment(0, 0.5) label.set_mnemonic_widget(self._min_assig) table.attach(label, 0, 1, 0, 1, gtk.FILL, 0) self._max_solap = gtk.SpinButton() self._max_solap.set_range(0, 60) self._max_solap.set_increments(1, 1) self._max_solap.set_value(0) self._max_solap.set_alignment(1.0) table.attach(self._max_solap, 1, 2, 1, 2, 0, 0) label = gtk.Label("Màxim nombre de _solapaments:") label.set_use_underline(True) label.set_alignment(0, 0.5) label.set_mnemonic_widget(self._max_solap) table.attach(label, 0, 1, 1, 2, gtk.FILL, 0) self.vbox.pack_start(table) def _prepara_progres(self): self._progres = gtk.ProgressBar() self._progres.set_text("Cap cerca realitzada") self.vbox.pack_start(self._progres, expand=False) def _accio(self, widget, response_id): if response_id == self.RESPONSE_CERCA: self._inicia_cerca() if response_id == self.RESPONSE_ATURA: self._atura = True if response_id in (gtk.RESPONSE_CLOSE, gtk.RESPONSE_DELETE_EVENT): self._atura = True self.hide() def _inicia_cerca(self): self.set_response_sensitive(self.RESPONSE_ATURA, True) self.set_response_sensitive(self.RESPONSE_CERCA, False) self._min_assig.set_sensitive(False) self._max_solap.set_sensitive(False) self._cerca = Cerca(self._grups, self._min_assig.get_value(), self._max_solap.get_value()) self._n_horaris = 0 self._combinacio = 0 self._n_combinacions = self._cerca.n_combinacions() self._atura = False gobject.timeout_add(100, self._actualitza_barra_cb) self._llista.actualitza(horaris=self._cerca_horaris()) self.set_response_sensitive(self.RESPONSE_ATURA, False) self.set_response_sensitive(self.RESPONSE_CERCA, True) self._min_assig.set_sensitive(True) self._max_solap.set_sensitive(True) def _cerca_horaris(self): for h, self._combinacio in self._cerca.horaris(): self._n_horaris += 1 if gtk.events_pending(): gtk.main_iteration(False) yield h if self._atura: break else: self._atura = True def _actualitza_barra_cb(self): self._progres.set_text(u"%d horaris trobats" % self._n_horaris) if not self._atura: f = float(self._combinacio) / self._n_combinacions self._progres.set_fraction(f) return True else: self._progres.set_fraction(0.0) return False
class FinestraCerca(Gtk.Dialog): RESPONSE_CERCA = 1 RESPONSE_ATURA = 2 def __init__(self, finestra, llista): self._finestra = finestra self._grups = () self._assigs = () self._llista = llista buttons = (Gtk.STOCK_FIND, self.RESPONSE_CERCA, Gtk.STOCK_STOP, self.RESPONSE_ATURA, Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE) Gtk.Dialog.__init__(self, title="Cerca", transient_for=finestra, modal=True, destroy_with_parent=True) self.add_buttons(*buttons) self.set_icon_name(Gtk.STOCK_FIND) self.set_response_sensitive(self.RESPONSE_ATURA, False) self.connect('response', self._accio) self.connect("delete_event", lambda widget, event: True) self.set_border_width(6) self.vbox.set_spacing(12) self._prepara_parametres() self._prepara_progres() self.set_resizable(False) self.vbox.show_all() def actualitza_grups(self, widget, grups): self._grups = tuple(grups) self._assigs = tuple(set(assig for assig, grup in grups)) self._min_assig.set_range(2, len(self._assigs)) self._min_assig.set_value(len(self._assigs)) def mostra(self, widget=None): if len(self._assigs) < 2: d = Gtk.MessageDialog(transient_for=self._finestra, modal=True, message_type=Gtk.MessageType.WARNING, buttons=Gtk.ButtonsType.OK, text="Heu de seleccionar grups de dues o més assignatures!") d.run() d.destroy() return self.show() def _prepara_parametres(self): l = Gtk.Label(label="<big>Paràmetres de cerca</big>") l.set_use_markup(True) l.set_alignment(0, 0) self.vbox.pack_start(l, expand=False, fill=True, padding=0) table = Gtk.Table(n_rows=2, n_columns=2) table.set_row_spacings(12) table.set_col_spacings(12) self._min_assig = Gtk.SpinButton() self._min_assig.set_increments(1, 1) self._min_assig.set_alignment(1.0) table.attach(self._min_assig, 1, 2, 0, 1, 0, 0) label = Gtk.Label(label="Mínim nombre d'_assignatures:") label.set_use_underline(True) label.set_alignment(0, 0.5) label.set_mnemonic_widget(self._min_assig) table.attach(label, 0, 1, 0, 1, Gtk.AttachOptions.FILL, 0) self._max_solap = Gtk.SpinButton() self._max_solap.set_range(0, 60) self._max_solap.set_increments(1, 1) self._max_solap.set_value(0) self._max_solap.set_alignment(1.0) table.attach(self._max_solap, 1, 2, 1, 2, 0, 0) label = Gtk.Label(label="Màxim nombre de _solapaments:") label.set_use_underline(True) label.set_alignment(0, 0.5) label.set_mnemonic_widget(self._max_solap) table.attach(label, 0, 1, 1, 2, Gtk.AttachOptions.FILL, 0) self.vbox.pack_start(table, expand=True, fill=True, padding=0) def _prepara_progres(self): self._progres = Gtk.ProgressBar() self._progres.set_text("Cap cerca realitzada") self.vbox.pack_start(self._progres, expand=False, fill=True, padding=0) def _accio(self, widget, response_id): if response_id == self.RESPONSE_CERCA: self._inicia_cerca() if response_id == self.RESPONSE_ATURA: self._atura = True if response_id in (Gtk.ResponseType.CLOSE, Gtk.ResponseType.DELETE_EVENT): self._atura = True self.hide() def _inicia_cerca(self): self.set_response_sensitive(self.RESPONSE_ATURA, True) self.set_response_sensitive(self.RESPONSE_CERCA, False) self._min_assig.set_sensitive(False) self._max_solap.set_sensitive(False) self._cerca = Cerca(self._grups, self._min_assig.get_value(), self._max_solap.get_value()) self._n_horaris = 0 self._combinacio = 0 self._n_combinacions = self._cerca.n_combinacions() self._atura = False GLib.timeout_add(100, self._actualitza_barra_cb) self._llista.actualitza(horaris=self._cerca_horaris()) self.set_response_sensitive(self.RESPONSE_ATURA, False) self.set_response_sensitive(self.RESPONSE_CERCA, True) self._min_assig.set_sensitive(True) self._max_solap.set_sensitive(True) def _cerca_horaris(self): for h, self._combinacio in self._cerca.horaris(): self._n_horaris += 1 if Gtk.events_pending(): Gtk.main_iteration() yield h if self._atura: break else: self._atura = True def _actualitza_barra_cb(self): self._progres.set_text("%d horaris trobats" % self._n_horaris) if not self._atura: f = float(self._combinacio) / self._n_combinacions self._progres.set_fraction(f) return True else: self._progres.set_fraction(0.0) return False