Commit graph

423 commits

Author SHA1 Message Date
Olivier Goffart
f27a2b8c74 Fix issues related to alias to globals
two problems
 - For the interpreter, properly handle the case of an alias to a global
 - For the rust generator, we can't return a reference to a property held
   in a global, so we must 'inline' the get_xx funciton on sub-components
2021-12-06 14:30:47 +01:00
Olivier Goffart
cd47ef1100 Mark properties that we know are never modified as constant,
so that we don't need to register dependencies when accessing them
2021-12-04 22:00:12 +01:00
Olivier Goffart
bc8d556799 Compiler: keep const-ness information of native property in the NativeClass 2021-12-04 22:00:12 +01:00
Olivier Goffart
a90013983b Add a way to debug the properties behind a configuration flag
I used a `#[cfg(..)]` instead of a feature flag because then it is enabled
for both the compiler and the lib at the same time, and since it is only a debug stuff
it does not need to be enabled within the project. So one must enable it with
`RUSTFLAGS='--cfg sixtyfps_debug_property'`
2021-12-04 22:00:12 +01:00
Olivier Goffart
0e174b6aba Start working on makeing the generated code no_std 2021-12-01 10:36:29 +01:00
Olivier Goffart
a201c31eaf Don't use Lazy to initialize the ITEM_TREE, use OnceBox instead
Lazy needs std
2021-12-01 10:36:29 +01:00
Olivier Goffart
47a4463abc Rename the sub component id to avoid error in the generated code with duplicated names 2021-11-23 12:03:03 +01:00
Simon Hausmann
fa14a80ea8 Fix text rendered blurry when using Qt
After commit becb4574c1 we'll
make sure not to set the plugin application attribute when initializing
the Qt backend. Unfortunately in the generated struct the NativeStyleMetrics field
is placed and initialized before the m_window. The Default::default() impl
calls `ensure_initialized()` with `from_qt_backend = false` because we don't
know what backend is being used. Since due to the ordering this is the first
call to `ensure_initialized()`, we'll end up setting the plugin application
attribute.

This patch fixes that by ensuring that the m_window field always comes first,
which is initialized with a call into the run-time library, which in turn
delegates to the backend. That'll be the Qt backend and we'll initialize
the application object correctly.
2021-11-23 11:05:02 +01:00
Olivier Goffart
d1cae710df preprocess the images at compile time
For the MCU port, we need to proccess the image to save them in the binary
in a convenient format.
This patch start this work by trying to anaylyze what format should an image
be using, and saving it as a texture in the binary.

The current graphical backend and the C++ frontend are not yet supported
2021-11-19 15:54:45 +01:00
Olivier Goffart
dd3fa1c221 Make the BindingMap hold RefCell of the BindingExpression
This will allow later to be able to operate on the binding despite the
element is borrowed.

Since the Binding itself is in a RefCell, the analysis don't need to
be anymore.
To do this change, a small change in the binding_analysis logic was required
which means that we will now detect binding loop if a binding was causing
two binding loop. (before, only one binding loop was detected)
2021-11-11 11:14:59 +01:00
Simon Hausmann
8ff27671ef Fix absolute item index computation for children of nested sub-components
Somehow the focus_change_subcompo test missed this case and the visible
issue of this off-by-one was that
the combo boxes in the printer demo's settings page opened at the wrong location (wrong parent).
2021-11-09 14:52:47 +01:00
Olivier Goffart
92998a76aa Rust: Don't mark the window as pub
No reason to have it public
2021-11-09 13:48:22 +01:00
Simon Hausmann
f10f05c726 Fix set_focus_item and show_popup_window calls from within sub-components in Rust
Compute the absolute item index like in the C++ generator.
2021-11-09 11:50:36 +01:00
Simon Hausmann
270f8145ff Don't call set_focus_item in the init function of sub-components
We use the setup_code for that for now, so apply the same logic as in the C++ generator.

