Commit Graph

393 Commits

Author SHA1 Message Date
Daniel McNab 2d88a63645
Handle an empty preedit (#387)
Since #314, we request the IME to be positioned every paint cycle. This
triggers a new event from the IME, which is a preedit clear. This IME
event also breaks text selection, which is why we handle it here.

This is still not the fully correct behaviour, but it does at least make
text selection in textboxes work again. We really need to improve our
testing story here.

Also give more detail in the short form of IME events; these events all
have quite different properties.
2024-06-24 17:28:33 +00:00
Daniel McNab d5bbb4cc35
Don't create a log file and print its name unless it will be used (#410)
Previously, this had the potential to be quite confusing.
2024-06-24 13:45:52 +00:00
Philipp Mildenberger fc96f06382
Support arrays (`[impl ViewSequence; N]`) as `ViewSequence`s (#175)
Adds the blanket impl
`impl<const N: usize, VT: ViewSequence> ViewSequence for [VT; N]`

Allows for example something like this:

```rust
fn my_tab(impl View) -> impl View {..}
h_stack(["Tab 1", "Tab 2", "Tab 3"].map(my_tab))
```
2024-06-24 09:38:47 +00:00
Philipp Mildenberger 0a8bf46d8c
xilem_core: Support generic `Message`s (#408)
This adds yet another generic parameter `Message` to the `View`,
`ViewSequence` and `AnyView` trait, such that implementors have more
freedom about what the message is. This is necessary for xilem_web, as a
`Send` bound is not possible to use with wasm_bindgen IIRC. (At least I
had to remove it in the `DynMessage` to get it to compile...).

It was fortunately straight-forward to just add the `Message` param with
the default `DynMessage`. Basically search replace... (I hope I haven't
missed anything, but I went through it twice...)
2024-06-22 18:59:42 +00:00
Olivier FAURE 9d7b9a6b04
Move another log line to reduce noise (#409) 2024-06-22 13:29:45 +00:00
Philipp Mildenberger b0e3d17f3f
xilem_core: Add `OneOf` views as statically typed alternative to `AnyView` (#394)
This ports the `OneOfN` views from `xilem_web` to `xilem_core`.
~~The new marking mechanism for the `ViewSequence` makes it possible to
use the same type as well for an implementation of `ViewSequence`, which
is provided here as well.~~
Because of ambiguity, and needing to specify the explicit type when
`OneOf(impl View)` would be used, where an `impl ViewSequence` is
expected, we have decided to not provide a `ViewSequence` impl, so that
it's not ambiguous, and not necessary to specify the concrete type. We
could instead add separate types for a `ViewSequence` instead like
`OneSeqOf2`.

Since macros make this unfortunately not super readable, for reviewers
of the code [this pre-macro
version](4f786c4282/xilem_core/src/views/one_of.rs)
may be better to look at, the only difference to this, is that this has
slightly enhanced doc comments, and obviously more than just `OneOf2`.
2024-06-21 19:59:44 +00:00
Olivier FAURE 27a6b6285d
Move a log line to avoid false positives and reduce noise (#407) 2024-06-21 10:23:24 +00:00
Philipp Mildenberger 7bc5ca97fd
Port `Adapt` from old `xilem_core` (#401)
Ports `Adapt` to new xilem_core.
It also adds `MapState` which was previously called `AdaptState` and a
new view `MapAction` which is basically about how elm works.
`MapAction` and `Adapt` is shown in action in the added `elm` example,
while `MapState` can be seen in action in the added `components`
example.
2024-06-18 20:14:08 +00:00
Daniel McNab 9299b67986
Move to a single global `parley::LayoutContext` (#405)
Based on a suggestion from @dfrg.

This appears to have improved performance with the 30_000 hello's
example from ~$\frac{1}{20}$ms to $\frac{1}{160}$ms
So an approx 8x increase in throughput for that scene.
2024-06-18 19:04:17 +00:00
Olivier FAURE dd196c7134
Tweak code in post_event_processing (#270)
Inline `wants_animation_frame`.
Request new frame for both visual and accessibility updates.
2024-06-17 10:16:42 +00:00
Bruce Mitchener 32c365a42f
Update to winit 0.30.2 (#400)
A fix was in winit 0.30.1 to fix a crash on exit on macOS (among other
things).

Fixes #239.
2024-06-16 07:14:04 +00:00
Bruce Mitchener c8725dcc41
Update stable Rust version to 1.79 (#399) 2024-06-16 07:13:32 +00:00
Daniel McNab 7d62b16a19
Create a `View` for `SizedBox` (#398)
![image](https://github.com/linebender/xilem/assets/36049421/9b1cccc2-15d9-48dc-aca8-eddeb32dfac5)

I have chosen not to set the background and border properties, as those
are moreso styling properties - in our current state, we seem to be much
preferring only specifying layout values
2024-06-14 17:04:39 +00:00
Daniel McNab d6af6a6ef7
Differentiate pointer buttons in `Button` Widget and View (#397)
In most cases, you want a button which only actuates when the primary
mouse button is pressed, so the easy case is still that. This is a short
term hack, because e.g. the active state is still based on any button
being pressed, not just those we are interested in.

That is, we probably need to represent a set of buttons we are
interested in. However, this change minimally unblocks additional work
with Xilem. In particular, see [#xilem > Minesweeper converted from Iced
to
Xilem](https://xi.zulipchat.com/#narrow/stream/354396-xilem/topic/Minesweeper.20converted.20from.20Iced.20to.20Xilem).
2024-06-14 16:40:26 +00:00
Daniel McNab f73bf9d577
Consistently use `ctx` over `cx` in Xilem (#391)
This was brought up in [#xilem > paper
cuts](https://xi.zulipchat.com/#narrow/stream/354396-xilem/topic/paper.20cuts)

The memoize change was a copy-and-paste failure
2024-06-12 16:43:39 +00:00
Daniel McNab a63c708ff2
Fix textboxes with an infinite available width (#386)
Also fix clipping behaviour - previously the textbox outline would be
clipped.
2024-06-11 17:49:08 +00:00
Olivier FAURE 921912b10c
Fix typos in tracing code (#385) 2024-06-10 12:56:45 +00:00
Olivier FAURE 36d894cfde
Small improvements to tracing code (#384) 2024-06-10 11:15:36 +00:00
Daniel McNab 8386ad2399
Add milliseconds in the tracing formatting (#383)
In #254, we had an initial log format added.

However, that doesn't include support for milliseconds, which are useful
in a GUI system because it allows getting a first approximation of
latency. I'm adding this now because of the startup latency issues first
observed in #381 ([#masonry > Slight Startup Time
Regression](https://xi.zulipchat.com/#narrow/stream/317477-masonry/topic/Slight.20Startup.20Time.20Regression))
2024-06-10 10:14:12 +00:00
Bruce Mitchener 1be18aeff0
deps: Update accesskit to 0.15, accesskit_winit to 0.21 (#382) 2024-06-10 08:45:18 +00:00
Bruce Mitchener 1ddff7be92
deps: Update `wgpu`, `vello`, `peniko` (#381)
This brings us to the 0.2 release of Vello, which brings the 0.20
release of wgpu.
2024-06-10 08:29:53 +00:00
Daniel McNab 86d9592a3e
Move `xilem` onto a new `xilem_core`, which uses a generic View trait (#310)
This:
1) Renames the current/old `xilem_core` to `xilem_web_core` and moves it
to the `xilem_web/xilem_web_core` folder
2) Creates a new `xilem_core`, which does not use (non-tuple) macros and
instead contains a `View` trait which is generic over the `Context` type
3) Ports `xilem` to this `xilem_core`, but with some functionality
missing (namely a few of the extra views; I expect these to
straightforward to port)
4) Ports the `mason` and `mason_android` examples to this new `xilem`,
with less functionality.

This continues ideas first explored in #235 

The advantages of this new View trait are:
1) Improved support for ad-hoc views, such as views with additional
attributes.
This will be very useful for layout algorithms, and will also enable
native *good* multi-window (and potentially menus?)
2) A lack of macros, to better enable using go-to-definition and other
IDE features on the traits

Possible disadvantages:
1) There are a few more traits to enable the flexibility
2) It can be less clear what `Self::Element::Mut` is in the `rebuild`
function, because of how the resolution works
3) When implementing `View`, you need to specify the context (i.e.
`impl<State, Action> View<State, Action, [new] ViewCtx> for
Button<State, Action>`.

---------

Co-authored-by: Philipp Mildenberger <philipp@mildenberger.me>
2024-06-06 15:16:36 +00:00
Bruce Mitchener 3726c24c6a
masonry: Pass in winit `CursorEntered` events (#324) 2024-06-04 16:22:53 +00:00
Bruce Mitchener 36bbe77352
masonry: Use own `PointerButton` enum (#333)
This brings the `PointerButton` enum from glazier and has all code
outside of the winit event loop integration using it.

For now, it has a `todo!()` for the `MouseButton::Other` as it isn't
clear what that is for.
2024-06-04 08:53:14 +00:00
Bruce Mitchener 5a2db6dce8
masonry: Use `dpi` via `crate::dpi` (#332) 2024-06-04 07:06:21 +00:00
Aaron Muir Hamilton d2336d8b66
Signal TextFieldFocused and ImeMoved to enable and position the IME. (#314) 2024-06-03 16:29:23 +00:00
Olivier FAURE 49d22aaeea
Add diagram to document xilem layers (#322)
Note that this adds a link to a section added in
https://github.com/linebender/parley/pull/69

I removed Taffy from the diagram for simplicity, and because Taffy's
current integration is in flux.

Overall I think the Xilem README is in desperate need of a rewrite, and
this PR should be considered a stopgap. Further PRs should better
integrate the ecosystem descriptions into the README, move some sections
around, etc.
2024-06-03 15:36:18 +00:00
Kaur Kuut 5b200876c3
Disable `clippy::assigning_clones` lint. (#331)
Enabling
[`assigning_clones`](https://rust-lang.github.io/rust-clippy/master/index.html#/assigning_clones)
by default in Rust 1.78 was a mistake which was reversed in a week in
[rust-clippy#12779](https://github.com/rust-lang/rust-clippy/pull/12779).

We can disable it locally until the upstream fix arrives to stable Rust.
2024-06-03 14:35:03 +00:00
Olivier FAURE a2045f1356
Document masonry (#329)
This was initially a supposed to be a small documentation pass, which
grew into a few changes:

- Adding back a to-do-list example.
- Fixing the bugs revealed by that example (infinite bounding boxes,
wrong accessibility handling in Portal, etc).
- Making sure all widgets return the correct spans instead of the
less-useful default one.
- Adding a trace to the layout pass for easier debugging.

Overall I'm pretty happy with this!
2024-06-03 14:21:41 +00:00
Olivier FAURE a1ed84ea6a
Bump accesskit sub-dependency version (#330)
This bumps the `accesskit_consumer` version in `Cargo.lock` to the next
minor version (`0.19.1`).

That version includes better error messages when AccessKit panics.
2024-06-03 14:17:03 +00:00
Bruce Mitchener 9a28599f57
masonry: Rename a scale factor variable (#328)
This helps make it more clear when skimming through this code that this
is the scale factor being used to transform the scene.
2024-06-03 11:39:02 +00:00
Bruce Mitchener 6adcf746f4
masonry: Use `web-time` instead of `instant` (#323)
Recently, `instant` has been marked as unmaintained by the maintainer. A
suggested replacement is `web-time`, which is used by `winit` and is
already in our dependency tree.
2024-06-03 11:30:55 +00:00
Bruce Mitchener 8c06d3a9bc
masonry: Update more docs to use non-HTML links. (#327) 2024-06-03 11:29:51 +00:00
Bruce Mitchener 94d8f50947
Allow feeding masonry from an externally event loop. (#325)
This allows for running `masonry` with an externally managed event loop
for integrating with an application that is already running an event
loop.

* Expose `PointerState` to allow creating `PointerEvent`
* Expose `WindowEvent` to allow managing window size and scale factor.
* Make `DriverCtx` usable from outside the crate. While this struct was
already `pub`, the sole member of it was not.
2024-06-01 16:52:01 +00:00
Bruce Mitchener a76995f2b4
masonry: Avoid reconstructing LogicalPosition. (#326)
In the call to updating the hot state from the widget pod, the
`mouse_pos` is already of the right type, so it doesn't need to try to
reconstruct itself as the right type.

This is different from another call site (in `contexts.rs`) where the
`mouse_pos` is an `Option<Point>` and so it does need reconstructing.
2024-05-31 18:02:52 +00:00
Olivier FAURE 5575c9248b
Add VS Code marker comments to code (#261)
[VS Code marker
comments](https://code.visualstudio.com/docs/editor/custom-layout#_minimap-and-breadcrumbs)
are a [new
feature](https://code.visualstudio.com/updates/v1_88#_minimap-section-headers)
that supposedly help with browsing the code with a minimap. I don't know
if other editors have equivalents.

I haven't tested them before, and I don't know whether they actually
improve DX, but they're pretty simple and unobstrusive, so I think it'd
be worth adding them experimentally and seeing how it goes.
2024-05-31 11:54:19 +00:00
Bruce Mitchener f8cbf81ca5
lints: Suppress some check-cfg warnings (#321)
The current nightly issues warnings for unknown cfgs, so we need to
suppress some of these for now.

Even though these are only needed for `masonry`, we put them in the
workspace configuration due to limitations in how the lints table is
configured and overridden in current versions of Cargo.
2024-05-30 04:42:48 +00:00
Bruce Mitchener 2ab7c824cc
xilem,masonry: Use `dpi` crate directly (#320)
This removes a class of dependencies from within both `masonry` and
`xilem` on the `winit` crate where we can just use `dpi` directly
instead.

The `dpi` crate is meant (like `cursor_icon`) to be a shared ecosystem
crate rather than only for usage with `winit`.
2024-05-29 07:52:04 +00:00
Bruce Mitchener 66e141ab8f
ci: Update stable Rust. (#317) 2024-05-26 15:22:32 +00:00
Bruce Mitchener b85a511140
clippy: Fix `doc_lazy_continuation` lint (#316) 2024-05-26 15:22:19 +00:00
Aaron Muir Hamilton 73fe4e6c2e
Add basic translation of Touch to PointerEvent. (#313)
https://github.com/linebender/xilem/assets/1272018/6e9aeefb-f324-4738-9aa2-f54d643631e2
2024-05-24 13:33:25 +00:00
Daniel McNab 866d416cef
Make execution on Android work properly (#309)
```
cargo apk run --example mason_android -p xilem
```


![image](https://github.com/linebender/xilem/assets/36049421/40cec14e-ce27-4bb8-ba46-8e6bd902852d)

There will some followup needed here, of course. But some of that will
want to come after xilem#235, when the way to do multiple windows has
become clearer
2024-05-23 08:13:30 +00:00
Philipp Mildenberger c6f6c78f52
xilem: Add Memoization views (`Memoize` and `Arc<impl View>`) (#267)
This ports the `Memoize` view from old xilem, slightly enhances it, by
checking whether the given view callback is a non-capturing closure and
not a function pointer (by asserting `std::mem::size_of::<F>() == 0`)

It also ports the `Arc<impl View>` and `Arc<dyn AnyMasonryView>` from
#164 including the example there to show how these two forms of
memoization can be used.
2024-05-20 15:51:58 +00:00
Jonas Platte 9c1eb3b2fe
Check for typos in CI (#306)
Currently, the only legit typo being found is `seeked` but I'm not sure
what to do about that.

Would be nice to check for new typos in CI anyways, right?

---------

Co-authored-by: Kaur Kuut <strom@nevermore.ee>
2024-05-17 06:39:32 +00:00
Bram Hoendervangers 380d39dea4
Update xilem-architecture.svg to have a white background (#308)
The architecture diagram is very hard to read on the dark theme of
github

<img width="1312" alt="image"
src="https://github.com/linebender/xilem/assets/9047770/90b5d68e-a14e-43ac-a625-c9696540df0c">
2024-05-16 16:44:25 +00:00
Aaron Muir Hamilton 0ef12a7fb6
Ignore synthetic keyinput events for now (#307)
They are unused (and rarely useful), and they cause unwanted behavior.
2024-05-16 14:18:16 +00:00
Olivier FAURE a8cf86772c
Add rustfmt config (#305)
These standardized options can make code a little nicer. Right now they
don't change anything, though they include an implicit commitment to
adopt the # `imports_granularity = "Module"` and `group_imports =
"StdExternalCrate"` settings.

While these settings are unstable, we can apply them with rustfmt
nightly without actually committing to using nightly in CI. We should
progressively move parts of the codebase towards that format in future
PRs.

---------

Co-authored-by: Kaur Kuut <strom@nevermore.ee>
2024-05-14 09:46:59 +00:00
Daniel McNab eef5a23905
Actually use the druid backspace logic (#303)
This is followup to #273.

This code originally came from
https://github.com/xi-editor/xi-editor/pull/837

I've also brought the tests back

---------

Co-authored-by: Yang Keao <keao.yang@yahoo.com>
2024-05-12 07:49:26 +00:00
Alex Pyattaev c12aa851bf
fix invalid HTML in examples (#304)
For some reason the recent version of Trunk refused to serve some of the
examples due to them missing the <html> tags. Adding the tags calms it
down and allows it to work again. Trivial change, but would save someone
the pain of having to fix examples before running them with trunk serve.

Co-authored-by: Alex Pyattaev <me@example.com>
2024-05-12 06:03:24 +00:00
Bruce Mitchener 99688a6eef
`masonry`: Use `cursor_icon` crate directly. (#300)
`cursor_icon` is a crate that is used by `winit` to provide its
`CursorIcon` type separately from the `winit` crate.

This re-exports the `CursorIcon` from `masonry` and then uses that
rather than via `winit:🪟:CursorIcon`, allowing the use of the
`CursorIcon` without having to independently discover its provenance.

This is also one step towards not requiring `winit` within the `masonry`
internals apart from the actual window / event loop management.
2024-05-12 05:53:53 +00:00