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>&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>&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>&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);
};