Changed: #1206 Update core and example plugin. Plugin should delete your own objects from the pool.
This commit is contained in:
parent
0c61d64592
commit
de37da056a
9 changed files with 121 additions and 63 deletions
|
@ -36,13 +36,27 @@
|
||||||
|
|
||||||
using namespace Core;
|
using namespace Core;
|
||||||
|
|
||||||
|
CorePlugin::CorePlugin()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CorePlugin::~CorePlugin()
|
||||||
|
{
|
||||||
|
Q_FOREACH(QObject *obj, _autoReleaseObjects)
|
||||||
|
{
|
||||||
|
_plugMan->removeObject(obj);
|
||||||
|
}
|
||||||
|
qDeleteAll(_autoReleaseObjects);
|
||||||
|
_autoReleaseObjects.clear();
|
||||||
|
}
|
||||||
|
|
||||||
bool CorePlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString)
|
bool CorePlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString)
|
||||||
{
|
{
|
||||||
Q_UNUSED(errorString);
|
Q_UNUSED(errorString);
|
||||||
_plugMan = pluginManager;
|
_plugMan = pluginManager;
|
||||||
oldOVQT = false;
|
_oldOVQT = false;
|
||||||
|
|
||||||
_plugMan->addObject(new CSearchPathsSettingsPage(this));
|
addAutoReleasedObject(new CSearchPathsSettingsPage(this));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,7 +80,7 @@ void CorePlugin::extensionsInitialized()
|
||||||
|
|
||||||
connect(newAction, SIGNAL(triggered()), this, SLOT(execSettings()));
|
connect(newAction, SIGNAL(triggered()), this, SLOT(execSettings()));
|
||||||
connect(newAction2, SIGNAL(triggered()), _pluginView, SLOT(show()));
|
connect(newAction2, SIGNAL(triggered()), _pluginView, SLOT(show()));
|
||||||
oldOVQT = true;
|
_oldOVQT = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -93,7 +107,7 @@ void CorePlugin::extensionsInitialized()
|
||||||
|
|
||||||
void CorePlugin::shutdown()
|
void CorePlugin::shutdown()
|
||||||
{
|
{
|
||||||
if (!oldOVQT)
|
if (!_oldOVQT)
|
||||||
{
|
{
|
||||||
delete _mainWindow;
|
delete _mainWindow;
|
||||||
delete _pluginView;
|
delete _pluginView;
|
||||||
|
@ -102,7 +116,7 @@ void CorePlugin::shutdown()
|
||||||
|
|
||||||
void CorePlugin::execSettings()
|
void CorePlugin::execSettings()
|
||||||
{
|
{
|
||||||
CSettingsDialog settingsDialog(_plugMan);
|
CSettingsDialog settingsDialog(this);
|
||||||
settingsDialog.show();
|
settingsDialog.show();
|
||||||
settingsDialog.execDialog();
|
settingsDialog.execDialog();
|
||||||
}
|
}
|
||||||
|
@ -142,6 +156,12 @@ QList<QString> CorePlugin::dependencies() const
|
||||||
return QList<QString>();
|
return QList<QString>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CorePlugin::addAutoReleasedObject(QObject *obj)
|
||||||
|
{
|
||||||
|
_plugMan->addObject(obj);
|
||||||
|
_autoReleaseObjects.prepend(obj);
|
||||||
|
}
|
||||||
|
|
||||||
QObject* CorePlugin::objectByName(const QString &name) const
|
QObject* CorePlugin::objectByName(const QString &name) const
|
||||||
{
|
{
|
||||||
Q_FOREACH (QObject *qobj, _plugMan->allObjects())
|
Q_FOREACH (QObject *qobj, _plugMan->allObjects())
|
||||||
|
|
|
@ -44,6 +44,9 @@ class CorePlugin : public QObject, public ExtensionSystem::IPlugin
|
||||||
Q_INTERFACES(ExtensionSystem::IPlugin)
|
Q_INTERFACES(ExtensionSystem::IPlugin)
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
CorePlugin();
|
||||||
|
virtual ~CorePlugin();
|
||||||
|
|
||||||
bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString);
|
bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString);
|
||||||
void extensionsInitialized();
|
void extensionsInitialized();
|
||||||
void shutdown();
|
void shutdown();
|
||||||
|
@ -56,6 +59,8 @@ public:
|
||||||
QString description() const;
|
QString description() const;
|
||||||
QList<QString> dependencies() const;
|
QList<QString> dependencies() const;
|
||||||
|
|
||||||
|
void addAutoReleasedObject(QObject *obj);
|
||||||
|
|
||||||
QObject *objectByName(const QString &name) const;
|
QObject *objectByName(const QString &name) const;
|
||||||
ExtensionSystem::IPluginSpec *pluginByName(const QString &name) const;
|
ExtensionSystem::IPluginSpec *pluginByName(const QString &name) const;
|
||||||
ExtensionSystem::IPluginManager *pluginManager() const
|
ExtensionSystem::IPluginManager *pluginManager() const
|
||||||
|
@ -63,20 +68,36 @@ public:
|
||||||
return _plugMan;
|
return _plugMan;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Type>
|
template <typename T>
|
||||||
QList<Type *> getObjects() const
|
QList<T *> getObjects() const
|
||||||
{
|
{
|
||||||
QList<QObject *> all = _plugMan->allObjects();
|
QList<QObject *> all = _plugMan->allObjects();
|
||||||
QList<Type *> objects;
|
QList<T *> objects;
|
||||||
Q_FOREACH(QObject *obj, all)
|
Q_FOREACH(QObject *obj, all)
|
||||||
{
|
{
|
||||||
Type *typeObj = qobject_cast<Type *>(obj);
|
T *tObj = qobject_cast<T *>(obj);
|
||||||
if (typeObj)
|
if (tObj)
|
||||||
objects.append(typeObj);
|
objects.append(tObj);
|
||||||
}
|
}
|
||||||
return objects;
|
return objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T *getObject() const
|
||||||
|
{
|
||||||
|
QList<QObject *> all = _plugMan->allObjects();
|
||||||
|
T *result = 0;
|
||||||
|
Q_FOREACH(QObject *obj, all)
|
||||||
|
{
|
||||||
|
T *tObj = qobject_cast<T *>(obj);
|
||||||
|
if (tObj)
|
||||||
|
{
|
||||||
|
result = tObj;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
NLMISC::CLibraryContext *_LibContext;
|
NLMISC::CLibraryContext *_LibContext;
|
||||||
|
|
||||||
|
@ -87,8 +108,8 @@ private:
|
||||||
ExtensionSystem::IPluginManager *_plugMan;
|
ExtensionSystem::IPluginManager *_plugMan;
|
||||||
ExtensionSystem::CPluginView *_pluginView;
|
ExtensionSystem::CPluginView *_pluginView;
|
||||||
CMainWindow *_mainWindow;
|
CMainWindow *_mainWindow;
|
||||||
|
QList<QObject *> _autoReleaseObjects;
|
||||||
bool oldOVQT;
|
bool _oldOVQT;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
// NeL includes
|
// NeL includes
|
||||||
#include <nel/misc/debug.h>
|
#include <nel/misc/debug.h>
|
||||||
|
|
||||||
// Qt includes
|
// Qt includes
|
||||||
#include <QtGui/QtGui>
|
#include <QtGui/QtGui>
|
||||||
|
|
||||||
|
@ -87,7 +88,7 @@ bool CMainWindow::showOptionsDialog(const QString &group,
|
||||||
{
|
{
|
||||||
if (!parent)
|
if (!parent)
|
||||||
parent = this;
|
parent = this;
|
||||||
CSettingsDialog _settingsDialog(_pluginManager, group, page, parent);
|
CSettingsDialog _settingsDialog(_corePlugin, group, page, parent);
|
||||||
_settingsDialog.show();
|
_settingsDialog.show();
|
||||||
return _settingsDialog.execDialog();
|
return _settingsDialog.execDialog();
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace Core
|
||||||
|
|
||||||
CSearchPathsSettingsPage::CSearchPathsSettingsPage(QObject *parent)
|
CSearchPathsSettingsPage::CSearchPathsSettingsPage(QObject *parent)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
_currentPage(NULL)
|
_currentPage(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,10 @@
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// Project includes
|
||||||
#include "settings_dialog.h"
|
#include "settings_dialog.h"
|
||||||
|
#include "core_plugin.h"
|
||||||
|
#include "ioptions_page.h"
|
||||||
|
|
||||||
// Qt includes
|
// Qt includes
|
||||||
#include <QtGui/QHeaderView>
|
#include <QtGui/QHeaderView>
|
||||||
|
@ -33,7 +36,7 @@ Q_DECLARE_METATYPE(PageData);
|
||||||
|
|
||||||
namespace Core
|
namespace Core
|
||||||
{
|
{
|
||||||
CSettingsDialog::CSettingsDialog(ExtensionSystem::IPluginManager *pluginManager,
|
CSettingsDialog::CSettingsDialog(CorePlugin *corePlugin,
|
||||||
const QString &categoryId,
|
const QString &categoryId,
|
||||||
const QString &pageId,
|
const QString &pageId,
|
||||||
QWidget *parent)
|
QWidget *parent)
|
||||||
|
@ -42,7 +45,7 @@ CSettingsDialog::CSettingsDialog(ExtensionSystem::IPluginManager *pluginManager,
|
||||||
{
|
{
|
||||||
_ui.setupUi(this);
|
_ui.setupUi(this);
|
||||||
|
|
||||||
_plugMan = pluginManager;
|
_plugMan = corePlugin->pluginManager();
|
||||||
|
|
||||||
QString initialCategory = categoryId;
|
QString initialCategory = categoryId;
|
||||||
QString initialPage = pageId;
|
QString initialPage = pageId;
|
||||||
|
@ -59,14 +62,7 @@ CSettingsDialog::CSettingsDialog(ExtensionSystem::IPluginManager *pluginManager,
|
||||||
|
|
||||||
QMap<QString, QTreeWidgetItem *> categories;
|
QMap<QString, QTreeWidgetItem *> categories;
|
||||||
|
|
||||||
QList<IOptionsPage *> pages;
|
QList<IOptionsPage *> pages = corePlugin->getObjects<IOptionsPage>();
|
||||||
QList<QObject *> all = _plugMan->allObjects();
|
|
||||||
Q_FOREACH(QObject *obj, all)
|
|
||||||
{
|
|
||||||
IOptionsPage *page = qobject_cast<IOptionsPage *>(obj);
|
|
||||||
if (page)
|
|
||||||
pages.append(page);
|
|
||||||
}
|
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
Q_FOREACH(IOptionsPage *page, pages)
|
Q_FOREACH(IOptionsPage *page, pages)
|
||||||
|
|
|
@ -25,11 +25,12 @@
|
||||||
#include <QtCore/QList>
|
#include <QtCore/QList>
|
||||||
|
|
||||||
// Project includes
|
// Project includes
|
||||||
#include "ioptions_page.h"
|
|
||||||
#include "../../extension_system/iplugin.h"
|
#include "../../extension_system/iplugin.h"
|
||||||
|
|
||||||
namespace Core
|
namespace Core
|
||||||
{
|
{
|
||||||
|
class CorePlugin;
|
||||||
|
class IOptionsPage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@class CSettingsDialog
|
@class CSettingsDialog
|
||||||
|
@ -40,7 +41,7 @@ class CSettingsDialog: public QDialog
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CSettingsDialog(ExtensionSystem::IPluginManager *pluginManager,
|
CSettingsDialog(CorePlugin *corePlugin,
|
||||||
const QString &initialCategory = QString(),
|
const QString &initialCategory = QString(),
|
||||||
const QString &initialPage = QString(),
|
const QString &initialPage = QString(),
|
||||||
QWidget *parent = 0);
|
QWidget *parent = 0);
|
||||||
|
@ -60,7 +61,7 @@ private Q_SLOTS:
|
||||||
void apply();
|
void apply();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<Core::IOptionsPage*> _pages;
|
QList<IOptionsPage *> _pages;
|
||||||
bool _applied;
|
bool _applied;
|
||||||
QString _currentCategory;
|
QString _currentCategory;
|
||||||
QString _currentPage;
|
QString _currentPage;
|
||||||
|
|
|
@ -18,15 +18,24 @@
|
||||||
|
|
||||||
namespace Plugin
|
namespace Plugin
|
||||||
{
|
{
|
||||||
|
MyPlugin::~MyPlugin()
|
||||||
|
{
|
||||||
|
Q_FOREACH(QObject *obj, _autoReleaseObjects)
|
||||||
|
{
|
||||||
|
_plugMan->removeObject(obj);
|
||||||
|
}
|
||||||
|
qDeleteAll(_autoReleaseObjects);
|
||||||
|
_autoReleaseObjects.clear();
|
||||||
|
}
|
||||||
|
|
||||||
bool MyPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString)
|
bool MyPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString)
|
||||||
{
|
{
|
||||||
Q_UNUSED(errorString);
|
Q_UNUSED(errorString);
|
||||||
_plugMan = pluginManager;
|
_plugMan = pluginManager;
|
||||||
|
|
||||||
_plugMan->addObject(new CExampleSettingsPage(this));
|
addAutoReleasedObject(new CExampleSettingsPage(this));
|
||||||
_plugMan->addObject(new CExampleAppPage(this));
|
addAutoReleasedObject(new CExampleAppPage(this));
|
||||||
_plugMan->addObject(new CCoreListener(this));
|
addAutoReleasedObject(new CCoreListener(this));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,6 +78,12 @@ QList<QString> MyPlugin::dependencies() const
|
||||||
return QList<QString>();
|
return QList<QString>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MyPlugin::addAutoReleasedObject(QObject *obj)
|
||||||
|
{
|
||||||
|
_plugMan->addObject(obj);
|
||||||
|
_autoReleaseObjects.prepend(obj);
|
||||||
|
}
|
||||||
|
|
||||||
QObject* MyPlugin::objectByName(const QString &name) const
|
QObject* MyPlugin::objectByName(const QString &name) const
|
||||||
{
|
{
|
||||||
Q_FOREACH (QObject *qobj, _plugMan->allObjects())
|
Q_FOREACH (QObject *qobj, _plugMan->allObjects())
|
||||||
|
|
|
@ -32,6 +32,8 @@ class MyPlugin : public QObject, public ExtensionSystem::IPlugin
|
||||||
Q_INTERFACES(ExtensionSystem::IPlugin)
|
Q_INTERFACES(ExtensionSystem::IPlugin)
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
virtual ~MyPlugin();
|
||||||
|
|
||||||
bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString);
|
bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString);
|
||||||
void extensionsInitialized();
|
void extensionsInitialized();
|
||||||
|
|
||||||
|
@ -43,6 +45,8 @@ public:
|
||||||
QString description() const;
|
QString description() const;
|
||||||
QList<QString> dependencies() const;
|
QList<QString> dependencies() const;
|
||||||
|
|
||||||
|
void addAutoReleasedObject(QObject *obj);
|
||||||
|
|
||||||
QObject *objectByName(const QString &name) const;
|
QObject *objectByName(const QString &name) const;
|
||||||
ExtensionSystem::IPluginSpec *pluginByName(const QString &name) const;
|
ExtensionSystem::IPluginSpec *pluginByName(const QString &name) const;
|
||||||
|
|
||||||
|
@ -51,7 +55,7 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ExtensionSystem::IPluginManager *_plugMan;
|
ExtensionSystem::IPluginManager *_plugMan;
|
||||||
|
QList<QObject *> _autoReleaseObjects;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CExampleAppPage: public QObject, public Core::IAppPage
|
class CExampleAppPage: public QObject, public Core::IAppPage
|
||||||
|
|
|
@ -52,52 +52,52 @@ bool SheetBuilderPlugin::initialize(ExtensionSystem::IPluginManager *pluginManag
|
||||||
|
|
||||||
void SheetBuilderPlugin::extensionsInitialized()
|
void SheetBuilderPlugin::extensionsInitialized()
|
||||||
{
|
{
|
||||||
QMenu *toolsMenu = qobject_cast<QMenu *>(objectByName("ovqt.Menu.Tools"));
|
QMenu *toolsMenu = qobject_cast<QMenu *>(objectByName("ovqt.Menu.Tools"));
|
||||||
nlassert(toolsMenu);
|
nlassert(toolsMenu);
|
||||||
|
|
||||||
toolsMenu->addSeparator();
|
toolsMenu->addSeparator();
|
||||||
|
|
||||||
QAction *actBuilder = toolsMenu->addAction("Sheet builder");
|
QAction *actBuilder = toolsMenu->addAction("Sheet builder");
|
||||||
connect(actBuilder, SIGNAL(triggered()), this, SLOT(execBuilderDialog()));
|
connect(actBuilder, SIGNAL(triggered()), this, SLOT(execBuilderDialog()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SheetBuilderPlugin::execBuilderDialog()
|
void SheetBuilderPlugin::execBuilderDialog()
|
||||||
{
|
{
|
||||||
QMainWindow *wnd = qobject_cast<QMainWindow *>(objectByName("CMainWindow"));
|
QMainWindow *wnd = qobject_cast<QMainWindow *>(objectByName("CMainWindow"));
|
||||||
nlassert(wnd);
|
nlassert(wnd);
|
||||||
|
|
||||||
SheetBuilderDialog dlg(wnd);
|
SheetBuilderDialog dlg(wnd);
|
||||||
dlg.exec();
|
dlg.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SheetBuilderPlugin::setNelContext(NLMISC::INelContext *nelContext)
|
void SheetBuilderPlugin::setNelContext(NLMISC::INelContext *nelContext)
|
||||||
{
|
{
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
// Ensure that a context doesn't exist yet.
|
// Ensure that a context doesn't exist yet.
|
||||||
// This only applies to platforms without PIC, e.g. Windows.
|
// This only applies to platforms without PIC, e.g. Windows.
|
||||||
nlassert(!NLMISC::INelContext::isContextInitialised());
|
nlassert(!NLMISC::INelContext::isContextInitialised());
|
||||||
#endif // NL_OS_WINDOWS
|
#endif // NL_OS_WINDOWS
|
||||||
_LibContext = new NLMISC::CLibraryContext(*nelContext);
|
_LibContext = new NLMISC::CLibraryContext(*nelContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SheetBuilderPlugin::name() const
|
QString SheetBuilderPlugin::name() const
|
||||||
{
|
{
|
||||||
return "Sheet builder";
|
return "Sheet builder";
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SheetBuilderPlugin::version() const
|
QString SheetBuilderPlugin::version() const
|
||||||
{
|
{
|
||||||
return "1.0";
|
return "1.0";
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SheetBuilderPlugin::vendor() const
|
QString SheetBuilderPlugin::vendor() const
|
||||||
{
|
{
|
||||||
return "kharvd";
|
return "kharvd";
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SheetBuilderPlugin::description() const
|
QString SheetBuilderPlugin::description() const
|
||||||
{
|
{
|
||||||
return "make_sheet_id equivalent";
|
return "make_sheet_id equivalent";
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<QString> SheetBuilderPlugin::dependencies() const
|
QList<QString> SheetBuilderPlugin::dependencies() const
|
||||||
|
@ -107,18 +107,18 @@ QList<QString> SheetBuilderPlugin::dependencies() const
|
||||||
|
|
||||||
QObject* SheetBuilderPlugin::objectByName(const QString &name) const
|
QObject* SheetBuilderPlugin::objectByName(const QString &name) const
|
||||||
{
|
{
|
||||||
Q_FOREACH (QObject *qobj, _plugMan->allObjects())
|
Q_FOREACH (QObject *qobj, _plugMan->allObjects())
|
||||||
if (qobj->objectName() == name)
|
if (qobj->objectName() == name)
|
||||||
return qobj;
|
return qobj;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ExtensionSystem::IPluginSpec *SheetBuilderPlugin::pluginByName(const QString &name) const
|
ExtensionSystem::IPluginSpec *SheetBuilderPlugin::pluginByName(const QString &name) const
|
||||||
{
|
{
|
||||||
Q_FOREACH (ExtensionSystem::IPluginSpec *spec, _plugMan->plugins())
|
Q_FOREACH (ExtensionSystem::IPluginSpec *spec, _plugMan->plugins())
|
||||||
if (spec->name() == name)
|
if (spec->name() == name)
|
||||||
return spec;
|
return spec;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Q_EXPORT_PLUGIN(SheetBuilderPlugin)
|
Q_EXPORT_PLUGIN(SheetBuilderPlugin)
|
||||||
|
|
Loading…
Reference in a new issue