[chirp_devel] [PATCH] Normalized dialog box affirmative buttons to follow gnome human interface guidelines and added alternative button order for other platforms. Fixes #8271

Kosta A.
Wed Sep 23 02:42:39 PDT 2020


# HG changeset patch
# User Kosta A. <ve7kcy at gmail.com>
# Date 1600853926 25200
#      Wed Sep 23 02:38:46 2020 -0700
# Node ID 42b1e50fcf7a40ab591074fba9f3808805590f2f
# Parent  1a49ad2e84e305b56a3bdeb823266e1219f34e02
Normalized dialog box affirmative buttons to follow gnome human interface guidelines and added alternative button order for other platforms. Fixes #8271.

diff --git a/chirp/ui/bandplans.py b/chirp/ui/bandplans.py
--- a/chirp/ui/bandplans.py
+++ b/chirp/ui/bandplans.py
@@ -47,7 +47,7 @@
                 # Check for duplicates.
                 duplicates = [x for x in plan.BANDS if x == band]
                 if len(duplicates) > 1:
-                    LOG.warn("Bandplan %s has duplicates %s" %
+                    LOG.debug("Bandplan %s has duplicates %s" %
                              (name, duplicates))
                 # Add repeater inputs.
                 rpt_input = band.inverse()
diff --git a/chirp/ui/clone.py b/chirp/ui/clone.py
--- a/chirp/ui/clone.py
+++ b/chirp/ui/clone.py
@@ -44,13 +44,16 @@
 
 
 class CloneSettingsDialog(gtk.Dialog):
-    def __make_field(self, label, widget):
-        l = gtk.Label(label)
-        self.__table.attach(l, 0, 1, self.__row, self.__row+1)
-        self.__table.attach(widget, 1, 2, self.__row, self.__row+1)
+    def __make_field(self, text, widget):
+        label = gtk.Label(text)
+        label.set_alignment(1.0, 0.5)
+        self.__table.attach(label, 0, 1, self.__row, self.__row+1,
+            xpadding=6, ypadding=3)
+        self.__table.attach(widget, 1, 2, self.__row, self.__row+1,
+            xpadding=6, ypadding=3)
         self.__row += 1
 
-        l.show()
+        label.show()
         widget.show()
 
     def __make_port(self, port):
@@ -123,17 +126,15 @@
 
     def __make_ui(self, settings):
         self.__table = gtk.Table(3, 2)
-        self.__table.set_row_spacings(3)
-        self.__table.set_col_spacings(10)
         self.__row = 0
 
         self.__port = self.__make_port(settings and settings.port or None)
         self.__modl = self.__make_model()
         self.__vend = self.__make_vendor(self.__modl)
 
-        self.__make_field(_("Port"), self.__port)
-        self.__make_field(_("Vendor"), self.__vend)
-        self.__make_field(_("Model"), self.__modl)
+        self.__make_field(_("Serial Port:"), self.__port)
+        self.__make_field(_("Vendor:"), self.__vend)
+        self.__make_field(_("Model:"), self.__modl)
 
         if settings and settings.radio_class:
             common.combo_select(self.__vend, settings.radio_class.VENDOR)
@@ -144,21 +145,21 @@
             self.__modl.set_sensitive(False)
 
         self.__table.show()
-        self.vbox.pack_start(self.__table, 1, 1, 1)
+        self.vbox.pack_start(self.__table, False, True, 2)
 
     def __init__(self, settings=None, parent=None, title=_("Radio")):
         buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                    gtk.STOCK_OK, gtk.RESPONSE_OK)
         gtk.Dialog.__init__(self, title,
                             parent=parent,
+                            buttons=buttons,
                             flags=gtk.DIALOG_MODAL)
+        self.set_default_response(gtk.RESPONSE_OK)
+        self.set_alternative_button_order([gtk.RESPONSE_OK,
+                                           gtk.RESPONSE_CANCEL])
+
         self.__make_ui(settings)
