feat(shortcuts): add accessibility shortcuts subpage w/ zoom-in & zoom-out

This commit is contained in:
Paul 2025-12-04 16:45:47 +01:00 committed by GitHub
parent 2e99561d32
commit 62c16c0495
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 149 additions and 7 deletions

View file

@ -384,19 +384,27 @@ impl cosmic::Application for SettingsApp {
return page.update(message).map(Into::into);
}
}
#[cfg(feature = "page-accessibility")]
crate::pages::Message::AccessibilityMagnifier(message) => {
if let Some(page) = self.pages.page_mut::<accessibility::magnifier::Page>() {
return page.update(self.active_page, message).map(Into::into);
}
}
#[cfg(feature = "page-about")]
crate::pages::Message::About(message) => {
if let Some(page) = self.pages.page_mut::<system::about::Page>() {
return page.update(message).map(Into::into);
}
}
#[cfg(feature = "page-accessibility")]
crate::pages::Message::AccessibilityMagnifier(message) => {
if let Some(page) = self.pages.page_mut::<accessibility::magnifier::Page>() {
return page.update(self.active_page, message).map(Into::into);
}
}
#[cfg(feature = "page-input")]
crate::pages::Message::AccessibilityShortcuts(message) => {
if let Some(page) = self
.pages
.page_mut::<input::keyboard::shortcuts::accessibility::Page>()
{
return page.update(message).map(Into::into);
}
}
crate::pages::Message::Appearance(message) => {
if let Some(page) = self.pages.page_mut::<appearance::Page>() {
return page.update(message).map(Into::into);

View file

@ -0,0 +1,113 @@
// Copyright 2024 System76 <info@system76.com>
// SPDX-License-Identifier: GPL-3.0-only
use super::{ShortcutMessage, ShortcutModel};
use cosmic::app::ContextDrawer;
use cosmic::{Element, Task};
use cosmic_settings_config::shortcuts::Action;
use cosmic_settings_page::{self as page, Section, section};
use slab::Slab;
pub struct Page {
model: super::Model,
}
impl Default for Page {
fn default() -> Self {
Self {
model: super::Model::default().actions(|defaults, keybindings| {
actions().iter().fold(Slab::new(), |mut slab, action| {
slab.insert(ShortcutModel::new(defaults, keybindings, action.clone()));
slab
})
}),
}
}
}
impl Page {
pub fn update(&mut self, message: ShortcutMessage) -> Task<crate::app::Message> {
self.model.update(message)
}
}
impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.model.entity = entity;
}
fn info(&self) -> page::Info {
page::Info::new("accessibility-shortcuts", "input-keyboard-symbolic")
.title(fl!("accessibility"))
}
fn content(
&self,
sections: &mut slotmap::SlotMap<section::Entity, Section<crate::pages::Message>>,
) -> Option<page::Content> {
Some(vec![sections.insert(shortcuts())])
}
fn context_drawer(&self) -> Option<ContextDrawer<'_, crate::pages::Message>> {
self.model
.context_drawer(crate::pages::Message::AccessibilityShortcuts)
}
fn dialog(&self) -> Option<Element<'_, crate::pages::Message>> {
self.model
.dialog()
.map(|el| el.map(crate::pages::Message::AccessibilityShortcuts))
}
fn on_context_drawer_close(&mut self) -> Task<crate::pages::Message> {
self.model.on_context_drawer_close();
Task::none()
}
fn on_enter(&mut self) -> Task<crate::pages::Message> {
_ = self.model.on_enter();
Task::none()
}
fn on_leave(&mut self) -> Task<crate::pages::Message> {
self.model.on_clear();
cosmic::iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(
false,
)
.discard()
}
#[cfg(feature = "wayland")]
fn subscription(
&self,
core: &cosmic::Core,
) -> cosmic::iced::Subscription<crate::pages::Message> {
self.model
.subscription(core)
.map(crate::pages::Message::AccessibilityShortcuts)
}
}
impl page::AutoBind<crate::pages::Message> for Page {}
#[must_use]
pub const fn actions() -> &'static [Action] {
&[Action::ZoomIn, Action::ZoomOut]
}
fn shortcuts() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
// Make these searchable in the global settings search.
for action in actions() {
descriptions.insert(super::localize_action(action));
}
Section::default()
.descriptions(descriptions)
.view::<Page>(move |_binder, page, _section| {
page.model
.view()
.map(crate::pages::Message::AccessibilityShortcuts)
})
}