However there's more work to be done later to make forward-focus work corectly into sub-components.
2021-11-09 11:49:51 +01:00
Simon Hausmann
3e02c7090c Minor cleanup
Qualify the Default trait also for the root field
2021-11-09 11:09:56 +01:00
Simon Hausmann
b0d76d1bcc Fix dyn_index dispatch to sub-components in Rust
Correctly make the dyn_index a local index by subtracting the base
2021-11-09 10:46:48 +01:00
Simon Hausmann
f7415171d0 Fix generated Rust code when using sub-components in nested repeaters
The code to determine the root is a little more complex, as unlike in C++
we are not passing the root on in constructors.
2021-11-09 10:40:51 +01:00
Simon Hausmann
1055b39c68 Fix calls to ItemRc that take a VRc, when called from sub-components
There are different ways to get the VRc.
2021-11-08 16:53:24 +01:00
Olivier Goffart
a6a8f232db Fix error in generated code:
```
error[E0599]: no method named `unwrap` found for struct `sixtyfps::re_exports::OnceCell` in the current scope
   --> .../test-driver-rust-0868c471dd25beed/out/imports_external_type.rs:384:29
    |
384 |                 &_self.root.unwrap().upgrade(),
    |                             ^^^^^^ method not found in `sixtyfps::re_exports::OnceCell<VWeak<sixtyfps::re_exports::ComponentVTable, imports_external_type::sixtyfps_generated_TestCase::InnerTestCase>>`
```
2021-11-08 16:41:45 +01:00
Simon Hausmann
e9a7be2f62 Fix compilation of init() calls to sub-components that are instantiated in repeaters
The path to get the root differs depending on where we are.
2021-11-08 16:29:34 +01:00
Simon Hausmann
8f2a7edbee Add support for callback aliases in Rust sub-components 2021-11-08 16:09:20 +01:00
Simon Hausmann
f693b434f4 Fix warning about unused imports in repeated elements of sub-components in Rust 2021-11-08 16:09:20 +01:00
Simon Hausmann
4ba6260a47 Add support for repeaters in Rust sub-components
* Generate a visit_dynamic_children dispatch function in sub-components and call it
* Add a self_weak to sub-components
* Fix access to the window from within repeated components
* Fix the parent type of repeated elements within sub-components to be a VWeakMapped instead of VWeak
* Fix the build of the parent_item() implementation of repeated elements within sub-comps. The parent index might still be wrong, needs to be checked.
2021-11-08 15:11:05 +01:00
Simon Hausmann
735a7eef82 Fix access to two-way bindings resolved to aliases in sub-components
We generate a getter that hides the renaming. Instead of returning a field offset, we
might as well use the same code as for the value getter
and return a `Pin<&Property<T>>`.

What doesn't work yet are aliases to globals, because that
uses a temporary.
2021-11-08 13:25:13 +01:00
Simon Hausmann
13de800ba3 Internal cleanup: Rename layouting_info to layout_info
That's making the call on the Component VTable consistent(ish) with the Item VTable.
2021-11-08 10:24:30 +01:00
Simon Hausmann
ca29d3ea66 Make it possible to use Text as a sub-component base type
At the use-size a binding for width and height is created that
uses the layout info. So that function needs to be emitted for sub-components,
and access to the window needs to be provided as well.

There's cleanup for later, which is unifying the name (layout vs layouting)
and shortening the signature for
sub-component calls (no need for the window parameter).
2021-11-07 13:28:35 +01:00
Simon Hausmann
add44d2be0 Fix accessing the global from sub-components in Rust
Add a root vweak to each sub-compoment and use it to route access to the globals.
2021-11-05 17:26:18 +01:00
Simon Hausmann
f708a4a32a Rust: Add support for custom properties in sub-components
Declare a const getter function that retrieves the field offset and call it from access_member.

Right now the indirection through
the function is not needed, but
it will be necessary when supporting aliases.
2021-11-05 13:43:50 +01:00
Olivier Goffart
9401bfbec7 Rust test driver: Add a feature to generate the rust code in build.rs
instead of in the sixtyfps! macro, so se actually see where the error is in
the generated code.

This also expose a bunch of warning that were not being taken care on.
2021-11-05 11:35:56 +01:00
Simon Hausmann
2cdb9d8d82 Fix accessing properties of builtin items through a sub-component chain in Rust 2021-11-05 11:21:44 +01:00
Simon Hausmann
6a53640b03 Fix calling init on nested sub-components
Call VRcMapped::map instead of VRc::map when the type of self_rc is not a VRc anymore.
2021-11-05 11:21:18 +01:00
Simon Hausmann
5fa4bc6b70 Generate an init function for sub-components
This allows something like this:

