| 
							- /*
 -  * Carla Bridge Toolkit, Qt version
 -  * Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com>
 -  *
 -  * This program is free software; you can redistribute it and/or
 -  * modify it under the terms of the GNU General Public License as
 -  * published by the Free Software Foundation; either version 2 of
 -  * the License, or any later version.
 -  *
 -  * This program is distributed in the hope that it will be useful,
 -  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 -  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 -  * GNU General Public License for more details.
 -  *
 -  * For a full copy of the GNU General Public License see the GPL.txt file
 -  */
 - 
 - #include "CarlaBridgeClient.hpp"
 - #include "CarlaBridgeToolkit.hpp"
 - #include "CarlaStyle.hpp"
 - 
 - #include <QtCore/QSettings>
 - #include <QtCore/QThread>
 - #include <QtCore/QTimerEvent>
 - 
 - #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
 - # include <QtWidgets/QApplication>
 - # include <QtWidgets/QMainWindow>
 - # ifdef Q_WS_X11
 - #  undef Q_WS_X11
 - # endif
 - #else
 - # include <QtGui/QApplication>
 - # include <QtGui/QMainWindow>
 - # ifdef Q_WS_X11
 - #  include <QtGui/QX11EmbedContainer>
 - # endif
 - #endif
 - 
 - #if defined(BRIDGE_COCOA) || defined(BRIDGE_HWND) || defined(BRIDGE_X11)
 - # define BRIDGE_CONTAINER
 - # ifndef BRIDGE_X11
 - typedef QWidget QEmbedContainer;
 - # else
 - #  ifdef Q_WS_X11
 - typedef QX11EmbedContainer QEmbedContainer;
 - #  else
 - #   warning Using X11 UI bridge without QX11EmbedContainer
 - typedef QWidget QEmbedContainer;
 - #  endif
 - # endif
 - #endif
 - 
 - CARLA_BRIDGE_START_NAMESPACE
 - 
 - // -------------------------------------------------------------------------
 - 
 - #if defined(BRIDGE_QT4)
 - static const char* const appName = "Carla-Qt4UIs";
 - #elif defined(BRIDGE_QT5)
 - static const char* const appName = "Carla-Qt5UIs";
 - #elif defined(BRIDGE_COCOA)
 - static const char* const appName = "Carla-CocoaUIs";
 - #elif defined(BRIDGE_HWND)
 - static const char* const appName = "Carla-HWNDUIs";
 - #elif defined(BRIDGE_X11)
 - static const char* const appName = "Carla-X11UIs";
 - #else
 - static const char* const appName = "Carla-UIs";
 - #endif
 - 
 - static int   qargc = 0;
 - static char* qargv[0] = {};
 - 
 - // -------------------------------------------------------------------------
 - 
 - class CarlaBridgeToolkitQt: public QObject,
 -                             public CarlaBridgeToolkit
 - {
 -       Q_OBJECT
 - 
 - public:
 -     CarlaBridgeToolkitQt(CarlaBridgeClient* const client, const char* const uiTitle)
 -         : QObject(nullptr),
 -           CarlaBridgeToolkit(client, uiTitle),
 -           fApp(nullptr),
 -           fWindow(nullptr),
 - #ifdef BRIDGE_CONTAINER
 -           fEmbedContainer(nullptr),
 - #endif
 -           fMsgTimer(0)
 -     {
 -         carla_debug("CarlaBridgeToolkitQt::CarlaBridgeToolkitQt(%p, \"%s\")", client, uiTitle);
 - 
 -         connect(this, SIGNAL(setSizeSafeSignal(int,int)), SLOT(setSizeSafeSlot(int,int)));
 -     }
 - 
 -     ~CarlaBridgeToolkitQt() override
 -     {
 -         CARLA_ASSERT(fApp == nullptr);
 -         CARLA_ASSERT(fWindow == nullptr);
 -         CARLA_ASSERT(fMsgTimer == 0);
 -         carla_debug("CarlaBridgeToolkitQt::~CarlaBridgeToolkitQt()");
 -     }
 - 
 -     void init() override
 -     {
 -         CARLA_ASSERT(fApp == nullptr);
 -         CARLA_ASSERT(fWindow == nullptr);
 -         CARLA_ASSERT(fMsgTimer == 0);
 -         carla_debug("CarlaBridgeToolkitQt::init()");
 - 
 -         fApp = new QApplication(qargc, qargv);
 - 
 -         {
 -             QSettings settings("falkTX", "Carla");
 - 
 -             if (settings.value("Main/UseProTheme", true).toBool())
 -             {
 -                 CarlaStyle* const style(new CarlaStyle());
 -                 fApp->setStyle(style);
 -                 //style->ready(fApp);
 - 
 - //                 QString color(settings.value("Main/ProThemeColor", "Black").toString());
 - //
 - //                 if (color == "System")
 - //                     pass(); //style->setColorScheme(CarlaStyle::COLOR_SYSTEM);
 - //                 else
 - //                     style->setColorScheme(CarlaStyle::COLOR_BLACK);
 -             }
 -         }
 - 
 -         fWindow = new QMainWindow(nullptr);
 -         fWindow->resize(30, 30);
 -         fWindow->hide();
 -     }
 - 
 -     void exec(const bool showGui) override
 -     {
 -         CARLA_ASSERT(kClient != nullptr);
 -         CARLA_ASSERT(fApp != nullptr);
 -         CARLA_ASSERT(fWindow != nullptr);
 -         carla_debug("CarlaBridgeToolkitQt::exec(%s)", bool2str(showGui));
 - 
 - #if defined(BRIDGE_QT4) || defined(BRIDGE_QT5)
 -         QWidget* const widget((QWidget*)kClient->getWidget());
 - 
 -         fWindow->setCentralWidget(widget);
 -         fWindow->adjustSize();
 - 
 -         widget->setParent(fWindow);
 -         widget->show();
 - #endif
 - 
 -         if (! kClient->isResizable())
 -         {
 -             fWindow->setFixedSize(fWindow->width(), fWindow->height());
 - #ifdef Q_OS_WIN
 -             fWindow->setWindowFlags(fWindow->windowFlags() | Qt::MSWindowsFixedSizeDialogHint);
 - #endif
 -         }
 - 
 -         fWindow->setWindowIcon(QIcon::fromTheme("carla", QIcon(":/scalable/carla.svg")));
 -         fWindow->setWindowTitle(kUiTitle);
 - 
 -         {
 -             QSettings settings("falkTX", appName);
 - 
 -             if (settings.contains(QString("%1/pos_x").arg(kUiTitle)))
 -             {
 -                 bool hasX, hasY;
 -                 const int posX(settings.value(QString("%1/pos_x").arg(kUiTitle), fWindow->x()).toInt(&hasX));
 -                 const int posY(settings.value(QString("%1/pos_y").arg(kUiTitle), fWindow->y()).toInt(&hasY));
 - 
 -                 if (hasX && hasY)
 -                     fWindow->move(posX, posY);
 - 
 -                 if (kClient->isResizable())
 -                 {
 -                     bool hasWidth, hasHeight;
 -                     const int width(settings.value(QString("%1/width").arg(kUiTitle), fWindow->width()).toInt(&hasWidth));
 -                     const int height(settings.value(QString("%1/height").arg(kUiTitle), fWindow->height()).toInt(&hasHeight));
 - 
 -                     if (hasWidth && hasHeight)
 -                         fWindow->resize(width, height);
 -                 }
 -             }
 - 
 -             if (settings.value("Engine/UIsAlwaysOnTop", true).toBool())
 -                 fWindow->setWindowFlags(fWindow->windowFlags() | Qt::WindowStaysOnTopHint);
 -         }
 - 
 -         if (showGui)
 -             show();
 -         else
 -             kClient->sendOscUpdate();
 - 
 -         fMsgTimer = startTimer(30);
 - 
 -         // First idle
 -         handleTimeout();
 - 
 -         // Main loop
 -         fApp->exec();
 -     }
 - 
 -     void quit() override
 -     {
 -         CARLA_ASSERT(kClient != nullptr);
 -         CARLA_ASSERT(fApp != nullptr);
 -         CARLA_ASSERT(fWindow != nullptr);
 -         carla_debug("CarlaBridgeToolkitQt::quit()");
 - 
 -         if (fMsgTimer != 0)
 -         {
 -             killTimer(fMsgTimer);
 -             fMsgTimer = 0;
 -         }
 - 
 -         if (fWindow != nullptr)
 -         {
 -             QSettings settings("falkTX", appName);
 -             settings.setValue(QString("%1/pos_x").arg(kUiTitle), fWindow->x());
 -             settings.setValue(QString("%1/pos_y").arg(kUiTitle), fWindow->y());
 -             settings.setValue(QString("%1/width").arg(kUiTitle), fWindow->width());
 -             settings.setValue(QString("%1/height").arg(kUiTitle), fWindow->height());
 -             settings.sync();
 - 
 -             fWindow->close();
 - 
 - #ifdef BRIDGE_CONTAINER
 -             if (fEmbedContainer != nullptr)
 -             {
 -                 fEmbedContainer->close();
 - 
 -                 delete fEmbedContainer;
 -                 fEmbedContainer = nullptr;
 -             }
 - #endif
 - 
 -             delete fWindow;
 -             fWindow = nullptr;
 -         }
 - 
 -         if (fApp != nullptr)
 -         {
 -             if (! fApp->closingDown())
 -                 fApp->quit();
 - 
 -             delete fApp;
 -             fApp = nullptr;
 -         }
 -     }
 - 
 -     void show() override
 -     {
 -         CARLA_ASSERT(fWindow != nullptr);
 -         carla_debug("CarlaBridgeToolkitQt::show()");
 - 
 -         if (fWindow != nullptr)
 -             fWindow->show();
 -     }
 - 
 -     void hide() override
 -     {
 -         CARLA_ASSERT(fWindow != nullptr);
 -         carla_debug("CarlaBridgeToolkitQt::hide()");
 - 
 -         if (fWindow != nullptr)
 -             fWindow->hide();
 -     }
 - 
 -     void resize(const int width, const int height) override
 -     {
 -         CARLA_ASSERT_INT(width > 0, width);
 -         CARLA_ASSERT_INT(height > 0, height);
 -         carla_debug("CarlaBridgeToolkitQt::resize(%i, %i)", width, height);
 - 
 -         if (width <= 0)
 -             return;
 -         if (height <= 0)
 -             return;
 - 
 -         emit setSizeSafeSignal(width, height);
 -     }
 - 
 - #ifdef BRIDGE_CONTAINER
 -     void* getContainerId()
 -     {
 -         CARLA_ASSERT(fWindow != nullptr);
 -         carla_debug("CarlaBridgeToolkitQt::getContainerId()");
 - 
 -         if (fEmbedContainer == nullptr)
 -         {
 -             fEmbedContainer = new QEmbedContainer(fWindow);
 - 
 -             fWindow->setCentralWidget(fEmbedContainer);
 -             fWindow->adjustSize();
 - 
 -             fEmbedContainer->setParent(fWindow);
 -             fEmbedContainer->show();
 -         }
 - 
 -         return (void*)fEmbedContainer->winId();
 -     }
 - #endif
 - 
 - protected:
 -     QApplication* fApp;
 -     QMainWindow* fWindow;
 - 
 - #ifdef BRIDGE_CONTAINER
 -     QEmbedContainer* fEmbedContainer;
 - #endif
 - 
 -     int fMsgTimer;
 - 
 -     void handleTimeout()
 -     {
 -         if (kClient == nullptr)
 -             return;
 - 
 -         kClient->uiIdle();
 - 
 -         if (! kClient->oscIdle())
 -         {
 -             killTimer(fMsgTimer);
 -             fMsgTimer = 0;
 -         }
 -     }
 - 
 - private:
 -     void timerEvent(QTimerEvent* const event)
 -     {
 -         if (event->timerId() == fMsgTimer)
 -             handleTimeout();
 - 
 -         QObject::timerEvent(event);
 -     }
 - 
 - signals:
 -     void setSizeSafeSignal(int, int);
 - 
 - private slots:
 -     void setSizeSafeSlot(int width, int height)
 -     {
 -         CARLA_ASSERT(kClient != nullptr && ! kClient->isResizable());
 -         CARLA_ASSERT(fWindow != nullptr);
 - 
 -         if (kClient == nullptr || fWindow == nullptr)
 -             return;
 - 
 -         if (kClient->isResizable())
 -             fWindow->resize(width, height);
 -         else
 -             fWindow->setFixedSize(width, height);
 - 
 - #ifdef BRIDGE_CONTAINER
 -         if (fEmbedContainer != nullptr)
 -             fEmbedContainer->setFixedSize(width, height);
 - #endif
 -     }
 - };
 - 
 - #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
 - # include "CarlaBridgeToolkitQt5.moc"
 - #else
 - # include "CarlaBridgeToolkitQt4.moc"
 - #endif
 - 
 - // -------------------------------------------------------------------------
 - 
 - CarlaBridgeToolkit* CarlaBridgeToolkit::createNew(CarlaBridgeClient* const client, const char* const uiTitle)
 - {
 -     return new CarlaBridgeToolkitQt(client, uiTitle);
 - }
 - 
 - // -------------------------------------------------------------------------
 - 
 - CARLA_BRIDGE_END_NAMESPACE
 - 
 - #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
 - # include "resources.qt5.cpp"
 - #else
 - # include "resources.qt4.cpp"
 - #endif
 - 
 - // -------------------------------------------------------------------------
 
 
  |