From 415ad3e594ec2952e9efb6306ad81765bfae30c6 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Mon, 11 Jul 2011 00:23:28 +0300 Subject: [PATCH] Changed: #1302 Added basic shell of World editor plugin. --HG-- branch : gsoc2011-worldeditorqt --- .../src/plugins/world_editor/CMakeLists.txt | 48 +++++++ .../icons/ic_nel_world_editor.png | Bin 0 -> 44031 bytes .../src/plugins/world_editor/world_editor.qrc | 5 + .../world_editor/world_editor_constants.h | 39 ++++++ .../world_editor/world_editor_global.h | 30 ++++ .../world_editor/world_editor_plugin.cpp | 128 ++++++++++++++++++ .../world_editor/world_editor_plugin.h | 108 +++++++++++++++ .../world_editor/world_editor_window.cpp | 119 ++++++++++++++++ .../world_editor/world_editor_window.h | 57 ++++++++ .../world_editor/world_editor_window.ui | 54 ++++++++ 10 files changed, 588 insertions(+) create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/CMakeLists.txt create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/icons/ic_nel_world_editor.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor.qrc create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_constants.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_global.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_plugin.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_plugin.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.ui diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/CMakeLists.txt new file mode 100644 index 000000000..784dd6139 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/CMakeLists.txt @@ -0,0 +1,48 @@ +INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${LIBXML2_INCLUDE_DIR} + ${QT_INCLUDES}) + +FILE(GLOB SRC *.cpp *.h) + +SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin.h + ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_manager.h + ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h) + +SET(OVQT_PLUGIN_WORLD_EDITOR_HDR world_editor_plugin.h + world_editor_window.h +) + +SET(OVQT_PLUGIN_WORLD_EDITOR_UIS world_editor_window.ui +) + +SET(OVQT_PLUGIN_WORLD_EDITOR_RCS world_editor.qrc) + +SET(QT_USE_QTGUI TRUE) +SET(QT_USE_QTOPENGL TRUE) + +QT4_ADD_RESOURCES(OVQT_PLUGIN_WORLD_EDITOR_RC_SRCS ${OVQT_PLUGIN_WORLD_EDITOR_RCS}) +QT4_WRAP_CPP(OVQT_PLUGIN_WORLD_EDITOR_MOC_SRC ${OVQT_PLUGIN_WORLD_EDITOR_HDR}) +QT4_WRAP_UI(OVQT_PLUGIN_WORLD_EDITOR_UI_HDRS ${OVQT_PLUGIN_WORLD_EDITOR_UIS}) + +SOURCE_GROUP(QtResources FILES ${OVQT_PLUGIN_WORLD_EDITOR_UIS}) +SOURCE_GROUP(QtGeneratedUiHdr FILES ${OVQT_PLUGIN_WORLD_EDITOR_UI_HDRS}) +SOURCE_GROUP(QtGeneratedMocQrcSrc FILES ${OVQT_PLUGIN_WORLD_EDITOR_MOC_SRC} OVQT_PLUGIN_WORLD_EDITOR_RC_SRCS) +SOURCE_GROUP("World Editor Plugin" FILES ${SRC}) +SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC}) + +ADD_LIBRARY(ovqt_plugin_world_editor MODULE ${SRC} + ${OVQT_PLUGIN_WORLD_EDITOR_MOC_SRC} + ${OVQT_EXT_SYS_SRC} + ${OVQT_PLUGIN_WORLD_EDITOR_UI_HDRS} + ${OVQT_PLUGIN_WORLD_EDITOR_RC_SRCS}) + +TARGET_LINK_LIBRARIES(ovqt_plugin_world_editor ovqt_plugin_core ovqt_plugin_landscape_editor nelmisc nel3d ${QT_LIBRARIES} ${QT_QTOPENGL_LIBRARY}) + +NL_DEFAULT_PROPS(ovqt_plugin_world_editor "NeL, Tools, 3D: Object Viewer Qt Plugin: World Editor") +NL_ADD_RUNTIME_FLAGS(ovqt_plugin_world_editor) +NL_ADD_LIB_SUFFIX(ovqt_plugin_world_editor) + +ADD_DEFINITIONS(-DWORLD_EDITOR_LIBRARY ${LIBXML2_DEFINITIONS} -DQT_PLUGIN -DQT_SHARED ${QT_DEFINITIONS}) + +INSTALL(TARGETS ovqt_plugin_world_editor LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/icons/ic_nel_world_editor.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/icons/ic_nel_world_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..d41f64e2fa43da9d64f9b528cc173593d4a94c59 GIT binary patch literal 44031 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 GHST}F+s82g literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor.qrc b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor.qrc new file mode 100644 index 000000000..f7c54fd5f --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor.qrc @@ -0,0 +1,5 @@ + + + icons/ic_nel_world_editor.png + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_constants.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_constants.h new file mode 100644 index 000000000..644f79b53 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_constants.h @@ -0,0 +1,39 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef WORLD_EDITOR_CONSTANTS_H +#define WORLD_EDITOR_CONSTANTS_H + +namespace WorldEditor +{ +namespace Constants +{ +const char * const WORLD_EDITOR_PLUGIN = "WorldEditor"; + +//settings +const char * const WORLD_EDITOR_SECTION = "WorldEditor"; +const char * const WORLD_WINDOW_STATE = "WorldWindowState"; +const char * const WORLD_WINDOW_GEOMETRY = "WorldWindowGeometry"; + +//resources +const char * const ICON_WORLD_EDITOR = ":/icons/ic_nel_world_editor.png"; + + +} // namespace Constants +} // namespace WorldEditor + +#endif // WORLD_EDITOR_CONSTANTS_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_global.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_global.h new file mode 100644 index 000000000..a7a94ca75 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_global.h @@ -0,0 +1,30 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef WORLD_EDITOR_GLOBAL_H +#define WORLD_EDITOR_GLOBAL_H + +#include + +#if defined(WORLD_EDITOR_LIBRARY) +# define WORLD_EDITOR_EXPORT Q_DECL_EXPORT +#else +# define WORLD_EDITOR_EXPORT Q_DECL_IMPORT +#endif + +#endif // WORLD_EDITOR_GLOBAL_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_plugin.cpp new file mode 100644 index 000000000..494f6e2b6 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_plugin.cpp @@ -0,0 +1,128 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "world_editor_plugin.h" +#include "world_editor_window.h" + +#include "../core/icore.h" +#include "../core/core_constants.h" + +// NeL includes +#include "nel/misc/debug.h" + +// Qt includes +#include + +namespace WorldEditor +{ + +WorldEditorPlugin::~WorldEditorPlugin() +{ + Q_FOREACH(QObject *obj, m_autoReleaseObjects) + { + m_plugMan->removeObject(obj); + } + qDeleteAll(m_autoReleaseObjects); + m_autoReleaseObjects.clear(); +} + +bool WorldEditorPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) +{ + Q_UNUSED(errorString); + m_plugMan = pluginManager; + + addAutoReleasedObject(new WorldEditorContext(this)); + return true; +} + +void WorldEditorPlugin::extensionsInitialized() +{ +} + +void WorldEditorPlugin::shutdown() +{ +} + +void WorldEditorPlugin::setNelContext(NLMISC::INelContext *nelContext) +{ +#ifdef NL_OS_WINDOWS + // Ensure that a context doesn't exist yet. + // This only applies to platforms without PIC, e.g. Windows. + nlassert(!NLMISC::INelContext::isContextInitialised()); +#endif // NL_OS_WINDOWS + m_libContext = new NLMISC::CLibraryContext(*nelContext); +} + +QString WorldEditorPlugin::name() const +{ + return tr("WorldEditor"); +} + +QString WorldEditorPlugin::version() const +{ + return "0.0.1"; +} + +QString WorldEditorPlugin::vendor() const +{ + return "GSoC2011_dnk-88"; +} + +QString WorldEditorPlugin::description() const +{ + return "World editor ovqt plugin."; +} + +QStringList WorldEditorPlugin::dependencies() const +{ + QStringList list; + list.append(Core::Constants::OVQT_CORE_PLUGIN); + return list; +} + +void WorldEditorPlugin::addAutoReleasedObject(QObject *obj) +{ + m_plugMan->addObject(obj); + m_autoReleaseObjects.prepend(obj); +} + +WorldEditorContext::WorldEditorContext(QObject *parent) + : IContext(parent), + m_worldEditorWindow(0) +{ + m_worldEditorWindow = new WorldEditorWindow(); +} + +QUndoStack *WorldEditorContext::undoStack() +{ + return m_worldEditorWindow->undoStack(); +} + +void WorldEditorContext::open() +{ + //m_worldEditorWindow->open(); +} + +QWidget *WorldEditorContext::widget() +{ + return m_worldEditorWindow; +} + +} + +Q_EXPORT_PLUGIN(WorldEditor::WorldEditorPlugin) \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_plugin.h new file mode 100644 index 000000000..fdfff7eff --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_plugin.h @@ -0,0 +1,108 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef WORLD_EDITOR_PLUGIN_H +#define WORLD_EDITOR_PLUGIN_H + +// Project includes +#include "world_editor_constants.h" +#include "../../extension_system/iplugin.h" +#include "../core/icontext.h" + +// NeL includes +#include "nel/misc/app_context.h" + +// Qt includes +#include +#include + +namespace NLMISC +{ +class CLibraryContext; +} + +namespace ExtensionSystem +{ +class IPluginSpec; +} + +namespace WorldEditor +{ +class WorldEditorWindow; + +class WorldEditorPlugin : public QObject, public ExtensionSystem::IPlugin +{ + Q_OBJECT + Q_INTERFACES(ExtensionSystem::IPlugin) +public: + + virtual ~WorldEditorPlugin(); + + bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString); + void extensionsInitialized(); + void shutdown(); + + void setNelContext(NLMISC::INelContext *nelContext); + + QString name() const; + QString version() const; + QString vendor() const; + QString description() const; + QStringList dependencies() const; + + void addAutoReleasedObject(QObject *obj); + +protected: + NLMISC::CLibraryContext *m_libContext; + +private: + ExtensionSystem::IPluginManager *m_plugMan; + QList m_autoReleaseObjects; +}; + +class WorldEditorContext: public Core::IContext +{ + Q_OBJECT +public: + WorldEditorContext(QObject *parent = 0); + virtual ~WorldEditorContext() {} + + virtual QString id() const + { + return QLatin1String("WorldEditorContext"); + } + virtual QString trName() const + { + return tr("World Editor"); + } + virtual QIcon icon() const + { + return QIcon(Constants::ICON_WORLD_EDITOR); + } + + virtual void open(); + + virtual QUndoStack *undoStack(); + + virtual QWidget *widget(); + + WorldEditorWindow *m_worldEditorWindow; +}; + +} // namespace WorldEditor + +#endif // WORLD_EDITOR_PLUGIN_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.cpp new file mode 100644 index 000000000..7d6f9dcfd --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.cpp @@ -0,0 +1,119 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "world_editor_window.h" +#include "world_editor_constants.h" + +#include "../core/icore.h" +#include "../core/imenu_manager.h" +#include "../core/core_constants.h" + +// Qt includes +#include + +namespace WorldEditor +{ +QString _lastDir; + +WorldEditorWindow::WorldEditorWindow(QWidget *parent) + : QMainWindow(parent), + m_undoStack(0) +{ + m_ui.setupUi(this); + m_undoStack = new QUndoStack(this); + + createMenus(); + createToolBars(); +// readSettings(); +} + +WorldEditorWindow::~WorldEditorWindow() +{ +// writeSettings(); +} + +QUndoStack *WorldEditorWindow::undoStack() const +{ + return m_undoStack; +} + +void WorldEditorWindow::open() +{ + /* QStringList fileNames = QFileDialog::getOpenFileNames(this, + tr("Open NeL Ligo land file"), _lastDir, + tr("All NeL Ligo land files (*.land)")); + + setCursor(Qt::WaitCursor); + if (!fileNames.isEmpty()) + { + QStringList list = fileNames; + _lastDir = QFileInfo(list.front()).absolutePath(); + Q_FOREACH(QString fileName, fileNames) + { + } + } + setCursor(Qt::ArrowCursor);*/ +} + +void WorldEditorWindow::createMenus() +{ + Core::IMenuManager *menuManager = Core::ICore::instance()->menuManager(); +} + +void WorldEditorWindow::createToolBars() +{ + Core::IMenuManager *menuManager = Core::ICore::instance()->menuManager(); + //QAction *action = menuManager->action(Core::Constants::NEW); + //m_ui.fileToolBar->addAction(action); + QAction *action = menuManager->action(Core::Constants::OPEN); + m_ui.fileToolBar->addAction(action); + + action = menuManager->action(Core::Constants::UNDO); + if (action != 0) + m_ui.undoToolBar->addAction(action); + + action = menuManager->action(Core::Constants::REDO); + if (action != 0) + m_ui.undoToolBar->addAction(action); + + //action = menuManager->action(Core::Constants::SAVE); + //m_ui.fileToolBar->addAction(action); + //action = menuManager->action(Core::Constants::SAVE_AS); + //m_ui.fileToolBar->addAction(action); +} + +void WorldEditorWindow::readSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(Constants::WORLD_EDITOR_SECTION); + restoreState(settings->value(Constants::WORLD_WINDOW_STATE).toByteArray()); + restoreGeometry(settings->value(Constants::WORLD_WINDOW_GEOMETRY).toByteArray()); + settings->endGroup(); +} + +void WorldEditorWindow::writeSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(Constants::WORLD_EDITOR_SECTION); + settings->setValue(Constants::WORLD_WINDOW_STATE, saveState()); + settings->setValue(Constants::WORLD_WINDOW_GEOMETRY, saveGeometry()); + settings->endGroup(); + settings->sync(); +} + +} /* namespace LandscapeEditor */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.h new file mode 100644 index 000000000..8efafc48b --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.h @@ -0,0 +1,57 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef WORLD_EDITOR_WINDOW_H +#define WORLD_EDITOR_WINDOW_H + +// Project includes +#include "ui_world_editor_window.h" + +// Qt includes +#include + +namespace WorldEditor +{ + +class WorldEditorWindow: public QMainWindow +{ + Q_OBJECT + +public: + WorldEditorWindow(QWidget *parent = 0); + ~WorldEditorWindow(); + + QUndoStack *undoStack() const; + +Q_SIGNALS: +public Q_SLOTS: + void open(); + +private Q_SLOTS: +private: + void createMenus(); + void createToolBars(); + void readSettings(); + void writeSettings(); + + QUndoStack *m_undoStack; + Ui::WorldEditorWindow m_ui; +}; /* class WorldEditorWindow */ + +} /* namespace WorldEditor */ + +#endif // WORLD_EDITOR_WINDOW_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.ui new file mode 100644 index 000000000..86c8a2b11 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/world_editor_window.ui @@ -0,0 +1,54 @@ + + + WorldEditorWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + :/icons/ic_nel_world_editor.png:/icons/ic_nel_world_editor.png + + + + + + + + + + + toolBar + + + TopToolBarArea + + + false + + + + + toolBar + + + TopToolBarArea + + + false + + + + + + + +