-        self.__cancel_button = self.add_button(gtk.STOCK_CANCEL,
-                                               gtk.RESPONSE_CANCEL)
-        self.__okay_button = self.add_button(gtk.STOCK_OK,
-                                             gtk.RESPONSE_OK)
-        self.__okay_button.grab_default()
-        self.__okay_button.grab_focus()
+
 
     def run(self):
         r = gtk.Dialog.run(self)
diff --git a/chirp/ui/editorset.py b/chirp/ui/editorset.py
--- a/chirp/ui/editorset.py
+++ b/chirp/ui/editorset.py
@@ -276,7 +276,7 @@
         choices = [x.VARIANT for x in devices]
 
         d = inputdialog.ChoiceDialog(choices)
-        text = _("The {vendor} {model} has multiple independent sub-devices")
+        text = _("The {vendor} {model} has multiple independent sub-devices.")
         d.label.set_text(text.format(vendor=radio.VENDOR, model=radio.MODEL) +
                          os.linesep + _("Choose one to import from:"))
         r = d.run()
diff --git a/chirp/ui/importdialog.py b/chirp/ui/importdialog.py
--- a/chirp/ui/importdialog.py
+++ b/chirp/ui/importdialog.py
@@ -396,19 +396,19 @@
         all.connect("clicked", self.__select_all, True)
         all.set_size_request(50, 25)
         all.show()
-        hbox.pack_start(all, 0, 0, 0)
+        hbox.pack_start(all, False, False, 1)
 
         none = gtk.Button(_("None"))
         none.connect("clicked", self.__select_all, False)
         none.set_size_request(50, 25)
         none.show()
-        hbox.pack_start(none, 0, 0, 0)
+        hbox.pack_start(none, False, False, 1)
 
         inv = gtk.Button(_("Inverse"))
         inv.connect("clicked", self.__select_all, None)
         inv.set_size_request(50, 25)
         inv.show()
-        hbox.pack_start(inv, 0, 0, 0)
+        hbox.pack_start(inv, False, False, 1)
 
         frame = gtk.Frame(_("Select"))
         frame.show()
@@ -424,49 +424,49 @@
         incr.connect("clicked", self.__incrnew, 100)
         incr.set_size_request(50, 25)
         incr.show()
-        hbox.pack_start(incr, 0, 0, 0)
+        hbox.pack_start(incr, False, False, 1)
 
         incr = gtk.Button("+10")
         incr.connect("clicked", self.__incrnew, 10)
         incr.set_size_request(50, 25)
         incr.show()
-        hbox.pack_start(incr, 0, 0, 0)
+        hbox.pack_start(incr, False, False, 1)
 
         incr = gtk.Button("+1")
         incr.connect("clicked", self.__incrnew, 1)
         incr.set_size_request(50, 25)
         incr.show()
-        hbox.pack_start(incr, 0, 0, 0)
+        hbox.pack_start(incr, False, False, 1)
 
         decr = gtk.Button("-1")
         decr.connect("clicked", self.__incrnew, -1)
         decr.set_size_request(50, 25)
         decr.show()
-        hbox.pack_start(decr, 0, 0, 0)
+        hbox.pack_start(decr, False, False, 1)
 
         decr = gtk.Button("-10")
         decr.connect("clicked", self.__incrnew, -10)
         decr.set_size_request(50, 25)
         decr.show()
-        hbox.pack_start(decr, 0, 0, 0)
+        hbox.pack_start(decr, False, False, 1)
 
         decr = gtk.Button("-100")
         decr.connect("clicked", self.__incrnew, -100)
         decr.set_size_request(50, 25)
         decr.show()
-        hbox.pack_start(decr, 0, 0, 0)
+        hbox.pack_start(decr, False, False, 1)
 
         auto = gtk.Button(_("Auto"))
         auto.connect("clicked", self.__autonew)
         auto.set_size_request(50, 25)
         auto.show()
-        hbox.pack_start(auto, 0, 0, 0)
+        hbox.pack_start(auto, False, False, 1)
 
         revr = gtk.Button(_("Reverse"))
         revr.connect("clicked", self.__revrnew)
         revr.set_size_request(50, 25)
         revr.show()
