feat(tray): implement tooltips (text only) for tray items
This commit is contained in:
parent
4b6253e810
commit
84a8f79bbe
|
@ -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;
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue