Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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