slint/api/sixtyfps-cpp
Simon Hausmann aa5babffe1 Prepare for key event delivery to a specific focus item
Begin by routing key events through the component. In the future that
will direct the event to the focus item.
2020-09-25 10:06:15 +02:00
..
cmake CMake: on windows need to add the IMPORTED_IMPLIB 2020-09-06 14:54:05 +02:00
docs Documentation for the newly added struct type 2020-09-17 13:14:01 +02:00
include Prepare for key event delivery to a specific focus item 2020-09-25 10:06:15 +02:00
README.md Simplify markdown links to C++/Rust docs 2020-09-03 17:35:07 +02:00

SixtyFPS-cpp

A C++ UI toolkit

SixtyFPS is a UI toolkit that supports different programming languages. SixtyFPS.cpp is the C++ API to interact with a SixtyFPS UI from C++.

The complete C++ documentation can be viewed online at https://www.sixtyfps.io/docs/cpp/.

Building

The C++ API comes as a CMake package with a library and header files. The build process consists of the following steps:

  1. Install Rust and Cargo (recommended via https://rustup.rs).
  2. Build the CMake package: cargo xtask cmake. If you'd like to install SixtyFPS.cpp into a specific directory, then you can pass the prefix and install parameters: cargo xtask cmake --prefix /path/where/to/install --install
  3. When running CMake make sure to point the CMAKE_PREFIX_PATH to the install directory. If you build SixtyFPS.cpp without prefix, then the target/debug/ directory is your CMAKE_PREFIX_PATH.

Usage via CMake

TODO

Tutorial

Let's make a UI for a todo list application using the SixtyFPS UI description language. Hopefully this should be self explainatory. Check out the documentation of the language for help

NOTE: this is not yet implemented as is.

// file: todoapp.60
TodoApp := MainWindow {
    signal todo_added(string);
    property<model> todo_model;

    ColumnLayout {
        RowLayout {
            text_edit := LineEdit {}
            Button {
                text: "Add Todo";
                clicked => {
                    todo_added(text_edit.text);
                    text_edit.text = "";
                }
            }
        }
        NativeListView {
            model: todo_model;
        }
    }
}

Now, we can generate the C++ code using the following command

sixtyfpscpp_compiler todoapp.sixtyfps -o todoapp.h

Note: You would usually not type this command yourself, this is done automatically by the build system See the documentation for how to integrate with cmake

This will generate a todoapp.h header file. It basically contains the following code (edited for briefty)

#include <sixtyfps>
struct TodoApp : sixtyfps::window {
    sixtyfps::signal<std::string_view> &todo_added();
    sixtyfps::property<std::shared_ptr<sixtyfps::data_model<
        sixtyfps::native_list_view_item>>> &todo_model();
    //...
}

We can then use this from out .cpp file

// include the generated file
#include "todoapp.h"

int main() {
    // Let's instantiate our window: this return a handle to it
    auto todo_app = sixtyfps::create_window<TodoApp>();

    // let's create a model: `simple_data_model` is a data model which is simply backed by
    // a vector behind the scene.
    auto model = std::make_shared<sixtyfps::simple_data_model<sixtyfps::native_list_view_item>>();
    model->push_back({"Write documentation", sixtyfps::native_list_view_item::checkable });
    todo_app->data_model().set(model);

    // let's connect our "add" button to add an item in the model
    todo_app->todo_added().connect([=](std::string_view data) {
        model->push_back({data, sixtyfps::native_list_view_item::checkable})
    });

    // Show the window
    todo_app->show();

    // Run the sixtyfps envent loop on this thread.
    sixtyfps::run();
}

That's it.

Check the rest of the documentation for the reference.