feat: add drawer bool option to group
This commit is contained in:
parent
bbb7fb0c82
commit
5246ab15cb
|
@ -5,20 +5,28 @@
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
|
||||||
#include "AModule.hpp"
|
#include "AModule.hpp"
|
||||||
|
#include "gtkmm/revealer.h"
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
class Group : public AModule {
|
class Group : public AModule {
|
||||||
public:
|
public:
|
||||||
Group(const std::string&, const std::string&, const Json::Value&, bool);
|
Group(const std::string&, const std::string&, const Json::Value&, bool);
|
||||||
~Group() = default;
|
virtual ~Group() = default;
|
||||||
auto update() -> void override;
|
auto update() -> void override;
|
||||||
operator Gtk::Widget&() override;
|
operator Gtk::Widget&() override;
|
||||||
|
|
||||||
virtual Gtk::Box& getBox();
|
virtual Gtk::Box& getBox();
|
||||||
|
void addWidget(Gtk::Widget& widget);
|
||||||
|
|
||||||
|
bool hangleMouseHover(GdkEventCrossing* const& e);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Gtk::Box box;
|
Gtk::Box box;
|
||||||
|
Gtk::Box revealer_box;
|
||||||
|
Gtk::Revealer revealer;
|
||||||
|
bool is_first_widget = true;
|
||||||
|
bool is_drawer = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
|
|
@ -756,11 +756,8 @@ void waybar::Bar::getModules(const Factory& factory, const std::string& pos,
|
||||||
// auto parent = group ? group : &this->box_;
|
// auto parent = group ? group : &this->box_;
|
||||||
// auto vertical = parent->get_orientation() == Gtk::ORIENTATION_VERTICAL;
|
// auto vertical = parent->get_orientation() == Gtk::ORIENTATION_VERTICAL;
|
||||||
|
|
||||||
auto vertical = (
|
auto vertical = (group ? group->getBox().get_orientation() : box_.get_orientation()) ==
|
||||||
group ?
|
Gtk::ORIENTATION_VERTICAL;
|
||||||
group->getBox().get_orientation() :
|
|
||||||
box_.get_orientation()
|
|
||||||
) == Gtk::ORIENTATION_VERTICAL;
|
|
||||||
|
|
||||||
auto group_module = new waybar::Group(id_name, class_name, config[ref], vertical);
|
auto group_module = new waybar::Group(id_name, class_name, config[ref], vertical);
|
||||||
getModules(factory, ref, group_module);
|
getModules(factory, ref, group_module);
|
||||||
|
@ -772,7 +769,7 @@ void waybar::Bar::getModules(const Factory& factory, const std::string& pos,
|
||||||
std::shared_ptr<AModule> module_sp(module);
|
std::shared_ptr<AModule> module_sp(module);
|
||||||
modules_all_.emplace_back(module_sp);
|
modules_all_.emplace_back(module_sp);
|
||||||
if (group) {
|
if (group) {
|
||||||
group->getBox().pack_start(*module, false, false);
|
group->addWidget(*module);
|
||||||
} else {
|
} else {
|
||||||
if (pos == "modules-left") {
|
if (pos == "modules-left") {
|
||||||
modules_left_.emplace_back(module_sp);
|
modules_left_.emplace_back(module_sp);
|
||||||
|
|
|
@ -1,15 +1,20 @@
|
||||||
#include "group.hpp"
|
#include "group.hpp"
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
#include <util/command.hpp>
|
#include <util/command.hpp>
|
||||||
|
|
||||||
|
#include "gdkmm/device.h"
|
||||||
|
#include "gtkmm/widget.h"
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
Group::Group(const std::string& name, const std::string& id, const Json::Value& config,
|
Group::Group(const std::string& name, const std::string& id, const Json::Value& config,
|
||||||
bool vertical)
|
bool vertical)
|
||||||
: AModule(config, name, id, false, false),
|
: AModule(config, name, id, true, true),
|
||||||
box{vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0} {
|
box{vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0},
|
||||||
|
revealer_box{vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0} {
|
||||||
box.set_name(name_);
|
box.set_name(name_);
|
||||||
if (!id.empty()) {
|
if (!id.empty()) {
|
||||||
box.get_style_context()->add_class(id);
|
box.get_style_context()->add_class(id);
|
||||||
|
@ -29,14 +34,62 @@ Group::Group(const std::string& name, const std::string& id, const Json::Value&
|
||||||
} else {
|
} else {
|
||||||
throw std::runtime_error("Invalid orientation value: " + orientation);
|
throw std::runtime_error("Invalid orientation value: " + orientation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!config_["drawer"].empty() && config_["drawer"].asBool()) {
|
||||||
|
is_drawer = true;
|
||||||
|
revealer.set_transition_type(Gtk::RevealerTransitionType::REVEALER_TRANSITION_TYPE_SLIDE_UP);
|
||||||
|
revealer.set_transition_duration(500);
|
||||||
|
revealer.set_reveal_child(false);
|
||||||
|
|
||||||
|
revealer.get_style_context()->add_class("drawer");
|
||||||
|
|
||||||
|
revealer.add(revealer_box);
|
||||||
|
box.pack_start(revealer);
|
||||||
|
|
||||||
|
revealer.add_events(Gdk::EventMask::ENTER_NOTIFY_MASK | Gdk::EventMask::LEAVE_NOTIFY_MASK);
|
||||||
|
revealer.signal_enter_notify_event().connect(sigc::mem_fun(*this, &Group::hangleMouseHover));
|
||||||
|
revealer.signal_leave_notify_event().connect(sigc::mem_fun(*this, &Group::hangleMouseHover));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Group::hangleMouseHover(GdkEventCrossing* const& e) {
|
||||||
|
spdlog::info("Mouse hover event");
|
||||||
|
|
||||||
|
switch (e->type) {
|
||||||
|
case GDK_ENTER_NOTIFY:
|
||||||
|
spdlog::info("Mouse enter event");
|
||||||
|
revealer.set_reveal_child(true);
|
||||||
|
break;
|
||||||
|
case GDK_LEAVE_NOTIFY:
|
||||||
|
spdlog::info("Mouse leave event");
|
||||||
|
revealer.set_reveal_child(false);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
spdlog::warn("Unhandled mouse hover event type: {}", (int)e->type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Group::update() -> void {
|
auto Group::update() -> void {
|
||||||
// noop
|
// noop
|
||||||
}
|
}
|
||||||
|
|
||||||
Gtk::Box& Group::getBox() { return box; }
|
Gtk::Box& Group::getBox() { return is_drawer ? (is_first_widget ? box : revealer_box) : box; }
|
||||||
|
|
||||||
Group::operator Gtk::Widget&() { return getBox(); }
|
void Group::addWidget(Gtk::Widget& widget) {
|
||||||
|
widget.set_has_tooltip(false);
|
||||||
|
spdlog::info("Adding widget to group {}. Is first? {}", name_, is_first_widget);
|
||||||
|
getBox().pack_start(widget, false, false);
|
||||||
|
if (is_first_widget) {
|
||||||
|
widget.add_events(Gdk::EventMask::ENTER_NOTIFY_MASK | Gdk::EventMask::LEAVE_NOTIFY_MASK);
|
||||||
|
widget.signal_enter_notify_event().connect(sigc::mem_fun(*this, &Group::hangleMouseHover));
|
||||||
|
widget.signal_leave_notify_event().connect(sigc::mem_fun(*this, &Group::hangleMouseHover));
|
||||||
|
}
|
||||||
|
is_first_widget = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Group::operator Gtk::Widget&() { return box; }
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
|
Loading…
Reference in New Issue