mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-12 05:55:37 +00:00
sculpt_manager: query presets
This patch queries the files at config/presets/ in addition to config/launcher using the existing launcher_query component. Issue #4731
This commit is contained in:
parent
88becbe29d
commit
114238c248
@ -35,6 +35,7 @@
|
|||||||
#include <model/child_exit_state.h>
|
#include <model/child_exit_state.h>
|
||||||
#include <model/file_operation_queue.h>
|
#include <model/file_operation_queue.h>
|
||||||
#include <model/settings.h>
|
#include <model/settings.h>
|
||||||
|
#include <model/presets.h>
|
||||||
#include <view/download_status.h>
|
#include <view/download_status.h>
|
||||||
#include <view/popup_dialog.h>
|
#include <view/popup_dialog.h>
|
||||||
#include <view/panel_dialog.h>
|
#include <view/panel_dialog.h>
|
||||||
@ -368,21 +369,26 @@ struct Sculpt::Main : Input_event_handler,
|
|||||||
_env, "report -> /runtime/launcher_query/listing" };
|
_env, "report -> /runtime/launcher_query/listing" };
|
||||||
|
|
||||||
Launchers _launchers { _heap };
|
Launchers _launchers { _heap };
|
||||||
|
Presets _presets { _heap };
|
||||||
|
|
||||||
Signal_handler<Main> _launcher_listing_handler {
|
Signal_handler<Main> _launcher_and_preset_listing_handler {
|
||||||
_env.ep(), *this, &Main::_handle_launcher_listing };
|
_env.ep(), *this, &Main::_handle_launcher_and_preset_listing };
|
||||||
|
|
||||||
void _handle_launcher_listing()
|
void _handle_launcher_and_preset_listing()
|
||||||
{
|
{
|
||||||
_launcher_listing_rom.update();
|
_launcher_listing_rom.update();
|
||||||
|
|
||||||
Xml_node listing = _launcher_listing_rom.xml();
|
Xml_node const listing = _launcher_listing_rom.xml();
|
||||||
if (listing.has_sub_node("dir")) {
|
listing.for_each_sub_node("dir", [&] (Xml_node const &dir) {
|
||||||
Xml_node dir = listing.sub_node("dir");
|
|
||||||
|
|
||||||
/* let 'update_from_xml' iterate over <file> nodes */
|
Path const dir_path = dir.attribute_value("path", Path());
|
||||||
_launchers.update_from_xml(dir);
|
|
||||||
}
|
if (dir_path == "/launcher")
|
||||||
|
_launchers.update_from_xml(dir); /* iterate over <file> nodes */
|
||||||
|
|
||||||
|
if (dir_path == "/presets")
|
||||||
|
_presets.update_from_xml(dir); /* iterate over <file> nodes */
|
||||||
|
});
|
||||||
|
|
||||||
_popup_menu_view.generate();
|
_popup_menu_view.generate();
|
||||||
_deploy._handle_managed_deploy();
|
_deploy._handle_managed_deploy();
|
||||||
@ -1235,7 +1241,7 @@ struct Sculpt::Main : Input_event_handler,
|
|||||||
_pci_devices .sigh(_pci_devices_handler);
|
_pci_devices .sigh(_pci_devices_handler);
|
||||||
_window_list .sigh(_window_list_handler);
|
_window_list .sigh(_window_list_handler);
|
||||||
_decorator_margins .sigh(_decorator_margins_handler);
|
_decorator_margins .sigh(_decorator_margins_handler);
|
||||||
_launcher_listing_rom.sigh(_launcher_listing_handler);
|
_launcher_listing_rom.sigh(_launcher_and_preset_listing_handler);
|
||||||
_blueprint_rom .sigh(_blueprint_handler);
|
_blueprint_rom .sigh(_blueprint_handler);
|
||||||
_editor_saved_rom .sigh(_editor_saved_handler);
|
_editor_saved_rom .sigh(_editor_saved_handler);
|
||||||
_clicked_rom .sigh(_clicked_handler);
|
_clicked_rom .sigh(_clicked_handler);
|
||||||
|
121
repos/gems/src/app/sculpt_manager/model/presets.h
Normal file
121
repos/gems/src/app/sculpt_manager/model/presets.h
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
* \brief Cached information about available deploy presets
|
||||||
|
* \author Norman Feske
|
||||||
|
* \date 2022-01-11
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MODEL__PRESETS_H_
|
||||||
|
#define _MODEL__PRESETS_H_
|
||||||
|
|
||||||
|
/* Genode includes */
|
||||||
|
#include <util/list_model.h>
|
||||||
|
#include <util/dictionary.h>
|
||||||
|
|
||||||
|
/* local includes */
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
namespace Sculpt { class Presets; }
|
||||||
|
|
||||||
|
|
||||||
|
class Sculpt::Presets : public Noncopyable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
struct Info : Noncopyable
|
||||||
|
{
|
||||||
|
using Name = String<64>;
|
||||||
|
using Text = String<128>;
|
||||||
|
|
||||||
|
Name const name;
|
||||||
|
Text const text;
|
||||||
|
|
||||||
|
static Text _info_text(Xml_node const &node)
|
||||||
|
{
|
||||||
|
Text result { };
|
||||||
|
node.with_optional_sub_node("config", [&] (Xml_node const &config) {
|
||||||
|
result = config.attribute_value("info", Text()); });
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Info(Xml_node const &node)
|
||||||
|
:
|
||||||
|
name(node.attribute_value("name", Path())),
|
||||||
|
text(_info_text(node))
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Allocator &_alloc;
|
||||||
|
|
||||||
|
unsigned _count = 0;
|
||||||
|
|
||||||
|
struct Preset;
|
||||||
|
|
||||||
|
using Dict = Dictionary<Preset, Path>;
|
||||||
|
|
||||||
|
struct Preset : Dict::Element, List_model<Preset>::Element
|
||||||
|
{
|
||||||
|
Info const info;
|
||||||
|
|
||||||
|
bool matches(Xml_node const &node) const
|
||||||
|
{
|
||||||
|
return node.attribute_value("name", Path()) == name;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool type_matches(Xml_node const &node)
|
||||||
|
{
|
||||||
|
return node.has_type("file");
|
||||||
|
}
|
||||||
|
|
||||||
|
Preset(Dict &dict, Xml_node const &node)
|
||||||
|
:
|
||||||
|
Dict::Element(dict, node.attribute_value("name", Path())),
|
||||||
|
info(node)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
Dict _sorted { };
|
||||||
|
|
||||||
|
List_model<Preset> _presets { };
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Presets(Allocator &alloc) : _alloc(alloc) { }
|
||||||
|
|
||||||
|
void update_from_xml(Xml_node const &presets)
|
||||||
|
{
|
||||||
|
update_list_model_from_xml(_presets, presets,
|
||||||
|
|
||||||
|
/* create */
|
||||||
|
[&] (Xml_node const &node) -> Preset & {
|
||||||
|
return *new (_alloc) Preset(_sorted, node); },
|
||||||
|
|
||||||
|
/* destroy */
|
||||||
|
[&] (Preset &e) { destroy(_alloc, &e); },
|
||||||
|
|
||||||
|
/* update */
|
||||||
|
[&] (Preset &, Xml_node) { }
|
||||||
|
);
|
||||||
|
|
||||||
|
_count = 0;
|
||||||
|
_presets.for_each([&] (Preset const &) { _count++; });
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename FN>
|
||||||
|
void for_each(FN const &fn) const
|
||||||
|
{
|
||||||
|
_sorted.for_each([&] (Preset const &preset) { fn(preset.info); });
|
||||||
|
}
|
||||||
|
|
||||||
|
bool available() const { return _count > 0; };
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _MODEL__PRESETS_H_ */
|
@ -30,6 +30,11 @@ void Sculpt::gen_launcher_query_start_content(Xml_generator &xml)
|
|||||||
xml.attribute("path", "/launcher");
|
xml.attribute("path", "/launcher");
|
||||||
xml.attribute("content", "yes");
|
xml.attribute("content", "yes");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
xml.node("query", [&] () {
|
||||||
|
xml.attribute("path", "/presets");
|
||||||
|
xml.attribute("content", "yes");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
xml.node("route", [&] () {
|
xml.node("route", [&] () {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user