<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'># HG changeset patch<br># User K. Arvanitis &lt;<a href="mailto:kosta@alumni.uvic.ca">kosta@alumni.uvic.ca</a>&gt;<br># Date 1422941391 28800<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mon Feb 02 21:29:51 2015 -0800<br># Node ID e8378ba8777941cff2f0b4717355d476e224b43c<br># Parent&nbsp; 5a17f1c24b38875fe8ef83b6a3fe6b61f11c07af<br>[PATCH] Radio settings flattened view<BR>Due to the nested nature of the settings editor tree view, labels in the<br>tree generally become obscured because the pane is too small.<BR>This change addresses the issue by a) adding a horizontal paned window<br>which allows the tree view to be manually resized while b) flattening<br>the radio featrure radio settings group to return a single list of<br>all top level radio settings groups.<BR><br>Bug #2285<BR>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/alinco.py<br>--- a/chirp/alinco.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/alinco.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -14,8 +14,7 @@<br>&nbsp;# along with this program.&nbsp; If not, see &lt;<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>&gt;.<br>&nbsp;<br>&nbsp;from chirp import chirp_common, bitwise, memmap, errors, directory, util<br>-from chirp.settings import RadioSettingGroup, RadioSetting<br>-from chirp.settings import RadioSettingValueBoolean<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;import time<br>&nbsp;<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/anytone.py<br>--- a/chirp/anytone.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/anytone.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -23,8 +23,7 @@<br>&nbsp;from chirp import errors<br>&nbsp;from chirp import memmap<br>&nbsp;from chirp import util<br>-from chirp.settings import RadioSettingGroup, RadioSetting, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueList, RadioSettingValueString, RadioSettingValueBoolean<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;_mem_format = """<br>&nbsp;#seekto 0x0100;<br>@@ -475,19 +474,20 @@<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _settings = self._memobj.settings<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settings = RadioSettingGroup('all', 'All Settings')<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settings = RadioSettings(basic)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display = ["Frequency", "Channel", "Name"]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("display", "Display",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueList(display,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display[_settings.display]))<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settings.append(rs)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append(rs)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apo = ["Off"] + ['%.1f hour(s)' % (0.5 * x) for x in range(1, 25)]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("apo", "Automatic Power Off",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueList(apo,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apo[_settings.apo]))<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settings.append(rs)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append(rs)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def filter(s):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s_ = ""<br>@@ -499,23 +499,26 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("welcome", "Welcome Message",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueString(0, 8,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filter(_settings.welcome)))<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settings.append(rs)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append(rs)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("beep", "Beep Enabled",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(_settings.beep))<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settings.append(rs)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append(rs)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mute = ["Off", "TX", "RX", "TX/RX"]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("mute", "Sub Band Mute",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueList(mute,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mute[_settings.mute]))<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settings.append(rs)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append(rs)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return settings<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def set_settings(self, settings):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _settings = self._memobj.settings<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for element in settings:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not isinstance(element, RadioSetting):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.set_settings(element)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = element.get_name()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setattr(_settings, name, element.value)<br>&nbsp;<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/ap510.py<br>--- a/chirp/ap510.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/ap510.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -15,10 +15,7 @@<br>&nbsp;<br>&nbsp;import struct<br>&nbsp;from chirp import chirp_common, directory, errors, util<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueFloat, RadioSettingValue, InvalidValueError<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;<br>&nbsp;def encode_base100(v):<br>@@ -313,7 +310,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aprs = RadioSettingGroup("aprs", "APRS", china, smartbeacon)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digipeat = RadioSettingGroup("digipeat", "Digipeat")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; system = RadioSettingGroup("system", "System")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settings = RadioSettingGroup("all", "Settings", aprs, digipeat, system)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settings = RadioSettings(aprs, digipeat, system)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The RadioSetting syntax is really verbose, iterate it.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fields = [<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/baofeng_uv3r.py<br>--- a/chirp/baofeng_uv3r.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/baofeng_uv3r.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -19,10 +19,7 @@<br>&nbsp;import os<br>&nbsp;from chirp import util, chirp_common, bitwise, errors, directory<br>&nbsp;from chirp.wouxun_common import do_download, do_upload<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueString, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueFloat<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;if os.getenv("CHIRP_DEBUG"):<br>&nbsp;&nbsp;&nbsp;&nbsp; DEBUG = True<br>@@ -357,7 +354,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _settings = self._memobj.settings<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _vfo = self._memobj.vfo<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic Settings")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettingGroup("top", "All Settings", basic)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettings(basic)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("squelch", "Squelch Level",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueInteger(0, 9, _settings.squelch))<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/bjuv55.py<br>--- a/chirp/bjuv55.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/bjuv55.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -21,10 +21,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, errors, util, directory, memmap<br>&nbsp;from chirp import bitwise<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueFloat, InvalidValueError<br>+from chirp.settings import *<br>&nbsp;from textwrap import dedent<br>&nbsp;from chirp import uv5r<br>&nbsp;<br>@@ -270,7 +267,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _settings = self._memobj.settings<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic Settings")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; advanced = RadioSettingGroup("advanced", "Advanced Settings")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettingGroup("top", "All Settings", basic, advanced)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettings(basic, advanced)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("squelch", "Carrier Squelch Level",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueInteger(0, 9, _settings.squelch))<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/chirp_common.py<br>--- a/chirp/chirp_common.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/chirp_common.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -248,7 +248,7 @@<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; immutable = []<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp; # A RadioSettingsGroup of additional settings supported by the radio,<br>+&nbsp;&nbsp;&nbsp; # A RadioSettingGroup of additional settings supported by the radio,<br>&nbsp;&nbsp;&nbsp;&nbsp; # or an empty list if none<br>&nbsp;&nbsp;&nbsp;&nbsp; extra = []<br>&nbsp;<br>@@ -1027,7 +1027,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rf.validate_memory(mem)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """Returns a RadioSettingGroup containing one or more<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """Returns a RadioSettings list containing one or more<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingGroup or RadioSetting objects. These represent general<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setting knobs and dials that can be adjusted on the radio. If this<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function is implemented, the has_settings RadioFeatures flag should<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/ft1802.py<br>--- a/chirp/ft1802.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/ft1802.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -24,8 +24,7 @@<br>&nbsp;# 5. In Chirp, choose Upload to Radio.<br>&nbsp;<br>&nbsp;from chirp import chirp_common, bitwise, directory, yaesu_clone<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean<br>+from chirp.settings import *<br>&nbsp;from textwrap import dedent<br>&nbsp;<br>&nbsp;MEM_FORMAT = """<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/ft1d.py<br>--- a/chirp/ft1d.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/ft1d.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -20,9 +20,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, yaesu_clone, directory<br>&nbsp;from chirp import bitwise<br>-from chirp.settings import RadioSettingGroup, RadioSetting<br>-from chirp.settings import RadioSettingValueInteger, RadioSettingValueString<br>-from chirp.settings import RadioSettingValueList, RadioSettingValueBoolean<br>+from chirp.settings import *<br>&nbsp;from textwrap import dedent<br>&nbsp;<br>&nbsp;MEM_FORMAT = """<br>@@ -1458,16 +1456,15 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return menu<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def _get_settings(self):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("all", "All Settings",<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_general_settings(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_rx_settings(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_tx_settings(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_smartbeacon(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_msgs(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_beacons(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_dtmf_settings(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_misc_settings(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_scan_settings())<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(self._get_aprs_general_settings(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_rx_settings(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_tx_settings(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_smartbeacon(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_msgs(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_beacons(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_dtmf_settings(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_misc_settings(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_scan_settings())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return top<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/ft60.py<br>--- a/chirp/ft60.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/ft60.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -16,10 +16,7 @@<br>&nbsp;import time, os<br>&nbsp;from chirp import chirp_common, yaesu_clone, memmap, bitwise, directory<br>&nbsp;from chirp import errors<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueFloat<br>+from chirp.settings import *<br>&nbsp;from textwrap import dedent<br>&nbsp;<br>&nbsp;ACK = "\x06"<br>@@ -400,8 +397,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; misc = RadioSettingGroup("misc", "Miscellaneous Settings")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbls = RadioSettingGroup("banks", "Memory Bank Link Scan")<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setmode = RadioSettingGroup("top", "Set Mode",<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repeater, ctcss, arts, scan, power, wires, eai, switch, misc, mbls)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setmode = RadioSettings(repeater, ctcss, arts, scan, power, wires, eai, switch, misc, mbls)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # APO<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opts = [ "OFF" ] + [ "%0.1f" % (x * 0.5) for x in range(1, 24+1) ]<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/ft7800.py<br>--- a/chirp/ft7800.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/ft7800.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -17,9 +17,7 @@<br>&nbsp;from chirp import chirp_common, yaesu_clone, memmap, directory<br>&nbsp;from chirp import bitwise, errors<br>&nbsp;from textwrap import dedent<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString<br>+from chirp.settings import *<br>&nbsp;import os, re<br>&nbsp;<br>&nbsp;from collections import defaultdict<br>@@ -568,8 +566,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dtmf = RadioSettingGroup("dtmf", "DTMF")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arts = RadioSettingGroup("arts", "ARTS")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prog = RadioSettingGroup("prog", "Programmable Buttons")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("top", "All Settings",<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic, dtmf, arts, prog)<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(basic, dtmf, arts, prog)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append( RadioSetting("priority_revert", "Priority Revert",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(_settings.priority_revert)))<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/ft817.py<br>--- a/chirp/ft817.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/ft817.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -18,9 +18,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, yaesu_clone, util, memmap, errors, directory<br>&nbsp;from chirp import bitwise<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString<br>+from chirp.settings import *<br>&nbsp;import time, os<br>&nbsp;from textwrap import dedent<br>&nbsp;<br>@@ -763,7 +761,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extended = RadioSettingGroup("extended", "Extended")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; antenna = RadioSettingGroup("antenna", "Antenna selection")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; panelcontr = RadioSettingGroup("panelcontr", "Panel controls")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("top", "All Settings", basic, cw, packet,<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(basic, cw, packet,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; panelcontr, panel, extended, antenna)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("ars_144", "144 ARS",<br>@@ -1136,7 +1135,7 @@<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = FT817Radio.get_settings(self)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = top["basic"]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = top[0]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("emergency", "Emergency",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(self._memobj.settings.emergency))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append(rs)<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/ft857.py<br>--- a/chirp/ft857.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/ft857.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -17,9 +17,7 @@<br>&nbsp;"""FT857 - FT857/US management module"""<br>&nbsp;<br>&nbsp;from chirp import ft817, chirp_common, errors, directory<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString<br>+from chirp.settings import *<br>&nbsp;import os<br>&nbsp;from textwrap import dedent<br>&nbsp;<br>@@ -525,7 +523,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; panel = RadioSettingGroup("panel", "Panel settings")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extended = RadioSettingGroup("extended", "Extended")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; panelcontr = RadioSettingGroup("panelcontr", "Panel controls")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("top", "All Settings", basic, cw, packet,<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(basic, cw, packet,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; panelcontr, panel, extended)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("extended_menu", "Extended menu",<br>@@ -1073,7 +1072,7 @@<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = FT857Radio.get_settings(self)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = top["basic"]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = top[0]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("emergency", "Emergency",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(self._memobj.settings.emergency))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append(rs)<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/ft90.py<br>--- a/chirp/ft90.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/ft90.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -15,9 +15,7 @@<br>&nbsp;# along with this program.&nbsp; If not, see &lt;<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>&gt;.<br>&nbsp;<br>&nbsp;from chirp import chirp_common, bitwise, memmap, directory, errors, util, yaesu_clone<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString<br>+from chirp.settings import *<br>&nbsp;import time, os, traceback, string, re<br>&nbsp;from textwrap import dedent<br>&nbsp;<br>@@ -509,7 +507,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autodial = RadioSettingGroup("autodial", "AutoDial")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keymaps = RadioSettingGroup("keymaps", "KeyMaps")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("top", "All Settings", basic, keymaps, autodial)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(basic, keymaps, autodial)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("beep", "Beep",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(_settings.beep))<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/ftm350.py<br>--- a/chirp/ftm350.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/ftm350.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -19,8 +19,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, yaesu_clone, directory, errors, util<br>&nbsp;from chirp import bitwise, memmap<br>-from chirp.settings import RadioSettingGroup, RadioSetting<br>-from chirp.settings import RadioSettingValueInteger, RadioSettingValueString<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;mem_format = """<br>&nbsp;struct mem {<br>@@ -380,7 +379,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return filedata.startswith("AH033$")<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("all", "All Settings")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings()<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aprs = RadioSettingGroup("aprs", "APRS")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top.append(aprs)<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/h777.py<br>--- a/chirp/h777.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/h777.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -21,9 +21,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, directory, memmap<br>&nbsp;from chirp import bitwise, errors, util<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;DEBUG = os.getenv("CHIRP_DEBUG") and True or False<br>&nbsp;<br>@@ -392,6 +390,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _settings = self._memobj.settings<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic Settings")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(basic)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # TODO: Check that all these settings actually do what they<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # say they do.<br>@@ -472,7 +471,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._memobj.settings2.timeouttimer]))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append(rs)<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return basic<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return top<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def set_settings(self, settings):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for element in settings:<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/ic2100.py<br>--- a/chirp/ic2100.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/ic2100.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -15,10 +15,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, icf, util, directory<br>&nbsp;from chirp import bitwise, memmap<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueFloat, InvalidValueError<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;MEM_FORMAT = """<br>&nbsp;struct {<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/icf.py<br>--- a/chirp/icf.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/icf.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -18,8 +18,7 @@<br>&nbsp;import time<br>&nbsp;<br>&nbsp;from chirp import chirp_common, errors, util, memmap<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;CMD_CLONE_OUT = 0xE2<br>&nbsp;CMD_CLONE_IN&nbsp; = 0xE3<br>@@ -640,17 +639,18 @@<br>&nbsp;<br>&nbsp;def make_speed_switch_setting(radio):<br>&nbsp;&nbsp;&nbsp;&nbsp; if not radio.__class__._can_hispeed:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return []<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {}<br>&nbsp;&nbsp;&nbsp;&nbsp; drvopts = RadioSettingGroup("drvopts", "Driver Options")<br>+&nbsp;&nbsp;&nbsp; top = RadioSettings(drvopts)<br>&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("drv_clone_speed", "Use Hi-Speed Clone",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(radio._can_hispeed))<br>&nbsp;&nbsp;&nbsp;&nbsp; drvopts.append(rs)<br>-&nbsp;&nbsp;&nbsp; return drvopts<br>+&nbsp;&nbsp;&nbsp; return top<br>&nbsp;<br>&nbsp;def honor_speed_switch_setting(radio, settings):<br>&nbsp;&nbsp;&nbsp;&nbsp; for element in settings:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if element.get_name() == "drvopts":<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return honor_speed_switch_setting(radio, settings)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return honor_speed_switch_setting(radio, element)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if element.get_name() == "drv_clone_speed":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; radio.__class__._can_hispeed = element.value.get_value()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/icq7.py<br>--- a/chirp/icq7.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/icq7.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -17,10 +17,7 @@<br>&nbsp;from chirp import chirp_common, icf, directory<br>&nbsp;from chirp import bitwise<br>&nbsp;from chirp.chirp_common import to_GHz, from_GHz<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueString, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueFloat<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;MEM_FORMAT = """<br>&nbsp;struct {<br>@@ -198,7 +195,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _settings = self._memobj.settings<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic Settings")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettingGroup("top", "All Settings", basic)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettings(basic)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("ch", "Channel Indication Mode",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(_settings.ch))<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/kenwood_live.py<br>--- a/chirp/kenwood_live.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/kenwood_live.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -25,9 +25,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; sys.path.insert(0, "..")<br>&nbsp;<br>&nbsp;from chirp import chirp_common, errors, directory, util<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueBoolean, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueString, RadioSettingValueList<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;DEBUG = True<br>&nbsp;<br>@@ -392,7 +390,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aux, tnc, save, display, dtmf)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sky = RadioSettingGroup("sky", "SkyCommand")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aprs = RadioSettingGroup("aprs", "APRS")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("top", "All Settings", radio, aprs, sky)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(radio, aprs, sky)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bools = [("AMR", aprs, "APRS Message Auto-Reply"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("AIP", aux, "Advanced Intercept Point"),<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/kguv8d.py<br>--- a/chirp/kguv8d.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/kguv8d.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -18,9 +18,7 @@<br>&nbsp;import time<br>&nbsp;import os<br>&nbsp;from chirp import util, chirp_common, bitwise, memmap, errors, directory<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueString<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;if os.getenv("CHIRP_DEBUG"):<br>&nbsp;&nbsp;&nbsp;&nbsp; CHIRP_DEBUG = True<br>@@ -677,7 +675,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cal_grp = RadioSettingGroup("cal_grp", "Call Group")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lmt_grp = RadioSettingGroup("lmt_grp", "Frequency Limits")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oem_grp = RadioSettingGroup("oem_grp", "OEM Info")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettingGroup("top", "All Settings", cfg_grp, vfoa_grp,<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettings(cfg_grp, vfoa_grp,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vfob_grp, key_grp, scn_grp, cal_grp, lmt_grp, oem_grp)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/kyd.py<br>--- a/chirp/kyd.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/kyd.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -20,9 +20,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, directory, memmap<br>&nbsp;from chirp import bitwise, errors, util<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;DEBUG = os.getenv("CHIRP_DEBUG") and True or False<br>&nbsp;<br>@@ -436,6 +434,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _settings = self._memobj.settings<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic Settings")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(basic)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("tot", "Time-out timer",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueList(TIMEOUTTIMER_LIST,<br>@@ -474,7 +473,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(_settings.save))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append(rs)<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return basic<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return top<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def set_settings(self, settings):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for element in settings:<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/leixen.py<br>--- a/chirp/leixen.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/leixen.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -18,10 +18,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, directory, memmap, errors, util<br>&nbsp;from chirp import bitwise<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueFloat, InvalidValueError<br>+from chirp.settings import *<br>&nbsp;from textwrap import dedent<br>&nbsp;<br>&nbsp;if os.getenv("CHIRP_DEBUG"):<br>@@ -531,8 +528,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg_grp = RadioSettingGroup("cfg_grp", "Basic Settings")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adv_grp = RadioSettingGroup("adv_grp", "Advanced Settings")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key_grp = RadioSettingGroup("key_grp", "Key Assignment")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettingGroup("top", "All Settings", cfg_grp,<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adv_grp, key_grp)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettings(cfg_grp, adv_grp, key_grp)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Basic Settings<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/settings.py<br>--- a/chirp/settings.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/settings.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -199,6 +199,11 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; def __str__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self._current<br>&nbsp;<br>+<br>+class RadioSettings(list):<br>+&nbsp;&nbsp;&nbsp; def __init__(self, *groups):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.__init__(self, groups)<br>+<br>&nbsp;class RadioSettingGroup(object):<br>&nbsp;&nbsp;&nbsp;&nbsp; """A group of settings"""<br>&nbsp;&nbsp;&nbsp;&nbsp; def _validate(self, element):<br>@@ -244,7 +249,7 @@<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def __iter__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class RSGIterator:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """Iterator for a RadioSettingsGroup"""<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """Iterator for a RadioSettingGroup"""<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __init__(self, rsg):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.__rsg = rsg<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.__i = 0<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/th9800.py<br>--- a/chirp/th9800.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/th9800.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -17,10 +17,7 @@<br>&nbsp;<br>&nbsp;from chirp import bitwise, chirp_common, directory, errors, util, memmap<br>&nbsp;import struct<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueFloat, InvalidValueError<br>+from chirp.settings import *<br>&nbsp;from chirp_common import format_freq<br>&nbsp;import os<br>&nbsp;import time<br>@@ -400,8 +397,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _bandlimits = self._memobj.bandlimits<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info =&nbsp; RadioSettingGroup("info", "Model Info")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("top", "All Settings",<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic, info)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(basic, info)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append( RadioSetting("beep", "Beep",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(_settings.beep)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append( RadioSetting("beep_vol", "Beep Volume",<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/th_uvf8d.py<br>--- a/chirp/th_uvf8d.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/th_uvf8d.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -25,9 +25,7 @@<br>&nbsp;import struct<br>&nbsp;<br>&nbsp;from chirp import chirp_common, bitwise, errors, directory, memmap, util<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;<br>&nbsp;def uvf8d_identify(radio):<br>@@ -464,7 +462,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _settings = self._memobj.settings<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettingGroup("top", "All Settings")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettingGroup("basic", "Basic")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(basic)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group.append(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSetting("mode", "Mode",<br>@@ -595,7 +594,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueList(AB_LIST,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AB_LIST[_settings.b_work_area])))<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return group<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return top<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group.append(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSetting("disnm", "Display Name",<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/thuv1f.py<br>--- a/chirp/thuv1f.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/thuv1f.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -17,11 +17,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, errors, util, directory, memmap<br>&nbsp;from chirp import bitwise<br>-<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueList, RadioSettingValueBoolean, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueString<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;def uvf1_identify(radio):<br>&nbsp;&nbsp;&nbsp;&nbsp; """Do identify handshake with TYT TH-UVF1"""<br>@@ -383,7 +379,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _settings = self._memobj.settings<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettingGroup("top", "All Settings")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettingGroup("basic", "Basic");<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(group)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group.append(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSetting("led", "LED Mode",<br>@@ -463,7 +460,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueString(0, 6,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _filter(_settings.ponmsg))))<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return group<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return top<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def set_settings(self, settings):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _settings = self._memobj.settings<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/tk8102.py<br>--- a/chirp/tk8102.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/tk8102.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -18,9 +18,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, directory, memmap, errors, util<br>&nbsp;from chirp import bitwise<br>-from chirp.settings import RadioSettingGroup, RadioSetting<br>-from chirp.settings import RadioSettingValueBoolean, RadioSettingValueList<br>-from chirp.settings import RadioSettingValueString<br>+from chirp.settings import *<br>&nbsp;<br>&nbsp;MEM_FORMAT = """<br>&nbsp;#seekto 0x0030;<br>@@ -355,7 +353,8 @@<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _mem = self._memobj<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("all", "All Settings")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(basic)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def _f(val):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string = ""<br>@@ -369,18 +368,21 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueString(0, 32,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _f(_mem.messages.line1),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autopad=False))<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top.append(line1)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append(line1)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line2 = RadioSetting("messages.line2", "Message Line 2",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueString(0, 32,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _f(_mem.messages.line2),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autopad=False))<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top.append(line2)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append(line2)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return top<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def set_settings(self, settings):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for element in settings:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not isinstance(element, RadioSetting):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.set_settings(element)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if "." in element.get_name():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bits = element.get_name().split(".")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj = self._memobj<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/uv5r.py<br>--- a/chirp/uv5r.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/uv5r.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -19,10 +19,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, errors, util, directory, memmap<br>&nbsp;from chirp import bitwise<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueFloat, InvalidValueError<br>+from chirp.settings import *<br>&nbsp;from textwrap import dedent<br>&nbsp;<br>&nbsp;if os.getenv("CHIRP_DEBUG"):<br>@@ -986,7 +983,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _wmchannel = self._memobj.wmchannel<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic Settings")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; advanced = RadioSettingGroup("advanced", "Advanced Settings")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettingGroup("top", "All Settings", basic, advanced)<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettings(basic, advanced)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("squelch", "Carrier Squelch Level",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueInteger(0, 9, _settings.squelch))<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/uvb5.py<br>--- a/chirp/uvb5.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/uvb5.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -15,10 +15,7 @@<br>&nbsp;<br>&nbsp;import struct<br>&nbsp;from chirp import chirp_common, directory, bitwise, memmap, errors, util<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueString, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueFloat<br>+from chirp.settings import *<br>&nbsp;from textwrap import dedent<br>&nbsp;<br>&nbsp;mem_format = """<br>@@ -480,7 +477,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _settings = self._memobj.settings<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic Settings")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettingGroup("top", "All Settings", basic)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettings(basic)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options = ["Time", "Carrier", "Search"]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("scantype", "Scan Type",<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/vx2.py<br>--- a/chirp/vx2.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/vx2.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -15,9 +15,7 @@<br>&nbsp;# along with this program.&nbsp; If not, see &lt;<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>&gt;.<br>&nbsp;<br>&nbsp;from chirp import chirp_common, yaesu_clone, directory, bitwise<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString<br>+from chirp.settings import *<br>&nbsp;import os, traceback, re<br>&nbsp;<br>&nbsp;if os.getenv("CHIRP_DEBUG"):<br>@@ -437,7 +435,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic = RadioSettingGroup("basic", "Basic")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dtmf = RadioSettingGroup("dtmf", "DTMF")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arts = RadioSettingGroup("arts", "ARTS")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("top", "All Settings", basic, arts, dtmf)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(basic, arts, dtmf)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options = [ "off", "30m", "1h", "3h", "5h", "8h" ]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("apo", "APO time (hrs)",<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/vx3.py<br>--- a/chirp/vx3.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/vx3.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -16,9 +16,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, yaesu_clone, directory<br>&nbsp;from chirp import bitwise<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueString<br>+from chirp.settings import *<br>&nbsp;from textwrap import dedent<br>&nbsp;import os, re<br>&nbsp;<br>@@ -529,8 +527,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arts = RadioSettingGroup("arts", "ARTS")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eai = RadioSettingGroup("eai", "Emergency")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = RadioSettingGroup("msg", "Messages")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("top", "All Settings",<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic, sound, arts, dtmf, eai, msg)<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(basic, sound, arts, dtmf, eai, msg)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basic.append( RadioSetting("att_wx", "Attenuation WX",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(_settings.att_wx)))<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/vx8.py<br>--- a/chirp/vx8.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/vx8.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -18,9 +18,7 @@<br>&nbsp;<br>&nbsp;from chirp import chirp_common, yaesu_clone, directory<br>&nbsp;from chirp import bitwise<br>-from chirp.settings import RadioSettingGroup, RadioSetting<br>-from chirp.settings import RadioSettingValueInteger, RadioSettingValueString<br>-from chirp.settings import RadioSettingValueList, RadioSettingValueBoolean<br>+from chirp.settings import *<br>&nbsp;from textwrap import dedent<br>&nbsp;<br>&nbsp;MEM_FORMAT = """<br>@@ -1372,14 +1370,13 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return menu<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def _get_settings(self):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("all", "All Settings",<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_general_settings(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_rx_settings(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_tx_settings(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_smartbeacon(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_dtmf_settings(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_misc_settings(),<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_scan_settings())<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(self._get_aprs_general_settings(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_rx_settings(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_tx_settings(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_aprs_smartbeacon(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_dtmf_settings(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_misc_settings(),<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._get_scan_settings())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return top<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirp/wouxun.py<br>--- a/chirp/wouxun.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirp/wouxun.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -18,10 +18,7 @@<br>&nbsp;import time<br>&nbsp;import os<br>&nbsp;from chirp import util, chirp_common, bitwise, memmap, errors, directory<br>-from chirp.settings import RadioSetting, RadioSettingGroup, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean, RadioSettingValueList, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueInteger, RadioSettingValueString, \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueFloat<br>+from chirp.settings import *<br>&nbsp;from chirp.wouxun_common import wipe_memory, do_download, do_upload<br>&nbsp;from textwrap import dedent<br>&nbsp;<br>@@ -334,7 +331,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freqranges = RadioSettingGroup("freqranges", "Freq ranges")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fm_preset = RadioSettingGroup("fm_preset", "FM Presets")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("top", "All Settings", freqranges, fm_preset)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(freqranges, fm_preset)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("menu_available", "Menu Available",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(<br>@@ -1045,7 +1042,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freqranges = RadioSettingGroup("freqranges", "Freq ranges")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fm_preset = RadioSettingGroup("fm_preset", "FM Presets")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("top", "All Settings", freqranges, fm_preset)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettings(freqranges, fm_preset)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("menu_available", "Menu Available",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueBoolean(<br>@@ -1425,7 +1422,7 @@<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_settings(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freqranges = RadioSettingGroup("freqranges", "Freq ranges (read only)")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = RadioSettingGroup("top", "All Settings", freqranges)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = RadioSettings(freqranges)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = RadioSetting("vhf_rx_start", "vhf rx start",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueInteger(66, 520,<br>@@ -1473,7 +1470,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( decode_freq(self._memobj.freq_ranges.vhf_rx_start) * 1000000, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (decode_freq(self._memobj.freq_ranges.vhf_rx_stop)+1) * 1000000)]<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return top<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return group<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; @classmethod<br>&nbsp;&nbsp;&nbsp;&nbsp; def match_model(cls, filedata, filename):<br>diff -r 5a17f1c24b38 -r e8378ba87779 chirpui/settingsedit.py<br>--- a/chirpui/settingsedit.py&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/chirpui/settingsedit.py&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -16,10 +16,11 @@<br>&nbsp;import gtk<br>&nbsp;import gobject<br>&nbsp;<br>-from chirp import chirp_common, settings<br>+from chirp import chirp_common<br>+from chirp.settings import *<br>&nbsp;from chirpui import common, miscwidgets<br>&nbsp;<br>-class RadioSettingProxy(settings.RadioSetting):<br>+class RadioSettingProxy(RadioSetting):<br>&nbsp;&nbsp;&nbsp;&nbsp; def __init__(self, setting, editor):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._setting = setting<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._editor = editor<br>@@ -27,40 +28,40 @@<br>&nbsp;class SettingsEditor(common.Editor):<br>&nbsp;&nbsp;&nbsp;&nbsp; def __init__(self, rthread):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(SettingsEditor, self).__init__(rthread)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._changed = False<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The main box<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.root = gtk.HBox(False, 0)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._store = gtk.TreeStore(gobject.TYPE_STRING,<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gobject.TYPE_PYOBJECT)<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The pane<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paned = gtk.HPaned()<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paned.show()<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.root.pack_start(paned, 1, 1, 0)<br>+&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The selection tree<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_INT)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view = gtk.TreeView(self._store)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view.set_size_request(150, -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view.get_selection().connect("changed", self._view_changed_cb)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view.append_column(gtk.TreeViewColumn("", gtk.CellRendererText(), text=0))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view.show()<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.root.pack_start(self._view, 0, 0, 0)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paned.pack1(self._view)<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col = gtk.TreeViewColumn("", gtk.CellRendererText(), text=0)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view.append_column(col)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The settings notebook<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._notebook = gtk.Notebook()<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._notebook.set_show_tabs(False)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._notebook.set_show_border(False)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._notebook.show()<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paned.pack2(self._notebook)<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._table = gtk.Table(20, 3)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._table.set_col_spacings(10)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._table.show()<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._changed = False<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._settings = None<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw = gtk.ScrolledWindow()<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.add_with_viewport(self._table)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.show()<br>-<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.root.pack_start(sw, 1, 1, 1)<br>-<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._index = 0<br>-<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._top_setting_group = None<br>-<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; job = common.RadioJob(self._build_ui, "get_settings")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; job = common.RadioJob(self._get_settings_cb, "get_settings")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; job.set_desc("Getting radio settings")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.rthread.submit(job)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def _save_settings(self):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self._top_setting_group is None:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self._settings is None:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def setting_cb(result):<br>@@ -71,21 +72,21 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._changed = False<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; job = common.RadioJob(setting_cb, "set_settings",<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._top_setting_group)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._settings)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; job.set_desc("Setting radio settings")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.rthread.submit(job)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def _load_setting(self, value, widget):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isinstance(value, settings.RadioSettingValueInteger):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isinstance(value, RadioSettingValueInteger):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adj = widget.get_adjustment()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adj.configure(value.get_value(),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value.get_min(), value.get_max(),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value.get_step(), 1, 0)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueFloat):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueFloat):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widget.set_text(value.format())<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueBoolean):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueBoolean):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widget.set_active(value.get_value())<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueList):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueList):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; model = widget.get_model()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; model.clear()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for option in value.get_options():<br>@@ -93,22 +94,22 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; current = value.get_value()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index = value.get_options().index(current)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widget.set_active(index)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueString):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueString):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widget.set_text(str(value).rstrip())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Unsupported widget type %s for %s" % (value.__class__,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.get_name())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; def _do_save_setting(self, widget, value):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isinstance(value, settings.RadioSettingValueInteger):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isinstance(value, RadioSettingValueInteger):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value.set_value(widget.get_adjustment().get_value())<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueFloat):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueFloat):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value.set_value(widget.get_text())<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueBoolean):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueBoolean):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value.set_value(widget.get_active())<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueList):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueList):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value.set_value(widget.get_active_text())<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueString):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueString):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value.set_value(widget.get_text())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Unsupported widget type %s for %s" % (\<br>@@ -121,53 +122,62 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; def _save_setting(self, widget, value):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._do_save_setting(widget, value)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except settings.InvalidValueError, e:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except InvalidValueError, e:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; common.show_error(_("Invalid setting value: %s") % e)<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp; def _build_ui_group(self, group):<br>+&nbsp;&nbsp;&nbsp; def _build_ui_tab(self, group):<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The scrolled window<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw = gtk.ScrolledWindow()<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.show()<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Notebook tab<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tab = self._notebook.append_page(sw, gtk.Label(_(group.get_name())))<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Settings table<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table = gtk.Table(len(group), 2, True)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.show()<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.add_with_viewport(table)<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row = 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def pack(widget, pos):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._table.attach(widget, pos, pos+1, self._index, self._index+1,<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xoptions=gtk.FILL, yoptions=0)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.attach(widget, pos, pos+1, row, row+1,<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xoptions=gtk.FILL, yoptions=0, xpadding=6, ypadding=0)<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def abandon(child):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._table.remove(child)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._table.foreach(abandon)<br>-<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._index = 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for element in group:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not isinstance(element, settings.RadioSetting):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not isinstance(element, RadioSetting):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label = gtk.Label(element.get_shortname())<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label.set_alignment(1.0, 0.5)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label.set_alignment(-1.0, 0.5)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label.show()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pack(label, 0)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isinstance(element.value, list) and \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isinstance(element.value[0],<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; settings.RadioSettingValueInteger):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arraybox = gtk.HBox(True, 3)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RadioSettingValueInteger):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arraybox = gtk.HBox(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arraybox = gtk.VBox(True, 3)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arraybox = gtk.VBox(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pack(arraybox, 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arraybox.show()<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widgets = []<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for index in element.keys():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = element[index]<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isinstance(value, settings.RadioSettingValueInteger):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isinstance(value, RadioSettingValueInteger):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widget = gtk.SpinButton()<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Digits: %i" % widget.get_digits()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signal = "value-changed"<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueFloat):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueFloat):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widget = gtk.Entry()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signal = "focus-out-event"<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueBoolean):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueBoolean):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widget = gtk.CheckButton(_("Enabled"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signal = "toggled"<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueList):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueList):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widget = miscwidgets.make_choice([], editable=False)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signal = "changed"<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, settings.RadioSettingValueString):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(value, RadioSettingValueString):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widget = gtk.Entry()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signal = "changed"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>@@ -190,42 +200,35 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widget.connect(signal, self._save_setting, value)<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._index += 1<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row += 1<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp; def _build_tree(self, group, parent):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return tab<br>+<br>+&nbsp;&nbsp;&nbsp; def _build_ui_group(self, group, parent):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tab = self._build_ui_tab(group)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iter = self._store.append(parent)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._store.set(iter, 0, group.get_shortname(), 1, group)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._store.set(iter, 0, group.get_shortname(), 1, tab)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self._set_default is None:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # If we haven't found the first page with actual settings on it<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # yet, then look for one here<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for element in group:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isinstance(element, settings.RadioSetting):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._set_default = self._store.get_path(iter), group<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for element in group:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not isinstance(element, RadioSetting):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._build_ui_group(element, iter)<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for element in group:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not isinstance(element, settings.RadioSetting):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._build_tree(element, iter)<br>+&nbsp;&nbsp;&nbsp; def _build_ui(self, settings):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not isinstance(settings, list):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise Exception("Invalid Radio Settings")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._settings = settings<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for group in settings:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._build_ui_group(group, None)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view.expand_all()<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp; def _build_ui_real(self, group):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not isinstance(group, settings.RadioSettingGroup):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Toplevel is not a group"<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br>-<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._set_default = None<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._top_setting_group = group<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._build_tree(group, None)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view.set_cursor(self._set_default[0])<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._build_ui_group(self._set_default[1])<br>-<br>-&nbsp;&nbsp;&nbsp; def _build_ui(self, group):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gobject.idle_add(self._build_ui_real, group)<br>+&nbsp;&nbsp;&nbsp; def _get_settings_cb(self, settings):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gobject.idle_add(self._build_ui, settings)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def _view_changed_cb(self, selection):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lst, iter) = selection.get_selected()<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group, = self._store.get(iter, 1)<br>-<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if group:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._build_ui_group(group)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tab, = self._store.get(iter, 1)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._notebook.set_current_page(tab)<br>\ No newline at end of file<br>diff -r 5a17f1c24b38 -r e8378ba87779 tests/run_tests<br>--- a/tests/run_tests&nbsp;Sun Feb 01 17:51:08 2015 -0500<br>+++ b/tests/run_tests&nbsp;Mon Feb 02 21:29:51 2015 -0800<br>@@ -24,7 +24,7 @@<br>&nbsp;<br>&nbsp;from chirp import CHIRP_VERSION<br>&nbsp;from chirp import *<br>-from chirp import chirp_common, directory, generic_csv, import_logic, memmap<br>+from chirp import chirp_common, directory, generic_csv, import_logic, memmap, settings<br>&nbsp;from chirp import errors<br>&nbsp;<br>&nbsp;TESTS = {}<br>@@ -523,13 +523,15 @@<br>&nbsp;<br>&nbsp;TESTS["Edges"] = TestCaseEdges<br>&nbsp;<br>-<br>&nbsp;class TestCaseSettings(TestCase):<br>&nbsp;&nbsp;&nbsp;&nbsp; def __str__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Settings"<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def do_get_settings(self, rf):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._wrapper.do("get_settings")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lst = self._wrapper.do("get_settings")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not isinstance(lst, list):<br>+&nbsp;&nbsp;&nbsp;&nbsp; raise TestFailedError("Invalid Radio Settings")<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._wrapper.do("set_settings", lst)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def run(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rf = self._wrapper.do("get_features")<br>@@ -537,7 +539,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not rf.has_settings:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise TestSkippedError("Settings not supported")<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.do_get_settings(rf)<br>+&nbsp;self.do_get_settings(rf)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return []<br>&nbsp;<br>&nbsp;<BR>                                               </div></body>
</html>