sculpt: debug-dialog tweaks

Shorten the visible text. Make "wait" option depend on "wx" option.
Indent checkboxes similar to the resource dialog.

Issue #5012
This commit is contained in:
Norman Feske 2023-10-19 13:49:44 +02:00 committed by Christian Helmuth
parent 5471ef7e1e
commit ca85cb936b
3 changed files with 59 additions and 89 deletions

View File

@ -24,15 +24,12 @@ namespace Sculpt { struct Debug_dialog; }
struct Sculpt::Debug_dialog : Noncopyable, Deprecated_dialog struct Sculpt::Debug_dialog : Noncopyable, Deprecated_dialog
{ {
bool _monitor; bool _monitor = false;
bool _wait; bool _wait = false;
bool _wx; bool _wx = false;
Hoverable_item _item { }; Hoverable_item _item { };
Debug_dialog(bool monitor, bool wait, bool wx)
: _monitor(monitor), _wait(wait), _wx(wx) { }
Hover_result hover(Xml_node hover) override Hover_result hover(Xml_node hover) override
{ {
return Deprecated_dialog::any_hover_changed( return Deprecated_dialog::any_hover_changed(
@ -46,63 +43,64 @@ struct Sculpt::Debug_dialog : Noncopyable, Deprecated_dialog
if (!clicked.valid()) if (!clicked.valid())
return; return;
if (clicked == "monitor") if (clicked == "monitor") _monitor = !_monitor;
_monitor = component.monitor = !component.monitor; if (clicked == "wx") _wx = !_wx;
else if (clicked == "wait") { if (clicked == "wait") _wait = !_wait;
_wait = component.wait = !component.wait;
/* wait depends on wx */ /* "wx" depends on "monitor", "wait" depends on "wx" */
if (_wait) _wx &= _monitor;
_wx = component.wx = true; _wait &= _wx;
} else if (clicked == "wx") {
_wx = component.wx = !component.wx; component.wx = _wx;
/* wait depends on wx */ component.monitor = _monitor;
if (!_wx) component.wait = _wait;
_wait = component.wait = false;
}
} }
void _gen_menu_entry(Xml_generator &xml, Start_name const &name, void _gen_checkbox(Xml_generator &xml, Start_name const &name,
Component::Info const &text, bool selected, Component::Info const &text, bool selected) const
char const *style = "radio") const
{ {
gen_named_node(xml, "hbox", name, [&] () { gen_named_node(xml, "hbox", name, [&] {
gen_named_node(xml, "float", "left", [&] () { gen_named_node(xml, "float", "left", [&] {
xml.attribute("west", "yes"); xml.attribute("west", "yes");
xml.node("hbox", [&] () { xml.node("hbox", [&] {
gen_named_node(xml, "button", "button", [&] () {
gen_named_node(xml, "button", "button", [&] {
if (selected) if (selected)
xml.attribute("selected", "yes"); xml.attribute("selected", "yes");
xml.attribute("style", style); xml.attribute("style", "checkbox");
_item.gen_hovered_attr(xml, name); _item.gen_hovered_attr(xml, name);
xml.node("hbox", [&] () { }); xml.node("hbox", [&] { });
}); });
gen_named_node(xml, "label", "name", [&] () { gen_named_node(xml, "label", "name", [&] {
xml.attribute("text", Path(" ", text)); }); xml.attribute("text", Path(" ", text)); });
}); });
}); });
gen_named_node(xml, "hbox", "right", [&] () { }); gen_named_node(xml, "hbox", "right", [&] { });
}); });
} }
void generate(Xml_generator &xml) const override void generate(Xml_generator &xml) const override
{ {
xml.node("vbox", [&] () { xml.node("vbox", [&] {
_gen_menu_entry(xml, "monitor", "monitor this component", _monitor, "checkbox"); _gen_checkbox(xml, "monitor", "Debug", _monitor);
if (_monitor) {
_gen_menu_entry(xml, "wait", " wait for GDB", _wait, "checkbox"); if (_monitor)
_gen_menu_entry(xml, "wx", " map executable segments writeable", _wx, "checkbox"); _gen_checkbox(xml, "wx", "Allow code patching", _wx);
}
if (_wx)
_gen_checkbox(xml, "wait", "Wait for GDB", _wait);
}); });
} }
void reset() override void reset() override
{ {
_item._hovered = Hoverable_item::Id(); _item._hovered = Hoverable_item::Id();
_monitor = _wait = _wx = false;
} }
}; };

View File

@ -107,25 +107,9 @@ void Popup_dialog::_gen_pkg_elements(Xml_generator &xml,
}); });
} }
if (_debug.constructed()) {
gen_named_node(xml, "frame", "debug", [&] { gen_named_node(xml, "frame", "debug", [&] {
xml.node("vbox", [&] () { xml.node("vbox", [&] {
_debug.generate(xml); }); });
bool const selected = _route_selected("debug");
if (!selected)
_gen_route_entry(xml, "debug",
"Debug options ...", false, "enter");
if (selected) {
_gen_route_entry(xml, "back", "Debug options ...",
true, "back");
_debug->generate(xml);
}
});
});
}
/* /*
* Display "Add component" button once all routes are defined * Display "Add component" button once all routes are defined
@ -457,7 +441,7 @@ void Popup_dialog::click(Action &action)
} }
} }
else if (_state == ROUTE_SELECTED) { else if (_state == ROUTE_SELECTED || _dialog_item.hovered("debug")) {
/* /*
* Keep the routing selection open when clicking on the "Add component" * Keep the routing selection open when clicking on the "Add component"
@ -495,22 +479,6 @@ void Popup_dialog::click(Action &action)
_resources->click(component); }); _resources->click(component); });
} }
} else if (_debug_dialog_selected()) {
bool const clicked_on_different_route = clicked_route.valid()
&& (clicked_route != "");
if (clicked_on_different_route) {
/* close debug options dialog */
_selected_route.construct(clicked_route);
} else {
if (_debug.constructed())
action.apply_to_construction([&] (Component &component) {
_debug->click(component); });
}
} else { } else {
bool clicked_on_selected_route = false; bool clicked_on_selected_route = false;
@ -561,4 +529,10 @@ void Popup_dialog::click(Action &action)
} }
} }
} }
if (_state == PKG_SHOWN || _state == ROUTE_SELECTED) {
if (_dialog_item.hovered("debug"))
action.apply_to_construction([&] (Component &component) {
_debug.click(component); });
}
} }

