feat/issue 3256: Toggle drawer state

This commit is contained in:
Rene D. Obermueller 2024-07-07 22:08:45 +02:00
parent 44f39ca0ce
commit e2e5d4d447
3 changed files with 37 additions and 3 deletions

View File

@ -25,9 +25,13 @@ class Group : public AModule {
Gtk::Revealer revealer; Gtk::Revealer revealer;
bool is_first_widget = true; bool is_first_widget = true;
bool is_drawer = false; bool is_drawer = false;
bool click_to_reveal = false;
std::string add_class_to_drawer_children; std::string add_class_to_drawer_children;
bool handleMouseEnter(GdkEventCrossing *const &ev) override; bool handleMouseEnter(GdkEventCrossing *const &ev) override;
bool handleMouseLeave(GdkEventCrossing *const &ev) override; bool handleMouseLeave(GdkEventCrossing *const &ev) override;
bool handleToggle(GdkEventButton *const &ev) override;
void show_group();
void hide_group();
}; };
} // namespace waybar } // namespace waybar

View File

@ -278,6 +278,11 @@ A group may hide all but one element, showing them only on mouse hover. In order
default: "hidden" ++ default: "hidden" ++
Defines the CSS class to be applied to the hidden elements. Defines the CSS class to be applied to the hidden elements.
*click-to-reveal*: ++
typeof: bool ++
default: false ++
Whether left click should reveal the content rather than mouse over. Note that grouped modules may still process their own on-click events.
*transition-left-to-right*: ++ *transition-left-to-right*: ++
typeof: bool ++ typeof: bool ++
default: true ++ default: true ++

View File

@ -62,6 +62,7 @@ Group::Group(const std::string& name, const std::string& id, const Json::Value&
const bool left_to_right = (drawer_config["transition-left-to-right"].isBool() const bool left_to_right = (drawer_config["transition-left-to-right"].isBool()
? drawer_config["transition-left-to-right"].asBool() ? drawer_config["transition-left-to-right"].asBool()
: true); : true);
click_to_reveal = drawer_config["click-to-reveal"].asBool();
auto transition_type = getPreferredTransitionType(vertical); auto transition_type = getPreferredTransitionType(vertical);
@ -83,18 +84,42 @@ Group::Group(const std::string& name, const std::string& id, const Json::Value&
event_box_.add(box); event_box_.add(box);
} }
bool Group::handleMouseEnter(GdkEventCrossing* const& e) { void Group::show_group() {
box.set_state_flags(Gtk::StateFlags::STATE_FLAG_PRELIGHT); box.set_state_flags(Gtk::StateFlags::STATE_FLAG_PRELIGHT);
revealer.set_reveal_child(true); revealer.set_reveal_child(true);
}
void Group::hide_group() {
box.unset_state_flags(Gtk::StateFlags::STATE_FLAG_PRELIGHT);
revealer.set_reveal_child(false);
}
bool Group::handleMouseEnter(GdkEventCrossing* const& e) {
if (!click_to_reveal) {
show_group();
}
return false; return false;
} }
bool Group::handleMouseLeave(GdkEventCrossing* const& e) { bool Group::handleMouseLeave(GdkEventCrossing* const& e) {
box.unset_state_flags(Gtk::StateFlags::STATE_FLAG_PRELIGHT); if (!click_to_reveal) {
revealer.set_reveal_child(false); hide_group();
}
return false; return false;
} }
bool Group::handleToggle(GdkEventButton* const& e) {
if (!click_to_reveal || e->button != 1) {
return false;
}
if (box.get_state_flags() & Gtk::StateFlags::STATE_FLAG_PRELIGHT) {
hide_group();
} else {
show_group();
}
return true;
}
auto Group::update() -> void { auto Group::update() -> void {
// noop // noop
} }