diff --git a/apps/opencs/CMakeLists.txt b/apps/opencs/CMakeLists.txt index 417d57981c..727c4d7b30 100644 --- a/apps/opencs/CMakeLists.txt +++ b/apps/opencs/CMakeLists.txt @@ -69,7 +69,7 @@ opencs_units_noqt (view/world ) opencs_units (view/widget - scenetoolbar scenetool scenetoolmode pushbutton scenetooltoggle + scenetoolbar scenetool scenetoolmode pushbutton scenetooltoggle scenetoolrun ) opencs_units (view/render diff --git a/apps/opencs/view/render/pagedworldspacewidget.cpp b/apps/opencs/view/render/pagedworldspacewidget.cpp index 21d88fb892..aaa6241038 100644 --- a/apps/opencs/view/render/pagedworldspacewidget.cpp +++ b/apps/opencs/view/render/pagedworldspacewidget.cpp @@ -133,6 +133,20 @@ void CSVRender::PagedWorldspaceWidget::referenceAdded (const QModelIndex& parent flagAsModified(); } +std::string CSVRender::PagedWorldspaceWidget::getStartupInstruction() +{ + Ogre::Vector3 position = getCamera()->getPosition(); + + std::ostringstream stream; + + stream + << "player->position " + << position.x << ", " << position.y << ", " << position.z + << ", 0"; + + return stream.str(); +} + CSVRender::PagedWorldspaceWidget::PagedWorldspaceWidget (QWidget* parent, CSMDoc::Document& document) : WorldspaceWidget (document, parent), mDocument (document), mWorldspace ("std::default") { diff --git a/apps/opencs/view/render/pagedworldspacewidget.hpp b/apps/opencs/view/render/pagedworldspacewidget.hpp index ec44856974..0c0022498d 100644 --- a/apps/opencs/view/render/pagedworldspacewidget.hpp +++ b/apps/opencs/view/render/pagedworldspacewidget.hpp @@ -42,6 +42,8 @@ namespace CSVRender virtual void referenceAdded (const QModelIndex& index, int start, int end); + virtual std::string getStartupInstruction(); + public: PagedWorldspaceWidget (QWidget *parent, CSMDoc::Document& document); diff --git a/apps/opencs/view/render/unpagedworldspacewidget.cpp b/apps/opencs/view/render/unpagedworldspacewidget.cpp index 5175eba6ef..b7e73417af 100644 --- a/apps/opencs/view/render/unpagedworldspacewidget.cpp +++ b/apps/opencs/view/render/unpagedworldspacewidget.cpp @@ -1,7 +1,10 @@ #include "unpagedworldspacewidget.hpp" +#include + #include +#include #include @@ -149,6 +152,20 @@ void CSVRender::UnpagedWorldspaceWidget::referenceAdded (const QModelIndex& pare flagAsModified(); } +std::string CSVRender::UnpagedWorldspaceWidget::getStartupInstruction() +{ + Ogre::Vector3 position = getCamera()->getPosition(); + + std::ostringstream stream; + + stream + << "player->positionCell " + << position.x << ", " << position.y << ", " << position.z + << ", 0, \"" << mCellId << "\""; + + return stream.str(); +} + CSVRender::WorldspaceWidget::dropRequirments CSVRender::UnpagedWorldspaceWidget::getDropRequirements (CSVRender::WorldspaceWidget::dropType type) const { switch(type) diff --git a/apps/opencs/view/render/unpagedworldspacewidget.hpp b/apps/opencs/view/render/unpagedworldspacewidget.hpp index 505d607350..a7e8e9ff5e 100644 --- a/apps/opencs/view/render/unpagedworldspacewidget.hpp +++ b/apps/opencs/view/render/unpagedworldspacewidget.hpp @@ -60,6 +60,8 @@ namespace CSVRender virtual void referenceAdded (const QModelIndex& index, int start, int end); + virtual std::string getStartupInstruction(); + private slots: void cellDataChanged (const QModelIndex& topLeft, const QModelIndex& bottomRight); diff --git a/apps/opencs/view/render/worldspacewidget.cpp b/apps/opencs/view/render/worldspacewidget.cpp index 4d3c7f666e..40324f4158 100644 --- a/apps/opencs/view/render/worldspacewidget.cpp +++ b/apps/opencs/view/render/worldspacewidget.cpp @@ -1,6 +1,8 @@ #include "worldspacewidget.hpp" +#include + #include #include #include @@ -8,14 +10,16 @@ #include #include "../../model/world/universalid.hpp" +#include "../../model/world/idtable.hpp" #include "../widget/scenetoolmode.hpp" #include "../widget/scenetooltoggle.hpp" +#include "../widget/scenetoolrun.hpp" #include "elements.hpp" CSVRender::WorldspaceWidget::WorldspaceWidget (CSMDoc::Document& document, QWidget* parent) -: SceneWidget (parent), mDocument(document) +: SceneWidget (parent), mDocument(document), mRun (0) { setAcceptDrops(true); @@ -112,6 +116,44 @@ CSVWidget::SceneToolToggle *CSVRender::WorldspaceWidget::makeSceneVisibilitySele return mSceneElements; } +CSVWidget::SceneToolRun *CSVRender::WorldspaceWidget::makeRunTool ( + CSVWidget::SceneToolbar *parent) +{ + CSMWorld::IdTable& debugProfiles = dynamic_cast ( + *mDocument.getData().getTableModel (CSMWorld::UniversalId::Type_DebugProfiles)); + + std::vector profiles; + + int idColumn = debugProfiles.findColumnIndex (CSMWorld::Columns::ColumnId_Id); + int stateColumn = debugProfiles.findColumnIndex (CSMWorld::Columns::ColumnId_Modification); + int defaultColumn = debugProfiles.findColumnIndex ( + CSMWorld::Columns::ColumnId_DefaultProfile); + + int size = debugProfiles.rowCount(); + + for (int i=0; i& data) { @@ -201,6 +243,11 @@ void CSVRender::WorldspaceWidget::dropEvent (QDropEvent* event) } //not handling drops from different documents at the moment } +void CSVRender::WorldspaceWidget::runRequest (const std::string& profile) +{ + mDocument.startRunning (profile, getStartupInstruction()); +} + void CSVRender::WorldspaceWidget::elementSelectionChanged() { setVisibilityMask (getElementMask()); diff --git a/apps/opencs/view/render/worldspacewidget.hpp b/apps/opencs/view/render/worldspacewidget.hpp index e21ad5ec23..0c74b24bcc 100644 --- a/apps/opencs/view/render/worldspacewidget.hpp +++ b/apps/opencs/view/render/worldspacewidget.hpp @@ -18,6 +18,7 @@ namespace CSVWidget class SceneToolMode; class SceneToolToggle; class SceneToolbar; + class SceneToolRun; } namespace CSVRender @@ -30,6 +31,8 @@ namespace CSVRender CSVRender::NavigationFree mFree; CSVRender::NavigationOrbit mOrbit; CSVWidget::SceneToolToggle *mSceneElements; + CSVWidget::SceneToolRun *mRun; + CSMDoc::Document& mDocument; public: @@ -60,6 +63,10 @@ namespace CSVRender CSVWidget::SceneToolToggle *makeSceneVisibilitySelector ( CSVWidget::SceneToolbar *parent); + /// \attention The created tool is not added to the toolbar (via addTool). Doing + /// that is the responsibility of the calling function. + CSVWidget::SceneToolRun *makeRunTool (CSVWidget::SceneToolbar *parent); + void selectDefaultNavigationMode(); static dropType getDropType(const std::vector& data); @@ -77,8 +84,6 @@ namespace CSVRender virtual void addVisibilitySelectorButtons (CSVWidget::SceneToolToggle *tool); - const CSMDoc::Document& mDocument; - private: void dragEnterEvent(QDragEnterEvent *event); @@ -87,6 +92,8 @@ namespace CSVRender void dragMoveEvent(QDragMoveEvent *event); + virtual std::string getStartupInstruction() = 0; + private slots: void selectNavigationMode (const std::string& mode); @@ -104,6 +111,8 @@ namespace CSVRender virtual void referenceAdded (const QModelIndex& index, int start, int end) = 0; + virtual void runRequest (const std::string& profile); + protected slots: void elementSelectionChanged(); diff --git a/apps/opencs/view/widget/pushbutton.cpp b/apps/opencs/view/widget/pushbutton.cpp index 307ea1a751..21f5f03878 100644 --- a/apps/opencs/view/widget/pushbutton.cpp +++ b/apps/opencs/view/widget/pushbutton.cpp @@ -20,6 +20,10 @@ void CSVWidget::PushButton::setExtendedToolTip() break; + case Type_TopAction: + + break; + case Type_Mode: tooltip += diff --git a/apps/opencs/view/widget/pushbutton.hpp b/apps/opencs/view/widget/pushbutton.hpp index 64b38db2ee..0b5ad68332 100644 --- a/apps/opencs/view/widget/pushbutton.hpp +++ b/apps/opencs/view/widget/pushbutton.hpp @@ -14,6 +14,7 @@ namespace CSVWidget enum Type { Type_TopMode, // top level button for mode selector panel + Type_TopAction, // top level button that triggers an action Type_Mode, // mode button Type_Toggle }; diff --git a/apps/opencs/view/widget/scenetool.cpp b/apps/opencs/view/widget/scenetool.cpp index e3f2dfd1c8..8239074b6f 100644 --- a/apps/opencs/view/widget/scenetool.cpp +++ b/apps/opencs/view/widget/scenetool.cpp @@ -3,8 +3,8 @@ #include "scenetoolbar.hpp" -CSVWidget::SceneTool::SceneTool (SceneToolbar *parent) -: PushButton (PushButton::Type_TopMode, "", parent) +CSVWidget::SceneTool::SceneTool (SceneToolbar *parent, Type type) +: PushButton (type, "", parent) { setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed)); setIconSize (QSize (parent->getIconSize(), parent->getIconSize())); diff --git a/apps/opencs/view/widget/scenetool.hpp b/apps/opencs/view/widget/scenetool.hpp index 24099683e0..1aa4df9f7c 100644 --- a/apps/opencs/view/widget/scenetool.hpp +++ b/apps/opencs/view/widget/scenetool.hpp @@ -14,7 +14,7 @@ namespace CSVWidget public: - SceneTool (SceneToolbar *parent); + SceneTool (SceneToolbar *parent, Type type = Type_TopMode); virtual void showPanel (const QPoint& position) = 0; diff --git a/apps/opencs/view/widget/scenetoolrun.cpp b/apps/opencs/view/widget/scenetoolrun.cpp new file mode 100644 index 0000000000..b2f4675598 --- /dev/null +++ b/apps/opencs/view/widget/scenetoolrun.cpp @@ -0,0 +1,35 @@ + +#include "scenetoolrun.hpp" + +void CSVWidget::SceneToolRun::adjustToolTips() +{ + QString toolTip = mToolTip; + + if (mCurrentIndex==-1) + toolTip += "

No debug profile selected (function disabled)"; + else + toolTip += "

Debug profile: " + QString::fromUtf8 (mProfiles[mCurrentIndex].c_str()); + + setToolTip (toolTip); +} + +void CSVWidget::SceneToolRun::updateIcon() +{ + setIcon (QIcon (mCurrentIndex==-1 ? mIconDisabled : mIcon)); +} + +CSVWidget::SceneToolRun::SceneToolRun (SceneToolbar *parent, const QString& toolTip, + const QString& icon, const QString& iconDisabled, const std::vector& profiles) +: SceneTool (parent, Type_TopAction), mProfiles (profiles), + mCurrentIndex (profiles.empty() ? -1 : 0), mToolTip (toolTip), mIcon (icon), + mIconDisabled (iconDisabled) +{ + updateIcon(); + adjustToolTips(); +} + +void CSVWidget::SceneToolRun::showPanel (const QPoint& position) +{ + if (mCurrentIndex!=-1) + emit runRequest (mProfiles[mCurrentIndex]); +} diff --git a/apps/opencs/view/widget/scenetoolrun.hpp b/apps/opencs/view/widget/scenetoolrun.hpp new file mode 100644 index 0000000000..cf16a172d6 --- /dev/null +++ b/apps/opencs/view/widget/scenetoolrun.hpp @@ -0,0 +1,40 @@ +#ifndef CSV_WIDGET_SCENETOOLRUN_H +#define CSV_WIDGET_SCENETOOLRUN_H + +#include +#include + +#include "scenetool.hpp" + +namespace CSVWidget +{ + class SceneToolRun : public SceneTool + { + Q_OBJECT + + std::vector mProfiles; + int mCurrentIndex; + QString mToolTip; + QString mIcon; + QString mIconDisabled; + + private: + + void adjustToolTips(); + + void updateIcon(); + + public: + + SceneToolRun (SceneToolbar *parent, const QString& toolTip, const QString& icon, + const QString& iconDisabled, const std::vector& profiles); + + virtual void showPanel (const QPoint& position); + + signals: + + void runRequest (const std::string& profile); + }; +} + +#endif diff --git a/apps/opencs/view/world/scenesubview.cpp b/apps/opencs/view/world/scenesubview.cpp index 3c5b38a22c..3afbbc8051 100644 --- a/apps/opencs/view/world/scenesubview.cpp +++ b/apps/opencs/view/world/scenesubview.cpp @@ -20,6 +20,7 @@ #include "../widget/scenetoolbar.hpp" #include "../widget/scenetoolmode.hpp" #include "../widget/scenetooltoggle.hpp" +#include "../widget/scenetoolrun.hpp" #include "tablebottombox.hpp" #include "creator.hpp" @@ -121,6 +122,9 @@ CSVWidget::SceneToolbar* CSVWorld::SceneSubView::makeToolbar (CSVRender::Worldsp toolbar->addTool (controlVisibilityTool); } + CSVWidget::SceneToolRun *runTool = widget->makeRunTool (toolbar); + toolbar->addTool (runTool); + return toolbar; }