diff --git a/applications/gui2/src/views/config.cpp b/applications/gui2/src/views/config.cpp index 3bd9bef3fc665bf03c46e5fe650b383579d02a86..17a0ec07ce8fef46ef3ef0f53a51939263a565b0 100644 --- a/applications/gui2/src/views/config.cpp +++ b/applications/gui2/src/views/config.cpp @@ -220,8 +220,9 @@ void ConfigWindow::__addElements(nanogui::FormHelper *form, const std::string &s } if (!nuri.empty()) { - auto button = form->addButton(key, [form, nuri]() { - buildForm(form->window()->screen(), nuri); + nanogui::Window *window = form->window(); + auto button = form->addButton(key, [window, nuri]() { + buildForm(window->screen(), nuri); }); button->setIcon(ENTYPO_ICON_FOLDER); @@ -236,7 +237,7 @@ void ConfigWindow::__addElements(nanogui::FormHelper *form, const std::string &s void ConfigWindow::_buildForm(const std::string &suri) { using namespace nanogui; - ftl::URI uri(suri); + /*ftl::URI uri(suri); FormHelper *form = new FormHelper(this->screen()); form->addWindow(Vector2i(100,50), uri.getFragment()); @@ -259,19 +260,38 @@ void ConfigWindow::_buildForm(const std::string &suri) { }); close->setBackgroundColor({80, 255}); form->window()->screen()->performLayout(); - delete form; + delete form;*/ + + buildForm(screen(), suri); } +static MUTEX config_mtx; +static std::unordered_map<std::string, nanogui::Window*> existing_configs; + // Static version void ConfigWindow::buildForm(nanogui::Screen *screen, const std::string &suri) { using namespace nanogui; + { + UNIQUE_LOCK(config_mtx, lk); + auto i = existing_configs.find(suri); + if (i != existing_configs.end()) { + screen->moveWindowToFront(i->second); + return; + } + } + ftl::URI uri(suri); FormHelper *form = new FormHelper(screen); form->addWindow(Vector2i(100,50), uri.getFragment()); //form->window()->setTheme(theme()); + { + UNIQUE_LOCK(config_mtx, lk); + existing_configs[suri] = form->window(); + } + __addElements(form, suri); // prevent parent window from being destroyed too early @@ -283,9 +303,11 @@ void ConfigWindow::buildForm(nanogui::Screen *screen, const std::string &suri) { auto *window = form->window(); - close->setCallback([window](){ + close->setCallback([window, suri](){ window->dispose(); //decRef(); + UNIQUE_LOCK(config_mtx, lk); + existing_configs.erase(suri); }); close->setBackgroundColor({80, 255}); form->window()->screen()->performLayout();