-        hbox.pack_start(revr, 0, 0, 0)
+        hbox.pack_start(revr, False, False, 1)
 
         frame = gtk.Frame(_("Adjust New Location"))
         frame.show()
@@ -482,7 +482,7 @@
         confirm.connect("toggled", __set_confirm)
         confirm.show()
 
-        hbox.pack_start(confirm, 0, 0, 0)
+        hbox.pack_start(confirm, False, False, 1)
 
         frame = gtk.Frame(_("Options"))
         frame.add(hbox)
@@ -494,16 +494,16 @@
     def make_controls(self):
         hbox = gtk.HBox(False, 2)
 
-        hbox.pack_start(self.make_select(), 0, 0, 0)
-        hbox.pack_start(self.make_adjust(), 0, 0, 0)
+        hbox.pack_start(self.make_select(), False, False, 1)
+        hbox.pack_start(self.make_adjust(), False, False, 1)
         # hbox.pack_start(self.make_options(), 0, 0, 0)
         hbox.show()
 
         return hbox
 
     def build_ui(self):
-        self.vbox.pack_start(self.make_view(), 1, 1, 1)
-        self.vbox.pack_start(self.make_controls(), 0, 0, 0)
+        self.vbox.pack_start(self.make_view(), True, True, 1)
+        self.vbox.pack_start(self.make_controls(), False, False, 0)
 
     def record_use_of(self, number):
         lo, hi = self.dst_radio.get_features().memory_bounds
@@ -578,12 +578,17 @@
     ACTION = _("Import")
 
     def __init__(self, src_radio, dst_radio, parent=None):
+        buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                    gtk.STOCK_OK, gtk.RESPONSE_OK)
         gtk.Dialog.__init__(self,
-                            buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                     gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
                             title=self.TITLE,
+                            buttons=buttons,
                             parent=parent)
 
+        self.set_default_response(gtk.RESPONSE_OK)
+        self.set_alternative_button_order([gtk.RESPONSE_OK,
+                                           gtk.RESPONSE_CANCEL])
+
         self.col_import = 0
         self.col_nloc = 1
         self.col_oloc = 2
diff --git a/chirp/ui/inputdialog.py b/chirp/ui/inputdialog.py
--- a/chirp/ui/inputdialog.py
+++ b/chirp/ui/inputdialog.py
@@ -22,69 +22,91 @@
 LOG = logging.getLogger(__name__)
 
 
-class TextInputDialog(gtk.Dialog):
-    def respond_ok(self, _):
-        self.response(gtk.RESPONSE_OK)
+class ChoiceDialog(gtk.Dialog):
 
-    def __init__(self, **args):
-        buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                   gtk.STOCK_OK, gtk.RESPONSE_OK)
-        gtk.Dialog.__init__(self, buttons=buttons, **args)
+    def _make_ui(self, choices):
+        self._table = gtk.Table(1, 2)
 
         self.label = gtk.Label()
-        self.label.set_size_request(300, 100)
-        # pylint: disable-msg=E1101
-        self.vbox.pack_start(self.label, 1, 1, 0)
-
-        self.text = gtk.Entry()
-        self.text.connect("activate", self.respond_ok, None)
-        # pylint: disable-msg=E1101
-        self.vbox.pack_start(self.text, 1, 1, 0)
-
+        self.label.set_alignment(0.0, 0.5)
+        self.label.set_size_request(384, -1)
         self.label.show()
-        self.text.show()
-
-
-class ChoiceDialog(gtk.Dialog):
-    editable = False
-
-    def __init__(self, choices, **args):
-        buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                   gtk.STOCK_OK, gtk.RESPONSE_OK)
-        gtk.Dialog.__init__(self, buttons=buttons, **args)
-
-        self.label = gtk.Label()
-        self.label.set_size_request(300, 100)
-        # pylint: disable-msg=E1101
-        self.vbox.pack_start(self.label, 1, 1, 0)
-        self.label.show()
+        self._table.attach(self.label, 0, 1, 0, 1, xpadding=6, ypadding=3)
 
         try:
             default = choices[0]
         except IndexError:
             default = None
 
