From 66615988396d61aa79038de17f7d1d540868e3a7 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Fri, 12 Jul 2024 16:30:50 -0400 Subject: [PATCH] feat: misc overflow --- .../com.system76.CosmicAppletAudio.desktop | 1 + cosmic-applet-audio/src/lib.rs | 37 ++++++------------- .../com.system76.CosmicAppletBattery.desktop | 1 + cosmic-applet-battery/src/app.rs | 7 +++- ...com.system76.CosmicAppletBluetooth.desktop | 1 + ....system76.CosmicAppletInputSources.desktop | 1 + .../com.system76.CosmicAppletMinimize.desktop | 1 + .../com.system76.CosmicAppletNetwork.desktop | 1 + ...system76.CosmicAppletNotifications.desktop | 1 + .../com.system76.CosmicAppletPower.desktop | 1 + ...om.system76.CosmicAppletStatusArea.desktop | 1 + .../com.system76.CosmicAppletTime.desktop | 2 +- ...om.system76.CosmicAppletWorkspaces.desktop | 2 + .../src/components/app.rs | 33 ++++++++++++++++- .../com.system76.CosmicPanelAppButton.desktop | 1 + ...system76.CosmicPanelLauncherButton.desktop | 1 + ...stem76.CosmicPanelWorkspacesButton.desktop | 1 + 17 files changed, 64 insertions(+), 29 deletions(-) diff --git a/cosmic-applet-audio/data/com.system76.CosmicAppletAudio.desktop b/cosmic-applet-audio/data/com.system76.CosmicAppletAudio.desktop index 32c5f128..a5eca813 100644 --- a/cosmic-applet-audio/data/com.system76.CosmicAppletAudio.desktop +++ b/cosmic-applet-audio/data/com.system76.CosmicAppletAudio.desktop @@ -13,3 +13,4 @@ NoDisplay=true X-CosmicApplet=true # Indicates that the auto-hover click should go to the "end" of the hover popup X-CosmicHoverPopup=End +X-OverflowPriority=10 diff --git a/cosmic-applet-audio/src/lib.rs b/cosmic-applet-audio/src/lib.rs index cba8bc7b..fe3a5934 100644 --- a/cosmic-applet-audio/src/lib.rs +++ b/cosmic-applet-audio/src/lib.rs @@ -6,26 +6,6 @@ mod mouse_area; use crate::{localize::localize, pulse::DeviceInfo}; use config::AudioAppletConfig; -use cosmic::cctk::sctk::reexports::calloop; -use cosmic::cctk::sctk::reexports::protocols::xdg::shell::client::xdg_positioner::Anchor; -use cosmic::cosmic_config::CosmicConfigEntry; -use cosmic::iced::widget; -use cosmic::iced::Limits; -use cosmic::iced::Point; -use cosmic::iced::Rectangle; -use cosmic::iced::{ - self, - widget::{column, row, slider, text}, - window, Alignment, Length, Size, Subscription, -}; -use cosmic::iced_runtime::core::alignment::Horizontal; -use cosmic::iced_style::application; -use cosmic::widget::button; -use cosmic::widget::horizontal_space; -use cosmic::widget::Column; -use cosmic::widget::Row; -use cosmic::widget::{divider, icon}; -use cosmic::Renderer; use cosmic::{ app::Command, applet::{ @@ -33,19 +13,18 @@ use cosmic::{ menu_button, menu_control_padding, padded_control, token::subscription::{activation_token_subscription, TokenRequest, TokenUpdate}, }, - cctk::sctk::reexports::calloop, + cctk::sctk::reexports::{calloop, protocols::xdg::shell::client::xdg_positioner::Anchor}, cosmic_config::CosmicConfigEntry, iced::{ - self, widget, - widget::{column, row, slider, text}, - window, Alignment, Length, Limits, Subscription, + self, + widget::{self, column, row, slider, text}, + window, Alignment, Length, Limits, Rectangle, Subscription, }, iced_runtime::core::alignment::Horizontal, iced_style::application, widget::{button, divider, horizontal_space, icon, Column, Row}, Element, Renderer, Theme, }; -use cosmic::{Element, Theme}; use cosmic_settings_subscriptions::pulse as sub_pulse; use cosmic_time::{anim, chain, id, once_cell::sync::Lazy, Instant, Timeline}; use iced::{ @@ -708,7 +687,13 @@ impl cosmic::Application for Audio { .clamp(0.0, 100.0); Message::SetOutputVolume(new_volume) }); - if let Some(playback_buttons) = self.playback_buttons() { + let playback_buttons = (!self.core.applet.configure.as_ref().is_some_and(|c| { + // if we have a configure for width and height, we're in a overflow popup + c.new_size.0.is_some() && c.new_size.1.is_some() + })) + .then(|| self.playback_buttons()); + + if let Some(Some(playback_buttons)) = playback_buttons { match self.core.applet.anchor { PanelAnchor::Left | PanelAnchor::Right => { Column::with_children(vec![playback_buttons, btn.into()]) diff --git a/cosmic-applet-battery/data/com.system76.CosmicAppletBattery.desktop b/cosmic-applet-battery/data/com.system76.CosmicAppletBattery.desktop index 47cf1903..9050df13 100644 --- a/cosmic-applet-battery/data/com.system76.CosmicAppletBattery.desktop +++ b/cosmic-applet-battery/data/com.system76.CosmicAppletBattery.desktop @@ -12,3 +12,4 @@ StartupNotify=true NoDisplay=true X-CosmicApplet=true X-CosmicHoverPopup=Start +X-OverflowPriority=10 diff --git a/cosmic-applet-battery/src/app.rs b/cosmic-applet-battery/src/app.rs index 700ac16d..cfd4ac9b 100644 --- a/cosmic-applet-battery/src/app.rs +++ b/cosmic-applet-battery/src/app.rs @@ -658,7 +658,12 @@ impl cosmic::Application for CosmicBatteryApplet { .into(), ); - if gpu.toggled { + if gpu.toggled + && !self.core.applet.configure.as_ref().is_some_and(|c| { + // if we have a configure for width and height, we're in a overflow popup + c.new_size.0.is_some() && c.new_size.1.is_some() + }) + { let app_list = gpu.app_list.as_ref().unwrap(); let mut list_apps = Vec::with_capacity(app_list.len()); for app in app_list { diff --git a/cosmic-applet-bluetooth/data/com.system76.CosmicAppletBluetooth.desktop b/cosmic-applet-bluetooth/data/com.system76.CosmicAppletBluetooth.desktop index be5a3d69..85f04333 100644 --- a/cosmic-applet-bluetooth/data/com.system76.CosmicAppletBluetooth.desktop +++ b/cosmic-applet-bluetooth/data/com.system76.CosmicAppletBluetooth.desktop @@ -11,3 +11,4 @@ StartupNotify=true NoDisplay=true X-CosmicApplet=true X-CosmicHoverPopup=Auto +X-OverflowPriority=10 diff --git a/cosmic-applet-input-sources/data/com.system76.CosmicAppletInputSources.desktop b/cosmic-applet-input-sources/data/com.system76.CosmicAppletInputSources.desktop index 833b0db0..140ee68e 100644 --- a/cosmic-applet-input-sources/data/com.system76.CosmicAppletInputSources.desktop +++ b/cosmic-applet-input-sources/data/com.system76.CosmicAppletInputSources.desktop @@ -11,3 +11,4 @@ StartupNotify=true NoDisplay=true X-CosmicApplet=true X-CosmicHoverPopup=Auto +X-OverflowPriority=10 diff --git a/cosmic-applet-minimize/data/com.system76.CosmicAppletMinimize.desktop b/cosmic-applet-minimize/data/com.system76.CosmicAppletMinimize.desktop index 4213fbca..26105f25 100644 --- a/cosmic-applet-minimize/data/com.system76.CosmicAppletMinimize.desktop +++ b/cosmic-applet-minimize/data/com.system76.CosmicAppletMinimize.desktop @@ -12,3 +12,4 @@ NoDisplay=true X-CosmicApplet=true X-MinimizeApplet=10 X-HostWaylandDisplay=true +X-OverflowPriority=50 diff --git a/cosmic-applet-network/data/com.system76.CosmicAppletNetwork.desktop b/cosmic-applet-network/data/com.system76.CosmicAppletNetwork.desktop index a6eef06d..197b58f3 100644 --- a/cosmic-applet-network/data/com.system76.CosmicAppletNetwork.desktop +++ b/cosmic-applet-network/data/com.system76.CosmicAppletNetwork.desktop @@ -11,3 +11,4 @@ StartupNotify=true NoDisplay=true X-CosmicApplet=true X-CosmicHoverPopup=Auto +X-OverflowPriority=10 diff --git a/cosmic-applet-notifications/data/com.system76.CosmicAppletNotifications.desktop b/cosmic-applet-notifications/data/com.system76.CosmicAppletNotifications.desktop index 009b4258..3daf0d97 100644 --- a/cosmic-applet-notifications/data/com.system76.CosmicAppletNotifications.desktop +++ b/cosmic-applet-notifications/data/com.system76.CosmicAppletNotifications.desktop @@ -11,3 +11,4 @@ NoDisplay=true X-CosmicApplet=true X-NotificationsApplet=true X-CosmicHoverPopup=Auto +X-OverflowPriority=10 diff --git a/cosmic-applet-power/data/com.system76.CosmicAppletPower.desktop b/cosmic-applet-power/data/com.system76.CosmicAppletPower.desktop index 9972ffc2..0308eb58 100644 --- a/cosmic-applet-power/data/com.system76.CosmicAppletPower.desktop +++ b/cosmic-applet-power/data/com.system76.CosmicAppletPower.desktop @@ -11,3 +11,4 @@ StartupNotify=true NoDisplay=true X-CosmicApplet=true X-CosmicHoverPopup=Auto +X-OverflowPriority=10 diff --git a/cosmic-applet-status-area/data/com.system76.CosmicAppletStatusArea.desktop b/cosmic-applet-status-area/data/com.system76.CosmicAppletStatusArea.desktop index 5508a4d8..4559e531 100644 --- a/cosmic-applet-status-area/data/com.system76.CosmicAppletStatusArea.desktop +++ b/cosmic-applet-status-area/data/com.system76.CosmicAppletStatusArea.desktop @@ -12,3 +12,4 @@ StartupNotify=true NoDisplay=true X-CosmicApplet=true X-CosmicHoverPopup=Auto +X-OverflowPriority=10 diff --git a/cosmic-applet-time/data/com.system76.CosmicAppletTime.desktop b/cosmic-applet-time/data/com.system76.CosmicAppletTime.desktop index 112a75f3..6ccea2ac 100644 --- a/cosmic-applet-time/data/com.system76.CosmicAppletTime.desktop +++ b/cosmic-applet-time/data/com.system76.CosmicAppletTime.desktop @@ -11,4 +11,4 @@ NoDisplay=true X-CosmicApplet=true X-HostWaylandDisplay=true X-CosmicHoverPopup=Auto - +# No shrink priority, as this applet is always visible when configured diff --git a/cosmic-applet-workspaces/data/com.system76.CosmicAppletWorkspaces.desktop b/cosmic-applet-workspaces/data/com.system76.CosmicAppletWorkspaces.desktop index c76be974..6b861376 100644 --- a/cosmic-applet-workspaces/data/com.system76.CosmicAppletWorkspaces.desktop +++ b/cosmic-applet-workspaces/data/com.system76.CosmicAppletWorkspaces.desktop @@ -10,3 +10,5 @@ StartupNotify=true NoDisplay=true X-CosmicApplet=true X-HostWaylandDisplay=true +X-OverflowPriority=5 +X-OverflowMinSize=4 diff --git a/cosmic-applet-workspaces/src/components/app.rs b/cosmic-applet-workspaces/src/components/app.rs index 4f47a556..ae85a20e 100644 --- a/cosmic-applet-workspaces/src/components/app.rs +++ b/cosmic-applet-workspaces/src/components/app.rs @@ -47,6 +47,33 @@ struct IcedWorkspacesApplet { layout: Layout, } +impl IcedWorkspacesApplet { + /// returns the index of the workspace button after which which must be moved to a popup + /// if it exists. + fn popup_index(&self) -> Option { + let mut index = None; + let Some(max_major_axis_len) = self.core.applet.configure.as_ref().and_then(|c| { + // if we have a configure for width and height, we're in a overflow popup + match self.core.applet.anchor { + PanelAnchor::Top | PanelAnchor::Bottom => c.new_size.0, + PanelAnchor::Left | PanelAnchor::Right => c.new_size.1, + } + }) else { + return index; + }; + let button_total_size = self.core.applet.suggested_size(true).0 + + self.core.applet.suggested_padding(true) * 2 + + 4; + let btn_count = max_major_axis_len.get() / button_total_size as u32; + if btn_count >= self.workspaces.len() as u32 { + index = None; + } else { + index = Some((btn_count as usize).min(self.workspaces.len())); + } + index + } +} + #[derive(Debug, Clone)] enum Message { WorkspaceUpdate(WorkspacesUpdate), @@ -146,7 +173,9 @@ impl cosmic::Application for IcedWorkspacesApplet { let suggested_total = self.core.applet.suggested_size(true).0 + self.core.applet.suggested_padding(true) * 2; let suggested_window_size = self.core.applet.suggested_window_size(); - let buttons = self.workspaces.iter().filter_map(|w| { + let popup_index = self.popup_index().unwrap_or(self.workspaces.len()); + + let buttons = self.workspaces[..popup_index].iter().filter_map(|w| { let content = self.core.applet.text(w.0.clone()).font(FONT_BOLD); let (width, height) = if self.core.applet.is_horizontal() { @@ -245,6 +274,8 @@ impl cosmic::Application for IcedWorkspacesApplet { .into(), ) }); + // TODO if there is a popup_index, create a button with a popup for the remaining workspaces + // Should it appear on hover or on click? let layout_section: Element<_> = match self.layout { Layout::Row => row(buttons).spacing(4).into(), Layout::Column => column(buttons).spacing(4).into(), diff --git a/cosmic-panel-app-button/data/com.system76.CosmicPanelAppButton.desktop b/cosmic-panel-app-button/data/com.system76.CosmicPanelAppButton.desktop index 11ddf214..a8677497 100644 --- a/cosmic-panel-app-button/data/com.system76.CosmicPanelAppButton.desktop +++ b/cosmic-panel-app-button/data/com.system76.CosmicPanelAppButton.desktop @@ -15,3 +15,4 @@ Icon=com.system76.CosmicPanelAppButton StartupNotify=true NoDisplay=true X-CosmicApplet=true +X-OverflowPriority=10 diff --git a/cosmic-panel-launcher-button/data/com.system76.CosmicPanelLauncherButton.desktop b/cosmic-panel-launcher-button/data/com.system76.CosmicPanelLauncherButton.desktop index 570f4230..9d84df6e 100644 --- a/cosmic-panel-launcher-button/data/com.system76.CosmicPanelLauncherButton.desktop +++ b/cosmic-panel-launcher-button/data/com.system76.CosmicPanelLauncherButton.desktop @@ -10,3 +10,4 @@ Icon=com.system76.CosmicPanelLauncherButton StartupNotify=true NoDisplay=true X-CosmicApplet=true +X-OverflowPriority=10 diff --git a/cosmic-panel-workspaces-button/data/com.system76.CosmicPanelWorkspacesButton.desktop b/cosmic-panel-workspaces-button/data/com.system76.CosmicPanelWorkspacesButton.desktop index 38a3a4ee..e5028a19 100644 --- a/cosmic-panel-workspaces-button/data/com.system76.CosmicPanelWorkspacesButton.desktop +++ b/cosmic-panel-workspaces-button/data/com.system76.CosmicPanelWorkspacesButton.desktop @@ -11,3 +11,4 @@ Icon=com.system76.CosmicPanelWorkspacesButton StartupNotify=true NoDisplay=true X-CosmicApplet=true +X-OverflowPriority=10