diff --git a/src/cantor.cpp b/src/cantor.cpp index 8f1e5fe723f115c55d3dea5ca2a7c98c16ecf83e..e8d951c3bc4d9c360c32d1b110b11737a21d9d89 100644 --- a/src/cantor.cpp +++ b/src/cantor.cpp @@ -48,8 +48,9 @@ #include "settings.h" #include "ui_settings.h" #include "backendchoosedialog.h" +#include -CantorShell::CantorShell() : KParts::MainWindow(), m_part(nullptr) +CantorShell::CantorShell() : KParts::MainWindow(), m_part(nullptr), m_panelHandler(nullptr) { // set the shell's ui resource file setXMLFile(QLatin1String("cantor_shell.rc")); @@ -75,6 +76,8 @@ CantorShell::CantorShell() : KParts::MainWindow(), m_part(nullptr) setDockOptions(QMainWindow::AnimatedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::VerticalTabs); + initPanels(); + updateNewSubmenu(); } @@ -358,7 +361,7 @@ void CantorShell::addWorksheet(const QString& backendName) { connect(part, SIGNAL(setCaption(QString,QIcon)), this, SLOT(setTabCaption(QString,QIcon))); connect(part, SIGNAL(worksheetSave(QUrl)), this, SLOT(onWorksheetSave(QUrl))); - connect(part, SIGNAL(requestOpenWorksheet(QUrl)), this, SLOT(load(QUrl))); + connect(part, SIGNAL(showHelp(QString)), this, SIGNAL(showHelp(QString))); m_parts.append(part); if (backend) // If backend empty (loading worksheet from file), then we connect to signal and wait m_parts2Backends[part] = backend->id(); @@ -396,11 +399,7 @@ void CantorShell::addWorksheet(const QString& backendName) void CantorShell::activateWorksheet(int index) { - QObject* pluginHandler=m_part->findChild(QLatin1String("PanelPluginHandler")); - if (pluginHandler) - disconnect(pluginHandler,SIGNAL(pluginsChanged()), this, SLOT(updatePanel())); - - // Save part state before change worksheet + // Save part panels states before change worksheet if (m_part) { QStringList visiblePanelNames; @@ -410,6 +409,16 @@ void CantorShell::activateWorksheet(int index) visiblePanelNames << doc->objectName(); } m_pluginsVisibility[m_part] = visiblePanelNames; + + Cantor::WorksheetAccessInterface* wa=m_part->findChild(Cantor::WorksheetAccessInterface::Name); + assert(wa); + PanelStates states; + QList plugins=m_panelHandler.plugins(wa->session()); + for(Cantor::PanelPlugin* plugin : plugins) + { + states.insert(plugin->name(), plugin->saveState()); + } + m_pluginsStates[m_part] = states; } m_part=findPart(m_tabWidget->widget(index)); @@ -418,8 +427,6 @@ void CantorShell::activateWorksheet(int index) createGUI(m_part); updateWindowTitle(m_part->url().fileName()); - QObject* pluginHandler=m_part->findChild(QLatin1String("PanelPluginHandler")); - connect(pluginHandler, SIGNAL(pluginsChanged()), this, SLOT(updatePanel())); updatePanel(); } else @@ -482,6 +489,7 @@ void CantorShell::closeTab(int index) m_tabWidget->removeTab(index); + bool isCurrectPartClosed = m_part ? widget == m_part->widget() : false; if(widget->objectName()==QLatin1String("ErrorMessage")) { widget->deleteLater(); @@ -495,13 +503,16 @@ void CantorShell::closeTab(int index) m_parts.removeAll(part); m_pluginsVisibility.remove(part); m_parts2Backends.remove(part); + m_pluginsStates.remove(part); delete part; } } if (m_tabWidget->count() == 0) setCaption(QString()); - updatePanel(); + + if (isCurrectPartClosed || m_part == nullptr) + updatePanel(); } bool CantorShell::reallyClose(bool checkAllParts) { @@ -645,35 +656,46 @@ KParts::ReadWritePart* CantorShell::findPart(QWidget* widget) return nullptr; } -void CantorShell::updatePanel() +void CantorShell::initPanels() { - unplugActionList(QLatin1String("view_show_panel_list")); + m_panelHandler.loadPlugins(); - //remove all of the previous panels (but do not delete the widgets) - foreach(QDockWidget* dock, m_panels) + QList plugins = m_panelHandler.allPlugins(); + foreach(Cantor::PanelPlugin* plugin, plugins) { - QWidget* widget=dock->widget(); - if(widget!=nullptr) + if(plugin==nullptr) { - widget->setParent(this); - widget->hide(); + qDebug()<<"somethings wrong"; + continue; } - dock->deleteLater(); - } - m_panels.clear(); - QList panelActions; + qDebug()<<"adding panel for "<name(); + plugin->setParentWidget(this); + plugin->connectToShell(this); + + QDockWidget* docker=new QDockWidget(plugin->name(), this); + docker->setObjectName(plugin->name()); + docker->setWidget(plugin->widget()); + addDockWidget ( Qt::RightDockWidgetArea, docker ); + + docker->hide(); + + connect(plugin, &Cantor::PanelPlugin::visibilityRequested, this, &CantorShell::pluginVisibilityRequested); + connect(plugin, &Cantor::PanelPlugin::requestRunCommand, this, &CantorShell::pluginCommandRunRequested); + + m_panels.append(docker); - Cantor::PanelPluginHandler* handler=m_part->findChild(QLatin1String("PanelPluginHandler")); - if(!handler) - { - qDebug()<<"no PanelPluginHandle found for this part"; - return; } +} - QDockWidget* last=nullptr; - bool isNewWorksheet = !m_pluginsVisibility.contains(m_part); +void CantorShell::updatePanel() +{ + unplugActionList(QLatin1String("view_show_panel_list")); + + QList panelActions; + + bool isNewWorksheet = !m_pluginsVisibility.contains(m_part); if (isNewWorksheet) { KConfigGroup panelStatusGroup(KSharedConfig::openConfig(), QLatin1String("PanelsStatus")); @@ -685,50 +707,86 @@ void CantorShell::updatePanel() } } - QList plugins=handler->plugins(); - foreach(Cantor::PanelPlugin* plugin, plugins) + Cantor::WorksheetAccessInterface* wa = nullptr; + if (m_part) + wa = m_part->findChild(Cantor::WorksheetAccessInterface::Name); + + // Worksheet interface can be missing on m_part clossing (and m_part on this moment can be nullptr) + QList plugins; + if (wa) { - if(plugin==nullptr) + QDockWidget* last=nullptr; + plugins = m_panelHandler.plugins(wa->session()); + for(Cantor::PanelPlugin* plugin : plugins) { - qDebug()<<"somethings wrong"; - continue; - } - - qDebug()<<"adding panel for "<name(); - plugin->setParentWidget(this); + if(plugin==nullptr) + { + qDebug()<<"somethings wrong"; + continue; + } - QDockWidget* docker=new QDockWidget(plugin->name(), this); - docker->setObjectName(plugin->name()); - docker->setWidget(plugin->widget()); - addDockWidget ( Qt::RightDockWidgetArea, docker ); + qDebug()<<"adding panel for "<name(); - // Set visibility for dock from saved info - if (isNewWorksheet) - { - if (plugin->showOnStartup()) - docker->show(); - else - docker->hide(); - } - else - { - if (m_pluginsVisibility[m_part].contains(plugin->name())) - docker->show(); + if (m_pluginsStates.contains(m_part)) + plugin->restoreState(m_pluginsStates[m_part][plugin->name()]); else - docker->hide(); - } + { + Cantor::PanelPlugin::State initState; + initState.session = wa->session(); + plugin->restoreState(initState); + } - if(last!=nullptr) - tabifyDockWidget(last, docker); - last=docker; + QDockWidget* foundDocker = nullptr; + for (QDockWidget* docker : m_panels) + if (docker->objectName() == plugin->name()) + { + foundDocker = docker; + break; + } - connect(plugin, &Cantor::PanelPlugin::visibilityRequested, this, &CantorShell::pluginVisibilityRequested); + if (!foundDocker) + { + qDebug() << "something wrong: can't find panel for plugin \"" << plugin->name() << "\""; + continue; + } - m_panels.append(docker); + // Set visibility for dock from saved info + if (isNewWorksheet) + { + if (plugin->showOnStartup()) + foundDocker->show(); + else + foundDocker->hide(); + } + else + { + if (m_pluginsVisibility[m_part].contains(plugin->name())) + foundDocker->show(); + else + foundDocker->hide(); + } + + if(last!=nullptr) + tabifyDockWidget(last, foundDocker); + last = foundDocker; - //Create the action to show/hide this panel - panelActions<toggleViewAction(); + //Create the action to show/hide this panel + panelActions<toggleViewAction(); + } + } + + // Hide plugins, which don't supported on current session + QList allPlugins=m_panelHandler.allPlugins(); + for(Cantor::PanelPlugin* plugin : allPlugins) + { + if (plugins.indexOf(plugin) == -1) + for (QDockWidget* docker : m_panels) + if (docker->objectName() == plugin->name()) + { + docker->hide(); + break; + } } plugActionList(QLatin1String("view_show_panel_list"), panelActions); @@ -769,7 +827,7 @@ void CantorShell::pluginVisibilityRequested() Cantor::PanelPlugin* plugin = static_cast(sender()); for (QDockWidget* docker: m_panels) { - if (plugin->name() == docker->windowTitle()) + if (plugin->name() == docker->objectName()) { if (docker->isHidden()) docker->show(); @@ -829,3 +887,11 @@ void CantorShell::updateBackendForPart(const QString& backend) } } } + +void CantorShell::pluginCommandRunRequested(const QString& cmd) +{ + if (m_part) + { + QMetaObject::invokeMethod(m_part, "runCommand", Qt::QueuedConnection, Q_ARG(QString, cmd)); + } +} diff --git a/src/cantor.h b/src/cantor.h index b32fc5826ff745b46eca4c3ccac91e986e685075..2c1196722183bc6c8f99eaf199540d32953e733f 100644 --- a/src/cantor.h +++ b/src/cantor.h @@ -28,6 +28,9 @@ #include #include +#include "lib/panelpluginhandler.h" +#include "lib/panelplugin.h" + class QTabWidget; class KTextEdit; class KRecentFilesAction; @@ -40,6 +43,8 @@ namespace KParts{ class ReadWritePart; } +using PanelStates = QMap; + /** * This is the application "Shell". It has a menubar, toolbar, and * statusbar but relies on the "Part" to do all the real work. @@ -75,6 +80,9 @@ protected: */ void readProperties(const KConfigGroup &) override; +Q_SIGNALS: + void showHelp(QString); + public Q_SLOTS: void addWorksheet(const QString& backendName); /// Use this method/slot to load whatever file/URL you have @@ -97,10 +105,12 @@ private Q_SLOTS: void downloadExamples(); void openExample(); + void initPanels(); void updatePanel(); void updateNewSubmenu(); void pluginVisibilityRequested(); + void pluginCommandRunRequested(const QString& cmd); private: void setupActions(); @@ -113,6 +123,7 @@ private: private: QMap m_pluginsVisibility; + QMap m_pluginsStates; QList m_parts; QMap m_parts2Backends; KParts::ReadWritePart* m_part; @@ -122,6 +133,8 @@ private: QDockWidget* m_helpDocker; KRecentFilesAction* m_recentProjectsAction; + Cantor::PanelPluginHandler m_panelHandler; + // For better UX: set previous used filter in "Open" action as default filter QString m_previousFilter; }; diff --git a/src/cantor_part.cpp b/src/cantor_part.cpp index 3348b3f6df071acd4b3af93ce50eb331b9b4ca1e..f011d7acfbf0623ea84023728501ca41d08c9db9 100644 --- a/src/cantor_part.cpp +++ b/src/cantor_part.cpp @@ -110,7 +110,6 @@ class WorksheetAccessInterfaceImpl : public Cantor::WorksheetAccessInterface CantorPart::CantorPart( QWidget *parentWidget, QObject *parent, const QVariantList & args ): KParts::ReadWritePart(parent), m_searchBar(nullptr), - m_panelHandler(new Cantor::PanelPluginHandler(this)), m_initProgressDlg(nullptr), m_showProgressDlg(true), m_currectZoomAction(nullptr), @@ -118,8 +117,6 @@ CantorPart::CantorPart( QWidget *parentWidget, QObject *parent, const QVariantLi m_statusBarBlocked(false), m_sessionStatusCounter(0) { - connect(m_panelHandler, &Cantor::PanelPluginHandler::pluginsChanged, this, &CantorPart::pluginsChanged); - QString backendName; if(!args.isEmpty()) backendName = args.first().toString(); @@ -693,7 +690,6 @@ void CantorPart::initialized() connect(m_worksheet->session(), &Cantor::Session::error, this, &CantorPart::showSessionError); loadAssistants(); - m_panelHandler->setSession(m_worksheet->session()); adjustGuiToSession(); // Don't set modification flag, if we add command entry in empty worksheet @@ -773,12 +769,6 @@ void CantorPart::updateCaption() emit setCaption(filename+QLatin1Char(' ') + i18n("[read-only]"), QIcon()); } -void CantorPart::pluginsChanged() -{ - for (auto* plugin : m_panelHandler->plugins()) - connect(plugin, &Cantor::PanelPlugin::requestRunCommand, this, &CantorPart::runCommand); -} - void CantorPart::loadAssistants() { qDebug()<<"loading assistants..."; diff --git a/src/cantor_part.h b/src/cantor_part.h index cd4b2a57aa90e3f142f14fab5fcc608245bd36fc..e71346316e6fd9aa64a08b7479e262b8bb174612 100644 --- a/src/cantor_part.h +++ b/src/cantor_part.h @@ -84,7 +84,6 @@ Q_SIGNALS: void setCaption(const QString& caption, const QIcon& icon); void showHelp(const QString& help); void worksheetSave(const QUrl& url); - void requestOpenWorksheet(const QUrl& url); void setBackendName(const QString& name); public Q_SLOTS: @@ -132,7 +131,6 @@ protected Q_SLOTS: void worksheetSessionLoginDone(); void initialized(); - void pluginsChanged(); void runCommand(const QString& value); void runAssistant(); @@ -168,7 +166,6 @@ private: WorksheetView *m_worksheetview; SearchBar *m_searchBar; QPointer m_scriptEditor; - Cantor::PanelPluginHandler* m_panelHandler; QProgressDialog* m_initProgressDlg; bool m_showProgressDlg; diff --git a/src/lib/panelplugin.cpp b/src/lib/panelplugin.cpp index b7d18263799935b0608008baca6361bc7d7e1cff..9364782e5b97092ef39acd279096a93821c4e307 100644 --- a/src/lib/panelplugin.cpp +++ b/src/lib/panelplugin.cpp @@ -75,18 +75,24 @@ QString PanelPlugin::name() return d->name; } -Session* PanelPlugin::session() +Cantor::PanelPlugin::State Cantor::PanelPlugin::saveState() { - return d->session; + Cantor::PanelPlugin::State state; + state.session = d->session; + return state; } -void PanelPlugin::setSession(Session* session) +void Cantor::PanelPlugin::restoreState(const Cantor::PanelPlugin::State& state) { - d->session=session; - onSessionChanged(); + d->session = state.session; +} + +Cantor::Session * Cantor::PanelPlugin::session() +{ + return d->session; } -void PanelPlugin::onSessionChanged() +void Cantor::PanelPlugin::connectToShell(QObject* /* cantorShell */) { } diff --git a/src/lib/panelplugin.h b/src/lib/panelplugin.h index 6bd4e06ccf1170451d9759cc54c2270a8e3e0978..4ceb9905ff9c55c5ac2ab401303310d4fbb64034 100644 --- a/src/lib/panelplugin.h +++ b/src/lib/panelplugin.h @@ -40,6 +40,12 @@ class CANTOR_EXPORT PanelPlugin : public QObject { Q_OBJECT public: + struct State { + Session* session{nullptr}; + QVector inners; + }; + + /** * Create a new PanelPlugin * @param parent the parent Object @see QObject @@ -91,14 +97,21 @@ class CANTOR_EXPORT PanelPlugin : public QObject QWidget* parentWidget(); /** - * sets the session this plugin operates on + * Save state of panel to storable form + * **/ - void setSession(Session* session); + virtual State saveState(); /** - * returns the session + * Restore state + * Can contains only session - this is init state from Cantor shell */ - Session* session(); + virtual void restoreState(const State& state); + + /** + * For proper connection to Cantor shell. All connections should be done here + */ + virtual void connectToShell(QObject* cantorShell); /** * Show on worksheet startup or not @@ -106,13 +119,13 @@ class CANTOR_EXPORT PanelPlugin : public QObject */ virtual bool showOnStartup(); + protected: + Session* session(); + Q_SIGNALS: void requestRunCommand(const QString& cmd); void visibilityRequested(); - protected: - virtual void onSessionChanged(); - private: PanelPluginPrivate* d; }; diff --git a/src/lib/panelpluginhandler.cpp b/src/lib/panelpluginhandler.cpp index a4f0878eaecd60baa62c6732d1f0421dd01fc37b..394f5a5427ee73edcf839dc99477de9e9c01d68c 100644 --- a/src/lib/panelpluginhandler.cpp +++ b/src/lib/panelpluginhandler.cpp @@ -35,14 +35,12 @@ class Cantor::PanelPluginHandlerPrivate { public: QList plugins; - Cantor::Session* session; }; PanelPluginHandler::PanelPluginHandler( QObject* parent ) : QObject(parent) , d(new PanelPluginHandlerPrivate) { setObjectName(QStringLiteral("PanelPluginHandler")); - d->session=nullptr; } PanelPluginHandler::~PanelPluginHandler() @@ -52,34 +50,28 @@ PanelPluginHandler::~PanelPluginHandler() void PanelPluginHandler::loadPlugins() { - if(d->session==nullptr) - return; - qDebug()<<"loading panel plugins for session of type "<session->backend()->name(); - QStringList panelDirs; - foreach(const QString &dir, QCoreApplication::libraryPaths()){ + foreach(const QString &dir, QCoreApplication::libraryPaths()) { panelDirs << dir + QDir::separator() + QLatin1String("cantor/panels"); } QPluginLoader loader; - const Cantor::Backend::Capabilities capabilities = d->session->backend()->capabilities(); - const QStringList& extensions = d->session->backend()->extensions(); foreach(const QString &dir, panelDirs){ - qDebug() << "dir: " << dir; QStringList panels; QDir panelDir = QDir(dir); panels = panelDir.entryList(); - foreach (const QString &panel, panels){ + foreach (const QString &panel, panels) + { if (panel==QLatin1String(".") || panel==QLatin1String("..")) continue; loader.setFileName(dir + QDir::separator() + panel); if (!loader.load()){ - qDebug() << "Error while loading panel: " << panel; + qDebug() << "Error while loading panel" << panel << ": \"" << loader.errorString() << "\""; continue; } @@ -89,47 +81,50 @@ void PanelPluginHandler::loadPlugins() KPluginMetaData info(loader); plugin->setPluginInfo(info); - bool supported=true; - foreach(const QString& req, plugin->requiredExtensions()){ - // FIXME: That req.isEmpty() is there just because Help Panel has req - // empty, returning FALSE when the comparison must to return TRUE. - supported = supported && (extensions.contains(req) || req.isEmpty()); - } + // This set session to null inside plugin + Cantor::PanelPlugin::State emptyState; + plugin->restoreState(emptyState); - supported = supported && ( (capabilities & plugin->requiredCapabilities()) == plugin->requiredCapabilities()); - - if(supported) - { - qDebug() << "plugin " << info.name()<<" is supported, requires extensions " << plugin->requiredExtensions(); - d->plugins.append(plugin); - plugin->setSession(d->session); - }else - { - qDebug() << "plugin " << info.name() <<" is not supported"; - plugin->deleteLater(); - } + d->plugins.append(plugin); } } - - emit pluginsChanged(); -} - -void PanelPluginHandler::setSession(Session* session) -{ - qDeleteAll(d->plugins); - d->plugins.clear(); - d->session=session; - loadPlugins(); } -QList PanelPluginHandler::plugins() +QList Cantor::PanelPluginHandler::allPlugins() { return d->plugins; } -void PanelPluginHandler::addPlugin(PanelPlugin* plugin) +QList PanelPluginHandler::plugins(Session* session) { - d->plugins.append(plugin); -} + QList pluginsForSession; + + if (session == nullptr) + return pluginsForSession; + + const Cantor::Backend::Capabilities capabilities = session->backend()->capabilities(); + const QStringList& extensions = session->backend()->extensions(); + + qDebug()<<"loading panel plugins for session of type "<backend()->name(); + for(Cantor::PanelPlugin* plugin : d->plugins) + { + bool supported=true; + foreach(const QString& req, plugin->requiredExtensions()){ + // FIXME: That req.isEmpty() is there just because Help Panel has req + // empty, returning FALSE when the comparison must to return TRUE. + supported = supported && (extensions.contains(req) || req.isEmpty()); + } + supported = supported && ( (capabilities & plugin->requiredCapabilities()) == plugin->requiredCapabilities()); + if(supported) + { + qDebug() << "plugin " << plugin->name()<<" is supported, requires extensions " << plugin->requiredExtensions(); + pluginsForSession.append(plugin); + } + else + qDebug() << "plugin " << plugin->name() <<" is not supported"; + } + + return pluginsForSession; +} diff --git a/src/lib/panelpluginhandler.h b/src/lib/panelpluginhandler.h index db66b30650228b168799ab7073747327f8308892..f3930961cec5eb3f257232ec959b7b7e575fca42 100644 --- a/src/lib/panelpluginhandler.h +++ b/src/lib/panelpluginhandler.h @@ -32,8 +32,7 @@ class Session; /** * Simple interface that exports a list of known PanelPlugins. - * Needed as the Panel must be handled by the Shell while plugins - * belong to the Part. + * Needed as the Panel must be handled by the Shell */ class CANTOR_EXPORT PanelPluginHandler : public QObject @@ -43,16 +42,9 @@ class CANTOR_EXPORT PanelPluginHandler : public QObject explicit PanelPluginHandler(QObject* parent); ~PanelPluginHandler() override; - QList plugins(); + QList allPlugins(); + QList plugins(Session* session); - void addPlugin(PanelPlugin* plugin); - - void setSession(Session* session); - - Q_SIGNALS: - void pluginsChanged(); - - private: void loadPlugins(); private: diff --git a/src/panelplugins/filebrowserpanel/filebrowserpanelplugin.cpp b/src/panelplugins/filebrowserpanel/filebrowserpanelplugin.cpp index 6e968dc918d50b1ef215f8bc351477d24b8570d4..93fb478b91a2a3360c4accf34e1b17adae8b9eba 100644 --- a/src/panelplugins/filebrowserpanel/filebrowserpanelplugin.cpp +++ b/src/panelplugins/filebrowserpanel/filebrowserpanelplugin.cpp @@ -74,12 +74,17 @@ QWidget* FileBrowserPanelPlugin::widget() constructMainWidget(); - connect(this, SIGNAL(requestOpenWorksheet(QUrl)), parent()->parent(), SIGNAL(requestOpenWorksheet(QUrl))); + } return m_mainWidget; } +void FileBrowserPanelPlugin::connectToShell(QObject* cantorShell) +{ + connect(this, SIGNAL(requestOpenWorksheet(QUrl)), cantorShell, SLOT(load(QUrl))); +} + bool FileBrowserPanelPlugin::showOnStartup() { return false; diff --git a/src/panelplugins/filebrowserpanel/filebrowserpanelplugin.h b/src/panelplugins/filebrowserpanel/filebrowserpanelplugin.h index 460652b71572b9255dc7829b4867440894111411..78396c745942834b0ee80814128776f861786b3e 100644 --- a/src/panelplugins/filebrowserpanel/filebrowserpanelplugin.h +++ b/src/panelplugins/filebrowserpanel/filebrowserpanelplugin.h @@ -44,6 +44,10 @@ class FileBrowserPanelPlugin : public Cantor::PanelPlugin bool showOnStartup() override; + void connectToShell(QObject * cantorShell) override; + + // No use restore files, because the FileBrowser Panel can be shared between session + Q_SIGNALS: void requestOpenWorksheet(const QUrl&); diff --git a/src/panelplugins/helppanel/helppanelplugin.cpp b/src/panelplugins/helppanel/helppanelplugin.cpp index 3a493fd7246cb3e640fe99cc577dedcf1bf92fb4..82f7b94885c77a1e39b86788eb31094dba0540bd 100644 --- a/src/panelplugins/helppanel/helppanelplugin.cpp +++ b/src/panelplugins/helppanel/helppanelplugin.cpp @@ -40,10 +40,6 @@ QWidget* HelpPanelPlugin::widget() m_edit = new KTextEdit(parentWidget()); setHelpHtml(i18n("