View File

@ -121,10 +121,12 @@ struct Sculpt::Popup_dialog : Deprecated_dialog
Activatable_item _action_item { }; Activatable_item _action_item { };
Activatable_item _install_item { }; Activatable_item _install_item { };
Hoverable_item _route_item { }; Hoverable_item _route_item { };
Hoverable_item _dialog_item { }; /* for detecting clicks into debug dialog */
Pd_route_dialog _pd_route { _runtime_config }; Pd_route_dialog _pd_route { _runtime_config };
Constructible<Resource_dialog> _resources { }; Constructible<Resource_dialog> _resources { };
Constructible<Debug_dialog> _debug { };
Debug_dialog _debug { };
enum State { TOP_LEVEL, DEPOT_REQUESTED, DEPOT_SHOWN, DEPOT_SELECTION, enum State { TOP_LEVEL, DEPOT_REQUESTED, DEPOT_SHOWN, DEPOT_SELECTION,
INDEX_REQUESTED, INDEX_SHOWN, INDEX_REQUESTED, INDEX_SHOWN,
@ -151,11 +153,6 @@ struct Sculpt::Popup_dialog : Deprecated_dialog
return _route_selected("resources"); return _route_selected("resources");
} }
bool _debug_dialog_selected() const
{
return _route_selected("debug");
}
template <typename FN> template <typename FN>
void _apply_to_selected_route(Action &action, FN const &fn) void _apply_to_selected_route(Action &action, FN const &fn)
{ {
@ -174,17 +171,19 @@ struct Sculpt::Popup_dialog : Deprecated_dialog
_item .match(hover, "frame", "vbox", "hbox", "name"), _item .match(hover, "frame", "vbox", "hbox", "name"),
_action_item .match(hover, "frame", "vbox", "button", "name"), _action_item .match(hover, "frame", "vbox", "button", "name"),
_install_item.match(hover, "frame", "vbox", "float", "vbox", "float", "button", "name"), _install_item.match(hover, "frame", "vbox", "float", "vbox", "float", "button", "name"),
_route_item .match(hover, "frame", "vbox", "frame", "vbox", "hbox", "name")); _route_item .match(hover, "frame", "vbox", "frame", "vbox", "hbox", "name"),
_dialog_item .match(hover, "frame", "vbox", "frame", "name"));
_pd_route.hover(hover, "frame", "vbox", "frame", "vbox", "hbox", "name"); _pd_route.hover(hover, "frame", "vbox", "frame", "vbox", "hbox", "name");
if (_resources.constructed() && if (_resources.constructed())
hover_result == Deprecated_dialog::Hover_result::UNMODIFIED) hover_result = Deprecated_dialog::any_hover_changed(
hover_result = _resources->match_sub_dialog(hover, "frame", "vbox", "frame", "vbox"); hover_result,
_resources->match_sub_dialog(hover, "frame", "vbox", "frame", "vbox"));
if (_debug.constructed() && hover_result = Deprecated_dialog::any_hover_changed(
hover_result == Deprecated_dialog::Hover_result::UNMODIFIED) hover_result,
hover_result = _debug->match_sub_dialog(hover, "frame", "vbox", "frame", "vbox"); _debug.match_sub_dialog(hover, "frame", "vbox", "frame", "vbox"));
return hover_result; return hover_result;
} }
@ -365,6 +364,7 @@ struct Sculpt::Popup_dialog : Deprecated_dialog
{ {
_item._hovered = Hoverable_item::Id(); _item._hovered = Hoverable_item::Id();
_route_item._hovered = Hoverable_item::Id(); _route_item._hovered = Hoverable_item::Id();
_dialog_item._hovered = Hoverable_item::Id();
_action_item.reset(); _action_item.reset();
_install_item.reset(); _install_item.reset();
_state = TOP_LEVEL; _state = TOP_LEVEL;
@ -372,7 +372,7 @@ struct Sculpt::Popup_dialog : Deprecated_dialog
_selected_route.destruct(); _selected_route.destruct();
_menu._level = 0; _menu._level = 0;
_resources.destruct(); _resources.destruct();
_debug.destruct(); _debug.reset();
_pd_route.reset(); _pd_route.reset();
} }
@ -427,9 +427,7 @@ struct Sculpt::Popup_dialog : Deprecated_dialog
construction.affinity_location, construction.affinity_location,
construction.priority); construction.priority);
_debug.construct(construction.monitor, _debug.reset();
construction.wait,
construction.wx);
construction.try_apply_blueprint(blueprint); construction.try_apply_blueprint(blueprint);