mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-07-20 20:11:11 +02:00
219fa8e14f
This commit adds various widget grouping and transparency options to komorebi-bar, and is comprised of the individual commits listed below, worked on in PR #1108, squashed into one.e8f5952abb* adding RenderConfig, and some test frames on widgets0a5e0a4c0a* no clonea5a7d6906c* comment6a91dd46cd* ignore unused80f0214e47* Group enum, Copy RenderConfigfbe5e2c1f7* Group -> Groupingce49b433f9* GroupingConfigf446a6a45f* "fmt --check" fix (thanks VS)d188222be7* added widget grouping and group module1008ec2031* rounding from settings, and apply_on_side7fff6d29a9* dereferencing655e8ce4c1* AlphaColour, transparency, bar background, more grouping config optionscba0fcd882* added RoundingConfigec5f7dc82d* handling grouping edge case for komorebi focus window12117b832b* changed default values645c46beb8* background color using theme color, AlphaColour.to_color32_or, updating json format for Grouping and RoundingConfig10d2ab21c7* hot-reload on groupingd88774328a* grouping correction on init2cd237fd0d* added shadow to grouping, optional width on grouping stroke4f4b617f26* grouping on bar, converting AlphaColour from_rgba_unmultiplied, simplified grouping3808fcec8f* widget rounding based on grouping, atomic background color, simplified config, style on groupingbe45d14f6d* renamed Side to Alignment, group spacingbe45d14f6d* proper widget spacing based on alignmentb43a5bda69* added widget_spacing to configc18e5f4dbe* test commitcba2b2f7ac* refactoring of render and grouping, widget spacing WIP9311cb00ec* simplify no_spacing36c267246b* correct spacing on komorebi and network widgets (WIP)85a41bf5b2* correct widget spacing on all widgets50b49ccf69* refactoring widget spacing9ec67ad988* account for ui item_spacing when setting the widget_spacinge88a2fd9c0* format
138 lines
4.2 KiB
Rust
138 lines
4.2 KiB
Rust
use crate::config::LabelPrefix;
|
|
use crate::render::RenderConfig;
|
|
use crate::widget::BarWidget;
|
|
use eframe::egui::text::LayoutJob;
|
|
use eframe::egui::Context;
|
|
use eframe::egui::FontId;
|
|
use eframe::egui::Label;
|
|
use eframe::egui::Sense;
|
|
use eframe::egui::TextFormat;
|
|
use eframe::egui::TextStyle;
|
|
use eframe::egui::Ui;
|
|
use eframe::egui::WidgetText;
|
|
use schemars::JsonSchema;
|
|
use serde::Deserialize;
|
|
use serde::Serialize;
|
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
|
|
pub struct DateConfig {
|
|
/// Enable the Date widget
|
|
pub enable: bool,
|
|
/// Set the Date format
|
|
pub format: DateFormat,
|
|
/// Display label prefix
|
|
pub label_prefix: Option<LabelPrefix>,
|
|
}
|
|
|
|
impl From<DateConfig> for Date {
|
|
fn from(value: DateConfig) -> Self {
|
|
Self {
|
|
enable: value.enable,
|
|
format: value.format,
|
|
label_prefix: value.label_prefix.unwrap_or(LabelPrefix::Icon),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
|
|
pub enum DateFormat {
|
|
/// Month/Date/Year format (09/08/24)
|
|
MonthDateYear,
|
|
/// Year-Month-Date format (2024-09-08)
|
|
YearMonthDate,
|
|
/// Date-Month-Year format (8-Sep-2024)
|
|
DateMonthYear,
|
|
/// Day Date Month Year format (8 September 2024)
|
|
DayDateMonthYear,
|
|
/// Custom format (https://docs.rs/chrono/latest/chrono/format/strftime/index.html)
|
|
Custom(String),
|
|
}
|
|
|
|
impl DateFormat {
|
|
pub fn next(&mut self) {
|
|
match self {
|
|
DateFormat::MonthDateYear => *self = Self::YearMonthDate,
|
|
DateFormat::YearMonthDate => *self = Self::DateMonthYear,
|
|
DateFormat::DateMonthYear => *self = Self::DayDateMonthYear,
|
|
DateFormat::DayDateMonthYear => *self = Self::MonthDateYear,
|
|
_ => {}
|
|
};
|
|
}
|
|
|
|
fn fmt_string(&self) -> String {
|
|
match self {
|
|
DateFormat::MonthDateYear => String::from("%D"),
|
|
DateFormat::YearMonthDate => String::from("%F"),
|
|
DateFormat::DateMonthYear => String::from("%v"),
|
|
DateFormat::DayDateMonthYear => String::from("%A %e %B %Y"),
|
|
DateFormat::Custom(custom) => custom.to_string(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Debug)]
|
|
pub struct Date {
|
|
pub enable: bool,
|
|
pub format: DateFormat,
|
|
label_prefix: LabelPrefix,
|
|
}
|
|
|
|
impl Date {
|
|
fn output(&mut self) -> String {
|
|
chrono::Local::now()
|
|
.format(&self.format.fmt_string())
|
|
.to_string()
|
|
}
|
|
}
|
|
|
|
impl BarWidget for Date {
|
|
fn render(&mut self, ctx: &Context, ui: &mut Ui, config: &mut RenderConfig) {
|
|
if self.enable {
|
|
let mut output = self.output();
|
|
if !output.is_empty() {
|
|
let font_id = ctx
|
|
.style()
|
|
.text_styles
|
|
.get(&TextStyle::Body)
|
|
.cloned()
|
|
.unwrap_or_else(FontId::default);
|
|
|
|
let mut layout_job = LayoutJob::simple(
|
|
match self.label_prefix {
|
|
LabelPrefix::Icon | LabelPrefix::IconAndText => {
|
|
egui_phosphor::regular::CALENDAR_DOTS.to_string()
|
|
}
|
|
LabelPrefix::None | LabelPrefix::Text => String::new(),
|
|
},
|
|
font_id.clone(),
|
|
ctx.style().visuals.selection.stroke.color,
|
|
100.0,
|
|
);
|
|
|
|
if let LabelPrefix::Text | LabelPrefix::IconAndText = self.label_prefix {
|
|
output.insert_str(0, "DATE: ");
|
|
}
|
|
|
|
layout_job.append(
|
|
&output,
|
|
10.0,
|
|
TextFormat::simple(font_id, ctx.style().visuals.text_color()),
|
|
);
|
|
|
|
config.apply_on_widget(true, ui, |ui| {
|
|
if ui
|
|
.add(
|
|
Label::new(WidgetText::LayoutJob(layout_job.clone()))
|
|
.selectable(false)
|
|
.sense(Sense::click()),
|
|
)
|
|
.clicked()
|
|
{
|
|
self.format.next()
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|