rute 0.0.1

UI library implemented on top of Qt
#pragma once

#include <map>
#include "rute_base.h"

class QWidget;
class QString;

extern std::map<void*, void*> s_host_data_lookup;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

struct PrivData {
    QWidget* parent;
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

template<typename QT> void destroy_generic(struct RUBase* qt_data) {
    QT* qt_obj = (QT*)qt_data;
    delete qt_obj;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

template<typename T, typename QT> T create_widget_func(
    struct RUBase* priv_data,
    RUDeleteCallback delete_callback, void* host_data)
{
    PrivData* data = (PrivData*)priv_data;
    QT* qt_obj = nullptr;
    if (data) {
        qt_obj = new QT(data->parent);
    } else {
        qt_obj = new QT(nullptr);
    }

    s_host_data_lookup[(void*)qt_obj] = host_data;
    qt_obj->m_delete_callback = delete_callback;

    T ctl;
    ctl.qt_data = (struct RUBase*)qt_obj;
    ctl.host_data = nullptr;

    return ctl;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

template<typename T, typename QT> T generic_create_func(void* priv_data)
{
    (void)priv_data;
    QT* qt_obj = new QT();

    T ctl;
    ctl.qt_data = (struct RUBase*)qt_obj;
    ctl.host_data = nullptr;

    return ctl;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

template<typename T, typename QT> T generic_create_func_with_delete(
    struct RUBase* priv_data,
    RUDeleteCallback delete_callback, void* private_user_data) {

    (void)priv_data;

    QT* qt_obj = new QT();
    qt_obj->m_delete_callback = delete_callback;
    qt_obj->m_private_data = private_user_data;

    T ctl;
    ctl.qt_data = (struct RUBase*)qt_obj;
    ctl.host_data = nullptr;

    return ctl;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

const char* q_string_to_const_char(const QString& v);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

struct RUApplication create_application(struct RUBase* priv_data);
void destroy_application(struct RUBase* priv_data);