feat(settings): refine density, group detailed options and add edge maximize gestures
This commit is contained in:
1 parent
d7e122711a
commit
9908dde9f8
11 files changed
+588
-195
No files matched your search
@@ -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"
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user