View file

@ -5,6 +5,7 @@ mod common;
pub use common::{Model, ShortcutBinding, ShortcutMessage, ShortcutModel};
pub mod accessibility;
pub mod custom;
pub mod manage_windows;
pub mod move_window;
@ -42,6 +43,7 @@ pub struct Page {
#[derive(Default)]
struct Modified {
accessibility: u16,
manage_windows: u16,
move_windows: u16,
nav: u16,
@ -51,6 +53,7 @@ struct Modified {
}
struct SubPages {
accessibility: page::Entity,
custom: page::Entity,
manage_window: page::Entity,
move_window: page::Entity,
@ -77,6 +80,7 @@ pub enum Message {
#[derive(Clone, Copy, Debug)]
pub enum Category {
Accessibility,
Custom,
ManageWindow,
MoveWindow,
@ -94,6 +98,7 @@ impl Default for Page {
search_model: Model::default(),
shortcuts_context: None,
sub_pages: SubPages {
accessibility: page::Entity::null(),
custom: page::Entity::null(),
manage_window: page::Entity::null(),
move_window: page::Entity::null(),
@ -174,6 +179,10 @@ impl Page {
pub fn update(&mut self, message: Message) -> Task<crate::app::Message> {
match message {
Message::Category(category) => match category {
Category::Accessibility => {
cosmic::task::message(crate::app::Message::Page(self.sub_pages.accessibility))
}
Category::Custom => {
cosmic::task::message(crate::app::Message::Page(self.sub_pages.custom))
}
@ -240,6 +249,7 @@ impl Page {
}
match action_category(custom_action) {
Some(Category::Accessibility) => self.modified.accessibility += 1,
Some(Category::ManageWindow) => self.modified.manage_windows += 1,
Some(Category::MoveWindow) => self.modified.move_windows += 1,
Some(Category::Nav) => self.modified.nav += 1,
@ -261,6 +271,7 @@ impl Page {
};
match action_category(action) {
Some(Category::Accessibility) => self.modified.accessibility += 1,
Some(Category::ManageWindow) => self.modified.manage_windows += 1,
Some(Category::MoveWindow) => self.modified.move_windows += 1,
Some(Category::Nav) => self.modified.nav += 1,
@ -297,6 +308,7 @@ impl page::AutoBind<crate::pages::Message> for Page {
fn sub_pages(
mut page: cosmic_settings_page::Insert<crate::pages::Message>,
) -> cosmic_settings_page::Insert<crate::pages::Message> {
let accessibility = page.sub_page_with_id::<accessibility::Page>();
let custom = page.sub_page_with_id::<custom::Page>();
let manage_window = page.sub_page_with_id::<manage_windows::Page>();
let move_window = page.sub_page_with_id::<move_window::Page>();
@ -305,6 +317,7 @@ impl page::AutoBind<crate::pages::Message> for Page {
let window_tiling = page.sub_page_with_id::<tiling::Page>();
let model = page.model.page_mut::<Page>().unwrap();
model.sub_pages.accessibility = accessibility;
model.sub_pages.custom = custom;
model.sub_pages.manage_window = manage_window;
model.sub_pages.move_window = move_window;
@ -407,6 +420,7 @@ impl Search {
fn shortcuts() -> Section<crate::pages::Message> {
let mut descriptions = Slab::new();
let accessibility = descriptions.insert(fl!("accessibility"));
let custom_label = descriptions.insert(fl!("custom"));
let manage_window_label = descriptions.insert(fl!("manage-windows"));
let move_window_label = descriptions.insert(fl!("move-windows"));
@ -430,6 +444,11 @@ fn shortcuts() -> Section<crate::pages::Message> {
// If the search input is not empty, show the category view, else the search results.
let content = if page.search.input.is_empty() {
settings::section()
.add(category_item(
Category::Accessibility,
&descriptions[accessibility],
page.modified.accessibility,
))
.add(category_item(
Category::ManageWindow,
&descriptions[manage_window_label],

View file

@ -31,6 +31,8 @@ pub enum Message {
Accessibility(accessibility::Message),
#[cfg(feature = "page-accessibility")]
AccessibilityMagnifier(accessibility::magnifier::Message),
#[cfg(feature = "page-input")]
AccessibilityShortcuts(input::keyboard::shortcuts::ShortcutMessage),
#[cfg(feature = "page-about")]
About(system::about::Message),
Appearance(desktop::appearance::Message),