60 : wxFrame(parent, wxID_ANY, _(
"Data Monitor: colours setup")),
61 m_top_panel(
nullptr) {
62 wxWindow::SetName(kDialogName);
63 auto on_apply = [&] { m_top_panel->Apply(); };
68 auto on_cancel = [&] {
69 m_top_panel->Cancel();
72 auto vbox =
new wxBoxSizer(wxVERTICAL);
73 auto buttons =
new ButtonSizer(
this, on_ok, on_apply, on_cancel);
74 m_top_panel =
new TopPanel(
this);
75 vbox->Add(m_top_panel, wxSizerFlags(1).Border().Expand());
76 vbox->Add(
new wxStaticLine(
this, wxID_ANY), wxSizerFlags(0).Expand());
77 vbox->Add(buttons, wxSizerFlags(0).Expand().Border());
83 using ButtonHandler = std::function<void()>;
88 StoredConfig() { Load(); }
91 dm_dropped = g_dm_dropped;
92 dm_filtered = g_dm_filtered;
93 dm_input = g_dm_input;
94 dm_not_ok = g_dm_not_ok;
96 dm_output = g_dm_output;
100 g_dm_dropped = WorkValue(dm_dropped, kDroppedStatus);
101 g_dm_filtered = WorkValue(dm_filtered, kNoOutputStatus);
102 g_dm_input = WorkValue(dm_input, kInputStatus);
103 g_dm_not_ok = WorkValue(dm_not_ok, kNotOkStatus);
104 g_dm_ok = WorkValue(dm_ok, kOkStatus);
105 g_dm_output = WorkValue(dm_output, kOutputStatus);
110 unsigned dm_filtered;
118 unsigned WorkValue(
unsigned stored_value,
NavmsgStatus ns) {
119 if (stored_value == kUndefinedColor)
return default_colors(ns).GetRGB();
125 class TopPanel :
public wxPanel {
127 explicit TopPanel(wxWindow* parent) : wxPanel(parent) {
128 auto grid =
new wxGridSizer(2);
130 m_msg_ok_pick = AddGridRow(grid, _(
"Input - OK"), kOkStatus);
131 m_msg_not_ok_pick = AddGridRow(grid, _(
"Errors"), kNotOkStatus);
132 m_msg_filtered_pick =
133 AddGridRow(grid, _(
"Filtered, no output"), kNoOutputStatus);
135 AddGridRow(grid, _(
"Filtered, dropped"), kDroppedStatus);
136 m_msg_output_pick = AddGridRow(grid, _(
"Output"), kOutputStatus);
137 m_msg_input_pick = AddGridRow(grid, _(
"Input event"), kInputStatus);
139 auto reset_btn =
new wxButton(
this, wxID_UNDO, _(
"Restore defaults"));
140 reset_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED,
141 [&](wxCommandEvent&) { Reset(); });
142 grid->Add(reset_btn);
149 g_dm_ok = m_msg_ok_pick->GetRgb();
150 g_dm_not_ok = m_msg_not_ok_pick->GetRgb();
151 g_dm_filtered = m_msg_filtered_pick->GetRgb();
152 g_dm_dropped = m_msg_dropped_pick->GetRgb();
153 g_dm_output = m_msg_output_pick->GetRgb();
154 g_dm_input = m_msg_input_pick->GetRgb();
160 m_stored_config.Unload();
161 m_msg_ok_pick->SetColor(g_dm_ok);
162 m_msg_not_ok_pick->SetColor(g_dm_not_ok);
163 m_msg_filtered_pick->SetColor(g_dm_filtered);
164 m_msg_dropped_pick->SetColor(g_dm_dropped);
165 m_msg_output_pick->SetColor(g_dm_output);
166 m_msg_input_pick->SetColor(g_dm_input);
171 m_msg_ok_pick->SetColour(m_std_colors(kOkStatus));
172 m_msg_not_ok_pick->SetColour(m_std_colors(kNotOkStatus));
173 m_msg_filtered_pick->SetColour(m_std_colors(kNoOutputStatus));
174 m_msg_dropped_pick->SetColour(m_std_colors(kDroppedStatus));
175 m_msg_output_pick->SetColour(m_std_colors(kOutputStatus));
176 m_msg_input_pick->SetColour(m_std_colors(kInputStatus));
177 m_stored_config.Load();
182 class ColorPicker :
public wxColourPickerCtrl {
184 ColorPicker(wxWindow* parent,
const wxColour& c)
185 : wxColourPickerCtrl(parent, wxID_ANY, c) {}
187 void SetColor(
unsigned rgb) { SetColour(wxColour(rgb)); }
189 [[nodiscard]]
unsigned GetRgb()
const {
190 return static_cast<unsigned>(GetColour().GetRGB());
194 ColorPicker* m_msg_ok_pick;
195 ColorPicker* m_msg_not_ok_pick;
196 ColorPicker* m_msg_filtered_pick;
197 ColorPicker* m_msg_dropped_pick;
198 ColorPicker* m_msg_output_pick;
199 ColorPicker* m_msg_input_pick;
203 StoredConfig m_stored_config;
205 ColorPicker* AddGridRow(wxGridSizer* grid,
const char* label,
207 grid->Add(
new wxStaticText(
this, wxID_ANY, label));
208 auto picker =
new ColorPicker(
this, m_colors(ns));
215 class ButtonSizer :
public wxStdDialogButtonSizer {
217 ButtonSizer(wxWindow* parent, ButtonHandler on_ok, ButtonHandler on_apply,
218 ButtonHandler on_cancel)
219 : wxStdDialogButtonSizer(),
220 m_on_ok(std::move(on_ok)),
221 m_on_apply(std::move(on_apply)),
222 m_on_cancel(std::move(on_cancel)) {
223 auto ok_btn =
new wxButton(parent, wxID_OK);
224 ok_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED,
225 [&](wxCommandEvent& ev) { m_on_ok(); });
227 auto cancel_btn =
new wxButton(parent, wxID_CANCEL);
228 cancel_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED,
229 [&](wxCommandEvent& ev) { m_on_cancel(); });
230 AddButton(cancel_btn);
231 auto apply_btn =
new wxButton(parent, wxID_APPLY);
232 apply_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED,
233 [&](wxCommandEvent& ev) { m_on_apply(); });
234 AddButton(apply_btn);
239 ButtonHandler m_on_ok;
240 ButtonHandler m_on_apply;
241 ButtonHandler m_on_cancel;
245 TopPanel* m_top_panel;