diff --git a/src/app/main.cpp b/src/app/main.cpp --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -114,6 +114,7 @@ QToolBar *mainToolBar = window->addToolBar(QObject::tr("Main")); mainToolBar->setObjectName("mainToolBar"); mainToolBar->addWidget(configureButton); + mainToolBar->addAction(components->scriptEditorAction()); window->addDockWidget(Qt::RightDockWidgetArea, editorDock); window->addDockWidget(Qt::LeftDockWidgetArea, pagesDock); diff --git a/src/kontact/part.cpp b/src/kontact/part.cpp --- a/src/kontact/part.cpp +++ b/src/kontact/part.cpp @@ -73,6 +73,9 @@ actionCollection()->addAction(action->objectName(), action); } + QAction *action = components->scriptEditorAction(); + actionCollection()->addAction(action->objectName(), action); + setXMLFile(KStandardDirs::locate("data", "zanshin/zanshin-next_part.rc")); } diff --git a/src/widgets/applicationcomponents.h b/src/widgets/applicationcomponents.h --- a/src/widgets/applicationcomponents.h +++ b/src/widgets/applicationcomponents.h @@ -41,6 +41,7 @@ class DataSourceComboBox; class EditorView; class PageView; +class ScriptEditor; class ApplicationComponents : public QObject { @@ -57,11 +58,15 @@ QList configureActions() const; + QAction *scriptEditorAction() const; + ScriptEditor *scriptEditor() const; + DataSourceComboBox *defaultNoteSourceCombo() const; DataSourceComboBox *defaultTaskSourceCombo() const; public slots: void setModel(const QObjectPtr &model); + void openScriptEditor(); private slots: void onCurrentPageChanged(QObject *page); @@ -79,6 +84,9 @@ QList m_configureActions; DataSourceComboBox *m_noteCombo; DataSourceComboBox *m_taskCombo; + + 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 @@ -35,9 +35,14 @@ #include "datasourcecombobox.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) @@ -48,7 +53,9 @@ m_pageView(Q_NULLPTR), m_editorView(Q_NULLPTR), m_noteCombo(Q_NULLPTR), - m_taskCombo(Q_NULLPTR) + m_taskCombo(Q_NULLPTR), + m_scriptEditorAction(Q_NULLPTR), + m_scriptEditor(Q_NULLPTR) { } @@ -158,6 +165,27 @@ return m_configureActions; } +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; +} + DataSourceComboBox *ApplicationComponents::defaultNoteSourceCombo() const { if (!m_noteCombo) { @@ -238,6 +266,18 @@ } } +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/tests/units/widgets/applicationcomponentstest.cpp b/tests/units/widgets/applicationcomponentstest.cpp --- a/tests/units/widgets/applicationcomponentstest.cpp +++ b/tests/units/widgets/applicationcomponentstest.cpp @@ -34,12 +34,17 @@ #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/datasourcecombobox.h" #include "widgets/editorview.h" #include "widgets/pageview.h" +#include "widgets/scripteditor.h" typedef std::function ComboGetterFunction; Q_DECLARE_METATYPE(ComboGetterFunction) @@ -192,6 +197,15 @@ void dueDateChanged(const QDateTime &due); }; +class ScriptHandlerStub : public Scripting::ScriptHandler +{ + Q_OBJECT +public: + explicit ScriptHandlerStub() : ScriptHandler(QSharedPointer()) + { + } +}; + class ApplicationComponentsTest : public QObject { Q_OBJECT @@ -506,6 +520,33 @@ QCOMPARE(noteAction->defaultWidget()->findChild("noteSourceCombo"), components.defaultNoteSourceCombo()); QCOMPARE(noteAction->objectName(), QString("zanshin_settings_note_sources")); } + + 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)