implement display of Q65 mode matrix
This commit is contained in:
parent
ce48892173
commit
a083042002
@ -25,3 +25,11 @@ h1 {
|
|||||||
margin: 1em 0;
|
margin: 1em 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.matrix {
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.q65-matrix {
|
||||||
|
grid-template-columns: repeat(5, auto);
|
||||||
|
}
|
@ -18,6 +18,7 @@ from owrx.form import (
|
|||||||
OptionalConverter,
|
OptionalConverter,
|
||||||
AprsBeaconSymbols,
|
AprsBeaconSymbols,
|
||||||
AprsAntennaDirections,
|
AprsAntennaDirections,
|
||||||
|
Q65ModeMatrix,
|
||||||
)
|
)
|
||||||
from urllib.parse import quote
|
from urllib.parse import quote
|
||||||
from owrx.wsjt import Fst4Profile, Fst4wProfile
|
from owrx.wsjt import Fst4Profile, Fst4wProfile
|
||||||
@ -239,7 +240,7 @@ class GeneralSettingsController(AdminController):
|
|||||||
"Enabled FST4W intervals",
|
"Enabled FST4W intervals",
|
||||||
[Option(v, "{}s".format(v)) for v in Fst4wProfile.availableIntervals],
|
[Option(v, "{}s".format(v)) for v in Fst4wProfile.availableIntervals],
|
||||||
),
|
),
|
||||||
# TODO: q65_enabled_combinations
|
Q65ModeMatrix("q65_enabled_combinations", "Enabled Q65 Mode combinations"),
|
||||||
),
|
),
|
||||||
Section(
|
Section(
|
||||||
"Background decoding",
|
"Background decoding",
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from owrx.modes import Modes
|
from owrx.modes import Modes
|
||||||
from owrx.config import Config
|
from owrx.config import Config
|
||||||
|
from owrx.wsjt import Q65Mode, Q65Profile
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
@ -316,6 +317,51 @@ class DropdownInput(Input):
|
|||||||
return "".join(options)
|
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 """
|
||||||
|
<div class="{classes}">
|
||||||
|
<input class="form-check-input" type="checkbox" id="{id}" name="{id}" {checked}>
|
||||||
|
<label class="form-check-label" for="{id}">
|
||||||
|
{checkboxText}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
""".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 """
|
||||||
|
<div class="matrix q65-matrix">
|
||||||
|
{checkboxes}
|
||||||
|
</div>
|
||||||
|
""".format(
|
||||||
|
checkboxes=checkboxes
|
||||||
|
)
|
||||||
|
|
||||||
|
def input_classes(self):
|
||||||
|
return " ".join(["form-check", "form-control-sm"])
|
||||||
|
|
||||||
|
|
||||||
class DropdownEnum(Enum):
|
class DropdownEnum(Enum):
|
||||||
def toOption(self):
|
def toOption(self):
|
||||||
return Option(self.name, str(self))
|
return Option(self.name, str(self))
|
||||||
@ -344,7 +390,7 @@ class WfmTauValues(DropdownEnum):
|
|||||||
return obj
|
return obj
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "{}µs ({})".format(int(self.value * 1E6), self.description)
|
return "{}µs ({})".format(int(self.value * 1e6), self.description)
|
||||||
|
|
||||||
|
|
||||||
class AprsBeaconSymbols(DropdownEnum):
|
class AprsBeaconSymbols(DropdownEnum):
|
||||||
|
Loading…
Reference in New Issue
Block a user