-        self.choice = make_choice(sorted(choices), self.editable, default)
-        # pylint: disable-msg=E1101
-        self.vbox.pack_start(self.choice, 1, 1, 0)
+        self.choice = make_choice(sorted(choices), False, default)
         self.choice.show()
+        self._table.attach(self.choice, 0, 1, 1, 2, xpadding=6, ypadding=3)
+
+        self._table.show()
+        self.vbox.pack_start(self._table, True, True, 2)
+
+    def __init__(self, choices, **args):
+        buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                    gtk.STOCK_OK, gtk.RESPONSE_OK)
+        gtk.Dialog.__init__(self, buttons=buttons, **args)
 
         self.set_default_response(gtk.RESPONSE_OK)
+        self.set_alternative_button_order([gtk.RESPONSE_OK,
+                                           gtk.RESPONSE_CANCEL])
+
+        self._make_ui(choices)
 
 
-class EditableChoiceDialog(ChoiceDialog):
-    editable = True
+class FieldDialog(gtk.Dialog):
+
+    def _make_ui(self):
+        self._table = gtk.Table(1, 2)
+        self._table.show()
+        self._row = 0
+
+        self.vbox.pack_start(self._table, True, True, 2)
+
+    def __init__(self, **args):
+        buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                   gtk.STOCK_OK, gtk.RESPONSE_OK)
+        gtk.Dialog.__init__(self, buttons=buttons, **args)
+        self.set_default_response(gtk.RESPONSE_OK)
+        self.set_alternative_button_order([gtk.RESPONSE_OK,
+                                           gtk.RESPONSE_CANCEL])
+
+        self._fields = {}
+
+        self._make_ui()
 
-    def __init__(self, choices, **args):
-        ChoiceDialog.__init__(self, choices, **args)
+    def response(self, _):
+        LOG.debug("Blocking response")
+        return
+
+    def add_field(self, name, widget, validator=None):
+        label = gtk.Label(name + ":")
+        label.set_alignment(1.0, 0.5)
+        label.show()
 
-        self.choice.child.set_activates_default(True)
+        widget.set_size_request(160, -1)
+        widget.show()
+
+        self._table.attach(label, 0, 1, self._row, self._row+1,
+            xpadding=6, ypadding=3)
+        self._table.attach(widget, 1, 2, self._row, self._row+1,
+            xpadding=6, ypadding=3)
+        self._row += 1
+
+        self._fields[name] = widget
+
+    def get_field(self, name):
+        return self._fields.get(name, None)
 
 
 class ExceptionDialog(gtk.MessageDialog):
     def __init__(self, exception, **args):
         gtk.MessageDialog.__init__(self, buttons=gtk.BUTTONS_OK,
                                    type=gtk.MESSAGE_ERROR, **args)
+        self.set_default_response(gtk.RESPONSE_OK)
         self.set_property("text", _("An error has occurred"))
         self.format_secondary_text(str(exception))
 
@@ -94,64 +116,3 @@
         LOG.error("--- Exception Dialog: %s ---" % exception)
         LOG.error(traceback.format_exc(limit=100))
         LOG.error("----------------------------")