```
SubCompo := Rectangle {
    background: green;
}
App := Window {
    SubCompo {}
}
```
2021-11-05 10:20:54 +01:00
Simon Hausmann
f70d6c6f17 Add skeleton for sub-component use in the Rust generator
* For sub-components create a super-primitive struct with just its fields
  and a new() function to create it. There's no init() function yet.
* Provide access to the root item of the sub-component

This just makes the most trivial example work:

```
SubComp := Rectangle {}

App := Window {
    SubComp {
        background: green;
    }
}
```
2021-11-04 19:50:53 +01:00
Simon Hausmann
7354b17a6a Minor cleanup in ItemTreeBuilder trait
Pass the sub-component as a parameter in enter_component(), as it's needed in the C++
implementation, it's readily available (no need to unwrap again) and Rust will need it, too.
2021-11-04 17:55:39 +01:00
Simon Hausmann
75959f4e4f Prepare for emitting Rust code for sub-components
Call generate_component like in the C++ generator. This will trigger `todo!()` :)
2021-11-04 16:06:17 +01:00
Simon Hausmann
1d7e3f07a8 Fold handle_repeater into the TreeBuilder to reduce the number of parameters 2021-11-04 15:57:55 +01:00
Olivier Goffart
7472b80094 Rust: use the new build_tree_item 2021-11-04 15:42:48 +01:00
Simon Hausmann
88293151b1 Remove unused variable in the Rust code generator 2021-11-03 11:49:18 +01:00
Simon Hausmann
14cb0520a9 Fix drop implementation of Rust generated code
Call free_graphics_resources, not init_items %-)

Amends commit 67579ec560
2021-11-01 18:50:33 +01:00
Simon Hausmann
67579ec560 Simplify drop implementation of generated components
Avoid creating an intermediate array of items to free the graphics resources.
Instead call run-time function with the item tree as a parameter, which is traversed.

It's practically the same data structure that was previously created, except
that it is shared/global and has little holes for the dynamic tree items, but those are easy to skip.
2021-11-01 08:58:53 +01:00
Simon Hausmann
d57edfbb7c Simplify free_graphics_resources API in the backend
Take an iterator reference instead of a slice, so that we can change the call sites in the future.
2021-10-30 13:03:52 +02:00
Olivier Goffart
567c644a5f Fix PopupWindow position when all elements are not inlined
Pass a reference to the parent item in the show_popup function
so we can compute the exact location at runtime.
2021-10-28 15:52:29 +02:00
Simon Hausmann
63bf1af093 Add support for tracking the length of a model in Rust
This is done by exposing the ModelNotify to the caller via the new
ModelTracker trait, which has a function that allows "hooking" into the
dirty tracking of the size.

By extension, this also works in JavaScript.

cc #98
2021-10-20 15:25:28 +02:00
James Blacklock
ab665ba7b6 enable scripts to access the length of arrays 2021-10-18 10:21:06 +02:00
Olivier Goffart
bb4e5d8b55 Fix animation not starting when set from a callback
Two problems:
 - We were not marking the property as dirty, so dependent property would not
   update themselves
 - In the generated rust/c++ code, we would not call set_animated_value
2021-10-13 14:33:40 +02:00
Olivier Goffart
89c43bcd36 Workaround a rust-analyzer parse error in the generated code
Workaround for https://github.com/rust-analyzer/rust-analyzer/issues/10492
2021-10-12 21:13:07 +02:00
Simon Hausmann
88ad176008 Improve diagnostics when images cannot be located for embedding
This is a two-stage change, that first centralizes the file I/O code
path for on-disk and builtin:/ files. Secondly the resource embedding
pass now produces diagnostics if a file cannot be located.
2021-10-05 23:16:46 +02:00
Simon Hausmann
4b267a8e9b Internal cleanup: Simplify string handling when accessing compiler-embedded files
For loading images that are included in the widget library that's included in turn
in the compiler binary, we need to create ImageInner::EmbeddedData
with &'static data and &'static file extension. The latter was
created using string interning, but we can also access the path of the
widget library data structure.
2021-10-05 23:16:46 +02:00
Simon Hausmann
4a26faef9a Add AboutSixtyFPS element 2021-10-05 23:16:46 +02:00
Olivier Goffart
7f05bfa309 Add the Dialog element 2021-09-29 16:25:44 +02:00