diff --git a/repos/gems/src/app/sculpt_manager/main.cc b/repos/gems/src/app/sculpt_manager/main.cc index e5b4fa502c..10404d134b 100644 --- a/repos/gems/src/app/sculpt_manager/main.cc +++ b/repos/gems/src/app/sculpt_manager/main.cc @@ -303,7 +303,11 @@ struct Sculpt::Main : Input_event_handler, xml.attribute("arch", _deploy._arch); xml.attribute("version", _query_version.value); - _popup_dialog.gen_depot_query(xml); + if (_popup_dialog.depot_query_needs_users()) + xml.node("scan", [&] () { + xml.attribute("users", "yes"); }); + + _popup_dialog.gen_depot_query(xml, _scan_rom.xml()); /* update query for blueprints of all unconfigured start nodes */ _deploy.gen_depot_query(xml); @@ -365,6 +369,16 @@ struct Sculpt::Main : Input_event_handler, Deploy::Prio_levels const _prio_levels { 4 }; + Attached_rom_dataspace _scan_rom { _env, "report -> runtime/depot_query/scan" }; + + Signal_handler
_scan_handler { _env.ep(), *this, &Main::_handle_scan }; + + void _handle_scan() + { + _scan_rom.update(); + _popup_dialog.depot_users_scan_updated(); + } + Attached_rom_dataspace _launcher_listing_rom { _env, "report -> /runtime/launcher_query/listing" }; @@ -1167,7 +1181,7 @@ struct Sculpt::Main : Input_event_handler, Popup_dialog _popup_dialog { _env, *this, _launchers, _network._nic_state, _network._nic_target, _runtime_state, _cached_runtime_config, - _download_queue, *this, *this }; + _download_queue, _scan_rom, *this, *this }; Menu_view _popup_menu_view { _env, _child_states, _popup_dialog, "popup_view", Ram_quota{4*1024*1024}, Cap_quota{150}, @@ -1245,6 +1259,7 @@ struct Sculpt::Main : Input_event_handler, _pci_devices .sigh(_pci_devices_handler); _window_list .sigh(_window_list_handler); _decorator_margins .sigh(_decorator_margins_handler); + _scan_rom .sigh(_scan_handler); _launcher_listing_rom.sigh(_launcher_and_preset_listing_handler); _blueprint_rom .sigh(_blueprint_handler); _editor_saved_rom .sigh(_editor_saved_handler); diff --git a/repos/gems/src/app/sculpt_manager/view/popup_dialog.cc b/repos/gems/src/app/sculpt_manager/view/popup_dialog.cc index ae0b18ad41..cd027cbc48 100644 --- a/repos/gems/src/app/sculpt_manager/view/popup_dialog.cc +++ b/repos/gems/src/app/sculpt_manager/view/popup_dialog.cc @@ -121,7 +121,7 @@ void Popup_dialog::_gen_pkg_elements(Xml_generator &xml, } -void Popup_dialog::_gen_menu_elements(Xml_generator &xml) const +void Popup_dialog::_gen_menu_elements(Xml_generator &xml, Xml_node const &depot_users) const { /* * Lauchers @@ -145,7 +145,7 @@ void Popup_dialog::_gen_menu_elements(Xml_generator &xml) const if (_state == DEPOT_SHOWN || _state == INDEX_REQUESTED) { _gen_sub_menu_title(xml, "back", "Depot"); - _scan_rom.xml().for_each_sub_node("user", [&] (Xml_node user) { + depot_users.for_each_sub_node("user", [&] (Xml_node user) { User const name = user.attribute_value("name", User()); bool const selected = (_selected_user == name); @@ -170,7 +170,7 @@ void Popup_dialog::_gen_menu_elements(Xml_generator &xml) const if (_state == DEPOT_SELECTION) { _gen_sub_menu_title(xml, "back", "Selection"); - _scan_rom.xml().for_each_sub_node("user", [&] (Xml_node user) { + depot_users.for_each_sub_node("user", [&] (Xml_node user) { User const name = user.attribute_value("name", User()); bool const selected = _index_avail(name); diff --git a/repos/gems/src/app/sculpt_manager/view/popup_dialog.h b/repos/gems/src/app/sculpt_manager/view/popup_dialog.h index ebd0c1cee5..55ca146efb 100644 --- a/repos/gems/src/app/sculpt_manager/view/popup_dialog.h +++ b/repos/gems/src/app/sculpt_manager/view/popup_dialog.h @@ -38,6 +38,8 @@ namespace Sculpt { struct Popup_dialog; } struct Sculpt::Popup_dialog : Dialog { + using Depot_users = Attached_rom_dataspace; + Env &_env; Sculpt_version const _sculpt_version { _env }; @@ -51,6 +53,7 @@ struct Sculpt::Popup_dialog : Dialog Runtime_info const &_runtime_info; Runtime_config const &_runtime_config; Download_queue const &_download_queue; + Depot_users const &_depot_users; Depot_query &_depot_query; @@ -214,15 +217,8 @@ struct Sculpt::Popup_dialog : Dialog return hover_result; } - Attached_rom_dataspace _scan_rom { _env, "report -> runtime/depot_query/scan" }; - - Signal_handler _scan_handler { - _env.ep(), *this, &Popup_dialog::_handle_scan }; - - void _handle_scan() + void depot_users_scan_updated() { - _scan_rom.update(); - if (_state == DEPOT_REQUESTED) _state = DEPOT_SHOWN; @@ -375,13 +371,13 @@ struct Sculpt::Popup_dialog : Dialog void _gen_pkg_info (Xml_generator &, Component const &) const; void _gen_pkg_elements (Xml_generator &, Component const &) const; - void _gen_menu_elements(Xml_generator &) const; + void _gen_menu_elements(Xml_generator &, Xml_node const &depot_users) const; void generate(Xml_generator &xml) const override { xml.node("frame", [&] () { xml.node("vbox", [&] () { - _gen_menu_elements(xml); }); }); + _gen_menu_elements(xml, _depot_users.xml()); }); }); } void click(Action &action); @@ -426,27 +422,26 @@ struct Sculpt::Popup_dialog : Dialog Runtime_info const &runtime_info, Runtime_config const &runtime_config, Download_queue const &download_queue, + Depot_users const &depot_users, Depot_query &depot_query, Construction_info const &construction_info) : _env(env), _launchers(launchers), _nic_state(nic_state), _nic_target(nic_target), _runtime_info(runtime_info), _runtime_config(runtime_config), - _download_queue(download_queue), _depot_query(depot_query), + _download_queue(download_queue), _depot_users(depot_users), + _depot_query(depot_query), _refresh(refresh), _construction_info(construction_info) { - _scan_rom.sigh(_scan_handler); _index_rom.sigh(_index_handler); } - void gen_depot_query(Xml_generator &xml) const + bool depot_query_needs_users() const { return _state >= TOP_LEVEL; } + + void gen_depot_query(Xml_generator &xml, Xml_node const &depot_users) const { if (_state >= TOP_LEVEL) - xml.node("scan", [&] () { - xml.attribute("users", "yes"); }); - - if (_state >= TOP_LEVEL) - _scan_rom.xml().for_each_sub_node("user", [&] (Xml_node user) { + depot_users.for_each_sub_node("user", [&] (Xml_node user) { xml.node("index", [&] () { User const name = user.attribute_value("name", User()); xml.attribute("user", name);