-
-
-class FieldDialog(gtk.Dialog):
-    def __init__(self, **kwargs):
-        if "buttons" not in kwargs.keys():
-            kwargs["buttons"] = (gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                 gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
-
-        self.__fields = {}
-        self.set_default_response(gtk.RESPONSE_OK)
-
-        gtk.Dialog.__init__(self, **kwargs)
-
-    def response(self, _):
-        LOG.debug("Blocking response")
-        return
-
-    def add_field(self, label, widget, validator=None):
-        box = gtk.HBox(True, 2)
-
-        lab = gtk.Label(label)
-        lab.show()
-
-        widget.set_size_request(150, -1)
-        widget.show()
-
-        box.pack_start(lab, 0, 0, 0)
-        box.pack_start(widget, 0, 0, 0)
-        box.show()
-
-        # pylint: disable-msg=E1101
-        self.vbox.pack_start(box, 0, 0, 0)
-
-        self.__fields[label] = widget
-
-    def get_field(self, label):
-        return self.__fields.get(label, None)
-
-
-class OverwriteDialog(gtk.MessageDialog):
-    def __init__(self, filename):
-        gtk.Dialog.__init__(self,
-                            buttons=(_("Overwrite"), gtk.RESPONSE_OK,
-                                     gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
-
-        self.set_property("text", _("File Exists"))
-
-        text = \
-            _("The file {name} already exists. "
-              "Do you want to overwrite it?").format(name=filename)
-
-        self.format_secondary_text(text)
-
-if __name__ == "__main__":
-    # pylint: disable-msg=C0103
-    d = FieldDialog(buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK))
-    d.add_field("Foo", gtk.Entry())
-    d.add_field("Bar", make_choice(["A", "B"]))
-    d.run()
-    gtk.main()
-    d.destroy()
diff --git a/chirp/ui/mainapp.py b/chirp/ui/mainapp.py
--- a/chirp/ui/mainapp.py
+++ b/chirp/ui/mainapp.py
@@ -161,9 +161,12 @@
             esets.append(self.tabs.get_nth_page(i))
 
         d = gtk.Dialog(title="Diff Radios",
-                       buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
+                       buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                                gtk.STOCK_OK, gtk.RESPONSE_OK),
                        parent=self)
+        d.set_default_response(gtk.RESPONSE_OK)
+        d.set_alternative_button_order([gtk.RESPONSE_OK,
+                                        gtk.RESPONSE_CANCEL])
 
         label = gtk.Label("")
         label.set_markup("<b>-1</b> for either Mem # does a full-file hex " +
@@ -296,8 +299,11 @@
         choice = miscwidgets.make_choice(sorted(radiolist.keys()), False,
                                          sorted(radiolist.keys())[0])
         d = gtk.Dialog(title="Detection Failed",
-                       buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
+                       buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                                gtk.STOCK_OK, gtk.RESPONSE_OK))
+        d.set_default_response(gtk.RESPONSE_OK)
+        d.set_alternative_button_order([gtk.RESPONSE_OK,
+                                        gtk.RESPONSE_CANCEL])
         d.vbox.pack_start(lab, 0, 0, 0)
         d.vbox.pack_start(choice, 0, 0, 0)
         d.vbox.set_spacing(5)
@@ -481,10 +487,22 @@
                 return
 
             if os.path.exists(fname):
-                dlg = inputdialog.OverwriteDialog(fname)
-                owrite = dlg.run()
+                dlg = miscwidgets.YesNoDialog(
+                    title=_("Save As"),
+                    parent=self,
+                    buttons=(gtk.STOCK_NO, gtk.RESPONSE_NO,
+                             gtk.STOCK_YES, gtk.RESPONSE_YES))
+                dlg.set_default_response(gtk.RESPONSE_NO)
+                dlg.set_alternative_button_order([gtk.RESPONSE_YES,
+                                                  gtk.RESPONSE_NO])
+                dlg.set_text(
+                    _("{name} already exists." + os.linesep +
+                        "Do you want to replace it?").format(name=fname))
+
+                res = dlg.run()
                 dlg.destroy()
-                if owrite == gtk.RESPONSE_OK:
+
+                if res == gtk.RESPONSE_OK:
                     break
             else:
                 break
@@ -812,10 +830,16 @@
 
         if eset.is_modified():
             dlg = miscwidgets.YesNoDialog(
-                title=_("Save Changes?"), parent=self,
-                buttons=(gtk.STOCK_YES, gtk.RESPONSE_YES,
+                title=_("Save Changes"),
+                parent=self,
+                buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                          gtk.STOCK_NO, gtk.RESPONSE_NO,
-                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
+                         gtk.STOCK_YES, gtk.RESPONSE_YES))
+            dlg.set_default_response(gtk.RESPONSE_YES)
+            dlg.set_alternative_button_order([gtk.RESPONSE_YES,
+                                              gtk.RESPONSE_NO,
+                                              gtk.RESPONSE_CANCEL])
+
             dlg.set_text(_("File is modified, save changes before closing?"))
             res = dlg.run()
             dlg.destroy()
@@ -1407,18 +1431,30 @@
         else:
             defname = "radio"
 
-        filen = platform.get_platform().gui_save_file(default_name=defname,
+        fname = platform.get_platform().gui_save_file(default_name=defname,
                                                       types=types)
-        if not filen:
+        if not fname:
             return
 
-        if os.path.exists(filen):
-            dlg = inputdialog.OverwriteDialog(filen)
-            owrite = dlg.run()
+        if os.path.exists(fname):
+            dlg = miscwidgets.YesNoDialog(
+                title=_("Export"),
+                parent=self,
+                buttons=(gtk.STOCK_NO, gtk.RESPONSE_NO,
+                         gtk.STOCK_YES, gtk.RESPONSE_YES))
+            dlg.set_default_response(gtk.RESPONSE_NO)
+            dlg.set_alternative_button_order([gtk.RESPONSE_YES,
+                                              gtk.RESPONSE_NO])
+            dlg.set_text(
+                _("{name} already exists." + os.linesep +
+                    "Do you want to replace it?").format(name=fname))
+
+            res = dlg.run()
             dlg.destroy()
-            if owrite != gtk.RESPONSE_OK:
+
+            if res != gtk.RESPONSE_OK:
                 return
-            os.remove(filen)
+            os.remove(fname)
 
         count = eset.do_export(filen)
         reporting.report_model_usage(eset.rthread.radio, "export", count > 0)
@@ -1472,28 +1508,43 @@
         radio_name = "%s %s %s" % (eset.rthread.radio.VENDOR,
                                    eset.rthread.radio.MODEL,
                                    eset.rthread.radio.VARIANT)
-        d = gtk.Dialog(title=_("Select Columns"),
+        d = gtk.Dialog(title=_("Choose Columns"),
                        parent=self,
-                       buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
-
-        vbox = gtk.VBox()
-        vbox.show()
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
-        sw.add_with_viewport(vbox)
-        sw.show()
-        d.vbox.pack_start(sw, 1, 1, 1)
+                       buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                                gtk.STOCK_OK, gtk.RESPONSE_OK))
+        d.set_default_response(gtk.RESPONSE_OK)
+        d.set_alternative_button_order([gtk.RESPONSE_OK,
+                                        gtk.RESPONSE_CANCEL])
         d.set_size_request(-1, 300)
         d.set_resizable(False)
 
-        labelstr = _("Visible columns for {radio}").format(radio=radio_name)
-        label = gtk.Label(labelstr)
+        text = _("Select the columns you want to display for {radio}.").format(radio=radio_name)
+        label = gtk.Label(text)
+        label.set_line_wrap(True)
+        label.set_size_request(240, -1)
         label.show()
-        vbox.pack_start(label)
+        d.vbox.pack_start(label, False, False, 2)
+
+        model = gtk.ListStore(bool, str)
+        view = gtk.TreeView(model)
+        view.set_headers_visible(False)
+        view.show()
 
-        fields = []
-        memedit = eset.get_current_editor()  # .editors["memedit"]
+        def _toggle(rend, path, model, *ignore):
+            if path is not None:
+                itr = model.get_iter(path)
+                model[itr][0] = not model[itr][0]
+
+        rend = gtk.CellRendererToggle()
+        rend.connect("toggled", _toggle, model)
+        col = gtk.TreeViewColumn(None, rend, active=0)
+        view.append_column(col)
+
+        rend = gtk.CellRendererText()
+        col = gtk.TreeViewColumn(None, rend, text=1)
+        view.append_column(col)
+
+        memedit = eset.get_current_editor()
         unsupported = memedit.get_unsupported_columns()
         for colspec in memedit.cols:
             if colspec[0].startswith("_"):
@@ -1502,20 +1553,22 @@
                 continue
             label = colspec[0]
             visible = memedit.get_column_visible(memedit.col(label))
-            widget = gtk.CheckButton(label)
-            widget.set_active(visible)
-            fields.append(widget)
-            vbox.pack_start(widget, 1, 1, 1)
-            widget.show()
+            model.append([visible, label])
+
+        sw = gtk.ScrolledWindow()
+        sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+        sw.add_with_viewport(view)
+        sw.show()
+        d.vbox.pack_start(sw, True, True, 2)
 
         res = d.run()
         selected_columns = []
         if res == gtk.RESPONSE_OK:
-            for widget in fields:
-                colnum = memedit.col(widget.get_label())
-                memedit.set_column_visible(colnum, widget.get_active())
-                if widget.get_active():
-                    selected_columns.append(widget.get_label())
+            for row in model:
+                colnum = memedit.col(row[1])
+                memedit.set_column_visible(colnum, row[0])
+                if row[0]:
+                    selected_columns.append(row[1])
 
         d.destroy()
 
@@ -1598,7 +1651,7 @@
         d.label.set_text(_("Choose a language or Auto to use the "
                            "operating system default. You will need to "
                            "restart the application before the change "
-                           "will take effect"))
+                           "will take effect."))
         d.label.set_line_wrap(True)
         r = d.run()
         if r == gtk.RESPONSE_OK:
