Revision
14503
Author
jmesquita
Date
2009-08-13 02:05:53 -0500 (Thu, 13 Aug 2009)

Log Message

Major refactor on how we keep track of monitor plugins.

Modified Paths

Diff

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/appmanager.cpp (14502 => 14503)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/appmanager.cpp	2009-08-13 00:34:30 UTC (rev 14502)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/appmanager.cpp	2009-08-13 07:05:53 UTC (rev 14503)
@@ -16,13 +16,18 @@
 
     QCoreApplication::setOrganizationName("FreeSWITCH");
     QCoreApplication::setApplicationName("FsGui");
-    settings = new SettingsDialog();
+
+    settingsDialog = new SettingsDialog();
     QWidget *base = new QWidget;
     pluginConfigPage = new Ui::pluginConfigPage();
     pluginConfigPage->setupUi(base);
-    settings->addConfigItem("Plugins", base);
+    settingsDialog->addConfigItem(new QListWidgetItem("Plugins"), base);
     QObject::connect(pluginConfigPage->btnRun, SIGNAL(clicked()),
                      this, SLOT(runPlugin()));
+    QObject::connect(pluginConfigPage->btnChangePluginDir, SIGNAL(clicked()),
+                     this, SLOT(changePluginDir()));
+    QObject::connect(settingsDialog, SIGNAL(accepted()),
+                     this, SLOT(writeSettings()));
     QObject::connect(pluginConfigPage->listWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
                      this, SLOT(pluginSelected(QListWidgetItem*, QListWidgetItem*)));
 
@@ -30,11 +35,27 @@
 
     qApp->setWindowIcon(QIcon(":/icons/fsgui_logo.png"));
 
+    readSettings();
     createActions();
     loadPlugins();
-    settings->show();
+    settingsDialog->show();
 }
 
+void AppManager::changePluginDir()
+{
+     QString dir = QFileDialog::getExistingDirectory(settingsDialog, tr("Plugin Location"),
+                                                 pluginsDir->currentPath(),
+                                                 QFileDialog::ShowDirsOnly
+                                                 | QFileDialog::DontResolveSymlinks);
+     if(!dir.isEmpty())
+     {
+         pluginConfigPage->linePluginDir->setText(dir);
+         pluginsDir->setCurrent(dir);
+         writeSettings();
+         unloadPlugins();
+         loadPlugins();
+     }
+}
 
 void AppManager::createActions()
 {
@@ -46,7 +67,7 @@
 
     action_preferences = new QAction(tr("&Preferences"), this);
     QObject::connect(action_preferences, SIGNAL(triggered()),
-                     settings, SLOT(show()));
+                     settingsDialog, SLOT(show()));
 
     action_about = new QAction(tr("&About"), this);
     action_about->setShortcut(QKeySequence::HelpContents);
@@ -97,31 +118,80 @@
     }
 }
 
