Jump to content

Recommended Posts

Posted

If i want to create 2 windows in 2 separate cpp files i get an error message saying "symbols already existing", when i rename every component (for example window->nwindow, ui->nui, displays->ndisplays) i only get 1 window opened, and its the original window, so not the one i modifyed.

Posted

You need to keep track of each variable you create, if you just do something like this:

auto window = CreateWindow("Window 1"....);
window = CreateWindow("Window 2"....);

then the first window is not referenced anymore and therefore deleted.

To better handle this, you should use classes to hold everything your windows need. (one class per window).

A very basic sample:

#include "UltraEngine.h"

using namespace UltraEngine;

class MyWindowBase : public Object
{
protected:
    shared_ptr<Window> _window;
    shared_ptr<Interface> _ui;
    string _title;
    bool _closed;

public:
    MyWindowBase(string title,int px,int py, int width,int height,  vector<shared_ptr<Display>> displays) : _title(title)
    {
        _window = CreateWindow(_title,px,py,width,height, displays[0], WINDOW_TITLEBAR | WINDOW_RESIZABLE | WINDOW_CENTER);
        _ui = CreateInterface(_window);
        _closed = false;
    }

    bool Closed()
    {
        return _closed;
    }

    void virtual Init() abstract;

    bool virtual Update(const Event ev)
    {
        if (ev.source != NULL && ev.source->As<Window>() == _window && !_closed)
        {
            switch (ev.id)
            {
            case EVENT_WINDOWCLOSE:
                _closed = true;
                _window = NULL;
                return true;
            }
        }

        return false;
    }
};

class MainWindow : public MyWindowBase
{
private:
    shared_ptr<Widget> _listbox;

public:
    
    MainWindow(string title, int px, int py, int width, int height, vector<shared_ptr<Display>> displays) : MyWindowBase(title, px, py, width, height, displays)
    {
        Init();
    }

    void Init() override
    {
        auto sz = _ui->root->GetSize();
        _listbox = CreateListBox(20, 20, sz.x - 40, sz.y - 40, _ui->root);
        _listbox->AddItem("Item 1", true);
        _listbox->AddItem("Item 2");
        _listbox->AddItem("Item 3");
        _listbox->AddItem("Item 4");
        _listbox->AddItem("Item 5");
        _listbox->AddItem("Item 6");
        _listbox->SetLayout(1, 1, 1, 1);
    }

    bool virtual Update(const Event ev) override
    {
        if (!MyWindowBase::Update(ev))
        {
            switch (ev.id)
            {
            case EVENT_WIDGETACTION:
                Print("Item " + String(ev.data) + " action");
                break;
            case EVENT_WIDGETSELECT:
                Print("Item " + String(ev.data) + " selected");
                break;
            }
        }

        return false;
    }

};

class SecondWindow : public MyWindowBase
{
private:
    shared_ptr<Widget> _listbox;

public:
    SecondWindow(string title, int px, int py, int width, int height, vector<shared_ptr<Display>> displays) : MyWindowBase(title, px, py, width, height, displays)
    {
        Init();
    }

    void Init() override
    {
        auto sz = _ui->root->GetSize();
        _listbox = CreateListBox(20, 20, sz.x - 40, sz.y - 40, _ui->root);
        _listbox->AddItem("Item 1.1", true);
        _listbox->AddItem("Item 1.2");
        _listbox->AddItem("Item 1.3");
        _listbox->AddItem("Item 1.4");
        _listbox->AddItem("Item 1.5");
        _listbox->AddItem("Item 1.6");
        _listbox->SetLayout(1, 1, 1, 1);
    }

    bool virtual Update(const Event ev) override
    {
        if (!MyWindowBase::Update(ev))
        {
            switch (ev.id)
            {
            case EVENT_WIDGETACTION:
                Print("Item " + String(ev.data) + " action");
                break;
            case EVENT_WIDGETSELECT:
                Print("Item " + String(ev.data) + " selected");
                break;
            }
        }

        return false;
    }

};

int main(int argc, const char* argv[])
{
    //Get the displays
    auto displays = GetDisplays();

    vector<shared_ptr<MyWindowBase>> windows;
    windows.push_back(make_shared<MainWindow>("Main Window", 0, 0, 800, 600, displays));
    windows.push_back(make_shared<SecondWindow>("Second Window", 400, 300, 400, 300, displays));
    bool running = true;

    while (running)
    {
        const Event ev = WaitEvent();   
        running = false;

        for (auto w : windows) 
        {
            if (w->Update(ev))
                break;

            if (!w->Closed())
                running = true;
        }
    }
    return 0;
}

 

  • Thanks 1
  • Windows 10 Pro 64-Bit-Version
  • NVIDIA Geforce 1080 TI

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...