Cantor

The KDE way to do Mathematics")); m_edit->setTextInteractionFlags(Qt::TextBrowserInteraction); - - //using old-style syntax here, otherwise we'd need to include and link to CantorPart and KParts - connect(parent()->parent(), SIGNAL(showHelp(QString)), this, SLOT(setHelpHtml(QString))); - connect(parent()->parent(), SIGNAL(showHelp(QString)), this, SIGNAL(visibilityRequested())); } return m_edit; @@ -71,5 +67,29 @@ bool HelpPanelPlugin::showOnStartup() return false; } +void HelpPanelPlugin::connectToShell(QObject* cantorShell) +{ + //using old-style syntax here, otherwise we'd need to include and link to CantorPart and KParts + connect(cantorShell, SIGNAL(showHelp(QString)), this, SLOT(setHelpHtml(QString))); + connect(cantorShell, SIGNAL(showHelp(QString)), this, SIGNAL(visibilityRequested())); +} + +Cantor::PanelPlugin::State HelpPanelPlugin::saveState() +{ + Cantor::PanelPlugin::State state = PanelPlugin::saveState(); + state.inners.append(m_edit->toHtml()); + return state; +} + +void HelpPanelPlugin::restoreState(const Cantor::PanelPlugin::State& state) +{ + PanelPlugin::restoreState(state); + if(state.inners.size() > 0) + setHelpHtml(state.inners.first().toString()); + else + setHelpHtml(i18n("