-void AppManager::loadPlugins()
+void AppManager::readSettings()
 {
-    QDir pluginsDir = QDir(qApp->applicationDirPath());
+    pluginsDir = new QDir;
+    QSettings settings;
+    QString dir = settings.value("PluginDir").toString();
+    if (dir.isEmpty())
+    {
+        pluginsDir->setCurrent(qApp->applicationDirPath());
 #if defined(Q_OS_WIN)
-    if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
-        pluginsDir.cdUp();
+        if (pluginsDir->dirName().toLower() == "debug" || pluginsDir->dirName().toLower() == "release")
+            pluginsDir->cdUp();
 #elif defined(Q_OS_MAC)
-    if (pluginsDir.dirName() == "MacOS") {
-        pluginsDir.cdUp();
-        pluginsDir.cdUp();
-        pluginsDir.cdUp();
+        if (pluginsDir->dirName() == "MacOS") {
+            pluginsDir->cdUp();
+            pluginsDir->cdUp();
+            pluginsDir->cdUp();
+        }
+#endif
+        pluginsDir->cd("plugins");
     }
-#endif
-    pluginsDir.cd("plugins");
-    foreach (QString fileName, pluginsDir.entryList(QDir::Files))
+    else
     {
-        QPluginLoader *loader = new QPluginLoader(pluginsDir.absoluteFilePath(fileName));
+         pluginsDir->setCurrent(dir);
+    }
+    pluginConfigPage->linePluginDir->setText(pluginsDir->absolutePath());
+}
+
+void AppManager::writeSettings()
+{
+    QSettings settings;
+    settings.setValue("PluginDir", pluginConfigPage->linePluginDir->text());
+}
+
+void AppManager::unloadPlugins()
+{
+    /* Pop and unload all plugins doing proper cleanup */
+    for (int i = 0; i < list_available_monitor_plugins.size(); i++)
+    {
+        QMapIterator<QListWidgetItem*, QWidget*> j(*list_available_monitor_plugins.at(i)->_configItems);
+        while(j.hasNext())
+        {
+            j.next();
+            settingsDialog->removeConfigItem(j.key(), j.value());
+        }
+        list_available_monitor_plugins.at(i)->_loader->unload();
+        delete list_available_monitor_plugins.takeAt(i);
+    }
+}
+
+void AppManager::loadPlugins()
+{
+    pluginConfigPage->listWidget->clear();
+
+    foreach (QString fileName, pluginsDir->entryList(QDir::Files))
+    {
+        QPluginLoader *loader = new QPluginLoader(pluginsDir->absoluteFilePath(fileName));
         if (MonitorInterface *interface = qobject_cast<MonitorInterface *>(loader->instance()))
         {
             if(QMainWindow *interface_window = qobject_cast<QMainWindow *>(loader->instance()))
             {
-                list_available_monitor_plugins.append(loader);
+                MonitorPlugin *plugin = new MonitorPlugin(loader);
+                list_available_monitor_plugins.append(plugin);
                 interface_window->setWindowTitle(QString("FsGui - ") + interface_window->windowTitle());
                 interface_window->setAttribute(Qt::WA_QuitOnClose);
-                interface->addConfigItems(settings);
+                interface->addConfigItems(settingsDialog, *plugin->_configItems);
+
+                /* Add config items */
+                QMapIterator<QListWidgetItem*, QWidget*> i(*plugin->_configItems);
+                while(i.hasNext())
+                {
+                    i.next();
+                    settingsDialog->addConfigItem(i.key(), i.value());
+                }
+
                 interface->setServerManager(serverManager);
                 createMenus(interface_window->menuBar());
                 pluginConfigPage->listWidget->addItem(QString("%1\n     %2").arg(interface->appName(),
@@ -138,17 +208,16 @@
     {
         QMessageBox::critical(0, tr("Error!"),
                                       tr("No available plugins. Install compatible plugins before running FsGui."));
-        exit(1);
     }
 }
 
 void AppManager::runPlugin()
 {
-    if (list_available_monitor_plugins.at(pluginConfigPage->listWidget->currentRow())->isLoaded())
+    if (list_available_monitor_plugins.at(pluginConfigPage->listWidget->currentRow())->_loader->isLoaded())
     {
-        MonitorInterface * interface = qobject_cast<MonitorInterface *>(list_available_monitor_plugins.at(pluginConfigPage->listWidget->currentRow())->instance());
+        MonitorInterface * interface = qobject_cast<MonitorInterface *>(list_available_monitor_plugins.at(pluginConfigPage->listWidget->currentRow())->_loader->instance());
         interface->newInstance();
-        settings->hide();
+        settingsDialog->hide();
     }
 }
 
@@ -166,17 +235,16 @@
         {
             for (int i = 0; i < list_available_monitor_plugins.size(); ++i)
             {
-                list_available_monitor_plugins.at(i)->unload();
+                list_available_monitor_plugins.takeAt(i)->_loader->unload();
             }
-            exit(0);
         }
         else
         {
             delete reallyClose;
             reallyClose = NULL;
-            settings->show();
-            settings->raise();
-            settings->activateWindow();
+            settingsDialog->show();
+            settingsDialog->raise();
+            settingsDialog->activateWindow();
         }
     }
 }
@@ -191,7 +259,7 @@
 
 void AppManager::about()
 {
-    QMessageBox::about(qobject_cast<QMainWindow *>(list_available_monitor_plugins.first()),
+    /*QMessageBox::about(qobject_cast<QMainWindow *>(list_available_monitor_plugins.first()),
                        tr("About FsGui"),
-                       tr("Hey, this is FsGui!!!"));
+                       tr("Hey, this is FsGui!!!"));*/
 }

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/appmanager.h (14502 => 14503)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/appmanager.h	2009-08-13 00:34:30 UTC (rev 14502)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/appmanager.h	2009-08-13 07:05:53 UTC (rev 14503)
@@ -18,6 +18,17 @@
 class ServerManager;
 
 /*!
+  \brief Represents a loaded monitor plugin
+  */
+class MonitorPlugin
+{
+public:
+    MonitorPlugin(QPluginLoader *loader) : _loader(loader), _configItems(new QMap<QListWidgetItem*, QWidget*>){}
+    QPluginLoader *_loader;
+    QMap<QListWidgetItem*, QWidget*> *_configItems;
+};
+
+/*!
   \brief This class will be the center of each installation
   and will load some plugins.
   */
@@ -41,8 +52,12 @@
       \brief Load all plugins populating each corresponding list
       */
     void loadPlugins();
+    /*!
+      \brief Unload all plugins cleaning up what is needed
+      */
+    void unloadPlugins();
 
-    QList<QPluginLoader *> list_available_monitor_plugins; /*< List of available Monitor plugins */
+    QList<MonitorPlugin *> list_available_monitor_plugins; /*< List of available Monitor plugins */
     QAction *action_exit; /*< Exit the application */
     QAction *action_preferences; /*< Show the preferences dialog */
     QAction *action_about; /*< Calls the about dialog */
@@ -50,9 +65,10 @@
     QMenu *menu_edit; /*< The edit menu on menu bar */
     QMenu *menu_help; /*< The help menu on menu bar */
     ServerManager *serverManager; /*< The dialog that can fetch new esl connections from the config */
-    SettingsDialog *settings; /*< Settings dialog */
+    SettingsDialog *settingsDialog; /*< Settings dialog */
     Ui::pluginConfigPage *pluginConfigPage; /*< The plugin config page being used */
-    QMessageBox *reallyClose;
+    QMessageBox *reallyClose; /*< Dialog that will confirm closing the application */
+    QDir *pluginsDir; /*< Directory from where we search the plugins */
 
 private slots:
     /*!
@@ -60,6 +76,10 @@
       */
     void runPlugin();
     /*!
+      \brief Change the plugin search directory
+      */
+    void changePluginDir();
+    /*!
       \brief Cleanup and give plugins a chance to clean for themselves.
       */
     void lastWindowClosed();
@@ -71,6 +91,15 @@
       \brief Show the about dialog.
       */
     void about();
+    /*!
+      \brief Write settings when convenient
+      */
+    void writeSettings();
+    /*!
+      \brief Read settings for the General section
+      */
+    void readSettings();
+
 };
 
 #endif // APPMANAGER_H

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/config_plugin_widget.ui (14502 => 14503)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/config_plugin_widget.ui	2009-08-13 00:34:30 UTC (rev 14502)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/config_plugin_widget.ui	2009-08-13 07:05:53 UTC (rev 14503)
@@ -6,41 +6,74 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>374</width>
-    <height>210</height>
+    <width>369</width>
+    <height>282</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QHBoxLayout" name="horizontalLayout">
+  <layout class="QVBoxLayout" name="verticalLayout_3">
    <item>
-    <widget class="QListWidget" name="listWidget"/>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Plugin Location</string>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <item>
+       <widget class="QLineEdit" name="linePluginDir">
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="btnChangePluginDir">
+        <property name="maximumSize">
+         <size>
+          <width>85</width>
+          <height>28</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>&amp;Change</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
    </item>
    <item>
-    <layout class="QVBoxLayout" name="verticalLayout">
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
      <item>
-      <widget class="QPushButton" name="btnRun">
-       <property name="enabled">
-        <bool>false</bool>
-       </property>
-       <property name="text">
-        <string>&amp;Run</string>
-       </property>
-      </widget>
+      <widget class="QListWidget" name="listWidget"/>
      </item>
      <item>
-      <spacer name="verticalSpacer">
-       <property name="orientation">
-        <enum>Qt::Vertical</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>20</width>
-         <height>40</height>
-        </size>
-       </property>
-      </spacer>
+      <layout class="QVBoxLayout" name="verticalLayout">
+       <item>
+        <widget class="QPushButton" name="btnRun">
+         <property name="enabled">
+          <bool>false</bool>
+         </property>
+         <property name="text">
+          <string>&amp;Run</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
      </item>
     </layout>
    </item>

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/interfaces.h (14502 => 14503)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/interfaces.h	2009-08-13 00:34:30 UTC (rev 14502)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/interfaces.h	2009-08-13 07:05:53 UTC (rev 14503)
@@ -3,6 +3,8 @@
 
 #include <QtPlugin>
 
+class QListWidgetItem;
+class QWidget;
 class ESLevent;
 class SettingsDialog;
 class ServerManager;
@@ -30,8 +32,10 @@
     virtual QString appDescription() = 0;
     /*!
       \brief Add a new configuration item to the settings dialog
+      \param[in] SettingsDialog A pointer to the settings dialog
+      \param[out] QMap<QListWidgetItem *, QWidget *> A QMap that has a items associated to config pages.
       */
-    virtual void addConfigItems(SettingsDialog *settings) = 0;
+    virtual void addConfigItems(SettingsDialog *, QMap<QListWidgetItem *, QWidget *>&) = 0;
     /*!
       \brief Sets a pointer to ServerManager object
       */

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/settingsdialog.cpp (14502 => 14503)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/settingsdialog.cpp	2009-08-13 00:34:30 UTC (rev 14502)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/settingsdialog.cpp	2009-08-13 07:05:53 UTC (rev 14503)
@@ -29,12 +29,6 @@
     }
 }
 
-void SettingsDialog::addConfigItem(QString item, QWidget *page)
-{
-    QListWidgetItem *item_widget = new QListWidgetItem(item);
-    addConfigItem(item_widget, page);
-}
-
 void SettingsDialog::addConfigItem(QListWidgetItem *item, QWidget *page)
 {
     m_ui->listConfig->addItem(item);
@@ -49,3 +43,10 @@
     m_ui->configPages->setCurrentIndex(m_ui->listConfig->row(current));
 }
 
+void SettingsDialog::removeConfigItem(QListWidgetItem *item, QWidget *page)
+{
+    m_ui->listConfig->removeItemWidget(item);
+    m_ui->configPages->removeWidget(page);
+    delete item;
+    delete page;
+}

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/settingsdialog.h (14502 => 14503)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/settingsdialog.h	2009-08-13 00:34:30 UTC (rev 14502)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/settingsdialog.h	2009-08-13 07:05:53 UTC (rev 14503)
@@ -15,7 +15,7 @@
     SettingsDialog(QWidget *parent = 0);
     ~SettingsDialog();
     void addConfigItem(QListWidgetItem *item, QWidget *page);
-    void addConfigItem(QString item, QWidget *page);
+    void removeConfigItem(QListWidgetItem *item, QWidget *page);
 
 protected:
     void changeEvent(QEvent *e);

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.cpp (14502 => 14503)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.cpp	2009-08-13 00:34:30 UTC (rev 14502)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.cpp	2009-08-13 07:05:53 UTC (rev 14503)
@@ -48,13 +48,14 @@
     return tr("This application will do the same as fs_cli does.");
 }
 
-void ConsolePlugin::addConfigItems(SettingsDialog *settings)
+void ConsolePlugin::addConfigItems(SettingsDialog *settings, QMap<QListWidgetItem *, QWidget *>&configItems)
 {
+    settingsDialog = settings;
+
     consoleConfigPage = new Ui::configPage();
     QWidget *base = new QWidget(this);
 
     consoleConfigPage->setupUi(base);
-    settings->addConfigItem("Console", base);
 
     QObject::connect(consoleConfigPage->btnBackgroundConsole, SIGNAL(clicked()),
                      this, SLOT(changeConsoleBackgroundColor()));
@@ -91,6 +92,7 @@
     readSettings();
     QObject::connect(settings, SIGNAL(accepted()),
                      this, SLOT(writeSettings()));
+    configItems.insert(new QListWidgetItem("Console"), base);
 }
 
 void ConsolePlugin::newInstance()

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.h (14502 => 14503)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.h	2009-08-13 00:34:30 UTC (rev 14502)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.h	2009-08-13 07:05:53 UTC (rev 14503)
@@ -12,6 +12,7 @@
     class configPage;
 }
 class ESLconnection;
+class SettingsDialog;
 
 class ConsolePlugin : public QMainWindow, public MonitorInterface
 {
@@ -23,7 +24,7 @@
     QObject *getMonitorInterfaceObject();
     QString appName();
     QString appDescription();
-    void addConfigItems(SettingsDialog *);
+    void addConfigItems(SettingsDialog *, QMap<QListWidgetItem *, QWidget *>&);
     void newInstance();
     void setServerManager(ServerManager *manager);
 
@@ -60,6 +61,7 @@
     Ui::configPage *consoleConfigPage;
     ServerManager *serverManager;
     QHash<QString, ESLconnection *> hashESL;
+    SettingsDialog *settingsDialog;
 
     void setPalette(QLineEdit *control, QString key);
 };