# HG changeset patch # User Zach Welch zach@mandolincreekfarm.com # Fake Node ID 2c6f7fe587c81205d06c1522f68246cf7299349e
Fix style issues (4/4) (#2355)
More low-hanging style issues.
diff --git a/chirp/bitwise_grammar.py b/chirp/bitwise_grammar.py index fe81b42..b6eb20c 100644 --- a/chirp/bitwise_grammar.py +++ b/chirp/bitwise_grammar.py @@ -21,63 +21,83 @@ TYPES = ["bit", "u8", "u16", "ul16", "u24", "ul24", "u32", "ul32", "lbcd", "bbcd"] DIRECTIVES = ["seekto", "seek", "printoffset"]
+ def string(): return re.compile(r""[^"]*"")
+ def symbol(): return re.compile(r"\w+")
+ def count(): return re.compile(r"([1-9][0-9]*|0x[0-9a-fA-F]+)")
+ def bitdef(): return symbol, ":", count, -1
+ def _bitdeflist(): return bitdef, -1, (",", bitdef)
+ def bitfield(): return -2, _bitdeflist
+ def array(): return symbol, '[', count, ']'
+ def _typedef(): return re.compile(r"(%s)" % "|".join(TYPES))
+ def definition(): return _typedef, [array, bitfield, symbol], ";"
+ def seekto(): return keyword("seekto"), count
+ def seek(): return keyword("seek"), count
+ def printoffset(): return keyword("printoffset"), string
+ def directive(): return "#", [seekto, seek, printoffset], ";"
+ def _block_inner(): return -2, [definition, struct, directive]
+ def _block(): return "{", _block_inner, "}"
+ def struct_defn(): return symbol, _block
+ def struct_decl(): return [symbol, _block], [array, symbol]
+ def struct(): return keyword("struct"), [struct_defn, struct_decl], ";"
+ def _language(): return _block_inner
+ def parse(data): lines = data.split("\n") for index, line in enumerate(lines): diff --git a/chirp/errors.py b/chirp/errors.py index 3fe1027..f4d9324 100644 --- a/chirp/errors.py +++ b/chirp/errors.py @@ -13,26 +13,32 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/.
+ class InvalidDataError(Exception): """The radio driver encountered some invalid data""" pass
+ class InvalidValueError(Exception): """An invalid value for a given parameter was used""" pass
+ class InvalidMemoryLocation(Exception): """The requested memory location does not exist""" pass
+ class RadioError(Exception): """An error occurred while talking to the radio""" pass
+ class UnsupportedToneError(Exception): """The radio does not support the specified tone value""" pass
+ class ImageDetectFailed(Exception): """The driver for the supplied image could not be determined""" pass diff --git a/chirp/generic_csv.py b/chirp/generic_csv.py index bf7ee1e..66a6005 100644 --- a/chirp/generic_csv.py +++ b/chirp/generic_csv.py @@ -18,10 +18,12 @@ import csv
from chirp import chirp_common, errors, directory
+ class OmittedHeaderError(Exception): """Internal exception to signal that a column has been omitted""" pass
+ def get_datum_by_header(headers, data, header): """Return the column corresponding to @headers[@header] from @data""" if header not in headers: @@ -30,8 +32,9 @@ def get_datum_by_header(headers, data, header): try: return data[headers.index(header)] except IndexError: - raise OmittedHeaderError("Header %s not provided on this line" % \ - header) + raise OmittedHeaderError("Header %s not provided on this line" % + header) +
def write_memory(writer, mem): """Write @mem using @writer if not empty""" @@ -39,6 +42,7 @@ def write_memory(writer, mem): return writer.writerow(mem.to_csv())
+ @directory.register class CSVRadio(chirp_common.FileBackedRadio, chirp_common.IcomDstarSupport): """A driver for Generic CSV files""" @@ -47,23 +51,23 @@ class CSVRadio(chirp_common.FileBackedRadio, chirp_common.IcomDstarSupport): FILE_EXTENSION = "csv"
ATTR_MAP = { - "Location" : (int, "number"), - "Name" : (str, "name"), - "Frequency" : (chirp_common.parse_freq, "freq"), - "Duplex" : (str, "duplex"), - "Offset" : (chirp_common.parse_freq, "offset"), - "Tone" : (str, "tmode"), - "rToneFreq" : (float, "rtone"), - "cToneFreq" : (float, "ctone"), - "DtcsCode" : (int, "dtcs"), - "DtcsPolarity" : (str, "dtcs_polarity"), - "Mode" : (str, "mode"), - "TStep" : (float, "tuning_step"), - "Skip" : (str, "skip"), - "URCALL" : (str, "dv_urcall"), - "RPT1CALL" : (str, "dv_rpt1call"), - "RPT2CALL" : (str, "dv_rpt2call"), - "Comment" : (str, "comment"), + "Location": (int, "number"), + "Name": (str, "name"), + "Frequency": (chirp_common.parse_freq, "freq"), + "Duplex": (str, "duplex"), + "Offset": (chirp_common.parse_freq, "offset"), + "Tone": (str, "tmode"), + "rToneFreq": (float, "rtone"), + "cToneFreq": (float, "ctone"), + "DtcsCode": (int, "dtcs"), + "DtcsPolarity": (str, "dtcs_polarity"), + "Mode": (str, "mode"), + "TStep": (float, "tuning_step"), + "Skip": (str, "skip"), + "URCALL": (str, "dv_urcall"), + "RPT1CALL": (str, "dv_rpt1call"), + "RPT2CALL": (str, "dv_rpt2call"), + "Comment": (str, "comment"), }
def _blank(self): @@ -118,7 +122,7 @@ class CSVRadio(chirp_common.FileBackedRadio, chirp_common.IcomDstarSupport): fname = "_clean_%s" % attr if hasattr(self, fname): mem = getattr(self, fname)(headers, line, mem) - + return mem
def _clean_tmode(self, headers, line, mem): @@ -189,7 +193,8 @@ class CSVRadio(chirp_common.FileBackedRadio, chirp_common.IcomDstarSupport): print "Line %i has %i columns, expected %i" % (lineno, len(line), len(header)) - self.errors.append("Column number mismatch on line %i" % lineno) + self.errors.append("Column number mismatch on line %i" % + lineno) continue
try: @@ -247,7 +252,7 @@ class CSVRadio(chirp_common.FileBackedRadio, chirp_common.IcomDstarSupport): return
delta += 1 - + for i in range(len(self.memories), len(self.memories) + delta + 1): mem = chirp_common.Memory() mem.empty = True @@ -313,7 +318,7 @@ class CommanderCSVRadio(CSVRadio): def _clean_duplex(self, headers, line, mem): try: txfreq = chirp_common.parse_freq( - get_datum_by_header(headers, line, "TX Freq")) + get_datum_by_header(headers, line, "TX Freq")) except ValueError: mem.duplex = "off" return mem @@ -325,7 +330,7 @@ class CommanderCSVRadio(CSVRadio): mem.offset = txfreq
return mem - + def _clean_tmode(self, headers, line, mem): rtone = get_datum_by_header(headers, line, "Encode") ctone = get_datum_by_header(headers, line, "Decode") @@ -356,7 +361,8 @@ class CommanderCSVRadio(CSVRadio): filedata.startswith("Name,RX Freq,TX Freq,Decode,Encode,TX Pwr," "Scan,TX Dev,Busy Lck,Group/Notes") or \ filedata.startswith('"#","Name","RX Freq","TX Freq","Decode",' - '"Encode","TX Pwr","Scan","TX Dev","Busy Lck","Group/Notes"') + '"Encode","TX Pwr","Scan","TX Dev",' + '"Busy Lck","Group/Notes"')
@directory.register @@ -372,7 +378,7 @@ class RTCSVRadio(CSVRadio): "Simplex": "", "Split": "split", } - + SKIP_MAP = { "Off": "", "On": "S", @@ -391,19 +397,25 @@ class RTCSVRadio(CSVRadio): }
ATTR_MAP = { - "Channel Number": (int, "number"), - "Receive Frequency":(chirp_common.parse_freq, "freq"), - "Offset Frequency": (chirp_common.parse_freq, "offset"), - "Offset Direction": (lambda v: RTCSVRadio.DUPLEX_MAP.get(v, v), "duplex"), - "Operating Mode": (str, "mode"), - "Name": (str, "name"), - "Tone Mode": (lambda v: RTCSVRadio.TMODE_MAP.get(v, v), "tmode"), - "CTCSS": (lambda v: float(v.split(" ")[0]), "rtone"), - "DCS": (int, "dtcs"), - "Skip": (lambda v: RTCSVRadio.SKIP_MAP.get(v, v), "skip"), - "Step": (lambda v: float(v.split(" ")[0]), "tuning_step"), - "Mask": (lambda v: RTCSVRadio.BOOL_MAP.get(v, v), "empty",), - "Comment": (str, "comment"), + "Channel Number": (int, "number"), + "Receive Frequency": (chirp_common.parse_freq, "freq"), + "Offset Frequency": (chirp_common.parse_freq, "offset"), + "Offset Direction": (lambda v: + RTCSVRadio.DUPLEX_MAP.get(v, v), "duplex"), + "Operating Mode": (str, "mode"), + "Name": (str, "name"), + "Tone Mode": (lambda v: + RTCSVRadio.TMODE_MAP.get(v, v), "tmode"), + "CTCSS": (lambda v: + float(v.split(" ")[0]), "rtone"), + "DCS": (int, "dtcs"), + "Skip": (lambda v: + RTCSVRadio.SKIP_MAP.get(v, v), "skip"), + "Step": (lambda v: + float(v.split(" ")[0]), "tuning_step"), + "Mask": (lambda v: + RTCSVRadio.BOOL_MAP.get(v, v), "empty",), + "Comment": (str, "comment"), }
def _clean_duplex(self, headers, line, mem): @@ -441,5 +453,6 @@ class RTCSVRadio(CSVRadio): # consistent across radio models. return filename.lower().endswith("." + cls.FILE_EXTENSION) and \ filedata.startswith("Channel Number,Receive Frequency," - "Transmit Frequency,Offset Frequency,Offset Direction," - "Operating Mode,Name,Tone Mode,CTCSS,DCS") + "Transmit Frequency,Offset Frequency," + "Offset Direction,Operating Mode," + "Name,Tone Mode,CTCSS,DCS") diff --git a/chirp/import_logic.py b/chirp/import_logic.py index b787378..04f81ba 100644 --- a/chirp/import_logic.py +++ b/chirp/import_logic.py @@ -15,14 +15,17 @@
from chirp import chirp_common, errors
+ class ImportError(Exception): """An import error""" pass
+ class DestNotCompatible(ImportError): """Memory is not compatible with the destination radio""" pass
+ def ensure_has_calls(radio, memory): """Make sure @radio has the necessary D-STAR callsigns for @memory""" ulist_changed = rlist_changed = False @@ -62,10 +65,12 @@ def ensure_has_calls(radio, memory): if rlist_changed: radio.set_repeater_call_list(rlist)
+ # Filter the name according to the destination's rules def _import_name(dst_radio, _srcrf, mem): mem.name = dst_radio.filter_name(mem.name)
+ def _import_power(dst_radio, _srcrf, mem): levels = dst_radio.get_features().valid_power_levels if not levels: @@ -75,7 +80,7 @@ def _import_power(dst_radio, _srcrf, mem): # Source radio did not support power levels, so choose the # first (highest) level from the destination radio. mem.power = levels[0] - return + return
# If both radios support power levels, we need to decide how to # convert the source power level to a valid one for the destination @@ -86,6 +91,7 @@ def _import_power(dst_radio, _srcrf, mem): deltas = [abs(mem.power - power) for power in levels] mem.power = levels[deltas.index(min(deltas))]
+ def _import_tone(dst_radio, srcrf, mem): dstrf = dst_radio.get_features()
@@ -104,6 +110,7 @@ def _import_tone(dst_radio, srcrf, mem): if mem.tmode == "TSQL": mem.ctone = mem.rtone
+ def _import_dtcs(dst_radio, srcrf, mem): dstrf = dst_radio.get_features()
@@ -122,6 +129,7 @@ def _import_dtcs(dst_radio, srcrf, mem): if mem.tmode == "DTCS": mem.rx_dtcs = mem.dtcs
+ def _guess_mode_by_frequency(freq): ranges = [ (0, 136000000, "AM"), @@ -135,6 +143,7 @@ def _guess_mode_by_frequency(freq): # If we don't know, assume FM return "FM"
+ def _import_mode(dst_radio, srcrf, mem): dstrf = dst_radio.get_features()
@@ -148,9 +157,10 @@ def _import_mode(dst_radio, srcrf, mem): raise DestNotCompatible("Destination does not support %s" % mode) mem.mode = mode
+ def _make_offset_with_split(rxfreq, txfreq): offset = txfreq - rxfreq - + if offset == 0: return "", offset elif offset > 0: @@ -158,24 +168,25 @@ def _make_offset_with_split(rxfreq, txfreq): elif offset < 0: return "-", offset * -1
+ def _import_duplex(dst_radio, srcrf, mem): dstrf = dst_radio.get_features()
# If a radio does not support odd split, we can use an equivalent offset if mem.duplex == "split" and mem.duplex not in dstrf.valid_duplexes: mem.duplex, mem.offset = _make_offset_with_split(mem.freq, mem.offset) - + # Enforce maximum offset - ranges = [ - ( 0, 500000000, 15000000), - (500000000, 3000000000, 50000000), - ] + ranges = [(0, 500000000, 15000000), + (500000000, 3000000000, 50000000), + ] for lo, hi, limit in ranges: if lo < mem.freq <= hi: if abs(mem.offset) > limit: raise DestNotCompatible("Unable to create import memory: " "offset is abnormally large.")
+ def import_mem(dst_radio, src_features, src_mem, overrides={}): """Perform import logic to create a destination memory from src_mem that will be compatible with @dst_radio""" @@ -183,7 +194,8 @@ def import_mem(dst_radio, src_features, src_mem, overrides={}):
if isinstance(src_mem, chirp_common.DVMemory): if not isinstance(dst_radio, chirp_common.IcomDstarSupport): - raise DestNotCompatible("Destination radio does not support D-STAR") + raise DestNotCompatible( + "Destination radio does not support D-STAR") if dst_rf.requires_call_lists: ensure_has_calls(dst_radio, src_mem)
@@ -206,17 +218,19 @@ def import_mem(dst_radio, src_features, src_mem, overrides={}): msgs = dst_radio.validate_memory(dst_mem) errs = [x for x in msgs if isinstance(x, chirp_common.ValidationError)] if errs: - raise DestNotCompatible("Unable to create import memory: %s" %\ - ", ".join(errs)) + raise DestNotCompatible("Unable to create import memory: %s" % + ", ".join(errs))
return dst_mem
+ def _get_bank_model(radio): for model in radio.get_mapping_models(): if isinstance(model, chirp_common.BankModel): return model return None
+ def import_bank(dst_radio, src_radio, dst_mem, src_mem): """Attempt to set the same banks for @mem(by index) in @dst_radio that it has in @src_radio""" diff --git a/chirp/platform.py b/chirp/platform.py index 313dfbd..5429ebc 100644 --- a/chirp/platform.py +++ b/chirp/platform.py @@ -19,6 +19,7 @@ import glob import re from subprocess import Popen
+ def win32_comports_bruteforce(): import win32file import win32con @@ -36,7 +37,7 @@ def win32_comports_bruteforce(): win32con.OPEN_EXISTING, 0, None) - ports.append((portname,"Unknown","Serial")) + ports.append((portname, "Unknown", "Serial")) win32file.CloseHandle(port) port = None except Exception, e: @@ -44,19 +45,23 @@ def win32_comports_bruteforce():
return ports
+ try: from serial.tools.list_ports import comports except: comports = win32_comports_bruteforce
+ def _find_me(): return sys.modules["chirp.platform"].__file__
+ def natural_sorted(l): convert = lambda text: int(text) if text.isdigit() else text.lower() natural_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] return sorted(l, key=natural_key)
+ class Platform: """Base class for platform-specific functions"""
@@ -229,6 +234,7 @@ class Platform: return os.path.dirname(os.path.abspath(os.path.join(_find_me(), "..")))
+ def _unix_editor(): macos_textedit = "/Applications/TextEdit.app/Contents/MacOS/TextEdit"
@@ -237,23 +243,24 @@ def _unix_editor(): else: return "gedit"
+ class UnixPlatform(Platform): """A platform module suitable for UNIX systems""" def __init__(self, basepath): if not basepath: basepath = os.path.abspath(os.path.join(self.default_dir(), ".chirp")) - + if not os.path.isdir(basepath): os.mkdir(basepath)
Platform.__init__(self, basepath)
- # This is a hack that needs to be properly fixed by importing the - # latest changes to this module from d-rats. In the interest of - # time, however, I'll throw it here + # This is a hack that needs to be properly fixed by importing the + # latest changes to this module from d-rats. In the interest of + # time, however, I'll throw it here if sys.platform == "darwin": - if not os.environ.has_key("DISPLAY"): + if "DISPLAY" not in os.environ: print "Forcing DISPLAY for MacOS" os.environ["DISPLAY"] = ":0"
@@ -302,6 +309,7 @@ class UnixPlatform(Platform):
return ver
+ class Win32Platform(Platform): """A platform module suitable for Windows systems""" def __init__(self, basepath=None): @@ -362,7 +370,7 @@ class Win32Platform(Platform): def gui_save_file(self, start_dir=None, default_name=None, types=[]): import win32gui import win32api - + (pform, _, _, _, _) = win32api.GetVersionEx()
typestrs = "" @@ -405,14 +413,16 @@ class Win32Platform(Platform): def os_version_string(self): import win32api
- vers = { 4: "Win2k", - 5: "WinXP", - 6: "WinVista/7", - } + vers = {4: "Win2k", + 5: "WinXP", + 6: "WinVista/7", + }
(pform, sub, build, _, _) = win32api.GetVersionEx()
- return vers.get(pform, "Win32 (Unknown %i.%i:%i)" % (pform, sub, build)) + return vers.get(pform, + "Win32 (Unknown %i.%i:%i)" % (pform, sub, build)) +
def _get_platform(basepath): if os.name == "nt": @@ -421,6 +431,8 @@ def _get_platform(basepath): return UnixPlatform(basepath)
PLATFORM = None + + def get_platform(basepath=None): """Return the platform singleton""" global PLATFORM @@ -430,6 +442,7 @@ def get_platform(basepath=None):
return PLATFORM
+ def _do_test(): __pform = get_platform()
diff --git a/chirp/xml_ll.py b/chirp/xml_ll.py index 28ec333..8713507 100644 --- a/chirp/xml_ll.py +++ b/chirp/xml_ll.py @@ -17,6 +17,7 @@ import re
from chirp import chirp_common, errors
+ def get_memory(doc, number): """Extract a Memory object from @doc""" ctx = doc.xpathNewContext() @@ -59,7 +60,7 @@ def get_memory(doc, number): mem.ctone = float(_get("/squelch[@id='ctone']/tone/text()")) mem.dtcs = int(_get("/squelch[@id='dtcs']/code/text()"), 10) mem.dtcs_polarity = _get("/squelch[@id='dtcs']/polarity/text()") - + try: sql = _get("/squelchSetting/text()") if sql == "rtone": @@ -73,7 +74,7 @@ def get_memory(doc, number): except IndexError: mem.tmode = ""
- dmap = {"positive" : "+", "negative" : "-", "none" : ""} + dmap = {"positive": "+", "negative": "-", "none": ""} dupx = _get("/duplex/text()") mem.duplex = dmap.get(dupx, "")
@@ -97,6 +98,7 @@ def get_memory(doc, number):
return mem
+ def set_memory(doc, mem): """Set @mem in @doc""" ctx = doc.xpathNewContext() @@ -121,11 +123,11 @@ def set_memory(doc, mem): lname_filter = "[^.A-Za-z0-9/ >-]" lname = memnode.newChild(None, "longName", None) lname.addContent(re.sub(lname_filter, "", mem.name[:16])) - + freq = memnode.newChild(None, "frequency", None) freq.newProp("units", "MHz") freq.addContent(chirp_common.format_freq(mem.freq)) - + rtone = memnode.newChild(None, "squelch", None) rtone.newProp("id", "rtone") rtone.newProp("type", "repeater") @@ -154,7 +156,7 @@ def set_memory(doc, mem): elif mem.tmode == "DTCS": sset.addContent("dtcs")
- dmap = {"+" : "positive", "-" : "negative", "" : "none"} + dmap = {"+": "positive", "-": "negative", "": "none"} dupx = memnode.newChild(None, "duplex", None) dupx.addContent(dmap[mem.duplex])
@@ -168,7 +170,7 @@ def set_memory(doc, mem): step = memnode.newChild(None, "tuningStep", None) step.newProp("units", "kHz") step.addContent("%.5f" % mem.tuning_step) - + if mem.skip: skip = memnode.newChild(None, "skip", None) skip.addContent(mem.skip) @@ -197,6 +199,7 @@ def set_memory(doc, mem): dc = dv.newChild(None, "digitalCode", None) dc.addContent(str(mem.dv_code))
+ def del_memory(doc, number): """Remove memory @number from @doc""" path = "//radio/memories/memory[@location=%i]" % number @@ -205,13 +208,15 @@ def del_memory(doc, number):
for field in fields: field.unlinkNode() - + + def _get_bank(node): bank = chirp_common.Bank(node.prop("label")) ident = int(node.prop("id"))
return ident, bank
+ def get_banks(doc): """Return a list of banks from @doc""" path = "//radio/banks/bank" @@ -229,6 +234,7 @@ def get_banks(doc):
return [x[1] for x in banks]
+ def set_banks(doc, banklist): """Set the list of banks in @doc""" path = "//radio/banks/bank" diff --git a/chirpui/bankedit.py b/chirpui/bankedit.py index 19ea3e3..009f726 100644 --- a/chirpui/bankedit.py +++ b/chirpui/bankedit.py @@ -22,6 +22,7 @@ from gobject import TYPE_INT, TYPE_STRING, TYPE_BOOLEAN from chirp import chirp_common from chirpui import common, miscwidgets
+ class MappingNamesJob(common.RadioJob): def __init__(self, model, editor, cb): common.RadioJob.__init__(self, cb, None) @@ -37,6 +38,7 @@ class MappingNamesJob(common.RadioJob):
gobject.idle_add(self.cb, *self.cb_args)
+ class MappingNameEditor(common.Editor): def refresh(self): def got_mappings(): @@ -117,6 +119,7 @@ class MappingNameEditor(common.Editor): def mappings_changed(self): pass
+ class MemoryMappingsJob(common.RadioJob): def __init__(self, model, cb, number): common.RadioJob.__init__(self, cb, None) @@ -137,6 +140,7 @@ class MemoryMappingsJob(common.RadioJob): indexes.append(self.__model.get_memory_index(mem, mapping)) self.cb(mem, mappings, indexes, *self.cb_args)
+ class MappingMembershipEditor(common.Editor): def _number_to_path(self, number): return (number - self._rf.memory_bounds[0],) @@ -160,9 +164,9 @@ class MappingMembershipEditor(common.Editor): indexes.sort() for i in range(0, num_indexes): if i not in indexes: - return i + index_bounds[0] # In case not zero-origin index + return i + index_bounds[0] # In case not zero-origin index
- return 0 # If the mapping is full, just wrap around! + return 0 # If the mapping is full, just wrap around!
def _toggled_cb(self, rend, path, colnum): try: @@ -233,7 +237,7 @@ class MappingMembershipEditor(common.Editor):
def _index_edited_cb(self, rend, path, new): loc, = self._store.get(self._store.get_iter(path), self.C_LOC) - + def refresh_memory(*args): self.refresh_memory(loc)
@@ -261,7 +265,7 @@ class MappingMembershipEditor(common.Editor): job = common.RadioJob(get_mapping, "get_memory", loc) job.set_desc(_("Getting memory {num}").format(num=loc)) self.rthread.submit(job) - + def __init__(self, rthread, editorset, model): super(MappingMembershipEditor, self).__init__(rthread)
@@ -278,16 +282,16 @@ class MappingMembershipEditor(common.Editor): ]
self._cols = [ - ("_filled", TYPE_BOOLEAN, None, ), + ("_filled", TYPE_BOOLEAN, None, ), ] + self._view_cols
self.C_FILLED = 0 - self.C_LOC = 1 - self.C_FREQ = 2 - self.C_NAME = 3 - self.C_INDEX = 4 - self.C_MAPPINGS = 5 # and beyond - + self.C_LOC = 1 + self.C_FREQ = 2 + self.C_NAME = 3 + self.C_INDEX = 4 + self.C_MAPPINGS = 5 # and beyond + cols = list(self._cols)
self._index_cache = [] @@ -296,7 +300,7 @@ class MappingMembershipEditor(common.Editor): label = "%s %i" % (self._type, (i+1)) cols.append((label, TYPE_BOOLEAN, gtk.CellRendererToggle))
- self._store = gtk.ListStore(*tuple([y for x,y,z in cols])) + self._store = gtk.ListStore(*tuple([y for x, y, z in cols])) self._view = gtk.TreeView(self._store)
is_indexed = isinstance(self._model, @@ -361,7 +365,7 @@ class MappingMembershipEditor(common.Editor): for i in range(0, len(self.mappings)): row.append(i + len(self._cols)) row.append(self.mappings[i][0] in mappings) - + self._store.set(iter, *tuple(row))
job = MemoryMappingsJob(self._model, got_mem, number) @@ -374,8 +378,7 @@ class MappingMembershipEditor(common.Editor): (min, max) = self._rf.memory_bounds for i in range(min, max+1): self.refresh_memory(i) - print "Got all %s info in %s" % (self._type, - (time.time() - start)) + print "Got all %s info in %s" % (self._type, (time.time() - start))
def refresh_mappings(self, and_memories=False): def got_mappings(): diff --git a/chirpui/radiobrowser.py b/chirpui/radiobrowser.py index a11d810..14673f9 100644 --- a/chirpui/radiobrowser.py +++ b/chirpui/radiobrowser.py @@ -9,6 +9,7 @@ from chirpui import common, config
CONF = config.get()
+ def do_insert_line_with_tags(b, line): def i(text, *tags): b.insert_with_tags_by_name(b.get_end_iter(), text, *tags) @@ -63,6 +64,7 @@ def do_insert_line_with_tags(b, line):
i(line)
+ def do_insert_with_tags(buf, text): buf.set_text('') lines = text.split(os.linesep) @@ -70,12 +72,15 @@ def do_insert_with_tags(buf, text): do_insert_line_with_tags(buf, line) buf.insert_with_tags_by_name(buf.get_end_iter(), os.linesep)
+ def classname(obj): return str(obj.__class__).split('.')[-1]
+ def bitwise_type(classname): return classname.split("DataElement")[0]
+ class FixedEntry(gtk.Entry): def __init__(self, *args, **kwargs): super(FixedEntry, self).__init__(*args, **kwargs) @@ -91,6 +96,7 @@ class FixedEntry(gtk.Entry): fontdesc = pango.FontDescription("Courier bold %i" % fontsize) self.modify_font(fontdesc)
+ class IntegerEntry(FixedEntry): def _colorize(self, _self): value = self.get_text() @@ -106,12 +112,14 @@ class IntegerEntry(FixedEntry): super(IntegerEntry, self).__init__(*args, **kwargs) self.connect("changed", self._colorize)
+ class BitwiseEditor(gtk.HBox): def __init__(self, element): super(BitwiseEditor, self).__init__(False, 3) self._element = element self._build_ui()
+ class IntegerEditor(BitwiseEditor): def _changed(self, entry, base): if not self._update: @@ -150,6 +158,7 @@ class IntegerEditor(BitwiseEditor): ent.show() self._update_entries()
+ class BCDArrayEditor(BitwiseEditor): def _changed(self, entry, hexent): self._element.set_value(int(entry.get_text())) @@ -183,6 +192,7 @@ class BCDArrayEditor(BitwiseEditor): ent.connect('changed', self._changed, hexent) self._format_hexent(hexent)
+ class CharArrayEditor(BitwiseEditor): def _changed(self, entry): self._element.set_value(entry.get_text().ljust(len(self._element))) @@ -194,6 +204,7 @@ class CharArrayEditor(BitwiseEditor): ent.show() self.pack_start(ent, 1, 1, 1)
+ class OtherEditor(BitwiseEditor): def _build_ui(self): name = classname(self._element) @@ -207,6 +218,7 @@ class OtherEditor(BitwiseEditor): l.show() self.pack_start(l, 1, 1, 1)
+ class RadioBrowser(common.Editor): def _build_ui(self): self._display = gtk.Table(20, 2) @@ -287,7 +299,7 @@ class RadioBrowser(common.Editor): pack(l, 0)
if (isinstance(item, bitwise.intDataElement) or - isinstance(item, bitwise.bcdDataElement)): + isinstance(item, bitwise.bcdDataElement)): e = IntegerEditor(item) elif (isinstance(item, bitwise.arrayDataElement) and isinstance(item[0], bitwise.bcdDataElement)): @@ -301,7 +313,6 @@ class RadioBrowser(common.Editor): pack(e, 1) next_row()
- def __init__(self, rthread): super(RadioBrowser, self).__init__(rthread) self._radio = rthread.radio @@ -317,14 +328,17 @@ class RadioBrowser(common.Editor): self.emit("changed") self._focused = False
+ if __name__ == "__main__": from chirp import * from chirp import directory import sys
r = directory.get_radio_by_image(sys.argv[1]) + class Foo: radio = r + w = gtk.Window() b = RadioBrowser(Foo) w.set_default_size(1024, 768) diff --git a/chirpui/settingsedit.py b/chirpui/settingsedit.py index 69bbadf..76264c9 100644 --- a/chirpui/settingsedit.py +++ b/chirpui/settingsedit.py @@ -20,11 +20,13 @@ from chirp import chirp_common from chirp import settings from chirpui import common, miscwidgets
+ class RadioSettingProxy(settings.RadioSetting): def __init__(self, setting, editor): self._setting = setting self._editor = editor
+ class SettingsEditor(common.Editor): def __init__(self, rthread): super(SettingsEditor, self).__init__(rthread) @@ -36,13 +38,14 @@ class SettingsEditor(common.Editor): paned = gtk.HPaned() paned.show() self.root.pack_start(paned, 1, 1, 0) - + # The selection tree self._store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_INT) self._view = gtk.TreeView(self._store) self._view.set_size_request(150, -1) self._view.get_selection().connect("changed", self._view_changed_cb) - self._view.append_column(gtk.TreeViewColumn("", gtk.CellRendererText(), text=0)) + self._view.append_column( + gtk.TreeViewColumn("", gtk.CellRendererText(), text=0)) self._view.show() paned.pack1(self._view)
@@ -88,9 +91,8 @@ class SettingsEditor(common.Editor): elif isinstance(value, settings.RadioSettingValueString): value.set_value(widget.get_text()) else: - print "Unsupported widget type %s for %s" % (\ - element.value.__class__, - element.get_name()) + print "Unsupported widget type %s for %s" % \ + (element.value.__class__, element.get_name())
self._changed = True self._save_settings() @@ -127,7 +129,9 @@ class SettingsEditor(common.Editor): label.set_alignment(0.0, 0.5) label.show()
- table.attach(label, 0, 1, row, row+1, xoptions=gtk.FILL, yoptions=0, xpadding=6, ypadding=3) + table.attach(label, 0, 1, row, row + 1, + xoptions=gtk.FILL, yoptions=0, + xpadding=6, ypadding=3)
if isinstance(element.value, list) and \ isinstance(element.value[0], @@ -138,7 +142,9 @@ class SettingsEditor(common.Editor):
# Widget container box.show() - table.attach(box, 1, 2, row, row+1, xoptions=gtk.FILL, yoptions=0, xpadding=12, ypadding=3) + table.attach(box, 1, 2, row, row + 1, + xoptions=gtk.FILL, yoptions=0, + xpadding=12, ypadding=3)
for i in element.keys(): value = element[i] @@ -154,7 +160,7 @@ class SettingsEditor(common.Editor): widget.set_width_chars(16) widget.set_text(value.format()) widget.connect("focus-out-event", lambda w, e, v: - self._save_setting(w, v), value) + self._save_setting(w, v), value) elif isinstance(value, settings.RadioSettingValueBoolean): widget = gtk.CheckButton(_("Enabled")) widget.set_active(value.get_value()) @@ -179,7 +185,7 @@ class SettingsEditor(common.Editor):
widget.set_sensitive(value.get_mutable()) widget.show() - + box.pack_start(widget, 1, 1, 1)
row += 1 @@ -187,12 +193,11 @@ class SettingsEditor(common.Editor): return tab
def _build_ui_group(self, group, parent): - tab = self._build_ui_tab(group) - + iter = self._store.append(parent) self._store.set(iter, 0, group.get_shortname(), 1, tab) - + for element in group: if not isinstance(element, settings.RadioSetting): self._build_ui_group(element, iter) @@ -213,4 +218,4 @@ class SettingsEditor(common.Editor): def _view_changed_cb(self, selection): (lst, iter) = selection.get_selected() tab, = self._store.get(iter, 1) - self._notebook.set_current_page(tab) \ No newline at end of file + self._notebook.set_current_page(tab) diff --git a/tools/cpep8.blacklist b/tools/cpep8.blacklist index 39b452f..91f4275 100644 --- a/tools/cpep8.blacklist +++ b/tools/cpep8.blacklist @@ -12,11 +12,9 @@ ./chirp/bandplan_na.py ./chirp/baofeng_uv3r.py ./chirp/bitwise.py -./chirp/bitwise_grammar.py ./chirp/bjuv55.py ./chirp/chirp_common.py ./chirp/elib_intl.py -./chirp/errors.py ./chirp/ft1802.py ./chirp/ft1d.py ./chirp/ft2800.py @@ -28,7 +26,6 @@ ./chirp/ft857.py ./chirp/ft90.py ./chirp/ftm350.py -./chirp/generic_csv.py ./chirp/h777.py ./chirp/ic208.py ./chirp/ic2100.py @@ -51,14 +48,12 @@ ./chirp/id800.py ./chirp/id880.py ./chirp/idrp.py -./chirp/import_logic.py ./chirp/kenwood_hmk.py ./chirp/kenwood_itm.py ./chirp/kenwood_live.py ./chirp/kguv8d.py ./chirp/kyd.py ./chirp/leixen.py -./chirp/platform.py ./chirp/puxing.py ./chirp/pyPEG.py ./chirp/rfinder.py @@ -85,9 +80,7 @@ ./chirp/vxa700.py ./chirp/wouxun.py ./chirp/wouxun_common.py -./chirp/xml_ll.py ./chirp/yaesu_clone.py -./chirpui/bankedit.py ./chirpui/common.py ./chirpui/editorset.py ./chirpui/fips.py @@ -96,9 +89,7 @@ ./chirpui/memdetail.py ./chirpui/memedit.py ./chirpui/miscwidgets.py -./chirpui/radiobrowser.py ./chirpui/reporting.py -./chirpui/settingsedit.py ./csvdump/csvapp.py ./csvdump/csvdump.py ./setup.py