refactor(AModule): hoist format/tooltip resolution to the base module
Move resolveTooltipFormat() (and add resolveFormat()) from ALabel down into AModule, and add a generic updateTooltip(Gtk::Widget&, ...) helper. This lets modules that are not ALabel-derived reuse the shared tooltip logic instead of re-implementing it. Migrate gamemode (the only non-ALabel module reading tooltip-format) to updateTooltip(box_, ...). ALabel inherits the resolvers.
This commit is contained in:
+1
-12
@@ -34,18 +34,7 @@ class ALabel : public AModule {
|
|||||||
bool setLabelMarkup(const Glib::ustring& markup);
|
bool setLabelMarkup(const Glib::ustring& markup);
|
||||||
bool setTooltipMarkup(const Glib::ustring& markup);
|
bool setTooltipMarkup(const Glib::ustring& markup);
|
||||||
|
|
||||||
// Resolve the tooltip format string: prefers `tooltip-format-<state>` (when a
|
// resolveTooltipFormat() / resolveFormat() are inherited from AModule.
|
||||||
// non-empty state is given), then `tooltip-format`, then `defaultFormat`.
|
|
||||||
std::string resolveTooltipFormat(const std::string& defaultFormat,
|
|
||||||
const std::string& state = "") const {
|
|
||||||
if (!state.empty() && config_["tooltip-format-" + state].isString()) {
|
|
||||||
return config_["tooltip-format-" + state].asString();
|
|
||||||
}
|
|
||||||
if (config_["tooltip-format"].isString()) {
|
|
||||||
return config_["tooltip-format"].asString();
|
|
||||||
}
|
|
||||||
return defaultFormat;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Combined label + tooltip helper. Builds a single fmt argument store from
|
// Combined label + tooltip helper. Builds a single fmt argument store from
|
||||||
// `args`, renders `labelFormat` into the label and the resolved tooltip format
|
// `args`, renders `labelFormat` into the label and the resolved tooltip format
|
||||||
|
|||||||
@@ -1,11 +1,16 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/args.h>
|
||||||
|
#include <fmt/format.h>
|
||||||
#include <glibmm/dispatcher.h>
|
#include <glibmm/dispatcher.h>
|
||||||
#include <glibmm/markup.h>
|
#include <glibmm/markup.h>
|
||||||
#include <gtkmm.h>
|
#include <gtkmm.h>
|
||||||
#include <gtkmm/eventbox.h>
|
#include <gtkmm/eventbox.h>
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
#include "IModule.hpp"
|
#include "IModule.hpp"
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
@@ -40,6 +45,40 @@ class AModule : public IModule {
|
|||||||
SCROLL_DIR getScrollDir(GdkEventScroll* e);
|
SCROLL_DIR getScrollDir(GdkEventScroll* e);
|
||||||
bool tooltipEnabled() const;
|
bool tooltipEnabled() const;
|
||||||
|
|
||||||
|
// --- Generic format/tooltip resolution (config-only, usable by any module,
|
||||||
|
// ALabel-derived or not). Prefers `<key>-<state>`, then `<key>`, then default.
|
||||||
|
std::string resolveFormat(const std::string& defaultFormat, const std::string& state = "") const {
|
||||||
|
if (!state.empty() && config_["format-" + state].isString()) {
|
||||||
|
return config_["format-" + state].asString();
|
||||||
|
}
|
||||||
|
if (config_["format"].isString()) {
|
||||||
|
return config_["format"].asString();
|
||||||
|
}
|
||||||
|
return defaultFormat;
|
||||||
|
}
|
||||||
|
std::string resolveTooltipFormat(const std::string& defaultFormat,
|
||||||
|
const std::string& state = "") const {
|
||||||
|
if (!state.empty() && config_["tooltip-format-" + state].isString()) {
|
||||||
|
return config_["tooltip-format-" + state].asString();
|
||||||
|
}
|
||||||
|
if (config_["tooltip-format"].isString()) {
|
||||||
|
return config_["tooltip-format"].asString();
|
||||||
|
}
|
||||||
|
return defaultFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generic tooltip for any widget: honors the `tooltip` toggle and
|
||||||
|
// `tooltip-format`, formats with the given args and applies it. Lets modules
|
||||||
|
// that are not ALabel-derived (e.g. gamemode) reuse the shared logic.
|
||||||
|
template <typename... Args>
|
||||||
|
void updateTooltip(Gtk::Widget& widget, const std::string& defaultFormat, Args&&... args) {
|
||||||
|
if (!tooltipEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
widget.set_tooltip_markup(
|
||||||
|
fmt::format(fmt::runtime(resolveTooltipFormat(defaultFormat)), std::forward<Args>(args)...));
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<int> pid_children_;
|
std::vector<int> pid_children_;
|
||||||
const std::string name_;
|
const std::string name_;
|
||||||
const Json::Value& config_;
|
const Json::Value& config_;
|
||||||
|
|||||||
@@ -210,10 +210,7 @@ auto Gamemode::update() -> void {
|
|||||||
lastStatus = status;
|
lastStatus = status;
|
||||||
|
|
||||||
// Tooltip
|
// Tooltip
|
||||||
if (tooltip) {
|
updateTooltip(box_, tooltip_format, fmt::arg("count", gameCount));
|
||||||
std::string text = fmt::format(fmt::runtime(tooltip_format), fmt::arg("count", gameCount));
|
|
||||||
box_.set_tooltip_markup(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Label format
|
// Label format
|
||||||
std::string str = fmt::format(fmt::runtime(showAltText ? format_alt : format),
|
std::string str = fmt::format(fmt::runtime(showAltText ? format_alt : format),
|
||||||
|
|||||||
Reference in New Issue
Block a user