diff --git a/chirp/ui/memdetail.py b/chirp/ui/memdetail.py
--- a/chirp/ui/memdetail.py
+++ b/chirp/ui/memdetail.py
@@ -176,7 +176,7 @@
 
     def _add(self, tab, row, name, editor, text, colindex=0):
         label = gtk.Label(text + ":")
-        label.set_alignment(0.0, 0.5)
+        label.set_alignment(1.0, 0.5)
         label.show()
         tab.attach(label, colindex, colindex + 1, row, row + 1,
                    xoptions=gtk.FILL, yoptions=0, xpadding=6, ypadding=3)
@@ -292,8 +292,12 @@
                             title="Memory Properties",
                             flags=gtk.DIALOG_MODAL,
                             parent=parent,
-                            buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                     gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
+                            buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                                     gtk.STOCK_OK, gtk.RESPONSE_OK))
+        self.set_default_response(gtk.RESPONSE_OK)
+        self.set_alternative_button_order([gtk.RESPONSE_OK,
+                                           gtk.RESPONSE_CANCEL])
+
         self.set_size_request(-1, 500)
         self._tips = gtk.Tooltips()
 
diff --git a/chirp/ui/memedit.py b/chirp/ui/memedit.py
--- a/chirp/ui/memedit.py
+++ b/chirp/ui/memedit.py
@@ -60,6 +60,8 @@
         self.set_property("text", _("Invalid value for this field"))
         self.format_secondary_text(str(exception))
 
