feat(settings): refine density, group detailed options and add edge maximize gestures

This commit is contained in:
aria committed 2026-10-28 04:49:27 +09:00
1 parent d7e122711a
commit 9908dde9f8
11 files changed
+588 -195

No files matched your search

+121 -10
View File
@@ -133,15 +133,16 @@ fn appearance_scroll_preserves_progress_and_settles_visibility() {
fn traverse(&mut self, children: &mut dyn FnMut(&mut dyn Operation)) {
children(self);
}
fn text(&mut self, _: Option<&widget::Id>, bounds: Rectangle, text: &str) {
if matches!(
text,
"Shell corner radius"
| "Shell opacity"
| "Background blur"
| "Interface font"
| "Focus border"
) {
fn container(&mut self, id: Option<&widget::Id>, bounds: Rectangle) {
if [
"theme.accent",
"theme.focus_ring.style",
"theme.material.blur_radius",
"theme.typography.font_family",
]
.iter()
.any(|path| id == Some(&widget::Id::new(format!("setting-label-{path}"))))
{
self.labels.push(bounds);
}
}
@@ -187,7 +188,7 @@ fn appearance_scroll_preserves_progress_and_settles_visibility() {
),
)
.0;
app.page = Page::Appearance;
app.page = Page::Theme;
let theme = app.native_palette.native_theme();
let mut tree: Option<Tree> = None;
let mut previous = 0.;
@@ -1254,3 +1255,113 @@ fn sidebar_rows_center_inside_the_full_button_hit_area() {
}
}
}
#[test]
fn double_clicking_blank_edges_toggles_maximize_without_changing_settings() {
#[derive(Default)]
struct Blank {
bounds: Option<Rectangle>,
label: Option<Rectangle>,
}
impl Operation for Blank {
fn traverse(&mut self, children: &mut dyn FnMut(&mut dyn Operation)) {
children(self);
}
fn container(&mut self, id: Option<&widget::Id>, bounds: Rectangle) {
if id == Some(&widget::Id::new("settings-right-blank")) {
self.bounds = Some(bounds);
}
if id == Some(&widget::Id::new("setting-label-ui.language")) {
self.label = Some(bounds);
}
}
}
let runtime = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.unwrap();
let renderer = runtime
.block_on(<cosmic::Renderer as Headless>::new(
Font::default(),
Pixels(14.),
Some("tiny-skia"),
))
.unwrap();
let app = App::init(
Core::default(),
(
"/unused/edge-gesture.kdl".into(),
Snapshot::parse(String::new()),
Some(InitialPage::Settings(Page::General)),
),
)
.0;
let before = app.draft.source.clone();
let mut view = app.page_view();
let mut tree = Tree::new(&view);
let viewport = Rectangle::with_size(Size::new(1280., 760.));
let node = view.as_widget_mut().layout(
&mut tree,
&renderer,
&layout::Limits::new(Size::ZERO, viewport.size()),
);
let mut blank = Blank::default();
view.as_widget_mut()
.operate(&mut tree, Layout::new(&node), &renderer, &mut blank);
let bounds = blank.bounds.unwrap();
let cursor = mouse::Cursor::Available(bounds.center());
let mut messages = Vec::new();
for _ in 0..2 {
for event in [
mouse::Event::ButtonPressed(mouse::Button::Left),
mouse::Event::ButtonReleased(mouse::Button::Left),
] {
view.as_widget_mut().update(
&mut tree,
&Event::Mouse(event),
Layout::new(&node),
cursor,
&renderer,
&mut clipboard::Null,
&mut Shell::new(&mut messages),
&viewport,
);
}
}
assert_eq!(
messages
.iter()
.filter(|m| matches!(m, Message::ToggleMaximize))
.count(),
1
);
assert!(
!messages
.iter()
.any(|m| matches!(m, Message::Change(_) | Message::DragWindow))
);
assert_eq!(app.draft.source, before);
messages.clear();
let cursor = mouse::Cursor::Available(blank.label.unwrap().center());
for _ in 0..2 {
for event in [
mouse::Event::ButtonPressed(mouse::Button::Left),
mouse::Event::ButtonReleased(mouse::Button::Left),
] {
view.as_widget_mut().update(
&mut tree,
&Event::Mouse(event),
Layout::new(&node),
cursor,
&renderer,
&mut clipboard::Null,
&mut Shell::new(&mut messages),
&viewport,
);
}
}
assert!(
messages.is_empty(),
"field labels must not act as window chrome"
);
}