Added: #1206 Added plugin view dialog. And if there are errors while loading plugin displays a diagnostic message.

This commit is contained in:
dnk-88 2010-12-02 12:52:22 +02:00
parent 165c9c686a
commit 1331037de3
8 changed files with 197 additions and 9 deletions

View file

@ -22,7 +22,8 @@ SET(OBJECT_VIEWER_HDR main_window.h graphics_viewport.h animation_dialog.h
vegetable_dialog.h global_wind_dialog.h day_night_dialog.h sun_color_dialog.h vegetable_dialog.h global_wind_dialog.h day_night_dialog.h sun_color_dialog.h
vegetable_noise_value_widget.h vegetable_density_page.h vegetable_landscape_page.h vegetable_noise_value_widget.h vegetable_density_page.h vegetable_landscape_page.h
vegetable_scale_page.h vegetable_appearance_page.h vegetable_rotate_page.h vegetable_scale_page.h vegetable_appearance_page.h vegetable_rotate_page.h
extension_system/iplugin_manager.h extension_system/plugin_manager.h) extension_system/iplugin_manager.h extension_system/plugin_manager.h
extension_system/plugin_view.h)
SET(OBJECT_VIEWER_UIS animation_form.ui animation_set_form.ui settings_form.ui SET(OBJECT_VIEWER_UIS animation_form.ui animation_set_form.ui settings_form.ui
setup_fog_form.ui slot_form.ui particle_control_form.ui particle_workspace_form.ui setup_fog_form.ui slot_form.ui particle_control_form.ui particle_workspace_form.ui
@ -35,7 +36,9 @@ SET(OBJECT_VIEWER_UIS animation_form.ui animation_set_form.ui settings_form.ui
particle_link_skeleton_form.ui water_pool_form.ui vegetable_dialog_form.ui particle_link_skeleton_form.ui water_pool_form.ui vegetable_dialog_form.ui
vegetable_noise_value_form.ui global_wind_form.ui sun_color_form.ui day_night_form.ui vegetable_noise_value_form.ui global_wind_form.ui sun_color_form.ui day_night_form.ui
vegetable_density_form.ui vegetable_apperance_form.ui vegetable_landscape_form.ui vegetable_density_form.ui vegetable_apperance_form.ui vegetable_landscape_form.ui
vegetable_rotate_form.ui vegetable_scale_form.ui) vegetable_rotate_form.ui vegetable_scale_form.ui
extension_system/plugin_view.ui)
SET(OBJECT_VIEWER_RCS object_viewer_qt.qrc) SET(OBJECT_VIEWER_RCS object_viewer_qt.qrc)
SET(QT_USE_QTGUI TRUE) SET(QT_USE_QTGUI TRUE)

View file

@ -100,7 +100,7 @@ QString CPluginSpec::errorString() const
bool CPluginSpec::setFileName(const QString &fileName) bool CPluginSpec::setFileName(const QString &fileName)
{ {
_name = _version _name = _version
= _vendor = _vendor
= _description = _description
= _location = _location
= _filePath = _filePath
@ -134,11 +134,10 @@ bool CPluginSpec::loadLibrary()
return true; return true;
return reportError(QCoreApplication::translate("CPluginSpec", "Loading the library failed because state != Resolved")); return reportError(QCoreApplication::translate("CPluginSpec", "Loading the library failed because state != Resolved"));
} }
QString libName = QString("%1/%2").arg(_location).arg(_fileName);
QPluginLoader loader(_filePath);
QPluginLoader loader(libName);
if (!loader.load()) if (!loader.load())
return reportError(libName + QString::fromLatin1(": ") + loader.errorString()); return reportError(loader.errorString());
IPlugin *pluginObject = qobject_cast<IPlugin*>(loader.instance()); IPlugin *pluginObject = qobject_cast<IPlugin*>(loader.instance());
if (!pluginObject) if (!pluginObject)

View file

@ -0,0 +1,59 @@
/*
Object Viewer Qt
Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by>
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 3 of the License, or
(at your option) 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.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PLUGIN_VIEW_H
#define PLUGIN_VIEW_H
#include "ui_plugin_view.h"
// STL includes
// Qt includes
// NeL includes
// Project includes
namespace NLQT
{
class IPluginManager;
class CPluginView: public QDialog
{
Q_OBJECT
public:
CPluginView(IPluginManager *pluginManager, QWidget *parent = 0);
~CPluginView();
private Q_SLOTS:
void updateList();
private:
IPluginManager *_pluginManager;
Ui::CPluginView _ui;
}; /* class CPluginView */
} /* namespace NLQT */
#endif // PLUGIN_VIEW_H