+        self.set_default_response(gtk.RESPONSE_OK)
+
 
 def iter_prev(store, iter):
     row = store.get_path(iter)[0]
@@ -1477,20 +1479,28 @@
             loc, filled = store.get(iter,
                                     self.col(_("Loc")), self.col("_filled"))
             if filled and not always:
-                d = miscwidgets.YesNoDialog(title=_("Overwrite?"),
-                                            buttons=(gtk.STOCK_YES, 1,
-                                                     gtk.STOCK_NO, 2,
-                                                     gtk.STOCK_CANCEL, 3,
-                                                     "All", 4))
+                d = miscwidgets.YesNoDialog(
+                    title=_("Overwrite"),
+                    parent=None,
+                    buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                             gtk.STOCK_NO, gtk.RESPONSE_NO,
+                             _("Yes to All"), gtk.RESPONSE_ACCEPT,
+                             gtk.STOCK_YES, gtk.RESPONSE_YES))
+                d.set_default_response(gtk.RESPONSE_YES)
+                d.set_alternative_button_order([gtk.RESPONSE_YES,
+                                                gtk.RESPONSE_ACCEPT,
+                                                gtk.RESPONSE_NO,
+                                                gtk.RESPONSE_CANCEL])
+
                 d.set_text(
                     _("Overwrite location {number}?").format(number=loc))
                 r = d.run()
                 d.destroy()
