-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hello, in reply to the discussion: http://lists.alioth.debian.org/pipermail/reportbug-maint/2008-August/000338.html I've been working this day on a GTK+ UI for reportbug. A first work is attached. I've completely rewritten the code of the previous gnome-reportbug to use GtkAssistant and using a more OO approach. To let gnome2 be imported correctly by reportbug you should apply this patch: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=497024 Any hints? Can I continue with the work?
Best regards, - -- http://syx.googlecode.com - Smalltalk YX http://lethalman.blogspot.com - Thoughts about computer technologies http://www.ammazzatecitutti.org - Ammazzateci tutti -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAki4U3EACgkQw9Qj+8Kak3F0BQCfQyYRgOGSCkZZyhKEReifmpPo 4dsAn0T6oWhbps5x10tbobn++okbdCK0 =kukM -----END PGP SIGNATURE-----
import gtk import sys from gtk import gdk import gobject gdk.threads_init () from Queue import Queue from reportbug_ui_text import ewrite import threading ISATTY = True log_message = ewrite display_failure = ewrite # Application class ReportbugApplication (threading.Thread): def __init__ (self): threading.Thread.__init__ (self) self.queue = Queue () def run (self): gtk.main () def get_last_value (self): return self.queue.get () def put_next_value (self): self.queue.put (self.next_value) def set_next_value (self, value): self.next_value = value @staticmethod def create_idle_callback (func): def callback (*args, **kwargs): func () return False return callback def run_once_in_main_thread (self, func): gobject.idle_add (self.create_idle_callback (func)) application = ReportbugApplication () # Assistant class Page (object): next_page_num = 0 page_type = gtk.ASSISTANT_PAGE_CONTENT default_complete = False def __init__ (self, assistant): self.assistant = assistant self.widget = self.create_widget () self.widget.page = self self.page_num = Page.next_page_num Page.next_page_num += 1 self.assistant.insert_page (self.widget, self.page_num) self.set_page_complete (self.default_complete) self.set_page_type (self.page_type) def execute_operation (self, *args, **kwargs): self.execute (*args, **kwargs) self.switch () def set_page_complete (self, complete): self.assistant.set_page_complete (self.widget, complete) def set_page_type (self, type): self.assistant.set_page_type (self.widget, type) def switch (self): self.widget.show_all () self.assistant.set_next_page (self) def is_valid (self, value): return bool (value) def validate (self, *args, **kwargs): value = self.get_value () if self.is_valid (value): self.assistant.app.set_next_value (value) self.set_page_complete (True) else: self.set_page_complete (False) class IntroPage (Page): page_type = gtk.ASSISTANT_PAGE_INTRO default_complete = True def create_widget (self): return gtk.Label ("ReportBUG") class GetStringPage (Page): def create_widget (self): vbox = gtk.VBox (spacing=6) self.label = gtk.Label () self.entry = gtk.Entry () self.entry.connect ('focus-out-event', self.validate) vbox.pack_start (self.label) vbox.pack_start (self.entry) return vbox def get_value (self): return self.entry.get_text () def execute (self, prompt, options=None, title=None, force_prompt=False, default='', ui=None): self.label.set_text (prompt) self.assistant.set_title (title) class MenuPage (Page): def create_widget (self): vbox = gtk.VBox () self.label = gtk.Label () vbox.pack_start (self.label) self.view = gtk.TreeView () scrolled = gtk.ScrolledWindow () scrolled.add (self.view) vbox.pack_start (scrolled) self.view.append_column (gtk.TreeViewColumn ('Option', gtk.CellRendererText (), text=0)) self.view.append_column (gtk.TreeViewColumn ('Description', gtk.CellRendererText (), text=1)) return vbox def execute (self, par, options, prompt, default=None, title=None, any_ok=False, order=None, extras=None, multiple=False, empty_ok=False, ui=None, oklabel='Ok', cancellabel='Cancel', quitlabel=None): self.label.set_text (par) self.model = gtk.ListStore (str, str) self.view.set_model (self.model) for option in options: self.model.append (option) self.assistant.set_title (title) class ProgressPage (Page): page_type = gtk.ASSISTANT_PAGE_PROGRESS default_complete = False def create_widget (self): return gtk.Label ("This operation may take a while") class ReportbugAssistant (gtk.Assistant): def __init__ (self, app): gtk.Assistant.__init__ (self) self.app = app self.set_forward_page_func (self.forward) self.connect_signals () self.setup_pages () self.showing_page = None self.requested_page = None def connect_signals (self): self.connect ('cancel', self.close) self.connect ('prepare', self.on_prepare) self.connect ('delete-event', self.close) def on_prepare (self, assistant, widget): if self.showing_page and self.showing_page == self.requested_page and self.get_current_page () > self.showing_page.page_num: self.app.put_next_value () self.showing_page = widget.page def close (self, *args): sys.exit (0) def forward (self, page_num): return page_num + 1 def set_title (self, title): if title: gtk.Assistant.set_title (self, "Reportbug: %s" % title) else: gtk.Assistant.set_title (self, "Reportbug") def set_next_page (self, page): self.requested_page = page if self.get_current_page () == Page.next_page_num: self.set_current_page (page.page_num) def setup_pages (self): self.showing_page = IntroPage(self) ProgressPage (self) Page.next_page_num = 1 assistant = ReportbugAssistant (application) assistant.show_all () # Dialogs class YesNoDialog (gtk.MessageDialog): def __init__ (self, application): self.app = application gtk.MessageDialog.__init__ (self, assistant, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO) self.connect ('response', self.on_response) def on_response (self, dialog, res): self.app.set_next_value (res == gtk.RESPONSE_YES) self.app.put_next_value () self.destroy () def execute_operation (self, msg, yeshelp, nohelp, default=True, nowrap=False, ui=None): self.set_markup (msg+"?") self.show_all () pages = {'get_string': GetStringPage, 'menu': MenuPage } dialogs = {'yes_no': YesNoDialog} # Begin the circle application.start () def create_forwarder (parent, klass): def func (*args, **kwargs): op = klass (parent) application.run_once_in_main_thread (lambda: op.execute_operation (*args, **kwargs)) return application.get_last_value () return func def forward_operations (parent, operations): for operation, klass in operations.iteritems (): globals()[operation] = create_forwarder (parent, klass) forward_operations (assistant, pages) forward_operations (application, dialogs)
_______________________________________________ Reportbug-maint mailing list Reportbug-maint@lists.alioth.debian.org http://lists.alioth.debian.org/mailman/listinfo/reportbug-maint