feat(tray): implement tooltips (text only) for tray items

This commit is contained in:
Aleksei Bavshin 2021-06-23 23:47:35 -07:00
parent 4b6253e810
commit 84a8f79bbe
No known key found for this signature in database
GPG Key ID: 4F071603387A382A
2 changed files with 26 additions and 4 deletions

View File

@ -16,6 +16,11 @@
namespace waybar::modules::SNI { namespace waybar::modules::SNI {
struct ToolTip {
Glib::ustring icon_name;
Glib::ustring text;
};
class Item : public sigc::trackable { class Item : public sigc::trackable {
public: public:
Item(const std::string&, const std::string&, const Json::Value&); Item(const std::string&, const std::string&, const Json::Value&);
@ -41,6 +46,7 @@ class Item : public sigc::trackable {
std::string attention_movie_name; std::string attention_movie_name;
std::string icon_theme_path; std::string icon_theme_path;
std::string menu; std::string menu;
ToolTip tooltip;
DbusmenuGtkMenu* dbus_menu = nullptr; DbusmenuGtkMenu* dbus_menu = nullptr;
Gtk::Menu* gtk_menu = nullptr; Gtk::Menu* gtk_menu = nullptr;
/** /**

View File

@ -2,6 +2,7 @@
#include <gdkmm/general.h> #include <gdkmm/general.h>
#include <glibmm/main.h> #include <glibmm/main.h>
#include <gtkmm/tooltip.h>
#include <spdlog/spdlog.h> #include <spdlog/spdlog.h>
#include <fstream> #include <fstream>
@ -81,7 +82,6 @@ void Item::proxyReady(Glib::RefPtr<Gio::AsyncResult>& result) {
return; return;
} }
this->updateImage(); this->updateImage();
// this->event_box.set_tooltip_text(this->title);
} catch (const Glib::Error& err) { } catch (const Glib::Error& err) {
spdlog::error("Failed to create DBus Proxy for {} {}: {}", bus_name, object_path, err.what()); spdlog::error("Failed to create DBus Proxy for {} {}: {}", bus_name, object_path, err.what());
@ -91,10 +91,24 @@ void Item::proxyReady(Glib::RefPtr<Gio::AsyncResult>& result) {
} }
template <typename T> template <typename T>
T get_variant(Glib::VariantBase& value) { T get_variant(const Glib::VariantBase& value) {
return Glib::VariantBase::cast_dynamic<Glib::Variant<T>>(value).get(); return Glib::VariantBase::cast_dynamic<Glib::Variant<T>>(value).get();
} }
template <>
ToolTip get_variant<ToolTip>(const Glib::VariantBase& value) {
ToolTip result;
// Unwrap (sa(iiay)ss)
auto container = value.cast_dynamic<Glib::VariantContainerBase>(value);
result.icon_name = get_variant<Glib::ustring>(container.get_child(0));
result.text = get_variant<Glib::ustring>(container.get_child(2));
auto description = get_variant<Glib::ustring>(container.get_child(3));
if (!description.empty()) {
result.text = fmt::format("<b>{}</b>\n{}", result.text, description);
}
return result;
}
void Item::setProperty(const Glib::ustring& name, Glib::VariantBase& value) { void Item::setProperty(const Glib::ustring& name, Glib::VariantBase& value) {
try { try {
spdlog::trace("Set tray item property: {}.{} = {}", id.empty() ? bus_name : id, name, value); spdlog::trace("Set tray item property: {}.{} = {}", id.empty() ? bus_name : id, name, value);
@ -122,7 +136,10 @@ void Item::setProperty(const Glib::ustring& name, Glib::VariantBase& value) {
} else if (name == "AttentionMovieName") { } else if (name == "AttentionMovieName") {
attention_movie_name = get_variant<std::string>(value); attention_movie_name = get_variant<std::string>(value);
} else if (name == "ToolTip") { } else if (name == "ToolTip") {
// TODO: tooltip tooltip = get_variant<ToolTip>(value);
if (!tooltip.text.empty()) {
event_box.set_tooltip_markup(tooltip.text);
}
} else if (name == "IconThemePath") { } else if (name == "IconThemePath") {
icon_theme_path = get_variant<std::string>(value); icon_theme_path = get_variant<std::string>(value);
if (!icon_theme_path.empty()) { if (!icon_theme_path.empty()) {
@ -172,7 +189,6 @@ void Item::processUpdatedProperties(Glib::RefPtr<Gio::AsyncResult>& _result) {
} }
this->updateImage(); this->updateImage();
// this->event_box.set_tooltip_text(this->title);
} catch (const Glib::Error& err) { } catch (const Glib::Error& err) {
spdlog::warn("Failed to update properties: {}", err.what()); spdlog::warn("Failed to update properties: {}", err.what());
} catch (const std::exception& err) { } catch (const std::exception& err) {