2018-08-18 11:43:48 +02:00
|
|
|
#include "ALabel.hpp"
|
2022-04-06 08:37:19 +02:00
|
|
|
|
2019-05-02 16:56:45 +02:00
|
|
|
#include <fmt/format.h>
|
2022-04-06 08:37:19 +02:00
|
|
|
|
2019-05-02 17:51:01 +02:00
|
|
|
#include <util/command.hpp>
|
2018-08-27 01:36:25 +02:00
|
|
|
|
2019-06-15 14:57:52 +02:00
|
|
|
namespace waybar {
|
|
|
|
|
|
|
|
ALabel::ALabel(const Json::Value& config, const std::string& name, const std::string& id,
|
2020-08-13 04:46:51 +02:00
|
|
|
const std::string& format, uint16_t interval, bool ellipsize, bool enable_click,
|
|
|
|
bool enable_scroll)
|
|
|
|
: AModule(config, name, id, config["format-alt"].isString() || enable_click, enable_scroll),
|
2019-04-18 17:52:00 +02:00
|
|
|
format_(config_["format"].isString() ? config_["format"].asString() : format),
|
|
|
|
interval_(config_["interval"] == "once"
|
2019-04-26 21:57:15 +02:00
|
|
|
? std::chrono::seconds(100000000)
|
2019-04-18 17:52:00 +02:00
|
|
|
: std::chrono::seconds(
|
|
|
|
config_["interval"].isUInt() ? config_["interval"].asUInt() : interval)),
|
|
|
|
default_format_(format_) {
|
2019-05-22 12:06:24 +02:00
|
|
|
label_.set_name(name);
|
|
|
|
if (!id.empty()) {
|
|
|
|
label_.get_style_context()->add_class(id);
|
|
|
|
}
|
2018-08-27 01:36:25 +02:00
|
|
|
event_box_.add(label_);
|
2019-04-18 17:52:00 +02:00
|
|
|
if (config_["max-length"].isUInt()) {
|
2021-01-31 23:03:49 +01:00
|
|
|
label_.set_max_width_chars(config_["max-length"].asInt());
|
2018-08-18 11:43:48 +02:00
|
|
|
label_.set_ellipsize(Pango::EllipsizeMode::ELLIPSIZE_END);
|
2020-08-19 23:11:11 +02:00
|
|
|
label_.set_single_line_mode(true);
|
2019-06-28 14:16:09 +02:00
|
|
|
} else if (ellipsize && label_.get_max_width_chars() == -1) {
|
2019-06-28 13:49:04 +02:00
|
|
|
label_.set_ellipsize(Pango::EllipsizeMode::ELLIPSIZE_END);
|
2020-08-19 23:11:11 +02:00
|
|
|
label_.set_single_line_mode(true);
|
2018-08-18 11:43:48 +02:00
|
|
|
}
|
2019-04-25 22:47:58 +02:00
|
|
|
|
2021-01-31 23:03:49 +01:00
|
|
|
if (config_["min-length"].isUInt()) {
|
|
|
|
label_.set_width_chars(config_["min-length"].asUInt());
|
2021-01-31 22:58:41 +01:00
|
|
|
}
|
|
|
|
|
2021-02-01 10:44:51 +01:00
|
|
|
uint rotate = 0;
|
|
|
|
|
|
|
|
if (config_["rotate"].isUInt()) {
|
|
|
|
rotate = config["rotate"].asUInt();
|
|
|
|
label_.set_angle(rotate);
|
|
|
|
}
|
|
|
|
|
2021-01-31 22:58:41 +01:00
|
|
|
if (config_["align"].isDouble()) {
|
|
|
|
auto align = config_["align"].asFloat();
|
2021-02-01 10:44:51 +01:00
|
|
|
if (rotate == 90 || rotate == 270) {
|
|
|
|
label_.set_yalign(align);
|
|
|
|
} else {
|
|
|
|
label_.set_xalign(align);
|
|
|
|
}
|
2019-04-25 22:47:58 +02:00
|
|
|
}
|
2018-08-18 11:43:48 +02:00
|
|
|
}
|
|
|
|
|
2022-04-06 08:37:19 +02:00
|
|
|
auto ALabel::update() -> void { AModule::update(); }
|
2018-08-18 11:43:48 +02:00
|
|
|
|
2019-06-15 14:57:52 +02:00
|
|
|
std::string ALabel::getIcon(uint16_t percentage, const std::string& alt, uint16_t max) {
|
2018-08-29 23:50:41 +02:00
|
|
|
auto format_icons = config_["format-icons"];
|
|
|
|
if (format_icons.isObject()) {
|
2018-12-25 21:03:13 +01:00
|
|
|
if (!alt.empty() && (format_icons[alt].isString() || format_icons[alt].isArray())) {
|
2018-08-29 23:50:41 +02:00
|
|
|
format_icons = format_icons[alt];
|
|
|
|
} else {
|
|
|
|
format_icons = format_icons["default"];
|
|
|
|
}
|
2018-08-27 01:36:25 +02:00
|
|
|
}
|
2018-08-29 23:50:41 +02:00
|
|
|
if (format_icons.isArray()) {
|
|
|
|
auto size = format_icons.size();
|
2021-10-29 12:42:48 +02:00
|
|
|
if (size) {
|
|
|
|
auto idx = std::clamp(percentage / ((max == 0 ? 100 : max) / size), 0U, size - 1);
|
|
|
|
format_icons = format_icons[idx];
|
|
|
|
}
|
2018-08-29 23:50:41 +02:00
|
|
|
}
|
|
|
|
if (format_icons.isString()) {
|
|
|
|
return format_icons.asString();
|
|
|
|
}
|
|
|
|
return "";
|
2018-08-27 01:36:25 +02:00
|
|
|
}
|
|
|
|
|
2022-04-06 08:37:19 +02:00
|
|
|
std::string ALabel::getIcon(uint16_t percentage, const std::vector<std::string>& alts,
|
|
|
|
uint16_t max) {
|
2020-05-22 21:23:04 +02:00
|
|
|
auto format_icons = config_["format-icons"];
|
|
|
|
if (format_icons.isObject()) {
|
2021-01-03 19:08:06 +01:00
|
|
|
std::string _alt = "default";
|
2020-05-22 21:23:04 +02:00
|
|
|
for (const auto& alt : alts) {
|
|
|
|
if (!alt.empty() && (format_icons[alt].isString() || format_icons[alt].isArray())) {
|
2021-01-03 19:08:06 +01:00
|
|
|
_alt = alt;
|
2020-05-22 21:23:04 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2021-01-03 19:08:06 +01:00
|
|
|
format_icons = format_icons[_alt];
|
2020-05-22 21:23:04 +02:00
|
|
|
}
|
|
|
|
if (format_icons.isArray()) {
|
|
|
|
auto size = format_icons.size();
|
2021-10-29 12:42:48 +02:00
|
|
|
if (size) {
|
|
|
|
auto idx = std::clamp(percentage / ((max == 0 ? 100 : max) / size), 0U, size - 1);
|
|
|
|
format_icons = format_icons[idx];
|
|
|
|
}
|
2020-05-22 21:23:04 +02:00
|
|
|
}
|
|
|
|
if (format_icons.isString()) {
|
|
|
|
return format_icons.asString();
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
2019-06-15 14:57:52 +02:00
|
|
|
bool waybar::ALabel::handleToggle(GdkEventButton* const& e) {
|
|
|
|
if (config_["format-alt-click"].isUInt() && e->button == config_["format-alt-click"].asUInt()) {
|
|
|
|
alt_ = !alt_;
|
|
|
|
if (alt_ && config_["format-alt"].isString()) {
|
|
|
|
format_ = config_["format-alt"].asString();
|
|
|
|
} else {
|
|
|
|
format_ = default_format_;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return AModule::handleToggle(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string ALabel::getState(uint8_t value, bool lesser) {
|
2019-05-13 11:31:05 +02:00
|
|
|
if (!config_["states"].isObject()) {
|
|
|
|
return "";
|
|
|
|
}
|
2019-05-03 03:39:34 +02:00
|
|
|
// Get current state
|
|
|
|
std::vector<std::pair<std::string, uint8_t>> states;
|
|
|
|
if (config_["states"].isObject()) {
|
|
|
|
for (auto it = config_["states"].begin(); it != config_["states"].end(); ++it) {
|
|
|
|
if (it->isUInt() && it.key().isString()) {
|
|
|
|
states.emplace_back(it.key().asString(), it->asUInt());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Sort states
|
2019-05-16 09:39:06 +02:00
|
|
|
std::sort(states.begin(), states.end(), [&lesser](auto& a, auto& b) {
|
|
|
|
return lesser ? a.second < b.second : a.second > b.second;
|
2019-05-13 11:36:34 +02:00
|
|
|
});
|
2019-05-03 03:39:34 +02:00
|
|
|
std::string valid_state;
|
|
|
|
for (auto const& state : states) {
|
2019-05-16 05:14:51 +02:00
|
|
|
if ((lesser ? value <= state.second : value >= state.second) && valid_state.empty()) {
|
2019-05-03 03:39:34 +02:00
|
|
|
label_.get_style_context()->add_class(state.first);
|
|
|
|
valid_state = state.first;
|
|
|
|
} else {
|
|
|
|
label_.get_style_context()->remove_class(state.first);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return valid_state;
|
|
|
|
}
|
|
|
|
|
2019-06-15 14:57:52 +02:00
|
|
|
} // namespace waybar
|