fix clippy warnings

This commit is contained in:
Emil Lerch 2026-03-02 14:25:04 -08:00
parent 9b6980bf71
commit e056cb9fec
Signed by: lobo
GPG key ID: A7B62D657EF764F8

View file

@ -3,7 +3,9 @@
use cosmic::iced::{Color, Font, Limits, Rectangle, Subscription, window}; use cosmic::iced::{Color, Font, Limits, Rectangle, Subscription, window};
use cosmic::iced::alignment::{Horizontal, Vertical}; use cosmic::iced::alignment::{Horizontal, Vertical};
use cosmic::iced::platform_specific::shell::wayland::commands::popup::{destroy_popup, get_popup}; use cosmic::iced::platform_specific::shell::wayland::commands::popup::{destroy_popup, get_popup};
use cosmic::widget::{self, autosize, container, rectangle_tracker::*}; use cosmic::widget::{self, autosize, container, rectangle_tracker::{
RectangleTracker, RectangleUpdate, rectangle_tracker_subscription,
}};
use cosmic::{iced_futures, prelude::*, surface}; use cosmic::{iced_futures, prelude::*, surface};
use cosmic::applet::cosmic_panel_config::PanelAnchor; use cosmic::applet::cosmic_panel_config::PanelAnchor;
use cosmic::iced_core::Shadow; use cosmic::iced_core::Shadow;
@ -144,6 +146,7 @@ impl cosmic::Application for AppModel {
// Calculate the width needed for the monospace content. // Calculate the width needed for the monospace content.
// The default monospace font is ~8.4px per character at 14px font size, // The default monospace font is ~8.4px per character at 14px font size,
// plus padding for container (12*2) and popup chrome (~32). // plus padding for container (12*2) and popup chrome (~32).
#[allow(clippy::cast_precision_loss)]
let max_line_len = self.full_weather.lines() let max_line_len = self.full_weather.lines()
.map(|line| line.chars().count()) .map(|line| line.chars().count())
.max() .max()
@ -236,7 +239,7 @@ impl cosmic::Application for AppModel {
self.last_updated = format_current_time(); self.last_updated = format_current_time();
} }
Err(e) => { Err(e) => {
eprintln!("Weather fetch error: {}", e); eprintln!("Weather fetch error: {e}");
self.weather_text = if e.contains("network") || e.contains("timeout") { self.weather_text = if e.contains("network") || e.contains("timeout") {
"🌐❌".to_string() // Network issue "🌐❌".to_string() // Network issue
} else { } else {
@ -252,7 +255,7 @@ impl cosmic::Application for AppModel {
self.full_weather = weather; self.full_weather = weather;
} }
Err(e) => { Err(e) => {
eprintln!("Full weather fetch error: {}", e); eprintln!("Full weather fetch error: {e}");
self.full_weather = "Failed to load weather".to_string(); self.full_weather = "Failed to load weather".to_string();
} }
} }
@ -263,61 +266,7 @@ impl cosmic::Application for AppModel {
cosmic::Action::App(Message::WeatherUpdate(result)) cosmic::Action::App(Message::WeatherUpdate(result))
}) })
} }
Message::TogglePopup => { Message::TogglePopup => self.toggle_popup(),
if let Some(p) = self.popup.take() {
destroy_popup(p)
} else {
let new_id = window::Id::unique();
self.popup = Some(new_id);
let mut popup_settings = self.core.applet.get_popup_settings(
self.core.main_window_id().unwrap(),
new_id,
None,
None,
None,
);
let Rectangle { x, y, width, height } = self.rectangle;
popup_settings.positioner.anchor_rect = Rectangle::<i32> {
x: x.max(1.) as i32,
y: y.max(1.) as i32,
width: width.max(1.) as i32,
height: height.max(1.) as i32,
};
popup_settings.positioner.size = None;
// Compute popup width from the weather content.
// ~8.4px per monospace character at default font size,
// plus padding for container (12*2) and popup chrome (~32).
let max_line_len = self.full_weather.lines()
.map(|line| line.len())
.max()
.unwrap_or(0) as f32;
// Use content-based width if available, otherwise a
// reasonable default for the wttr.in 4-column table.
let popup_width = if max_line_len > 0.0 {
(max_line_len * 8.4 + 56.0).max(400.0)
} else {
1100.0
};
popup_settings.positioner.size_limits = Limits::NONE
.min_width(1.0)
.min_height(1.0)
.max_width(popup_width)
.max_height(1080.0);
if self.full_weather.is_empty() {
let fetch_task = Task::perform(fetch_full_weather(), |result| {
cosmic::Action::App(Message::FullWeatherUpdate(result))
});
Task::batch([get_popup(popup_settings), fetch_task])
} else {
get_popup(popup_settings)
}
}
}
Message::CloseRequested(id) => { Message::CloseRequested(id) => {
if Some(id) == self.popup { if Some(id) == self.popup {
self.popup = None; self.popup = None;
@ -344,8 +293,69 @@ impl cosmic::Application for AppModel {
} }
} }
impl AppModel {
fn toggle_popup(&mut self) -> Task<cosmic::Action<Message>> {
if let Some(p) = self.popup.take() {
return destroy_popup(p);
}
let new_id = window::Id::unique();
self.popup = Some(new_id);
let mut popup_settings = self.core.applet.get_popup_settings(
self.core.main_window_id().unwrap(),
new_id,
None,
None,
None,
);
let Rectangle { x, y, width, height } = self.rectangle;
#[allow(clippy::cast_possible_truncation)]
let anchor_rect = Rectangle::<i32> {
x: x.max(1.) as i32,
y: y.max(1.) as i32,
width: width.max(1.) as i32,
height: height.max(1.) as i32,
};
popup_settings.positioner.anchor_rect = anchor_rect;
popup_settings.positioner.size = None;
// Compute popup width from the weather content.
// ~8.4px per monospace character at default font size,
// plus padding for container (12*2) and popup chrome (~32).
#[allow(clippy::cast_precision_loss)]
let max_line_len = self.full_weather.lines()
.map(str::len)
.max()
.unwrap_or(0) as f32;
// Use content-based width if available, otherwise a
// reasonable default for the wttr.in 4-column table.
let popup_width = if max_line_len > 0.0 {
(max_line_len * 8.4 + 56.0).max(400.0)
} else {
1100.0
};
popup_settings.positioner.size_limits = Limits::NONE
.min_width(1.0)
.min_height(1.0)
.max_width(popup_width)
.max_height(1080.0);
if self.full_weather.is_empty() {
let fetch_task = Task::perform(fetch_full_weather(), |result| {
cosmic::Action::App(Message::FullWeatherUpdate(result))
});
Task::batch([get_popup(popup_settings), fetch_task])
} else {
get_popup(popup_settings)
}
}
}
async fn fetch_weather() -> Result<(String, String), String> { async fn fetch_weather() -> Result<(String, String), String> {
let response = reqwest::get(&format!("{}/?format=%l|%c|%t", WTTR_URL)) let response = reqwest::get(&format!("{WTTR_URL}/?format=%l|%c|%t"))
.await .await
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
@ -378,7 +388,7 @@ fn format_current_time() -> String {
} }
async fn fetch_full_weather() -> Result<String, String> { async fn fetch_full_weather() -> Result<String, String> {
let response = reqwest::get(&format!("{}?A&T", WTTR_URL)).await.map_err(|e| e.to_string())?; let response = reqwest::get(&format!("{WTTR_URL}?A&T")).await.map_err(|e| e.to_string())?;
let text = response.text().await.map_err(|e| e.to_string())?; let text = response.text().await.map_err(|e| e.to_string())?;
Ok(text.trim().to_string()) Ok(text.trim().to_string())