![]() The Image's source property used to be a string. Now it is a Resource enum, which can either be None or an absolute file path to the image on disk. This also replaces the internal Image type. The compiler internally resolves the img bang expression to a resource reference, which shall remain just an absolute path. For now the target generator passes that through, but in the future the target generator may choose a target specific way of embedding the data and thus generating a different Resource type in the final code (through compile_expression in the cpp and rust generator). The C++ binding is a bit messy as cbindgen doesn't really support exporting enums that can be constructed on the C++ side. So instead we use cbindgen to merely export the type internally and only use the tag from it then. The public API is then a custom Resource type that is meant to be binary compatible. |
||
---|---|---|
.. | ||
cmake | ||
include | ||
README.md |
SixtyFPS-cpp
A C++ UI toolkit
SixtyFPS is a GUI engine, with libraries for different languages. SixtyFPS.cpp the a C++ API to interact with a SictyFPS UI from your C++ program.
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.