fix(accessibility): use popup_dropdown

This commit is contained in:
Vukašin Vojinović 2025-03-26 17:01:57 +01:00 • committed by Michael Murphy
parent 81aa5413e5
commit 486b4b9cad
21 changed files with 160 additions and 144 deletions

View file

@ -2,24 +2,23 @@ use std::collections::HashSet;
use std::fmt::Write;
use cosmic::{
Apply,
iced::{Element, Length},
iced_core::text::Wrapping,
surface,
widget::{self, icon, settings, svg, text},
Apply,
};
use cosmic_comp_config::{ZoomConfig, ZoomMovement};
use cosmic_config::{ConfigGet, ConfigSet};
use cosmic_settings_config::{shortcuts, Action, Binding};
use cosmic_settings_config::{Action, Binding, shortcuts};
use cosmic_settings_page::{
self as page,
self as page, Entity,
section::{self, Section},
Entity,
};
use slotmap::SlotMap;
use tracing::error;
use super::{wayland, AccessibilityEvent, AccessibilityRequest};
use super::{AccessibilityEvent, AccessibilityRequest, wayland};
#[derive(Debug)]
pub struct Page {
@ -254,10 +253,12 @@ pub fn tip() -> section::Section<crate::pages::Message> {
.view::<Page>(move |_binder, _page, section| {
let descriptions = &section.descriptions;
let mut items = vec![text::body(&descriptions[applet])
.wrapping(Wrapping::Word)
.width(Length::Shrink)
.into()];
let mut items = vec![
text::body(&descriptions[applet])
.wrapping(Wrapping::Word)
.width(Length::Shrink)
.into(),
];
if let Some(illustration) = applet_illustration.clone() {
items.push(svg(illustration).width(Length::Fill).into());
}
@ -283,30 +284,36 @@ pub fn view_movement() -> section::Section<crate::pages::Message> {
settings::section()
.title(&section.title)
.add(widget::settings::item_row(vec![widget::radio(
text::body(&descriptions[continuous]),
ZoomMovement::Continuously,
Some(page.zoom_config.view_moves),
Message::SetMovement,
)
.width(Length::Fill)
.into()]))
.add(widget::settings::item_row(vec![widget::radio(
text::body(&descriptions[onedge]),
ZoomMovement::OnEdge,
Some(page.zoom_config.view_moves),
Message::SetMovement,
)
.width(Length::Fill)
.into()]))
.add(widget::settings::item_row(vec![widget::radio(
text::body(&descriptions[centered]),
ZoomMovement::Centered,
Some(page.zoom_config.view_moves),
Message::SetMovement,
)
.width(Length::Fill)
.into()]))
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&descriptions[continuous]),
ZoomMovement::Continuously,
Some(page.zoom_config.view_moves),
Message::SetMovement,
)
.width(Length::Fill)
.into(),
]))
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&descriptions[onedge]),
ZoomMovement::OnEdge,
Some(page.zoom_config.view_moves),
Message::SetMovement,
)
.width(Length::Fill)
.into(),
]))
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&descriptions[centered]),
ZoomMovement::Centered,
Some(page.zoom_config.view_moves),
Message::SetMovement,
)
.width(Length::Fill)
.into(),
]))
.apply(Element::from)
.map(crate::pages::Message::AccessibilityMagnifier)
})

View file