Cantor

The KDE way to do Mathematics")); +} + + K_PLUGIN_FACTORY_WITH_JSON(helppanelplugin, "helppanelplugin.json", registerPlugin();) #include "helppanelplugin.moc" diff --git a/src/panelplugins/helppanel/helppanelplugin.h b/src/panelplugins/helppanel/helppanelplugin.h index 736b0fb606f04cc717023daa8f8888e6c6b0f93e..6a0152f1a8a2e12811c70bcba3753a4ba53f616d 100644 --- a/src/panelplugins/helppanel/helppanelplugin.h +++ b/src/panelplugins/helppanel/helppanelplugin.h @@ -36,6 +36,12 @@ class HelpPanelPlugin : public Cantor::PanelPlugin bool showOnStartup() override; + void connectToShell(QObject * cantorShell) override; + + Cantor::PanelPlugin::State saveState() override; + + void restoreState(const Cantor::PanelPlugin::State & state) override; + public Q_SLOTS: void setHelpHtml(const QString&); void showHelp(const QString&); diff --git a/src/panelplugins/variablemgr/variablemanagerplugin.cpp b/src/panelplugins/variablemgr/variablemanagerplugin.cpp index ea32ee07617f5222e5976a423b34f43b3c88e0c7..5f42f21508c1169d873e15aa5c69558d4562ad2f 100644 --- a/src/panelplugins/variablemgr/variablemanagerplugin.cpp +++ b/src/panelplugins/variablemgr/variablemanagerplugin.cpp @@ -33,8 +33,9 @@ VariableManagerPlugin::~VariableManagerPlugin() delete m_widget; } -void VariableManagerPlugin::onSessionChanged() +void VariableManagerPlugin::restoreState(const Cantor::PanelPlugin::State& state) { + PanelPlugin::restoreState(state); if(m_widget) m_widget->setSession(session()); } diff --git a/src/panelplugins/variablemgr/variablemanagerplugin.h b/src/panelplugins/variablemgr/variablemanagerplugin.h index 20fc25eb8f8773c08f3c4af1e94c951012c791fb..44a8cfdf73515078e5f22243b1e52da2a8ca0bb8 100644 --- a/src/panelplugins/variablemgr/variablemanagerplugin.h +++ b/src/panelplugins/variablemgr/variablemanagerplugin.h @@ -36,9 +36,7 @@ class VariableManagerPlugin : public Cantor::PanelPlugin Cantor::Backend::Capabilities requiredCapabilities() override; - protected: - void onSessionChanged() override; - + void restoreState(const Cantor::PanelPlugin::State & state) override; private: QPointer m_widget; diff --git a/src/panelplugins/variablemgr/variablemanagerwidget.cpp b/src/panelplugins/variablemgr/variablemanagerwidget.cpp index 9fb8bb4510894b266b0ab1b79f751dd831a85026..46b753f117c8e79c0e222fa0186f8f0238d6a5d8 100644 --- a/src/panelplugins/variablemgr/variablemanagerwidget.cpp +++ b/src/panelplugins/variablemgr/variablemanagerwidget.cpp @@ -48,28 +48,28 @@ m_table(new QTreeView(this)) QHBoxLayout* btnLayout=new QHBoxLayout(); int size=KIconLoader::global()->currentSize(KIconLoader::MainToolbar); - QToolButton* m_newBtn=new QToolButton(this); + m_newBtn=new QToolButton(this); m_newBtn->setIcon(QIcon::fromTheme(QLatin1String("document-new"))); m_newBtn->setToolTip(i18n("Add new variable")); m_newBtn->setIconSize(QSize(size, size)); connect(m_newBtn, &QToolButton::clicked, this, &VariableManagerWidget::newVariable); btnLayout->addWidget(m_newBtn); - QToolButton* m_loadBtn=new QToolButton(this); + m_loadBtn=new QToolButton(this); m_loadBtn->setIcon(QIcon::fromTheme(QLatin1String("document-open"))); m_loadBtn->setToolTip(i18n("Load Variables")); m_loadBtn->setIconSize(QSize(size, size)); connect(m_loadBtn, &QToolButton::clicked, this, &VariableManagerWidget::load); btnLayout->addWidget(m_loadBtn); - QToolButton* m_saveBtn=new QToolButton(this); + m_saveBtn=new QToolButton(this); m_saveBtn->setIcon(QIcon::fromTheme(QLatin1String("document-save"))); m_saveBtn->setToolTip(i18n("Store Variables")); m_saveBtn->setIconSize(QSize(size, size)); connect(m_saveBtn, &QToolButton::clicked, this, &VariableManagerWidget::save); btnLayout->addWidget(m_saveBtn); - QToolButton* m_clearBtn=new QToolButton(this); + m_clearBtn=new QToolButton(this); m_clearBtn->setIcon(QIcon::fromTheme(QLatin1String("edit-clear"))); m_clearBtn->setToolTip(i18n("Clear Variables")); m_clearBtn->setIconSize(QSize(size, size)); @@ -79,31 +79,32 @@ m_table(new QTreeView(this)) layout->addLayout(btnLayout); setSession(session); - - //check for the methods the backend actually supports, and disable the buttons accordingly - Cantor::VariableManagementExtension* ext= - dynamic_cast(m_session->backend()->extension(QLatin1String("VariableManagementExtension"))); - if (ext) - { - if(ext->loadVariables(QString()).isNull()) - m_loadBtn->setDisabled(true); - if(ext->saveVariables(QString()).isNull()) - m_saveBtn->setDisabled(true); - if(ext->addVariable(QString(), QString()).isNull()) - m_newBtn->setDisabled(true); - if(ext->clearVariables().isNull()) - m_clearBtn->setDisabled(true); - } } void VariableManagerWidget::setSession(Cantor::Session* session) { - m_session=session; + m_session = session; if(session) { m_model=session->variableDataModel(); if(m_table) m_table->setModel(m_model); + + //check for the methods the backend actually supports, and disable the buttons accordingly + Cantor::VariableManagementExtension* ext = dynamic_cast( + m_session->backend()->extension(QLatin1String("VariableManagementExtension")) + ); + if (ext) + { + if(ext->loadVariables(QString()).isNull()) + m_loadBtn->setDisabled(true); + if(ext->saveVariables(QString()).isNull()) + m_saveBtn->setDisabled(true); + if(ext->addVariable(QString(), QString()).isNull()) + m_newBtn->setDisabled(true); + if(ext->clearVariables().isNull()) + m_clearBtn->setDisabled(true); + } } } diff --git a/src/panelplugins/variablemgr/variablemanagerwidget.h b/src/panelplugins/variablemgr/variablemanagerwidget.h index 45fe27e4a32ce51adafa8d47bc5499f479778f31..0b9bcc2f01d58dc747fac3f6c0f599cb2d282f35 100644 --- a/src/panelplugins/variablemgr/variablemanagerwidget.h +++ b/src/panelplugins/variablemgr/variablemanagerwidget.h @@ -28,6 +28,7 @@ class Session; } class QTreeView; +class QToolButton; class QAbstractItemModel; class VariableManagerWidget : public QWidget @@ -53,6 +54,10 @@ class VariableManagerWidget : public QWidget Cantor::Session* m_session; QAbstractItemModel* m_model; QTreeView* m_table; + QToolButton* m_newBtn; + QToolButton* m_loadBtn; + QToolButton* m_saveBtn; + QToolButton* m_clearBtn; }; #endif /* _VARIABLEMANAGERWIDGET_H */