feat: misc overflow
This commit is contained in:
parent
f46f50e8e2
commit
6661598839
17 changed files with 64 additions and 29 deletions
|
|
@ -13,3 +13,4 @@ NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
# Indicates that the auto-hover click should go to the "end" of the hover popup
|
# Indicates that the auto-hover click should go to the "end" of the hover popup
|
||||||
X-CosmicHoverPopup=End
|
X-CosmicHoverPopup=End
|
||||||
|
X-OverflowPriority=10
|
||||||
|
|
|
||||||
|
|
@ -6,26 +6,6 @@ mod mouse_area;
|
||||||
|
|
||||||
use crate::{localize::localize, pulse::DeviceInfo};
|
use crate::{localize::localize, pulse::DeviceInfo};
|
||||||
use config::AudioAppletConfig;
|
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::{
|
use cosmic::{
|
||||||
app::Command,
|
app::Command,
|
||||||
applet::{
|
applet::{
|
||||||
|
|
@ -33,19 +13,18 @@ use cosmic::{
|
||||||
menu_button, menu_control_padding, padded_control,
|
menu_button, menu_control_padding, padded_control,
|
||||||
token::subscription::{activation_token_subscription, TokenRequest, TokenUpdate},
|
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,
|
cosmic_config::CosmicConfigEntry,
|
||||||
iced::{
|
iced::{
|
||||||
self, widget,
|
self,
|
||||||
widget::{column, row, slider, text},
|
widget::{self, column, row, slider, text},
|
||||||
window, Alignment, Length, Limits, Subscription,
|
window, Alignment, Length, Limits, Rectangle, Subscription,
|
||||||
},
|
},
|
||||||
iced_runtime::core::alignment::Horizontal,
|
iced_runtime::core::alignment::Horizontal,
|
||||||
iced_style::application,
|
iced_style::application,
|
||||||
widget::{button, divider, horizontal_space, icon, Column, Row},
|
widget::{button, divider, horizontal_space, icon, Column, Row},
|
||||||
Element, Renderer, Theme,
|
Element, Renderer, Theme,
|
||||||
};
|
};
|
||||||
use cosmic::{Element, Theme};
|
|
||||||
use cosmic_settings_subscriptions::pulse as sub_pulse;
|
use cosmic_settings_subscriptions::pulse as sub_pulse;
|
||||||
use cosmic_time::{anim, chain, id, once_cell::sync::Lazy, Instant, Timeline};
|
use cosmic_time::{anim, chain, id, once_cell::sync::Lazy, Instant, Timeline};
|
||||||
use iced::{
|
use iced::{
|
||||||
|
|
@ -708,7 +687,13 @@ impl cosmic::Application for Audio {
|
||||||
.clamp(0.0, 100.0);
|
.clamp(0.0, 100.0);
|
||||||
Message::SetOutputVolume(new_volume)
|
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 {
|
match self.core.applet.anchor {
|
||||||
PanelAnchor::Left | PanelAnchor::Right => {
|
PanelAnchor::Left | PanelAnchor::Right => {
|
||||||
Column::with_children(vec![playback_buttons, btn.into()])
|
Column::with_children(vec![playback_buttons, btn.into()])
|
||||||
|
|
|
||||||
|
|
@ -12,3 +12,4 @@ StartupNotify=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
X-CosmicHoverPopup=Start
|
X-CosmicHoverPopup=Start
|
||||||
|
X-OverflowPriority=10
|
||||||
|
|
|
||||||
|
|
@ -658,7 +658,12 @@ impl cosmic::Application for CosmicBatteryApplet {
|
||||||
.into(),
|
.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 app_list = gpu.app_list.as_ref().unwrap();
|
||||||
let mut list_apps = Vec::with_capacity(app_list.len());
|
let mut list_apps = Vec::with_capacity(app_list.len());
|
||||||
for app in app_list {
|
for app in app_list {
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,4 @@ StartupNotify=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
X-CosmicHoverPopup=Auto
|
X-CosmicHoverPopup=Auto
|
||||||
|
X-OverflowPriority=10
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,4 @@ StartupNotify=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
X-CosmicHoverPopup=Auto
|
X-CosmicHoverPopup=Auto
|
||||||
|
X-OverflowPriority=10
|
||||||
|
|
|
||||||
|
|
@ -12,3 +12,4 @@ NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
X-MinimizeApplet=10
|
X-MinimizeApplet=10
|
||||||
X-HostWaylandDisplay=true
|
X-HostWaylandDisplay=true
|
||||||
|
X-OverflowPriority=50
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,4 @@ StartupNotify=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
X-CosmicHoverPopup=Auto
|
X-CosmicHoverPopup=Auto
|
||||||
|
X-OverflowPriority=10
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,4 @@ NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
X-NotificationsApplet=true
|
X-NotificationsApplet=true
|
||||||
X-CosmicHoverPopup=Auto
|
X-CosmicHoverPopup=Auto
|
||||||
|
X-OverflowPriority=10
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,4 @@ StartupNotify=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
X-CosmicHoverPopup=Auto
|
X-CosmicHoverPopup=Auto
|
||||||
|
X-OverflowPriority=10
|
||||||
|
|
|
||||||
|
|
@ -12,3 +12,4 @@ StartupNotify=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
X-CosmicHoverPopup=Auto
|
X-CosmicHoverPopup=Auto
|
||||||
|
X-OverflowPriority=10
|
||||||
|
|
|
||||||
|
|
@ -11,4 +11,4 @@ NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
X-HostWaylandDisplay=true
|
X-HostWaylandDisplay=true
|
||||||
X-CosmicHoverPopup=Auto
|
X-CosmicHoverPopup=Auto
|
||||||
|
# No shrink priority, as this applet is always visible when configured
|
||||||
|
|
|
||||||
|
|
@ -10,3 +10,5 @@ StartupNotify=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
X-HostWaylandDisplay=true
|
X-HostWaylandDisplay=true
|
||||||
|
X-OverflowPriority=5
|
||||||
|
X-OverflowMinSize=4
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,33 @@ struct IcedWorkspacesApplet {
|
||||||
layout: Layout,
|
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<usize> {
|
||||||
|
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)]
|
#[derive(Debug, Clone)]
|
||||||
enum Message {
|
enum Message {
|
||||||
WorkspaceUpdate(WorkspacesUpdate),
|
WorkspaceUpdate(WorkspacesUpdate),
|
||||||
|
|
@ -146,7 +173,9 @@ impl cosmic::Application for IcedWorkspacesApplet {
|
||||||
let suggested_total =
|
let suggested_total =
|
||||||
self.core.applet.suggested_size(true).0 + self.core.applet.suggested_padding(true) * 2;
|
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 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 content = self.core.applet.text(w.0.clone()).font(FONT_BOLD);
|
||||||
|
|
||||||
let (width, height) = if self.core.applet.is_horizontal() {
|
let (width, height) = if self.core.applet.is_horizontal() {
|
||||||
|
|
@ -245,6 +274,8 @@ impl cosmic::Application for IcedWorkspacesApplet {
|
||||||
.into(),
|
.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 {
|
let layout_section: Element<_> = match self.layout {
|
||||||
Layout::Row => row(buttons).spacing(4).into(),
|
Layout::Row => row(buttons).spacing(4).into(),
|
||||||
Layout::Column => column(buttons).spacing(4).into(),
|
Layout::Column => column(buttons).spacing(4).into(),
|
||||||
|
|
|
||||||
|
|
@ -15,3 +15,4 @@ Icon=com.system76.CosmicPanelAppButton
|
||||||
StartupNotify=true
|
StartupNotify=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
|
X-OverflowPriority=10
|
||||||
|
|
|
||||||
|
|
@ -10,3 +10,4 @@ Icon=com.system76.CosmicPanelLauncherButton
|
||||||
StartupNotify=true
|
StartupNotify=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
|
X-OverflowPriority=10
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,4 @@ Icon=com.system76.CosmicPanelWorkspacesButton
|
||||||
StartupNotify=true
|
StartupNotify=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-CosmicApplet=true
|
X-CosmicApplet=true
|
||||||
|
X-OverflowPriority=10
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue