[Reportbug-commits] r647 - in trunk/reportbug/ui (gtk2_ui.py)

morph-guest at users.alioth.debian.org morph-guest at users.alioth.debian.org
Sat Sep 6 09:53:59 UTC 2008


    Date: Saturday, September 6, 2008 @ 09:53:58
  Author: morph-guest
Revision: 647

applied Luca's patches for GTK+ ui

Modified:
  trunk/reportbug/ui/gtk2_ui.py

Modified: trunk/reportbug/ui/gtk2_ui.py
===================================================================
--- trunk/reportbug/ui/gtk2_ui.py	2008-09-05 22:52:52 UTC (rev 646)
+++ trunk/reportbug/ui/gtk2_ui.py	2008-09-06 09:53:58 UTC (rev 647)
@@ -22,9 +22,12 @@
 #
 # Version ##VERSION##; see changelog for revision history
 
-import gtk
-from gtk import gdk
-import gobject
+try:
+    import gtk
+    from gtk import gdk
+    import gobject
+except ImportError:
+    raise UINotImportable, 'Please install the python-gtk2 package to use this interface.'
 
 gdk.threads_init ()
 
@@ -41,6 +44,8 @@
 
 ISATTY = True
 
+global application, assistant
+
 # Utilities
 
 def highlight (s):
@@ -159,9 +164,6 @@
     def on_response (self, dialog, res):
         sys.exit (1)
 
-oldhook = sys.excepthook
-sys.excepthook = ExceptionDialog.create_excepthook (oldhook)
-
 # BTS
 
 class Bug (object):
@@ -373,6 +375,7 @@
         self.notebook = gtk.Notebook ()
         self.vbox.pack_start (self.notebook)
         self.connect ('response', self.on_response)
+        self.set_size_request (800, 600)
 
     def on_response (self, *args):
         self.destroy ()
@@ -413,8 +416,6 @@
     def run_once_in_main_thread (self, func, *args, **kwargs):
         gobject.idle_add (self.create_idle_callback (func, *args, **kwargs))
 
-application = ReportbugApplication ()
-
 # Connection with reportbug
 
 # Syncronize "pipe" with reportbug
@@ -454,6 +455,7 @@
     def execute_operation (self, *args, **kwargs):
         self.switch_in ()
         self.connect_signals ()
+        self.empty_ok = kwargs.pop ('empty_ok', False)
         self.execute (*args, **kwargs)
         self.assistant.show ()
 
@@ -480,12 +482,19 @@
         self.assistant.set_next_page (self)
         self.set_page_title ("Reportbug")
 
+    # Setup keyboard focus in the page
+    def setup_focus (self):
+        self.widget.grab_focus ()
+
     # The user forwarded the assistant to see the next page
     def switch_out (self):
         pass
 
     def is_valid (self, value):
-        return bool (value)
+        if self.empty_ok:
+            return True
+        else:
+            return bool (value)
 
     def validate (self, *args, **kwargs):
         value = self.get_value ()
@@ -500,11 +509,26 @@
     default_complete = True
 
     def create_widget (self):
-        vbox = gtk.VBox ()
-        vbox.pack_start (gtk.Label ("ReportBUG"))
+        vbox = gtk.VBox (spacing=24)
+
+        label = gtk.Label ("""
+<b>Reportbug</b> is a tool designed to make the reporting of bugs in Debian and derived distributions relatively painless.
+
+This wizard will guide you through the bug reporting process step by step.""")
+        label.set_use_markup (True)
+        label.set_line_wrap (True)
+        label.set_justify (gtk.JUSTIFY_FILL)
+        vbox.pack_start (label, expand=False)
+
+        link = gtk.LinkButton ("http://alioth.debian.org/projects/reportbug",
+                               "Homepage of reportbug project")
+        vbox.pack_start (link, expand=False)
         return vbox
 
 class GetStringPage (Page):
+    def setup_focus (self):
+        self.entry.grab_focus ()
+
     def create_widget (self):
         vbox = gtk.VBox (spacing=12)
         self.label = gtk.Label ()
@@ -521,30 +545,46 @@
         return self.entry.get_text ()
 
     def execute (self, prompt, options=None, force_prompt=False, default=''):
+        if 'blank OK' in prompt:
+            self.empty_ok = True
+        else:
+            self.empty_ok = False
         self.label.set_text (prompt)
         self.entry.set_text (default)
 
+        if options:
+            options.sort ()
+            completion = gtk.EntryCompletion ()
+            model = gtk.ListStore (str)
+            for option in options:
+                model.append ([option])
+            completion.set_model (model)
+            completion.set_inline_selection (True)
+            completion.set_text_column (0)
+            self.entry.set_completion (completion)
+        else:
+            self.completion = None
+
+        self.validate ()
+
 class GetMultilinePage (Page):
+    def setup_focus (self):
+        self.view.grab_focus ()
+
     def create_widget (self):
         vbox = gtk.VBox (spacing=12)
         self.label = gtk.Label ()
         vbox.pack_start (self.label, expand=False)
 
-        view = gtk.TextView ()
+        self.view = gtk.TextView ()
         self.buffer = view.get_buffer ()
