diff --git a/src/widgets/applicationcomponents.h b/src/widgets/applicationcomponents.h --- a/src/widgets/applicationcomponents.h +++ b/src/widgets/applicationcomponents.h @@ -40,6 +40,7 @@ class AvailableSourcesView; class EditorView; class PageView; +class ScriptEditor; class ApplicationComponents : public QObject { @@ -54,8 +55,12 @@ PageView *pageView() const; EditorView *editorView() const; + QAction *scriptEditorAction() const; + ScriptEditor *scriptEditor() const; + public slots: void setModel(const QObjectPtr &model); + void openScriptEditor(); private slots: void onCurrentPageChanged(QObject *page); @@ -69,6 +74,9 @@ AvailablePagesView *m_availablePagesView; PageView *m_pageView; EditorView *m_editorView; + + QAction *m_scriptEditorAction; + ScriptEditor *m_scriptEditor; }; } diff --git a/src/widgets/applicationcomponents.cpp b/src/widgets/applicationcomponents.cpp --- a/src/widgets/applicationcomponents.cpp +++ b/src/widgets/applicationcomponents.cpp @@ -34,9 +34,14 @@ #include "availablesourcesview.h" #include "editorview.h" #include "pageview.h" +#include "scripteditor.h" #include "presentation/applicationmodel.h" +#include "scripting/scripthandler.h" + +#include "utils/dependencymanager.h" + using namespace Widgets; ApplicationComponents::ApplicationComponents(QWidget *parent) @@ -45,7 +50,9 @@ m_availableSourcesView(Q_NULLPTR), m_availablePagesView(Q_NULLPTR), m_pageView(Q_NULLPTR), - m_editorView(Q_NULLPTR) + m_editorView(Q_NULLPTR), + m_scriptEditorAction(Q_NULLPTR), + m_scriptEditor(Q_NULLPTR) { } @@ -125,6 +132,27 @@ return m_editorView; } +QAction *ApplicationComponents::scriptEditorAction() const +{ + if (m_scriptEditorAction == Q_NULLPTR) { + auto scriptEditorAction = new QAction(QIcon::fromTheme("application-x-javascript"), + tr("Script Editor"), + m_parent); + scriptEditorAction->setObjectName("zanshin_scripteditor_open"); + scriptEditorAction->connect(scriptEditorAction, SIGNAL(triggered()), this, SLOT(openScriptEditor())); + + ApplicationComponents *self = const_cast(this); + self->m_scriptEditorAction = scriptEditorAction; + } + + return m_scriptEditorAction; +} + +ScriptEditor *ApplicationComponents::scriptEditor() const +{ + return m_scriptEditor; +} + void ApplicationComponents::setModel(const QObjectPtr &model) { if (m_model == model) @@ -151,6 +179,18 @@ m_editorView->setModel(m_model->property("editor").value()); } +void ApplicationComponents::openScriptEditor() +{ + if (m_scriptEditor == Q_NULLPTR) { + m_scriptEditor = new Widgets::ScriptEditor(m_parent); + m_scriptEditor->setScriptHandler(Utils::DependencyManager::globalInstance().create()); + } + + m_scriptEditor->show(); + m_scriptEditor->raise(); + m_scriptEditor->activateWindow(); +} + void ApplicationComponents::onCurrentPageChanged(QObject *page) { m_model->setProperty("currentPage", QVariant::fromValue(page)); diff --git a/src/zanshin/app/dependencies.cpp b/src/zanshin/app/dependencies.cpp --- a/src/zanshin/app/dependencies.cpp +++ b/src/zanshin/app/dependencies.cpp @@ -41,6 +41,8 @@ #include "presentation/availablesourcesmodel.h" #include "presentation/availabletaskpagesmodel.h" +#include "scripting/scripthandler.h" + #include "utils/dependencymanager.h" void App::initializeDependencies() @@ -117,4 +119,7 @@ deps.add(); + + deps.add(); } diff --git a/src/zanshin/app/main.cpp b/src/zanshin/app/main.cpp --- a/src/zanshin/app/main.cpp +++ b/src/zanshin/app/main.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -88,6 +89,10 @@ auto window = new KXmlGuiWindow; window->setCentralWidget(widget); + QToolBar *mainToolBar = window->addToolBar(QObject::tr("Main")); + mainToolBar->setObjectName("mainToolBar"); + mainToolBar->addAction(components->scriptEditorAction()); + window->addDockWidget(Qt::RightDockWidgetArea, editorDock); window->addDockWidget(Qt::LeftDockWidgetArea, pagesDock); window->addDockWidget(Qt::LeftDockWidgetArea, sourcesDock); diff --git a/src/zanshin/kontact/part.cpp b/src/zanshin/kontact/part.cpp --- a/src/zanshin/kontact/part.cpp +++ b/src/zanshin/kontact/part.cpp @@ -78,6 +78,9 @@ ac->addAction(it.key(), it.value()); } + QAction *action = components->scriptEditorAction(); + actionCollection()->addAction(action->objectName(), action); + setXMLFile(KStandardDirs::locate("data", "zanshin/zanshin-next_part.rc")); } diff --git a/tests/units/widgets/applicationcomponentstest.cpp b/tests/units/widgets/applicationcomponentstest.cpp --- a/tests/units/widgets/applicationcomponentstest.cpp +++ b/tests/units/widgets/applicationcomponentstest.cpp @@ -36,11 +36,16 @@ #include "presentation/applicationmodel.h" #include "presentation/querytreemodelbase.h" +#include "scripting/scripthandler.h" + +#include "utils/dependencymanager.h" + #include "widgets/applicationcomponents.h" #include "widgets/availablepagesview.h" #include "widgets/availablesourcesview.h" #include "widgets/editorview.h" #include "widgets/pageview.h" +#include "widgets/scripteditor.h" class ApplicationModelStub : public QObject { @@ -190,6 +195,15 @@ void dueDateChanged(const QDateTime &due); }; +class ScriptHandlerStub : public Scripting::ScriptHandler +{ + Q_OBJECT +public: + explicit ScriptHandlerStub() : ScriptHandler(QSharedPointer()) + { + } +}; + class ApplicationComponentsTest : public QObject { Q_OBJECT @@ -424,6 +438,33 @@ QCOMPARE(editorModel.property("artifact").value(), pageModel.itemAtRow(index.row())); } + + void shouldProvideScriptEditorAction() + { + // GIVEN + Widgets::ApplicationComponents components; + + // WHEN + QAction *action = components.scriptEditorAction(); + + // THEN + QCOMPARE(action->objectName(), QString("zanshin_scripteditor_open")); + } + + void shouldOpenScriptEditor() + { + // GIVEN + Utils::DependencyManager::globalInstance().add(); + + Widgets::ApplicationComponents components; + QVERIFY(!components.scriptEditor()); + + // WHEN + components.scriptEditorAction()->trigger(); + + // THEN + QVERIFY(components.scriptEditor()->isVisible()); + } }; QTEST_MAIN(ApplicationComponentsTest)