group module: configurable orientation

currently, the orientation of group modules is always the opposite of
the bar. Change it so that:

* the default orientation of the group module is always the opposite of
  its parent, even for nested groups
* the orientation can be overridden in the config
* css ID and class are set for the group element
This commit is contained in:
Bao Trinh 2022-06-13 14:17:17 -05:00
parent 4deb6d812d
commit f5a24d12e5
No known key found for this signature in database
GPG Key ID: A9B3110B4EA55E36
4 changed files with 37 additions and 7 deletions

View File

@ -12,7 +12,7 @@ namespace waybar {
class Group : public AModule {
public:
Group(const std::string&, const Bar&, const Json::Value&);
Group(const std::string&, const std::string&, const Json::Value&, bool);
~Group() = default;
auto update() -> void;
operator Gtk::Widget&();

View File

@ -242,6 +242,7 @@ A module group is defined by specifying a module named "group/some-group-name".
"modules-right": ["group/hardware", "clock"],
"group/hardware": {
"orientation": "vertical",
"modules": [
"cpu",
"memory",
@ -253,6 +254,8 @@ A module group is defined by specifying a module named "group/some-group-name".
}
```
Valid options for the (optional) "orientation" property are: "horizontal", "vertical", "inherit", and "orthogonal" (default).
# SUPPORTED MODULES
- *waybar-backlight(5)*

View File

@ -742,7 +742,13 @@ void waybar::Bar::getModules(const Factory& factory, const std::string& pos,
AModule* module;
if (ref.compare(0, 6, "group/") == 0 && ref.size() > 6) {
auto group_module = new waybar::Group(ref, *this, config[ref]);
auto hash_pos = ref.find('#');
auto id_name = ref.substr(6, hash_pos - 6);
auto class_name = hash_pos != std::string::npos ? ref.substr(hash_pos + 1) : "";
auto parent = group ? group : &this->box_;
auto vertical = parent->get_orientation() == Gtk::ORIENTATION_VERTICAL;
auto group_module = new waybar::Group(id_name, class_name, config[ref], vertical);
getModules(factory, ref, &group_module->box);
module = group_module;
} else {
@ -764,11 +770,11 @@ void waybar::Bar::getModules(const Factory& factory, const std::string& pos,
modules_right_.emplace_back(module_sp);
}
}
module->dp.connect([module, name] {
module->dp.connect([module, ref] {
try {
module->update();
} catch (const std::exception& e) {
spdlog::error("{}: {}", name.asString(), e.what());
spdlog::error("{}: {}", ref, e.what());
}
});
} catch (const std::exception& e) {

View File

@ -6,9 +6,30 @@
namespace waybar {
Group::Group(const std::string& name, const Bar& bar, const Json::Value& config)
: AModule(config, name, "", false, false),
box{bar.vertical ? Gtk::ORIENTATION_HORIZONTAL : Gtk::ORIENTATION_VERTICAL, 0} {}
Group::Group(const std::string& name, const std::string& id, const Json::Value& config,
bool vertical)
: AModule(config, name, id, false, false),
box{vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0} {
box.set_name(name_);
if (!id.empty()) {
box.get_style_context()->add_class(id);
}
// default orientation: orthogonal to parent
auto orientation =
config_["orientation"].empty() ? "orthogonal" : config_["orientation"].asString();
if (orientation == "inherit") {
// keep orientation passed
} else if (orientation == "orthogonal") {
box.set_orientation(vertical ? Gtk::ORIENTATION_HORIZONTAL : Gtk::ORIENTATION_VERTICAL);
} else if (orientation == "vertical") {
box.set_orientation(Gtk::ORIENTATION_VERTICAL);
} else if (orientation == "horizontal") {
box.set_orientation(Gtk::ORIENTATION_HORIZONTAL);
} else {
throw std::runtime_error("Invalid orientation value: " + orientation);
}
}
auto Group::update() -> void {
// noop