Merge pull request #4941 from sjudin/groups-add-empty-css-class

feat(group): Add .empty class to empty groups
This commit is contained in:
Alexis Rouillard
2026-07-04 00:50:01 +02:00
committed by GitHub
3 changed files with 64 additions and 2 deletions
+44 -1
View File
@@ -30,6 +30,7 @@ Group::Group(const std::string& name, const std::string& id, const Json::Value&
box{vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0},
revealer_box{vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0} {
box.set_name(name_);
box.get_style_context()->add_class("empty");
if (!id.empty()) {
box.get_style_context()->add_class(id);
}
@@ -72,6 +73,9 @@ Group::Group(const std::string& name, const std::string& id, const Json::Value&
const bool start_expanded =
(drawer_config["start-expanded"].isBool() ? drawer_config["start-expanded"].asBool()
: false);
empty_if_drawer_empty = (drawer_config["empty-if-drawer-empty"].isBool()
? drawer_config["empty-if-drawer-empty"].asBool()
: false);
auto transition_type = getPreferredTransitionType(vertical);
@@ -154,7 +158,44 @@ bool Group::handleToggle(GdkEventButton* const& e) {
}
auto Group::update() -> void {
// noop
bool has_visible_child = false;
bool has_visible_drawer_child = false;
if (is_drawer) {
for (auto* rev_child : revealer_box.get_children()) {
if (rev_child->get_visible()) {
has_visible_drawer_child = true;
break;
}
}
}
if (is_drawer && empty_if_drawer_empty) {
has_visible_child = has_visible_drawer_child;
} else {
for (auto* child : box.get_children()) {
if (child == &revealer) {
if (has_visible_drawer_child) {
has_visible_child = true;
break;
}
} else if (child->get_visible()) {
has_visible_child = true;
break;
}
}
}
auto style = box.get_style_context();
if (has_visible_child) {
if (style->has_class("empty")) {
style->remove_class("empty");
}
} else {
if (!style->has_class("empty")) {
style->add_class("empty");
}
}
}
bool Group::handleScroll(GdkEventScroll* e) {
@@ -172,6 +213,8 @@ void Group::addWidget(Gtk::Widget& widget) {
}
is_first_widget = false;
widget.property_visible().signal_changed().connect(sigc::mem_fun(*this, &Group::update));
update();
}
Group::operator Gtk::Widget&() { return event_box_; }