-----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

Reply via email to