Commit Graph

427 Commits

Author SHA1 Message Date
Daniel McNab d70076262d
Update dependencies and bump to Rust 1.80 (#450)
There is one "semi-false-positive" lint triggered, which I have fixed.
Otherwise, the required
```
cargo upgrade --ignore-rust-version
cargo update
```
2024-07-26 13:02:41 +00:00
Daniel McNab 5e07dcebad
Support `OneOf` in Xilem (#445)
This uses the interface in Xilem Core from #394 and #436

Some thoughts:
1) You only need to specify the number of items in a single match arm.
I.e.
    ```rust
    fn my_view(){
        match x {
            0 => OneOf3(...),
            1=> OneOf9(...),
            _=> OneOf9(...),
        }
    }
    ```
    works. We probably should rename `OneOf9` back again in that case.
2) The example currently isn't that interesting. Any suggestions for a
more suitable state machine would be welcome.
2024-07-24 09:12:04 +00:00
Philipp Mildenberger c53d15472c
xilem_web: Support `Fill` for `SvgPathElement` instead of `SvgmPathElement` (#447)
Fixes #446 

I guess I missed the m before the path
2024-07-24 09:02:26 +00:00
Daniel McNab 51e77f5577
Use the `boxed` combinator (#444)
This removes the need to force type inference.
2024-07-23 10:13:03 +00:00
Andrii Zymohliad 4ddad5129e
Expose control over window background color (#439)
Adds `Xilem::background_color` builder method and the relevant changes
to Masonry. I've also modified `mason` example to demonstrate the usage
of the new API.

[Zulip
discussion](https://xi.zulipchat.com/#narrow/stream/354396-xilem/topic/Window.20background.20color)
2024-07-23 09:37:14 +00:00
Daniel McNab f2ee836cab
Tweak `async_repeat` and add some docs (#443)
Addresses post-merge review comments in #423.

Also added some stub-like docs.

---------

Co-authored-by: Philipp Mildenberger <philipp@mildenberger.me>
2024-07-22 13:17:54 +00:00
Olivier FAURE fc6a52265f
Use `cargo-rdme` to sync README and documentation root (#435)
This was remarkably painless.

I especially appreciate @taiki-e providing an install-action which does
90% of the CI work for us.

---------

Co-authored-by: Daniel McNab <36049421+DJMcNab@users.noreply.github.com>
2024-07-22 12:44:41 +00:00
Bruce Mitchener d71db1a1bc
ci: Update typos action to 1.23.2 from 1.22.9 (#441) 2024-07-22 11:15:35 +00:00
Bruce Mitchener 05620779b2
xilem: Fix intradoc link. (#442) 2024-07-22 09:32:02 +00:00
Daniel McNab 5f38922d1b
Correctly set `rust-version` in all `Cargo.toml`s (#438)
Discovered in #432; this would otherwise cause errors for users of
nightly (or 1.81 beta, due to be released next week)
2024-07-19 14:42:27 +00:00
Daniel McNab 2dc1c08b80
Add a CSS `gap` inspired Flex property. (#437)
See https://developer.mozilla.org/en-US/docs/Web/CSS/gap

Since #428, we no longer have default spacing between flex elements in
Masonry. This makes the examples quite ugly.

Choices made based on [#xilem > Porting Taffy Integration to New
Xilem](https://xi.zulipchat.com/#narrow/stream/354396-xilem/topic/Porting.20Taffy.20Integration.20to.20New.20Xilem).
Of particular note is the choice to not have this be overwritten by
spacers, due to:

> My first thought is that users are going to be very confused when they
add a space between two items and the result is the items are closer
together.

There is no such concept of a spacer in CSS parlance
2024-07-19 14:14:38 +00:00
Daniel McNab 0844e3c431
Change the `OneOf` views to not use macros (#436)
This still needs to be implemented in Xilem.

But I think this is an improvement overall
2024-07-19 14:14:30 +00:00
Philipp Mildenberger 4fdcb26eb9
Add a `FlexElement` to support explicit spacers and flex parameters for `Flex` in xilem (#428)
Takes ideas from #235 (in particular the masonry side).

This implements support for explicit spacers in the `Flex` view and flex
parameters for views (see examples `flex` and `mason` for more details).
It also adds a way (`AnyFlexChild`) to dynamically switch between
spacers and widgets (with optional flex parameters).
`masonry::widget::Flex::layout` is also updated to be in sync with
current druid.

---------

Co-authored-by: Daniel McNab <36049421+DJMcNab@users.noreply.github.com>
2024-07-19 08:00:41 +00:00
Daniel McNab 36ac5a1826
Fix docs on the re-export (#434)
I failed to commit this before merging #423
2024-07-18 09:19:06 +00:00
Daniel McNab f11b64892c
Import our intended set of lints (#432)
See discussion in [#linebender > Standard Lint
set](https://xi.zulipchat.com/#narrow/stream/419691-linebender/topic/Standard.20Lint.20set)

Of note: I have taken steps to ensure that this can be practically
reviewed by *not* applying most of the lints.
The commented out lints make good follow-ups

---------

Co-authored-by: Olivier FAURE <couteaubleu@gmail.com>
2024-07-18 08:58:16 +00:00
Daniel McNab 7f40266bd8
Integrate `tokio` for async communication with Xilem (#423)
Supercedes https://github.com/linebender/xilem/pull/411

This is designed with #417 in mind, to not lock-in to our event loop.

---------

Co-authored-by: Philipp Mildenberger <philipp@mildenberger.me>
2024-07-18 07:38:28 +00:00
Daniel McNab 732cfa8376
Move `text` into `reference` folder (#433)
This was imported in #241

See also [#masonry > text vs
text2](https://xi.zulipchat.com/#narrow/stream/317477-masonry/topic/text.20vs.20text2)

We do want to sort out text properly, see #337, so I'm keeping the
reference code around.
2024-07-18 07:05:11 +00:00
Daniel McNab 7a28babdd6
Allow Masonry to compile in release mode (#431)
Cc @xStrom for the CI change

Cc @PoignardAzur for the Masonry changes
2024-07-17 09:52:37 +00:00
Daniel McNab f913a3882b
Update to Vello 0.2.1 and wgpu 0.20.1 (#430)
Mostly to double check that the new release is suitable, but formalising
the update can't hurt
2024-07-17 07:42:20 +00:00
Bruce Mitchener b83a7ef41f
[masonry] Update to accesskit 0.16 (#426)
There was a breaking change in this release that renamed
`role::StaticText` to `role::Label`.
2024-07-16 08:18:51 +00:00
Olivier FAURE be4a5bf5e8
Implement widgets-in-arenas RFC (#396)
See https://github.com/linebender/rfcs/pull/6 and [zulip
thread](https://xi.zulipchat.com/#narrow/stream/317477-masonry/topic/New.20RFC.3A.20.22widgets-in-arena.22).
2024-07-15 11:45:19 +00:00
Markus Kohlhase 62c06c9f98
xilem_web: Add Elm Architecture example (#425)
I have intentionally left out the `xilem_core::adapt` variant here in
order to have a clear classic Elm example. I would rather show the
`adapt` variant in a separate example.
2024-07-12 11:39:37 +00:00
cfagot cf3530097b
Allow external event loop to drive masonry and xilem (#417)
These changes allow you to create a masonry or xilem app that is driven
by an external event loop.

## Masonry

Existing method for creating masonry app:
```
    masonry::event_loop_runner::run(
        masonry::event_loop_runner::EventLoop::with_user_event(),
        window_attributes,
        root_widget,
        app_driver,
    )
    .unwrap();
```

Instead you can now do this:

```
    let masonry_state = MasonryState::new(window_attributes, &event_loop, root_widget);

    let mut app = AppInterface {
        masonry_state,
        app_driver: Box::new(driver),
    };
    event_loop.run_app(&mut app)
```

Where AppInterface implements the winit
ApplicationHandler<accesskit_winit::Event> trait.

## Xilem

Existing method:
```
    let app = Xilem::new(state, app_logic);
    app.run_windowed(EventLoop::with_user_event(), title)?;
```

Now:
```
    let xilem = Xilem::new(0, app_logic);
    let (root_widget, app_driver) = xilem.split();
    let parts = xilem.split();
    let (root_widget, app_driver) = (parts.root_widget, parts.driver)

   // and then create masonry app just like above using root_widget and app_driver
```

Also adds example/external_event_loop.rs which duplicates
example/flex.rs but with an external event loop.

---------

Co-authored-by: Daniel McNab <36049421+DJMcNab@users.noreply.github.com>
2024-07-05 08:28:11 +00:00
Daniel McNab e76cf31258
Deny unsafe code globally (#406)
Related to #44

We don't have any necessary unsafe code, and I don't think any of us
want to lose that.

(Vello is also no longer laundering the unsafety wrt surface creation
thanks to a recent wgpu release)
2024-07-02 13:19:39 +00:00
Daniel McNab df85194c88
Fix the `head` elements of Xilem Web (#422)
These got mixed up in https://github.com/linebender/xilem/pull/142
2024-07-02 10:07:13 +00:00
Johan Holmerin ca5515125a
Use window.outer_size on iOS (#421)
As I understand it, on iOS the outer_size corresponds to the size of the
window, meaning when the surface is rendered using inner_size(the
safe/non-obscured size) the elements get stretched.

There's an open issue in winit about clarifying/standardizing the
different sizes, but until that's done switching to outer_size fixes the
issue.

The touch positions now also match the rendering

Winit issue: https://github.com/rust-windowing/winit/issues/2308

Fixes #419


<details>
  <summary>Before</summary>

![xilem
ios](https://github.com/linebender/xilem/assets/7433263/8bde0880-90e7-498b-b45c-c9964a0ae153)

</details>


<details>
  <summary>After</summary>

![ios
after](https://github.com/linebender/xilem/assets/7433263/8f6703d3-bb99-4f42-a941-d936ca5da6cf)


</details>
2024-07-01 23:18:25 +00:00
Johan Holmerin 1daf711d7f
Remove key_without_modifiers call on iOS (#418)
I had trouble getting masonry to compile for iOS due to a winit platform
method call that's not supported. There's already a cfg for android so I
just added iOS to it.

Reproduction:

```
cargo check --target aarch64-apple-ios
```

---------

Co-authored-by: Daniel McNab <36049421+DJMcNab@users.noreply.github.com>
2024-06-30 18:50:52 +00:00
Daniel McNab 032e86216a
Update to our latest CI standard (#414)
This was most recently updated in
https://github.com/linebender/vello/pull/505

The main differences are:
1) Greater concurrency between clippy and testing
2) More explanations
3) MSRV checking
4) Use of `cargo hack`
5) WASM checked in CI

I've also added the current values of our MSRVs to the main three
crates.
2024-06-28 13:02:54 +00:00
Bruce Mitchener 26f32020aa
masonry: Fix `unused_qualifications` lints (#416) 2024-06-28 12:48:24 +00:00
Daniel McNab 422c0da5be
Use the cleaner format for READMEs (#415) 2024-06-28 10:46:35 +00:00
Philipp Mildenberger b33a2a680d
Rewrite xilem_web to support new xilem_core (#403)
This ports xilem_web to the new xilem_core.

There's also a lot of cleanup internally:
* Get rid of all of the complex macros to support DOM interfaces, and
instead use associated type bounds on the `View::Element`.
* Introduce an extendable modifier based system, which should also work
on top of memoization (`Arc`, `Memoize`) and `OneOf` views with an
intersection of the modifiable properties.
* This modifier based system gets rid of the hacky way to propagate
attributes to elements, and takes inspiration by masonrys `WidgetMut`
type to apply changes.
* Currently that means `Attributes`, `Classes` and `Styles` to reflect
what xilem_web previously offered.

Downsides (currently, needs some investigation):

~~Due to more internal type complexity via associated types this suffers
from https://github.com/rust-lang/rust/issues/105900. The new trait
solver should hopefully mitigate some of that, but it seems currently it
completely stalls in the todomvc example (not in other examples).~~
~~The deep, possibly completely static composition via associated
type-bounds of the view and element tree unfortunately can take some
time to compile, this gets (already) obvious in the todomvc example. The
other examples don't seem to suffer that bad yet from that issue,
probably because they're quite simple.~~

~~I really hope we can mitigate this mostly, because I think this is the
idiomatic (and more correct) way to implement what the previous API has
offered.~~

One idea is to add a `Box<dyn AnyViewSequence>`, as every element takes
a "type-erased" `ViewSequence` as parameter, so this may solve most of
the issues (at the slight cost of dynamic dispatch/allocations).

Edit: idea was mostly successful, see comment right below.

I think it also closes #274

It's a draft, as there's a lot of changes in xilem_core that should be
upstreamed (and cleaned up) via separate PRs and I would like to
(mostly) fix the slow-compile time issue.

---------

Co-authored-by: Daniel McNab <36049421+DJMcNab@users.noreply.github.com>
2024-06-28 08:30:18 +00:00
Daniel McNab 45c7500f7a
Support `text_size` in `Label`/`Prose` views (#413)
Format:
```rust
label("everything").text_size(42.)
```
and the same with `prose`.

I've also added `font_size` aliases for these, because people will
expect it to have these names.
2024-06-27 09:50:50 +00:00
Daniel McNab d99e7af31f
Fix the mentions of Masonry issues to use issue links (#412)
Since we merged https://github.com/linebender/masonry into this
repository, these issue numbers were out-of-date.

I found these by search for `#[0-9]`, and got the updated links using
`https://github.com/linebender/masonry/issues/{x}`
2024-06-26 13:06:18 +00:00
Philipp Mildenberger 5284082523
xilem_core: Provide a way to add `View` implementations for external types (#402)
Since we're suffering from the orphan rule with the new xilem_core
implementation, we cannot use `View` in downstream crates for external
types such as a `WidgetView` implementation for `&'static str` in Xilem.

This PR adds an `OrphanView` trait which the `Context` of the `View` has
to implement for the type which has an implementation in xilem_core for
this. The `View` impl for these types is basically a proxy for
`OrphanView` (which in turn has the same method signature as `View`), so
downstream crates can achieve the same as with the `View`.

---------

Co-authored-by: Daniel McNab <36049421+DJMcNab@users.noreply.github.com>
2024-06-24 18:14:00 +00:00
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