| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
-
- #include "../../DFPSR/includeFramework.h"
- using namespace dsr;
- bool running = true;
- // GUI handles
- Window window;
- Component buttonClear;
- Component buttonAdd;
- Component myListBox;
- Component textElement;
- // Custom message handling
- List<String> messages;
- void showMessages() {
- if (messages.length() > 0) {
- // Summarizing all messages from the last action, which can also be used to display them in the same pop-up message.
- String content;
- string_append(content, U"Messages:\n");
- for (int m = 0; m < messages.length(); m++) {
- string_append(content, U" * ", messages[m]);
- }
- string_append(content, U"\n");
- string_sendMessage_default(content, MessageType::StandardPrinting);
- messages.clear();
- }
- }
- DSR_MAIN_CALLER(dsrMain)
- void dsrMain(List<String> args) {
- // Assign custom message handling to get control over errors, warnings and any other text being printed to the terminal.
- string_assignMessageHandler([](const ReadableString &message, MessageType type) {
- // Deferring messages can be useful for showing them at a later time.
- messages.push(message);
- // A custom message handler still have to throw exceptions or terminate the program when errors are thrown.
- if (type == MessageType::Error) {
- string_sendMessage_default(message, MessageType::Error);
- }
- });
- // Set current path to the application folder, so that it's safe to use relative paths for loading GUI resources.
- // Loading and saving files will automatically convert / and \ to the local format using file_optimizePath, so that you can use them directly in relative paths.
- file_setCurrentPath(file_getApplicationFolder());
- // Create a window
- window = window_create(U"GUI example", 1000, 700);
- // Register your custom components here
- //REGISTER_PERSISTENT_CLASS(className);
- // Load an interface to the window
- window_loadInterfaceFromFile(window, U"media/interface.lof");
- // Create a virtual machine with reusable image generating functions.
- // The same Media Machine Code (*.mmc) can be used for multiple themes.
- MediaMachine machine = machine_create(string_load(U"media/Drawing.mmc"));
- // Use the virtual machine with a specific style referring to the functions in machine.
- window_applyTheme(window, theme_createFromFile(machine, U"media/Theme.ini"));
- // Bind methods to events
- window_setCloseEvent(window, []() {
- sendWarning(U"Ahhh, you killed me! But closing a window directly is okay, because the program can run logic for saving things before terminating.");
- running = false;
- });
- // Look up components by name
- buttonClear = window_findComponentByName(window, U"buttonClear");
- buttonAdd = window_findComponentByName(window, U"buttonAdd");
- myListBox = window_findComponentByName(window, U"myListBox");
- textElement = window_findComponentByName(window, U"textElement");
- // Connect components with actions
- component_setPressedEvent(buttonClear, []() {
- // Clear list
- component_call(myListBox, U"ClearAll");
- });
- component_setPressedEvent(buttonAdd, []() {
- // Add to list
- component_call(myListBox, U"PushElement", component_getProperty_string(textElement, U"Text", false));
- });
- component_setKeyDownEvent(myListBox, [](const KeyboardEvent& event) {
- if (event.dsrKey == DsrKey_Delete) {
- // Delete from list
- int64_t index = component_getProperty_integer(myListBox, U"SelectedIndex", false, 0);
- //int64_t index = string_toInteger(component_call(myListBox, U"GetSelectedIndex")); // There is also a getter for the index
- if (index > -1) {
- component_call(myListBox, U"RemoveElement", string_combine(index));
- }
- }
- });
- // Connect actions to components without saving their handles
- component_setPressedEvent(window_findComponentByName(window, U"menuExit"), []() {
- sendWarning(U"You forgot to save your project and now I'm throwing it away because you forgot to save!");
- running = false;
- });
- // Called when the selected index has changed, when indices have changed their meaning
- // Triggered by mouse, keyboard, list changes and initialization
- component_setSelectEvent(myListBox, [](int64_t index) {
- String content = component_call(myListBox, U"GetSelectedText");
- printText("Select event: content is (", content, ") at index ", index, "\n");
- });
- // Only triggered by mouse presses like any other component
- component_setPressedEvent(myListBox, []() {
- int64_t index = component_getProperty_integer(myListBox, U"SelectedIndex", false, 0);
- //int64_t index = string_toInteger(component_call(myListBox, U"GetSelectedIndex")); // There is also a getter for the index
- String content = component_call(myListBox, U"GetSelectedText");
- printText("Pressed event: content is (", content, ") at index ", index, "\n");
- });
- // Execute
- while(running) {
- // Wait for actions
- while (!window_executeEvents(window)) {
- time_sleepSeconds(0.01);
- }
- // Busy loop instead of waiting
- //window_executeEvents(window);
- // Custom message handling
- showMessages();
- // Draw interface
- window_drawComponents(window);
- // Show the final image
- window_showCanvas(window);
- }
- // Empty the messages and switch back to the default message handler so that errors from deallocating global resources can be displayed
- showMessages();
- string_unassignMessageHandler();
- printText(U"Printing text using the default message handler again.\n");
- }
|