-        scrolled = create_scrollable (view)
+        scrolled = create_scrollable (self.view)
         vbox.pack_start (scrolled)
         return vbox
 
     def connect_signals (self):
         self.buffer.connect ('changed', self.validate)
 
-    def is_valid (self, value):
-        if self.empty_ok:
-            return True
-        else:
-            return bool (value)
-
     def get_value (self):
         text = self.buffer.get_text (self.buffer.get_start_iter (), self.buffer.get_end_iter ())
         lines = text.split ('\n')
@@ -553,9 +593,8 @@
             del lines[-1]
         return text.split ('\n')
 
-    def execute (self, prompt, empty_ok=True):
+    def execute (self, prompt):
         # The result must be iterable for reportbug even if it's empty and not modified
-        self.empty_ok = empty_ok
         self.label.set_text (prompt)
         self.buffer.set_text ("")
         self.buffer.emit ('changed')
@@ -567,6 +606,9 @@
         Page.__init__ (self, *args, **kwargs)
         self.selection = self.view.get_selection()
 
+    def setup_focus (self):
+        self.view.grab_focus ()
+
     def connect_signals (self):
         self.selection.connect ('changed', self.validate)
 
@@ -618,12 +660,6 @@
             values.append (row[self.value_column])
         return values
 
-    def is_valid (self, value):
-        if self.empty_ok:
-            return True
-        else:
-            return bool (value)
-
     def on_add (self, button):
         dialog = InputStringDialog ("Add a new item to the list")
         dialog.show_all ()
@@ -643,8 +679,7 @@
         for iter in iters:
             self.model.remove (iter)
 
-    def execute (self, prompt, empty_ok=True):
-        self.empty_ok = empty_ok
+    def execute (self, prompt):
         self.label.set_text (prompt)
 
         self.model = gtk.ListStore (str)
@@ -670,16 +705,8 @@
         vbox.show_all ()
         return vbox
 
-    def is_valid (self, value):
-        if self.empty_ok:
-            return True
-        else:
-            return bool (value)
-
     def execute (self, par, options, prompt, default=None, any_ok=False,
-                 order=None, extras=None, multiple=False, empty_ok=False):
-        self.empty_ok = empty_ok
-
+                 order=None, extras=None, multiple=False):
         self.label.set_text (par)
 
         self.model = gtk.ListStore (str, str)
@@ -768,6 +795,9 @@
 
         raise SyncReturn (None)
 
+    def setup_focus (self):
+        self.entry.grab_focus ()
+
     def create_widget (self):
         vbox = gtk.VBox (spacing=6)
         self.label = gtk.Label ("List of bugs. Select a bug to retrieve and submit more information.")
@@ -1055,6 +1085,7 @@
         self.showing_page = None
         self.requested_page = None
         self.progress_page = None
+        self.set_size_request (600, 400)
         self.set_forward_page_func (self.forward)
         self.connect_signals ()
         self.setup_pages ()
@@ -1079,6 +1110,8 @@
         if self.showing_page == self.progress_page:
             self.progress_page.reset_label ()
 
+        self.showing_page.setup_focus ()
+
     def close (self, *args):
         sys.exit (0)
         
@@ -1107,9 +1140,7 @@
         self.set_current_page (0)
         Page.next_page_num = 1
 
-assistant = ReportbugAssistant (application)
 
-
 # Dialogs
 
 
@@ -1164,7 +1195,8 @@
         self.set_title (ask_free (title))
         self.show_all ()
    
-log_message = assistant.set_progress_label
+def log_message (*args, **kwargs):
+    return assistant.set_progress_label (*args, **kwargs)
 
 def select_multiple (*args, **kwargs):
     kwargs['multiple'] = True
@@ -1191,10 +1223,6 @@
             'get_filename': GetFilenameDialog,
             'display_failure': DisplayFailureDialog, }
 
-# Begin the circle
-
-application.start ()
-
 def create_forwarder (parent, klass):
     def func (*args, **kwargs):
         op = klass (parent)
@@ -1210,16 +1238,31 @@
     for operation, klass in operations.iteritems ():
         globals()[operation] = create_forwarder (parent, klass)
 
-forward_operations (assistant, pages)
-forward_operations (application, dialogs)
+def initialize ():
+    global application, assistant
+    # Exception hook
+    oldhook = sys.excepthook
+    sys.excepthook = ExceptionDialog.create_excepthook (oldhook)
 
+    # GTK settings
+    gtk.link_button_set_uri_hook (lambda button, uri: launch_browser (uri))
+
+    application = ReportbugApplication ()
+    assistant = ReportbugAssistant (application)
+
+    # Forwarders
+    forward_operations (assistant, pages)
+    forward_operations (application, dialogs)
+
+    application.start ()
+
 def test ():
     # Write some tests here
+    print get_string ("test")
     page = HandleBTSQueryPage (assistant)
     application.run_once_in_main_thread (page.execute_operation, [('asd', (Bug ('#123 [asd] [we] we we Reported by: asd;' ), Bug ('#123 [asd] [we] we we Reported by: asd;')))], 'asd')
     return application.get_last_value ()
 
 if __name__ == '__main__':
+    initialize ()
     test ()
-
-




More information about the Reportbug-commits mailing list