1
0
Fork 0
mirror of https://github.com/Zedfrigg/ironbar.git synced 2025-08-17 06:41:03 +02:00

refactor: move label truncate function to ext trait

 Conflicts:
	src/gtk_helpers.rs
	src/modules/music/mod.rs
This commit is contained in:
Jake Stanger 2024-06-28 23:27:52 +01:00
parent cc6f21ed68
commit 8b05ed526d
No known key found for this signature in database
GPG key ID: C51FC8F9CB0BEA61
8 changed files with 44 additions and 35 deletions

View file

@ -1,5 +1,4 @@
use gtk::pango::EllipsizeMode as GtkEllipsizeMode;
use gtk::prelude::*;
use serde::Deserialize;
#[derive(Debug, Deserialize, Clone, Copy)]
@ -102,35 +101,27 @@ pub enum TruncateMode {
}
impl TruncateMode {
const fn mode(&self) -> EllipsizeMode {
match self {
Self::Length { mode, .. } | Self::Auto(mode) => *mode,
}
}
const fn length(&self) -> Option<i32> {
pub const fn length(&self) -> Option<i32> {
match self {
Self::Auto(_) | Self::Off => None,
Self::Length { length, .. } => *length,
}
}
const fn max_length(&self) -> Option<i32> {
pub const fn max_length(&self) -> Option<i32> {
match self {
Self::Auto(_) | Self::Off => None,
Self::Length { max_length, .. } => *max_length,
}
}
}
pub fn truncate_label(&self, label: &gtk::Label) {
label.set_ellipsize(self.mode().into());
if let Some(length) = self.length() {
label.set_width_chars(length);
}
if let Some(length) = self.max_length() {
label.set_max_width_chars(length);
}
impl From<TruncateMode> for GtkEllipsizeMode {
fn from(value: TruncateMode) -> Self {
let mode = match value {
TruncateMode::Off => EllipsizeMode::None,
TruncateMode::Length { mode, .. } | TruncateMode::Auto(mode) => mode,
};
mode.into()
}
}

View file

@ -1,6 +1,8 @@
use crate::config::TruncateMode;
use glib::{markup_escape_text, IsA};
use gtk::pango::EllipsizeMode;
use gtk::prelude::*;
use gtk::{Orientation, Widget};
use gtk::{Label, Orientation, Widget};
/// Represents a widget's size
/// and location relative to the bar's start edge.
@ -83,9 +85,11 @@ pub trait IronbarLabelExt {
/// the text is escaped to avoid issues with special characters (ie `&`).
/// Otherwise, the text is used verbatim, and it is up to the user to escape.
fn set_label_escaped(&self, label: &str);
fn truncate(&self, mode: TruncateMode);
}
impl IronbarLabelExt for gtk::Label {
impl IronbarLabelExt for Label {
fn set_label_escaped(&self, label: &str) {
if !label.contains("<span") {
self.set_label(&markup_escape_text(label));
@ -93,4 +97,16 @@ impl IronbarLabelExt for gtk::Label {
self.set_label(label);
}
}
fn truncate(&self, mode: TruncateMode) {
self.set_ellipsize(<TruncateMode as Into<EllipsizeMode>>::into(mode));
if let Some(length) = mode.length() {
self.set_width_chars(length);
}
if let Some(length) = mode.max_length() {
self.set_max_width_chars(length);
}
}
}

View file

@ -1,6 +1,7 @@
use crate::clients::clipboard::{self, ClipboardEvent};
use crate::clients::wayland::{ClipboardItem, ClipboardValue};
use crate::config::{CommonConfig, TruncateMode};
use crate::gtk_helpers::IronbarLabelExt;
use crate::image::new_icon_button;
use crate::modules::{
Module, ModuleInfo, ModuleParts, ModulePopup, ModuleUpdateEvent, PopupButton, WidgetContext,
@ -195,7 +196,7 @@ impl Module<Button> for ClipboardModule {
button.add(&label);
if let Some(truncate) = self.truncate {
truncate.truncate_label(&label);
label.truncate(truncate);
}
button.style_context().add_class("text");

View file

@ -1,6 +1,7 @@
use crate::clients::wayland::{self, ToplevelEvent};
use crate::config::{CommonConfig, TruncateMode};
use crate::gtk_helpers::IronbarGtkExt;
use crate::gtk_helpers::IronbarLabelExt;
use crate::image::ImageProvider;
use crate::modules::{Module, ModuleInfo, ModuleParts, ModuleUpdateEvent, WidgetContext};
use crate::{glib_recv, module_impl, send_async, spawn, try_send};
@ -145,7 +146,7 @@ impl Module<gtk::Box> for FocusedModule {
label.add_class("label");
if let Some(truncate) = self.truncate {
truncate.truncate_label(&label);
label.truncate(truncate);
}
container.add(&label);

View file

@ -196,7 +196,7 @@ impl Module<Button> for MusicModule {
.build();
if let Some(truncate) = self.truncate {
truncate.truncate_label(&label);
label.truncate(truncate);
}
button_contents.add(&icon_pause);

View file

@ -66,7 +66,7 @@ impl Module<GtkBox> for NetworkManagerModule {
let initial_icon_name = "content-loading-symbolic";
ImageProvider::parse(initial_icon_name, &icon_theme, false, self.icon_size)
.map(|provider| provider.load_into_image(icon.clone()));
.map(|provider| provider.load_into_image(&icon));
let widget_receiver = context.subscribe();
glib_recv!(widget_receiver, state => {
@ -80,7 +80,7 @@ impl Module<GtkBox> for NetworkManagerModule {
ClientState::Unknown => "dialog-question-symbolic",
};
ImageProvider::parse(icon_name, &icon_theme, false, self.icon_size)
.map(|provider| provider.load_into_image(icon.clone()));
.map(|provider| provider.load_into_image(&icon));
});
Ok(ModuleParts::new(container, None))

View file

@ -66,7 +66,7 @@ impl Module<Label> for SwayModeModule {
let label = label.clone();
if let Some(truncate) = self.truncate {
truncate.truncate_label(&label);
label.truncate(truncate);
}
let on_mode = move |mode: ModeEvent| {