@ -1,9 +1,10 @@
use cosmic::{
Apply, Task,
Task,
cosmic_theme::{CosmicPalette, ThemeBuilder},
iced_core::text::Wrapping,
theme::{self, CosmicTheme},
widget::{button, container, dropdown, horizontal_space, icon, settings, text, toggler},
surface,
theme::CosmicTheme,
widget::{dropdown, settings, text, toggler},
};
pub use cosmic_comp_config::ZoomMovement;
use cosmic_config::CosmicConfigEntry;
@ -68,6 +69,7 @@ pub enum Message {
SetScreenInverted(bool),
SetScreenFilterActive(bool),
SetScreenFilterSelection(ColorFilter),
Surface(surface::Action),
}
impl page::Page<crate::pages::Message> for Page {
@ -178,19 +180,9 @@ pub fn vision() -> section::Section<crate::pages::Message> {
&descriptions[unavailable]
};
settings::item_row(vec![
text::body(&descriptions[magnifier])
.wrapping(Wrapping::Word)
.into(),
horizontal_space().into(),
text::body(status_text).wrapping(Wrapping::Word).into(),
icon::from_name("go-next-symbolic").size(16).into(),
])
.apply(container)
.class(cosmic::theme::Container::List)
.apply(button::custom)
.class(theme::Button::Transparent)
.on_press_maybe(
crate::widget::go_next_with_item(
&descriptions[magnifier],
text::body(status_text).wrapping(Wrapping::Word),
page.wayland_available
.is_some()
.then_some(crate::pages::Message::Page(magnifier_entity)),
@ -235,13 +227,20 @@ pub fn vision() -> section::Section<crate::pages::Message> {
};
cosmic::Element::from(
settings::item::builder(&descriptions[color_filter_type]).control(
dropdown(
dropdown::popup_dropdown(
selections,
Some(page.screen_filter_selection as usize),
move |idx| {
let filter = ColorFilter::from_usize(idx).unwrap_or_default();
Message::SetScreenFilterSelection(filter)
},
cosmic::iced::window::Id::RESERVED,
Message::Surface,
|a| {
crate::app::Message::PageMessage(
crate::pages::Message::Accessibility(a),
)
},
),
),
)
@ -361,6 +360,9 @@ impl Page {
self.screen_filter_selection = filter;
}
}
Message::Surface(a) => {
return cosmic::task::message(crate::app::Message::Surface(a));
}
}
cosmic::iced::Task::none()

View file

@ -1,6 +1,6 @@
use cosmic::iced::{Alignment, Length};
use cosmic::widget::{button, icon, settings, text};
use cosmic::{widget, Apply, Element, Task};
use cosmic::{Apply, Element, Task, widget};
use cosmic_settings_page::section::Entity;
use cosmic_settings_page::{self as page, Content, Info, Section};
use freedesktop_desktop_entry::DesktopEntry;
@ -66,9 +66,11 @@ enum Context {
impl Into<Vec<PathBuf>> for DirectoryType {
fn into(self) -> Vec<PathBuf> {
match self {
DirectoryType::User => vec![dirs::config_dir()
.expect("config dir not found")
.join("autostart")],
DirectoryType::User => vec![
dirs::config_dir()
.expect("config dir not found")
.join("autostart"),
],
}
}
}
@ -309,7 +311,7 @@ impl Page {
) -> Element<'_, crate::pages::Message> {
let cosmic::cosmic_theme::Spacing {
space_s, space_l, ..
} = cosmic::theme::active().cosmic().spacing;
} = cosmic::theme::spacing();
let search = widget::search_input(fl!("type-to-search"), &self.application_search)
.on_input(Message::ApplicationSearch)
@ -328,12 +330,12 @@ impl Page {
{
let mut row = widget::row::with_capacity(2).spacing(space_s);
row = row.push(icon::from_name(app.icon().unwrap_or("application-default")));
row = row
.push(icon::from_name(app.icon().unwrap_or("application-default")));
if let Some(name) = app.name(&startup_apps.locales) {
row = row.push(text(name));
}
else {
} else {
row = row.push(text(&app.appid));
}
@ -363,13 +365,14 @@ impl Page {
}
fn apps() -> Section<crate::pages::Message> {
let cosmic::cosmic_theme::Spacing { space_s, .. } = cosmic::theme::active().cosmic().spacing;
let cosmic::cosmic_theme::Spacing {
space_xxs, space_s, ..
} = cosmic::theme::spacing();
Section::default()
.title(fl!("startup-apps"))
.view::<Page>(move |_binder, page, _section| {
let mut view = widget::column::with_capacity(4)
.spacing(cosmic::theme::active().cosmic().space_xxs());
let mut view = widget::column::with_capacity(4).spacing(space_xxs);
if let Some(startup_apps) = &page.cached_startup_apps {
let order = vec![DirectoryType::User];
@ -386,12 +389,12 @@ fn apps() -> Section<crate::pages::Message> {
for app in apps {
let mut row = widget::row::with_capacity(2).spacing(space_s);
row = row.push(icon::from_name(app.icon().unwrap_or("application-default")));
row = row
.push(icon::from_name(app.icon().unwrap_or("application-default")));
if let Some(name) = app.name(&startup_apps.locales) {
row = row.push(text(name));
}
else {
} else {
row = row.push(text(&app.appid));
}

View file

@ -8,10 +8,10 @@ use cosmic::iced::{Alignment, Length};
use cosmic::iced_core::text::Wrapping;
use cosmic::widget::color_picker::ColorPickerUpdate;
use cosmic::widget::{
self, button, column, container, divider, horizontal_space, icon, row, settings, text,
vertical_space, ColorPickerModel,
self, ColorPickerModel, button, column, container, divider, horizontal_space, icon, row,
settings, text, vertical_space,
};
use cosmic::{theme, Apply, Element};
use cosmic::{Apply, Element, theme};
use cosmic_settings_page as page;
pub fn color_picker_context_view<'a, Message: Clone + 'static>(
@ -124,7 +124,7 @@ pub fn page_list_item<'a, Message: 'static + Clone>(
space_s,
space_m,
..
} = cosmic::theme::active().cosmic().spacing;
} = cosmic::theme::spacing();
let mut builder = cosmic::widget::settings::item::builder(title);
@ -181,7 +181,10 @@ pub fn sub_page_header<'a, Message: 'static + Clone>(
.into()
}
pub fn go_next_item<Msg: Clone + 'static>(description: &str, msg: Msg) -> cosmic::Element<'_, Msg> {
pub fn go_next_item<Msg: Clone + 'static>(
description: &str,
msg_opt: impl Into<Option<Msg>>,
) -> cosmic::Element<'_, Msg> {
settings::item_row(vec![
text::body(description).wrapping(Wrapping::Word).into(),
horizontal_space().into(),
@ -190,15 +193,16 @@ pub fn go_next_item<Msg: Clone + 'static>(description: &str, msg: Msg) -> cosmic
.apply(widget::container)
.class(cosmic::theme::Container::List)
.apply(button::custom)
.padding(0)
.class(theme::Button::Transparent)
.on_press(msg)
.on_press_maybe(msg_opt.into())
.into()
}
pub fn go_next_with_item<'a, Msg: Clone + 'static>(
description: &'a str,
item: impl Into<cosmic::Element<'a, Msg>>,
msg: Msg,
msg_opt: impl Into<Option<Msg>>,
) -> cosmic::Element<'a, Msg> {
settings::item_row(vec![
text::body(description).wrapping(Wrapping::Word).into(),
@ -207,13 +211,14 @@ pub fn go_next_with_item<'a, Msg: Clone + 'static>(
.push(item)
.push(icon::from_name("go-next-symbolic").size(16).icon())
.align_y(Alignment::Center)
.spacing(cosmic::theme::active().cosmic().spacing.space_s)
.spacing(cosmic::theme::spacing().space_s)
.into(),
])
.apply(widget::container)
.class(cosmic::theme::Container::List)
.apply(button::custom)
.padding(0)
.class(theme::Button::Transparent)
.on_press(msg)
.on_press_maybe(msg_opt.into())
.into()
}

View file

@ -416,7 +416,7 @@ dialog = الحواري
}.
.revert-settings = استرد الإعدادات
legacy-applications = تحجيم تطبيقات نظام النوافذ إكس11
legacy-app-scaling = تحجيم تطبيقات نظام النوافذ إكس11
.scaled-by-system = حجِّم كل تطبيقات إكس11
.system-description = ستظهر تطبيقات إكس11 بشكل ضبابي على شاشات HiDPI.
.scaled-natively = صيِّر تطبيقات إكس11 بميزها الأصيل

View file

@ -361,7 +361,7 @@ dialog = Дыялог
.change-prompt = Змены налад будуць аўтаматычна вернуты праз { $time } секунд.
.revert-settings = Вярнуць налады
legacy-applications = Маштабаванне праграм аконнай сістэмы X11
legacy-app-scaling = Маштабаванне праграм аконнай сістэмы X11
.scaled-by-system = Маштабаваць усе праграмы X11
.system-description = Праграмы X11 будуць размытымі на экранах HiDPI.
.scaled-natively = Рэндэрыць праграмы X11 у роднай раздзяляльнасці

View file

@ -393,7 +393,7 @@ dialog = Dialog
.change-prompt = Ændringer af indstillinger vil automatisk vende tilbage om { $time } sekunder.
.revert-settings = Gendan indstillinger
legacy-applications = X11 Vinduessystem Applikationsskalering
legacy-app-scaling = X11 Vinduessystem Applikationsskalering
.scaled-by-system = Skalér alle X11 applikationer
.system-description = X11 applikationer vil fremstå slørede på HiDPI-skærme.
.scaled-natively = Render X11 applikationer i naturlig opløsning

View file

@ -401,7 +401,7 @@ dialog = Dialog
.change-prompt = Änderungen an den Einstellungen werden in { $time } Sekunden automatisch rückgängig gemacht.
.revert-settings = Einstellungen rückgängig machen
legacy-applications = Anwendungsskalierung des X11-Fenstersystems
legacy-app-scaling = Anwendungsskalierung des X11-Fenstersystems
.scaled-by-system = Alle X11-Anwendungen skalieren
.system-description = X11-Anwendungen werden auf HiDPI-Bildschirmen unscharf dargestellt.
.scaled-natively = X11-Anwendungen in nativer Auflösung rendern

View file

@ -392,7 +392,7 @@ dialog = Diálogo
.change-prompt = Los cambios en la configuración se revertirán automáticamente en { $time } segundos.
.revert-settings = Revertir configuraciones
legacy-applications = Escalado de aplicaciones del sistema de ventanas X11
legacy-app-scaling = Escalado de aplicaciones del sistema de ventanas X11
.scaled-by-system = Escalar todas las aplicaciones X11
.system-description = Las aplicaciones X11 aparecerán borrosas en pantallas HiDPI.
.scaled-natively = Renderizar aplicaciones X11 a resolución nativa

View file

@ -393,7 +393,7 @@ dialog = Dialogue
.change-prompt = Les modifications des paramètres reviendront automatiquement dans { $time } secondes.
.revert-settings = Revenir aux paramètres
legacy-applications = Mise à l'échelle des applications X11
legacy-app-scaling = Mise à l'échelle des applications X11
.scaled-by-system = Mettre à l'échelle toutes les applications X11
.system-description = Les applications X11 seront floues sur les écrans HiDPI.
.scaled-natively = Afficher toutes les applications X11 à la résolution native

View file

@ -398,7 +398,7 @@ dialog = Dialóg
.change-prompt = Rachaidh athruithe socruithe ar ais go huathoibríoch i gceann { $time } soicind.
.revert-settings = Cuir Socruithe ar ais
legacy-applications = X11 Scálú Feidhmchlár an Chórais Fuinneog
legacy-app-scaling = X11 Scálú Feidhmchlár an Chórais Fuinneog
.scaled-by-system = Scála gach Feidhmchlár X11
.system-description = Feicfear feidhmchláir X11 doiléir ar scáileáin HiDPI.
.scaled-natively = Rindreáil X11 Feidhmchláir ag taifeach dúchais

View file

@ -392,7 +392,7 @@ dialog = संवाद
.change-prompt = सेटिंग में परिवर्तन { $time } सेकंड में स्वचालित रूप से वापस आ जाएगा।
.revert-settings = सेटिंग्स वापस करें
legacy-applications = X11 विंडो सिस्टम एप्लिकेशन स्केलिंग
legacy-app-scaling = X11 विंडो सिस्टम एप्लिकेशन स्केलिंग
.scaled-by-system = सभी X11 एप्लिकेशनों को स्केल करें
.system-description = X11 एप्लिकेशन HiDPI स्क्रीन पर धुंधले दिखते हैं।
.scaled-natively = स्थानीय संकल्प पर X11 एप्लिकेशनों को स्केल करें

View file

@ -402,7 +402,7 @@ dialog = Dialog
.change-prompt = Le impostazioni verranno automaticamente ripristinate tra { $time } secondi.
.revert-settings = Ripristina impostazioni
legacy-applications = Scala delle applicazioni del sistema X11
legacy-app-scaling = Scala delle applicazioni del sistema X11
.scaled-by-system = Scala tutte le applicazioni X11
.system-description = Le applicazioni X11 appariranno sfocate su schermi HiDPI.
.scaled-natively = Renderizza le applicazioni X11 alla risoluzione nativa

View file

@ -225,7 +225,7 @@ dialog = ダイヤログ
.change-prompt = { $time }秒後に設定は自動的に元に戻ります。
.revert-settings = 元に戻す
legacy-applications = X11アプリケーションのスケーリング
legacy-app-scaling = X11アプリケーションのスケーリング
.scaled-by-system = X11アプリを全てスケーリングする
.system-description = HiDPI画面はX11アプリケーションがボケに見えます。
.scaled-natively = X11アプリをネーティブの解像度で表現する

View file

@ -392,7 +392,7 @@ dialog = ಡೈಲಾಗ್
.change-prompt = ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಬದಲಾವಣೆಗಳು { $time } ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಾಯತ್ತವಾಗಿ ಹಿಂದಿರುಗುತ್ತವೆ.
.revert-settings = ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಹಿಂದಿರುಗಿಸಿ
legacy-applications = X11 ವಿಂಡೋ ಸಿಸ್ಟಮ್ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಕೇಲಿಂಗ್
legacy-app-scaling = X11 ವಿಂಡೋ ಸಿಸ್ಟಮ್ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಕೇಲಿಂಗ್
.scaled-by-system = ಎಲ್ಲಾ X11 ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅಳೆಯಿರಿ
.system-description = X11 ಅಪ್ಲಿಕೇಶನ್‌ಗಳು HiDPI ಪರದೆಗಳಲ್ಲಿ ಅಸ್ಪಷ್ಟವಾಗಿ ಗೋಚರಿಸುತ್ತವೆ.
.scaled-natively = ಸ್ಥಳೀಯ ರೆಸಲ್ಯೂಶನ್‌ನಲ್ಲಿ X11 ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಸಲ್ಲಿಸಿ

View file

@ -430,7 +430,7 @@ dialog = Dialoog
.change-prompt = Instellingen worden automatisch hersteld in { $time } seconden.
.revert-settings = Instellingen herstellen
legacy-applications = Schaling van applicaties die het X11-venstersysteem gebruiken
legacy-app-scaling = Schaling van applicaties die het X11-venstersysteem gebruiken
.scaled-by-system = Schaal alle X11-applicaties
.system-description = X11-applicaties worden onscherp weergegeven op HiDPI-schermen.
.scaled-natively = X11-applicaties in native resolutie weergeven

View file

@ -445,7 +445,7 @@ dialog = Dialog
}
.revert-settings = Powróć do poprzednich ustawień
legacy-applications = Skalowanie aplikacji systemu okien X11
legacy-app-scaling = Skalowanie aplikacji systemu okien X11
.scaled-by-system = Skaluj wszystkie aplikacje X11
.system-description = Aplikacje X11 będą rozmyte na wyświetlaczach z wysokim DPI.
.scaled-natively = Renderuj aplikacje X11 w pierwotnej rozdzielczości.

View file

@ -410,7 +410,7 @@ dialog = Dialóg
.change-prompt = Zmeny nastavení sa automaticky vrátia o { $time } sekúnd.
.revert-settings = Vrátiť nastavenia
legacy-applications = Škálovanie aplikácií systému okien X11
legacy-app-scaling = Škálovanie aplikácií systému okien X11
.scaled-by-system = Škálovať všetky aplikácie X11
.system-description = Aplikácie X11 sa na obrazovkách HiDPI zobrazia rozmazane.
.scaled-natively = Vykresľovať aplikácie X11 v natívnom rozlíšení

View file

@ -149,7 +149,7 @@ dialog = Dialogruta
.change-prompt = Inställningsändringar återställs automatiskt om { $time } sekunder.
.revert-settings = Återställ inställningar
legacy-applications = X11 fönstersystem applikationsskalning
legacy-app-scaling = X11 fönstersystem applikationsskalning
.scaled-by-system = Skala alla X11 applikationer
.system-description = X11-applikationer kommer att se suddiga ut på HiDPI-skärmar.
.scaled-natively = Rendera X11-applikationer med inbyggd upplösning

View file

@ -392,7 +392,7 @@ dialog = ไดอะล็อก
.change-prompt = การเปลี่ยนแปลงการตั้งค่าจะคืนค่าเดิมภายใน { $time } วินาที
.revert-settings = คงค่าการตั้งค่าเดิม
legacy-applications = การขยายแอพลิเคชั่นที่ใช้ระบบจัดการหน้าต่าง X11
legacy-app-scaling = การขยายแอพลิเคชั่นที่ใช้ระบบจัดการหน้าต่าง X11
.scaled-by-system = ขยายแอพลิเคชั่น X11 ทั้งหมด
.system-description = แอพลิเคชั่น X11 จะเบลอบนหน้าจอ HiDPI
.scaled-natively = แสดงแอพลิเคชั่น X11 ทั้งหมดที่ความละเอียดดั้งเดิม

View file

@ -428,7 +428,7 @@ dialog = Diyalog
.change-prompt = { $time } saniye içinde önceki görüntü ayarlarına dönülecek.
.revert-settings = Ayarları Geri Al
legacy-applications = X11 Pencere Sistemi Uygulama Ölçeği
legacy-app-scaling = X11 Pencere Sistemi Uygulama Ölçeği
.scaled-by-system = Tüm X11 Uygulamalarını ölçekle
.system-description = X11 Uygulamaları HiDPI ekranlarda bulanık gözükecek.
.scaled-natively = X11 Uygulamalarını kendi çözünürlüğünde renderla
@ -840,4 +840,3 @@ default-apps = Varsayılan Uygulamalar
.terminal = Uçbirim
.other-associations = Diğer ilişkiler
.text-editor = Metin Düzenleyici