-                if r == 4:
+                if r == gtk.RESPONSE_ACCEPT:
                     always = True
-                elif r == 3:
+                elif r == gtk.RESPONSE_CANCEL:
                     break
-                elif r == 2:
+                elif r == gtk.RESPONSE_NO:
                     iter = store.iter_next(iter)
                     continue
 
@@ -1508,16 +1518,22 @@
                 errs = [x for x in msgs
                         if isinstance(x, chirp_common.ValidationError)]
                 if errs:
-                    d = miscwidgets.YesNoDialog(title=_("Incompatible Memory"),
-                                                buttons=(gtk.STOCK_OK, 1,
-                                                         gtk.STOCK_CANCEL, 2))
+                    d = miscwidgets.YesNoDialog(
+                        title=_("Incompatible Memory"),
+                        parent=None,
+                        buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                                 gtk.STOCK_OK, gtk.RESPONSE_OK))
+                    d.set_default_response(gtk.RESPONSE_OK)
+                    d.set_alternative_button_order([gtk.RESPONSE_OK,
+                                                    gtk.RESPONSE_CANCEL])
+
                     d.set_text(
                         _("Pasted memory {number} is not compatible with "
                           "this radio because:").format(number=src_number) +
                         os.linesep + os.linesep.join(msgs))
                     r = d.run()
                     d.destroy()
-                    if r == 2:
+                    if r == gtk.RESPONSE_CANCEL:
                         break
                     else:
                         iter = store.iter_next(iter)
diff --git a/chirp/ui/miscwidgets.py b/chirp/ui/miscwidgets.py
--- a/chirp/ui/miscwidgets.py
+++ b/chirp/ui/miscwidgets.py
@@ -603,13 +603,24 @@
 
 class YesNoDialog(gtk.Dialog):
     def __init__(self, title="", parent=None, buttons=None):
-        gtk.Dialog.__init__(self, title=title, parent=parent, buttons=buttons)
+        gtk.Dialog.__init__(self,
+                            title=title,
+                            parent=parent,
+                            buttons=buttons)
+
+        self._table = gtk.Table(1, 2)
 
         self._label = gtk.Label("")
+        self._label.set_alignment(0.0, 0.5)
+        self._label.set_line_wrap(True)
+        self._label.set_size_request(384, -1)
         self._label.show()
+        self._table.attach(self._label, 0, 1, 0, 1,
+            xpadding=6, ypadding=3)
 
+        self._table.show()
         # pylint: disable-msg=E1101
-        self.vbox.pack_start(self._label, 1, 1, 1)
+        self.vbox.pack_start(self._table, True, True, 2)
 
     def set_text(self, text):
         self._label.set_text(text)
diff --git a/chirp/ui/settingsedit.py b/chirp/ui/settingsedit.py
--- a/chirp/ui/settingsedit.py
+++ b/chirp/ui/settingsedit.py
@@ -135,7 +135,7 @@
 
             # Label
             label = gtk.Label(element.get_shortname() + ":")
-            label.set_alignment(0.0, 0.5)
+            label.set_alignment(1.0, 0.5)
             label.show()
 
             table.attach(label, 0, 1, row, row + 1,
diff --git a/chirp/ui/shiftdialog.py b/chirp/ui/shiftdialog.py
--- a/chirp/ui/shiftdialog.py
+++ b/chirp/ui/shiftdialog.py
@@ -30,6 +30,8 @@
                             title=_("Shift"),
                             buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_OK))
 
+        self.set_default_response(gtk.RESPONSE_OK)
+
         self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
 
         self.rthread = rthread



More information about the chirp_devel mailing list