View file

@ -11,7 +11,7 @@
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Plugins</string> <string>About plugins</string>
</property> </property>
<property name="modal"> <property name="modal">
<bool>true</bool> <bool>true</bool>
@ -19,6 +19,12 @@
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="4"> <item row="0" column="0" colspan="4">
<widget class="QTreeWidget" name="pluginTreeWidget"> <widget class="QTreeWidget" name="pluginTreeWidget">
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="itemsExpandable">
<bool>false</bool>
</property>
<column> <column>
<property name="text"> <property name="text">
<string>State</string> <string>State</string>
@ -48,6 +54,9 @@
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QPushButton" name="detailsPushButton"> <widget class="QPushButton" name="detailsPushButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text"> <property name="text">
<string>Details</string> <string>Details</string>
</property> </property>
@ -88,5 +97,22 @@
<resources> <resources>
<include location="../object_viewer_qt.qrc"/> <include location="../object_viewer_qt.qrc"/>
</resources> </resources>
<connections/> <connections>
<connection>
<sender>closePushButton</sender>
<signal>clicked()</signal>
<receiver>CPluginView</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>620</x>
<y>232</y>
</hint>
<hint type="destinationlabel">
<x>507</x>
<y>226</y>
</hint>
</hints>
</connection>
</connections>
</ui> </ui>

View file

@ -0,0 +1,75 @@
/*
Object Viewer Qt
Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by>
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 3 of the License, or
(at your option) 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.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "plugin_view.h"
// Qt includes
#include <QtCore/QDir>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtGui/QIcon>
#include <QtGui/QStyle>
#include <QtGui/QTreeWidgetItem>
// Project includes
#include "plugin_spec.h"
#include "iplugin_manager.h"
namespace NLQT
{
CPluginView::CPluginView(IPluginManager *pluginManager, QWidget *parent)
: QDialog(parent)
{
_ui.setupUi(this);
_pluginManager = pluginManager;
connect(_pluginManager, SIGNAL(pluginsChanged()), this, SLOT(updateList()));
updateList();
}
CPluginView::~CPluginView()
{
}
void CPluginView::updateList()
{
static QIcon okIcon = QApplication::style()->standardIcon(QStyle::SP_DialogApplyButton);
static QIcon errorIcon = QApplication::style()->standardIcon(QStyle::SP_DialogCancelButton);
QList<QTreeWidgetItem *> items;
Q_FOREACH (CPluginSpec *spec, _pluginManager->plugins())
{
QTreeWidgetItem *item = new QTreeWidgetItem(QStringList()
<< ""
<< spec->name()
<< QString("%1").arg(spec->version())
<< spec->vendor()
<< QDir::toNativeSeparators(spec->filePath()));
item->setIcon(0, spec->hasError() ? errorIcon : okIcon);
items.append(item);
}
_ui.pluginTreeWidget->clear();
if (!items.isEmpty())
_ui.pluginTreeWidget->addTopLevelItems(items);
}
} /* namespace NLQT */

View file

@ -3,6 +3,7 @@
#include <nel/misc/app_context.h> #include <nel/misc/app_context.h>
// Qt includes // Qt includes
#include <QtGui/QMessageBox>
#include <QtGui/QApplication> #include <QtGui/QApplication>
#include <QtGui/QSplashScreen> #include <QtGui/QSplashScreen>
@ -101,6 +102,16 @@ sint main(int argc, char **argv)
Modules::plugMan().setPluginPaths(QStringList() << QString("./plugins")); Modules::plugMan().setPluginPaths(QStringList() << QString("./plugins"));
Modules::plugMan().loadPlugins(); Modules::plugMan().loadPlugins();
QStringList errors;
Q_FOREACH (NLQT::CPluginSpec *spec, Modules::plugMan().plugins())
if (spec->hasError())
errors.append(spec->fileName() + " : " + spec->errorString());
if (!errors.isEmpty())
QMessageBox::warning(0,
QCoreApplication::translate("Application", "Object Viewer Qt - Plugin loader messages"),
errors.join(QString::fromLatin1("\n\n")));
splash->finish(&Modules::mainWin()); splash->finish(&Modules::mainWin());
int result = app.exec(); int result = app.exec();
Modules::release(); Modules::release();

View file

