From a083042002a8dec886cfee24a9a395a27c3f64dc Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 8 Feb 2021 15:16:04 +0100 Subject: [PATCH] implement display of Q65 mode matrix --- htdocs/css/admin.css | 8 ++++++ owrx/controllers/settings.py | 3 ++- owrx/form/__init__.py | 48 +++++++++++++++++++++++++++++++++++- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/htdocs/css/admin.css b/htdocs/css/admin.css index 1244728..8457124 100644 --- a/htdocs/css/admin.css +++ b/htdocs/css/admin.css @@ -24,4 +24,12 @@ h1 { margin: 1em 0; text-align: center; +} + +.matrix { + display: grid; +} + +.q65-matrix { + grid-template-columns: repeat(5, auto); } \ No newline at end of file diff --git a/owrx/controllers/settings.py b/owrx/controllers/settings.py index def68a9..38b6f65 100644 --- a/owrx/controllers/settings.py +++ b/owrx/controllers/settings.py @@ -18,6 +18,7 @@ from owrx.form import ( OptionalConverter, AprsBeaconSymbols, AprsAntennaDirections, + Q65ModeMatrix, ) from urllib.parse import quote from owrx.wsjt import Fst4Profile, Fst4wProfile @@ -239,7 +240,7 @@ class GeneralSettingsController(AdminController): "Enabled FST4W intervals", [Option(v, "{}s".format(v)) for v in Fst4wProfile.availableIntervals], ), - # TODO: q65_enabled_combinations + Q65ModeMatrix("q65_enabled_combinations", "Enabled Q65 Mode combinations"), ), Section( "Background decoding", diff --git a/owrx/form/__init__.py b/owrx/form/__init__.py index 551ea41..bdbbaf3 100644 --- a/owrx/form/__init__.py +++ b/owrx/form/__init__.py @@ -1,6 +1,7 @@ from abc import ABC, abstractmethod from owrx.modes import Modes from owrx.config import Config +from owrx.wsjt import Q65Mode, Q65Profile from enum import Enum @@ -316,6 +317,51 @@ class DropdownInput(Input): return "".join(options) +class Q65ModeConverter(Converter): + def convert_to_form(self, value): + pass + + def convert_from_form(self, value): + pass + + +class Q65ModeMatrix(Input): + def checkbox_id(self, mode, interval): + return "{0}-{1}-{2}".format(self.id, mode.value, interval) + + def render_checkbox(self, mode, interval, value): + return """ +
+ + +
+ """.format( + id=self.checkbox_id(mode, interval), + classes=self.input_classes(), + checked="checked" if [interval, mode.name] in value else "", + checkboxText="Mode {} interval {}s".format(mode.name, interval), + ) + + def render_input(self, value): + checkboxes = "".join( + self.render_checkbox(mode, interval, value) + for interval in Q65Profile.availableIntervals + for mode in Q65Mode + ) + return """ +
+ {checkboxes} +
+ """.format( + checkboxes=checkboxes + ) + + def input_classes(self): + return " ".join(["form-check", "form-control-sm"]) + + class DropdownEnum(Enum): def toOption(self): return Option(self.name, str(self)) @@ -344,7 +390,7 @@ class WfmTauValues(DropdownEnum): return obj def __str__(self): - return "{}µs ({})".format(int(self.value * 1E6), self.description) + return "{}µs ({})".format(int(self.value * 1e6), self.description) class AprsBeaconSymbols(DropdownEnum):