@ -46,6 +46,8 @@
#include "day_night_dialog.h" #include "day_night_dialog.h"
#include "sun_color_dialog.h" #include "sun_color_dialog.h"
#include "extension_system/plugin_view.h"
using namespace std; using namespace std;
using namespace NLMISC; using namespace NLMISC;
@ -132,6 +134,7 @@ CMainWindow::~CMainWindow()
delete _ParticleControlDialog; delete _ParticleControlDialog;
delete _ParticleWorkspaceDialog; delete _ParticleWorkspaceDialog;
delete _GraphicsViewport; delete _GraphicsViewport;
delete _PluginView;
} }
void CMainWindow::setVisible(bool visible) void CMainWindow::setVisible(bool visible)
@ -342,6 +345,10 @@ void CMainWindow::createActions()
_aboutQtAction = new QAction(tr("About &Qt"), this); _aboutQtAction = new QAction(tr("About &Qt"), this);
_aboutQtAction->setStatusTip(tr("Show the Qt library's About box")); _aboutQtAction->setStatusTip(tr("Show the Qt library's About box"));
connect(_aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt())); connect(_aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
_pluginViewAction = new QAction(tr("About &Plugins"), this);
_pluginViewAction->setStatusTip(tr("Show the plugin view dialog"));
connect(_pluginViewAction, SIGNAL(triggered()), _PluginView, SLOT(show()));
} }
void CMainWindow::createMenus() void CMainWindow::createMenus()
@ -406,6 +413,7 @@ void CMainWindow::createMenus()
_helpMenu = menuBar()->addMenu(tr("&Help")); _helpMenu = menuBar()->addMenu(tr("&Help"));
_helpMenu->addAction(_aboutAction); _helpMenu->addAction(_aboutAction);
_helpMenu->addAction(_aboutQtAction); _helpMenu->addAction(_aboutQtAction);
_helpMenu->addAction(_pluginViewAction);
} }
void CMainWindow::createToolBars() void CMainWindow::createToolBars()
@ -498,6 +506,8 @@ void CMainWindow::createDialogs()
addDockWidget(Qt::RightDockWidgetArea, _SetupFog); addDockWidget(Qt::RightDockWidgetArea, _SetupFog);
_SetupFog->setVisible(false); _SetupFog->setVisible(false);
_PluginView = new CPluginView(&Modules::plugMan(), this);
connect(_ParticleControlDialog, SIGNAL(changeState()), _ParticleWorkspaceDialog, SLOT(setNewState())); connect(_ParticleControlDialog, SIGNAL(changeState()), _ParticleWorkspaceDialog, SLOT(setNewState()));
connect(_ParticleWorkspaceDialog, SIGNAL(changeActiveNode()), _ParticleControlDialog, SLOT(updateActiveNode())); connect(_ParticleWorkspaceDialog, SIGNAL(changeActiveNode()), _ParticleControlDialog, SLOT(updateActiveNode()));
connect(_AnimationSetDialog->ui.setLengthPushButton, SIGNAL(clicked()), _AnimationDialog, SLOT(changeAnimLength())); connect(_AnimationSetDialog->ui.setLengthPushButton, SIGNAL(clicked()), _AnimationDialog, SLOT(changeAnimLength()));

View file

@ -53,6 +53,8 @@ class CGlobalWindDialog;
class CDayNightDialog; class CDayNightDialog;
class CSunColorDialog; class CSunColorDialog;
class CPluginView;
class CMainWindow : public QMainWindow class CMainWindow : public QMainWindow
{ {
Q_OBJECT Q_OBJECT
@ -113,6 +115,8 @@ private:
CDayNightDialog *_DayNightDialog; CDayNightDialog *_DayNightDialog;
CSunColorDialog *_SunColorDialog; CSunColorDialog *_SunColorDialog;
CPluginView *_PluginView;
CSkeletonTreeModel *_SkeletonTreeModel; CSkeletonTreeModel *_SkeletonTreeModel;
QPalette _originalPalette; QPalette _originalPalette;
@ -135,6 +139,7 @@ private:
QAction *_resetSceneAction; QAction *_resetSceneAction;
QAction *_saveScreenshotAction; QAction *_saveScreenshotAction;
QAction *_settingsAction; QAction *_settingsAction;
QAction *_pluginViewAction;
QAction *_aboutAction; QAction *_aboutAction;
QAction *_aboutQtAction; QAction *_aboutQtAction;
};/* class CMainWindow */ };/* class CMainWindow */