From bfdeb32fef774f5b7988cef1b1c71ae7d72c2d9f Mon Sep 17 00:00:00 2001 From: ephy Date: Sun, 21 Mar 2010 16:50:00 +0000 Subject: [PATCH] GCS/coreplugin: Changes to remember layout of views when GCS is closed. git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@359 ebee16cc-31ac-478f-84a7-5cbb03baadba --- ground/src/plugins/coreplugin/coreplugin.cpp | 13 +- .../src/plugins/coreplugin/fancytabwidget.cpp | 6 +- ground/src/plugins/coreplugin/iuavgadget.h | 9 +- .../plugins/coreplugin/iuavgadgetfactory.h | 6 +- ground/src/plugins/coreplugin/mainwindow.cpp | 24 ++- ground/src/plugins/coreplugin/mainwindow.h | 5 +- .../uavgadgetmanager/uavgadgetmanager.cpp | 200 +++++++----------- .../uavgadgetmanager/uavgadgetmanager.h | 6 +- .../uavgadgetmanager/uavgadgetview.cpp | 116 +++++----- .../uavgadgetmanager/uavgadgetview.h | 5 +- .../src/plugins/coreplugin/uavgadgetmode.cpp | 5 +- ground/src/plugins/coreplugin/uavgadgetmode.h | 1 + 12 files changed, 177 insertions(+), 219 deletions(-) diff --git a/ground/src/plugins/coreplugin/coreplugin.cpp b/ground/src/plugins/coreplugin/coreplugin.cpp index dd155977d..910ae7f5c 100644 --- a/ground/src/plugins/coreplugin/coreplugin.cpp +++ b/ground/src/plugins/coreplugin/coreplugin.cpp @@ -41,7 +41,6 @@ using namespace Core::Internal; CorePlugin::CorePlugin() : m_mainWindow(new MainWindow) -// m_uavGadgetMode(0) { } @@ -69,21 +68,27 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage) void CorePlugin::extensionsInitialized() { + // Workspace 1 UAVGadgetMode *uavGadgetMode; - UAVGadgetManager *m_uavGadgetManager = new UAVGadgetManager(CoreImpl::instance(), m_mainWindow); + UAVGadgetManager *m_uavGadgetManager; + m_uavGadgetManager = new UAVGadgetManager(CoreImpl::instance(), m_mainWindow); m_uavGadgetManager->hide(); - uavGadgetMode = new UAVGadgetMode(m_uavGadgetManager, QString("Mode 1"), + uavGadgetMode = new UAVGadgetMode(m_uavGadgetManager, QString(tr("Workspace 1")), QIcon(":/core/images/openpilot_logo_64.png"), 90, QString("Mode1")); m_uavGadgetManager->setUAVGadgetMode(uavGadgetMode); m_uavGadgetModes.append(uavGadgetMode); addObject(uavGadgetMode); + m_mainWindow->addUAVGadgetManager(m_uavGadgetManager); + + // Workspace 2 m_uavGadgetManager = new UAVGadgetManager(CoreImpl::instance(), m_mainWindow); m_uavGadgetManager->hide(); - uavGadgetMode = new UAVGadgetMode(m_uavGadgetManager, QString("Mode 2"), + uavGadgetMode = new UAVGadgetMode(m_uavGadgetManager, QString(tr("Workspace 2")), QIcon(":/core/images/plus.png"), 60, QString("Mode2")); m_uavGadgetManager->setUAVGadgetMode(uavGadgetMode); m_uavGadgetModes.append(uavGadgetMode); addObject(uavGadgetMode); + m_mainWindow->addUAVGadgetManager(m_uavGadgetManager); m_mainWindow->extensionsInitialized(); } diff --git a/ground/src/plugins/coreplugin/fancytabwidget.cpp b/ground/src/plugins/coreplugin/fancytabwidget.cpp index 1f0958471..c11216385 100644 --- a/ground/src/plugins/coreplugin/fancytabwidget.cpp +++ b/ground/src/plugins/coreplugin/fancytabwidget.cpp @@ -79,9 +79,9 @@ QSize FancyTabBar::tabSizeHint(bool minimum) const boldFont.setBold(true); QFontMetrics fm(boldFont); int spacing = 6; - int width = 60 + spacing + 2; + int width = 90 + spacing + 2; - int iconHeight = minimum ? 0 : 32; + int iconHeight = minimum ? 0 : 16; return QSize(width, iconHeight + spacing + fm.height()); } @@ -336,7 +336,7 @@ FancyTabWidget::FancyTabWidget(QWidget *parent) vlayout->setSpacing(0); vlayout->addLayout(m_modesStack); vlayout->addWidget(m_selectionWidget); - //vlayout->addWidget(m_statusBar); //status bar is not used for now +// vlayout->addWidget(m_statusBar); //status bar is not used for now QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->setMargin(0); diff --git a/ground/src/plugins/coreplugin/iuavgadget.h b/ground/src/plugins/coreplugin/iuavgadget.h index c52ecda4c..92c07b252 100644 --- a/ground/src/plugins/coreplugin/iuavgadget.h +++ b/ground/src/plugins/coreplugin/iuavgadget.h @@ -48,15 +48,16 @@ public: virtual QList context() const = 0; virtual QWidget *widget() = 0; virtual QString contextHelpId() const { return QString(); } + virtual QString gadgetKind() { return m_gadgetKind; } // virtual void saveConfiguration() = 0; // virtual void loadConfiguration(QString ) = 0; // virtual QStringList getConfigurationNames() = 0; virtual QWidget *toolBar() = 0; - virtual void setIndex(int index) { m_index = index; } - virtual int index() { return m_index; } -private: - int m_index; + virtual QByteArray saveState() { return 0; } + virtual void restoreState(QByteArray state) { } +protected: + QString m_gadgetKind; }; } // namespace Core diff --git a/ground/src/plugins/coreplugin/iuavgadgetfactory.h b/ground/src/plugins/coreplugin/iuavgadgetfactory.h index 9e954153c..8c79a1680 100644 --- a/ground/src/plugins/coreplugin/iuavgadgetfactory.h +++ b/ground/src/plugins/coreplugin/iuavgadgetfactory.h @@ -48,7 +48,11 @@ public: virtual ~IUAVGadgetFactory() {} virtual IUAVGadget *createUAVGadget(QWidget *parent) = 0; - virtual QString name() = 0; + virtual QString gadgetKind() const { return m_gadgetKind; } + virtual QString name() const { return m_name; } +protected: + QString m_name; + QString m_gadgetKind; }; } // namespace Core diff --git a/ground/src/plugins/coreplugin/mainwindow.cpp b/ground/src/plugins/coreplugin/mainwindow.cpp index aa5d2b5a7..76d65e3c1 100644 --- a/ground/src/plugins/coreplugin/mainwindow.cpp +++ b/ground/src/plugins/coreplugin/mainwindow.cpp @@ -113,7 +113,6 @@ MainWindow::MainWindow() : m_variableManager(new VariableManager(this)), m_viewManager(0), m_modeManager(0), - m_uavGadgetManager(0), m_connectionManager(0), m_mimeDatabase(new MimeDatabase), // m_rightPaneWidget(0), @@ -172,8 +171,6 @@ MainWindow::MainWindow() : m_viewManager = new ViewManager(this); m_messageManager = new MessageManager; -// m_uavGadgetManager = new UAVGadgetManager(m_coreImpl, this); -// m_uavGadgetManager->hide(); setCentralWidget(m_modeStack); connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*,QWidget*)), @@ -728,15 +725,20 @@ VariableManager *MainWindow::variableManager() const return m_variableManager; } - ConnectionManager *MainWindow::connectionManager() const { return m_connectionManager; } -UAVGadgetManager *MainWindow::uavGadgetManager() const +void MainWindow::addUAVGadgetManager(UAVGadgetManager *manager) { - return m_uavGadgetManager; + if (!m_uavGadgetManagers.contains(manager)) + m_uavGadgetManagers.append(manager); +} + +QList MainWindow::uavGadgetManagers() const +{ + return m_uavGadgetManagers; } ModeManager *MainWindow::modeManager() const @@ -870,7 +872,7 @@ void MainWindow::readSettings() if (geom.isValid()) { setGeometry(geom.toRect()); } else { - resize(1024, 700); + resize(750, 400); } if (m_settings->value(QLatin1String(maxKey), false).toBool()) setWindowState(Qt::WindowMaximized); @@ -878,7 +880,10 @@ void MainWindow::readSettings() m_settings->endGroup(); -// m_rightPaneWidget->readSettings(m_settings); + foreach (UAVGadgetManager *manager, m_uavGadgetManagers) { + manager->readSettings(); + } + // m_rightPaneWidget->readSettings(m_settings); } void MainWindow::writeSettings() @@ -900,6 +905,9 @@ void MainWindow::writeSettings() m_viewManager->saveSettings(m_settings); m_actionManager->saveSettings(m_settings); + foreach (UAVGadgetManager *manager, m_uavGadgetManagers) { + manager->saveSettings(); + } } void MainWindow::addAdditionalContext(int context) diff --git a/ground/src/plugins/coreplugin/mainwindow.h b/ground/src/plugins/coreplugin/mainwindow.h index 0512b81a8..0b027168f 100644 --- a/ground/src/plugins/coreplugin/mainwindow.h +++ b/ground/src/plugins/coreplugin/mainwindow.h @@ -92,7 +92,8 @@ public: Core::ActionManager *actionManager() const; Core::UniqueIDManager *uniqueIDManager() const; Core::MessageManager *messageManager() const; - Core::UAVGadgetManager *uavGadgetManager() const; + void addUAVGadgetManager(Core::UAVGadgetManager *manager); + QList uavGadgetManagers() const; Core::ConnectionManager *connectionManager() const; Core::VariableManager *variableManager() const; Core::ModeManager *modeManager() const; @@ -166,7 +167,7 @@ private: VariableManager *m_variableManager; ViewManager *m_viewManager; ModeManager *m_modeManager; - UAVGadgetManager *m_uavGadgetManager; + QList m_uavGadgetManagers; ConnectionManager *m_connectionManager; MimeDatabase *m_mimeDatabase; FancyTabWidget *m_modeStack; diff --git a/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetmanager.cpp b/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetmanager.cpp index e0af46199..de1640623 100644 --- a/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetmanager.cpp +++ b/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetmanager.cpp @@ -113,7 +113,7 @@ void UAVGadgetManagerPlaceHolder::currentModeChanged(Core::IMode *mode) if (m_mode == mode) { m_current = this; layout()->addWidget(gm); - gm->hideToolbars(gm->toolbarsHidden()); + gm->showToolbars(gm->toolbarsShown()); gm->show(); } } @@ -133,7 +133,7 @@ struct UAVGadgetManagerPrivate { ICore *m_core; // actions - static QAction *m_hideToolbarsAction; + static QAction *m_showToolbarsAction; static QAction *m_splitAction; static QAction *m_splitSideBySideAction; static QAction *m_removeCurrentSplitAction; @@ -144,7 +144,7 @@ struct UAVGadgetManagerPrivate { }; } -QAction *UAVGadgetManagerPrivate::m_hideToolbarsAction = 0; +QAction *UAVGadgetManagerPrivate::m_showToolbarsAction = 0; QAction *UAVGadgetManagerPrivate::m_splitAction = 0; QAction *UAVGadgetManagerPrivate::m_splitSideBySideAction = 0; QAction *UAVGadgetManagerPrivate::m_removeCurrentSplitAction = 0; @@ -165,7 +165,7 @@ UAVGadgetManagerPrivate::~UAVGadgetManagerPrivate() UAVGadgetManager::UAVGadgetManager(ICore *core, QWidget *parent) : QWidget(parent), - m_hidden(false), + m_showToolbars(false), m_d(new UAVGadgetManagerPrivate(core, parent)) { @@ -180,13 +180,13 @@ UAVGadgetManager::UAVGadgetManager(ICore *core, QWidget *parent) : ActionContainer *mwindow = am->actionContainer(Constants::M_WINDOW); Command *cmd; - // The actions m_d->m_hideToolbarsAction etc are common to all instances of UAVGadgetManager + // The actions m_d->m_showToolbarsAction etc are common to all instances of UAVGadgetManager // which means that they share the menu items/signals in the Window menu. // That is, they all connect their slots to the same signal and have to check in the slot // if the current mode is their mode, otherwise they just ignore the signal. // The first UAVGadgetManager creates the actions, and the following just use them // (This also implies that they share the same context.) - if (m_d->m_hideToolbarsAction == 0) + if (m_d->m_showToolbarsAction == 0) { //Window menu separators QAction *tmpaction = new QAction(this); @@ -194,9 +194,9 @@ UAVGadgetManager::UAVGadgetManager(ICore *core, QWidget *parent) : cmd = am->registerAction(tmpaction, QLatin1String("OpenPilot.Window.Sep.Split"), uavGadgetManagerContext); mwindow->addAction(cmd, Constants::G_WINDOW_HIDE_TOOLBAR); - m_d->m_hideToolbarsAction = new QAction(tr("Hide toolbars"), this); - m_d->m_hideToolbarsAction->setCheckable(true); - cmd = am->registerAction(m_d->m_hideToolbarsAction, Constants::HIDE_TOOLBARS, uavGadgetManagerContext); + m_d->m_showToolbarsAction = new QAction(tr("Show toolbars"), this); + m_d->m_showToolbarsAction->setCheckable(true); + cmd = am->registerAction(m_d->m_showToolbarsAction, Constants::HIDE_TOOLBARS, uavGadgetManagerContext); cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+F10"))); mwindow->addAction(cmd, Constants::G_WINDOW_HIDE_TOOLBAR); @@ -206,7 +206,7 @@ UAVGadgetManager::UAVGadgetManager(ICore *core, QWidget *parent) : cmd = am->registerAction(tmpaction2, QLatin1String("OpenPilot.Window.Sep.Split2"), uavGadgetManagerContext); mwindow->addAction(cmd, Constants::G_WINDOW_SPLIT); } - connect(m_d->m_hideToolbarsAction, SIGNAL(triggered(bool)), this, SLOT(hideToolbars(bool))); + connect(m_d->m_showToolbarsAction, SIGNAL(triggered(bool)), this, SLOT(showToolbars(bool))); #ifdef Q_WS_MAC QString prefix = tr("Meta+Shift"); @@ -269,6 +269,7 @@ UAVGadgetManager::UAVGadgetManager(ICore *core, QWidget *parent) : layout->setSpacing(0); layout->addWidget(m_d->m_splitterOrView); + showToolbars(m_showToolbars); updateActions(); } @@ -410,11 +411,11 @@ void UAVGadgetManager::updateActions() if (!m_d->m_splitterOrView) // this is only for startup return; // Splitting is only possible when the toolbars are shown - bool hidden = m_d->m_hideToolbarsAction->isChecked(); + bool shown = m_d->m_showToolbarsAction->isChecked(); bool hasSplitter = m_d->m_splitterOrView->isSplitter(); - m_d->m_removeCurrentSplitAction->setEnabled(!hidden && hasSplitter); - m_d->m_removeAllSplitsAction->setEnabled(!hidden && hasSplitter); - m_d->m_gotoOtherSplitAction->setEnabled(!hidden && hasSplitter); + m_d->m_removeCurrentSplitAction->setEnabled(shown && hasSplitter); + m_d->m_removeAllSplitsAction->setEnabled(shown && hasSplitter); + m_d->m_gotoOtherSplitAction->setEnabled(shown && hasSplitter); } UAVGadgetFactoryList UAVGadgetManager::uavGadgetFactories() const @@ -428,123 +429,74 @@ UAVGadgetFactoryList UAVGadgetManager::uavGadgetFactories() const QByteArray UAVGadgetManager::saveState() const { QByteArray bytes; -// QDataStream stream(&bytes, QIODevice::WriteOnly); -// -// stream << QByteArray("UAVGadgetManagerV4"); -// -// QList uavGadgets = openedUAVGadgets(); -// foreach (IUAVGadget *uavGadget, uavGadgets) { -// if (!uavGadget->file()->fileName().isEmpty()) { -// QByteArray state = uavGadget->saveState(); -// if (!state.isEmpty()) -// m_d->m_uavGadgetStates.insert(uavGadget->file()->fileName(), QVariant(state)); -// } -// } -// -// stream << m_d->m_uavGadgetStates; -// -// QList entries = m_d->m_uavGadgetModel->entries(); -// stream << entries.count(); -// -// foreach (OpenUAVGadgetsModel::Entry entry, entries) { -// stream << entry.fileName() << entry.displayName() << entry.kind(); -// } -// -// stream << m_d->m_splitterOrView->saveState(); + QDataStream stream(&bytes, QIODevice::WriteOnly); + + stream << QByteArray("UAVGadgetManagerV1"); + + stream << m_showToolbars; + + stream << m_d->m_splitterOrView->saveState(); return bytes; } bool UAVGadgetManager::restoreState(const QByteArray &state) { -// closeAllUAVGadgets(true); -// removeAllSplits(); -// QDataStream stream(state); -// -// QByteArray version; -// stream >> version; -// -// if (version != "UAVGadgetManagerV4") -// return false; -// -// QMap uavGadgetstates; -// -// QApplication::setOverrideCursor(Qt::WaitCursor); -// -// stream >> uavGadgetstates; -// -// QMapIterator i(uavGadgetstates); -// while (i.hasNext()) { -// i.next(); -// m_d->m_uavGadgetStates.insert(i.key(), i.value()); -// } -// -// int uavGadgetCount = 0; -// stream >> uavGadgetCount; -// while (--uavGadgetCount >= 0) { -// QString fileName; -// stream >> fileName; -// QString displayName; -// stream >> displayName; -// QByteArray kind; -// stream >> kind; -// -// if (!fileName.isEmpty() && !displayName.isEmpty()){ -// m_d->m_uavGadgetModel->addRestoredUAVGadget(fileName, displayName, kind); -// } -// } -// -// QByteArray splitterstates; -// stream >> splitterstates; -// m_d->m_splitterOrView->restoreState(splitterstates); -// -// // splitting and stuff results in focus trouble, that's why we set the focus again after restoration -// ensureUAVGadgetManagerVisible(); -// if (m_d->m_currentUAVGadget) { -// m_d->m_currentUAVGadget->widget()->setFocus(); -// } else if (Core::Internal::SplitterOrView *view = currentSplitterOrView()) { -// if (IUAVGadget *e = view->uavGadget()) -// e->widget()->setFocus(); -// else if (view->view()) -// view->view()->setFocus(); -// } -// -// QApplication::restoreOverrideCursor(); + removeAllSplits(); + emptyView(m_d->m_splitterOrView->view()); + QDataStream stream(state); + qDebug() << Q_FUNC_INFO; + + QByteArray version; + stream >> version; + + if (version != "UAVGadgetManagerV1") + return false; + + stream >> m_showToolbars; + + QApplication::setOverrideCursor(Qt::WaitCursor); + + QByteArray splitterstates; + stream >> splitterstates; + m_d->m_splitterOrView->restoreState(splitterstates); + + QApplication::restoreOverrideCursor(); return true; } + void UAVGadgetManager::saveSettings() { -// SettingsDatabase *settings = m_d->m_core->settingsDatabase(); -// settings->setValue(QLatin1String(documentStatesKey), m_d->m_uavGadgetStates); -// settings->setValue(QLatin1String(externalUAVGadgetKey), m_d->m_externalUAVGadget); -// settings->setValue(QLatin1String(reloadBehaviorKey), m_d->m_reloadBehavior); + QString defaultUAVGadgetManagerKey = QString("UAVGadgetManager/") + m_uavGadgetMode->uniqueModeName() + "/DefaultSettings"; + QString uavGadgetManagerKey = QString("UAVGadgetManager/") + m_uavGadgetMode->uniqueModeName() + "/Settings"; + + QSettings *qs = m_d->m_core->settings(); + // The idea is to have a default setting that is only written once + if (!qs->contains(defaultUAVGadgetManagerKey.toLatin1())) + qs->setValue(defaultUAVGadgetManagerKey.toLatin1(), saveState().toBase64()); + else + qs->setValue(uavGadgetManagerKey.toLatin1(), saveState().toBase64()); } void UAVGadgetManager::readSettings() { -// // Backward compatibility to old locations for these settings -// QSettings *qs = m_d->m_core->settings(); -// if (qs->contains(QLatin1String(documentStatesKey))) { -// m_d->m_uavGadgetStates = qs->value(QLatin1String(documentStatesKey)) -// .value >(); -// qs->remove(QLatin1String(documentStatesKey)); -// } -// if (qs->contains(QLatin1String(externalUAVGadgetKey))) { -// m_d->m_externalUAVGadget = qs->value(QLatin1String(externalUAVGadgetKey)).toString(); -// qs->remove(QLatin1String(externalUAVGadgetKey)); -// } -// -// SettingsDatabase *settings = m_d->m_core->settingsDatabase(); -// if (settings->contains(QLatin1String(documentStatesKey))) -// m_d->m_uavGadgetStates = settings->value(QLatin1String(documentStatesKey)) -// .value >(); -// if (settings->contains(QLatin1String(externalUAVGadgetKey))) -// m_d->m_externalUAVGadget = settings->value(QLatin1String(externalUAVGadgetKey)).toString(); -// -// if (settings->contains(QLatin1String(reloadBehaviorKey))) -// m_d->m_reloadBehavior = (IFile::ReloadBehavior)settings->value(QLatin1String(reloadBehaviorKey)).toInt(); + QString defaultUAVGadgetManagerKey = QString("UAVGadgetManager/") + m_uavGadgetMode->uniqueModeName() + "/DefaultSettings"; + QString uavGadgetManagerKey = QString("UAVGadgetManager/") + m_uavGadgetMode->uniqueModeName() + "/Settings"; + + QSettings *qs = m_d->m_core->settings(); + QString key(""); + if (qs->contains(uavGadgetManagerKey.toLatin1())) + key = uavGadgetManagerKey.toLatin1(); + else if (qs->contains(defaultUAVGadgetManagerKey.toLatin1())) + key = defaultUAVGadgetManagerKey.toLatin1(); + else + return; + const QVariant &managerSettings = qs->value(key); + restoreState(QByteArray::fromBase64(managerSettings.toByteArray())); + showToolbars(m_showToolbars); + updateActions(); } void UAVGadgetManager::split(Qt::Orientation orientation) @@ -616,24 +568,24 @@ void UAVGadgetManager::gotoOtherSplit() } } -void UAVGadgetManager::hideToolbars(bool hide) +void UAVGadgetManager::showToolbars(bool show) { if (m_d->m_core->modeManager()->currentMode() != m_uavGadgetMode) return; - m_d->m_hideToolbarsAction->setChecked(hide); - m_hidden = hide; + m_d->m_showToolbarsAction->setChecked(show); + m_showToolbars = show; SplitterOrView *next = m_d->m_splitterOrView->findFirstView(); do { - next->view()->hideToolbar(hide); + next->view()->showToolbar(show); next = m_d->m_splitterOrView->findNextView(next); } while (next); - m_d->m_splitAction->setEnabled(!hide); - m_d->m_splitSideBySideAction->setEnabled(!hide); - m_d->m_removeCurrentSplitAction->setEnabled(!hide); - m_d->m_removeAllSplitsAction->setEnabled(!hide); - m_d->m_gotoOtherSplitAction->setEnabled(!hide); + m_d->m_splitAction->setEnabled(show); + m_d->m_splitSideBySideAction->setEnabled(show); + m_d->m_removeCurrentSplitAction->setEnabled(show); + m_d->m_removeAllSplitsAction->setEnabled(show); + m_d->m_gotoOtherSplitAction->setEnabled(show); } //===================UAVGadgetClosingCoreListener====================== diff --git a/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetmanager.h b/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetmanager.h index 4ff8ce393..43f92eb7e 100644 --- a/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetmanager.h +++ b/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetmanager.h @@ -103,7 +103,7 @@ public: void saveSettings(); void readSettings(); - bool toolbarsHidden() { return m_hidden; } + bool toolbarsShown() { return m_showToolbars; } UAVGadgetFactoryList uavGadgetFactories() const; @@ -120,7 +120,7 @@ public slots: void removeCurrentSplit(); void removeAllSplits(); void gotoOtherSplit(); - void hideToolbars(bool hide); + void showToolbars(bool show); private: void addUAVGadget(IUAVGadget *gadget); @@ -130,7 +130,7 @@ private: void emptyView(Core::Internal::UAVGadgetView *view); Core::Internal::SplitterOrView *currentSplitterOrView() const; - bool m_hidden; + bool m_showToolbars; UAVGadgetManagerPrivate *m_d; Core::Internal::UAVGadgetMode *m_uavGadgetMode; diff --git a/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetview.cpp b/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetview.cpp index c4efcb36b..250dfbc3b 100644 --- a/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetview.cpp +++ b/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetview.cpp @@ -86,8 +86,8 @@ UAVGadgetView::UAVGadgetView(UAVGadgetManager *uavGadgetManager, IUAVGadget *uav int index = 0; foreach(Core::IUAVGadgetFactory *factory, fl) { - m_uavGadgetList->addItem(factory->name()); - if (factory->name() == QString("EmptyGadget")) + m_uavGadgetList->addItem(factory->name(), factory->gadgetKind()); + if (factory->gadgetKind() == QString("EmptyGadget")) m_defaultIndex = index; ++index; } @@ -135,9 +135,9 @@ bool UAVGadgetView::hasUAVGadget(IUAVGadget *uavGadget) const return (m_uavGadget == uavGadget); } -void UAVGadgetView::hideToolbar(bool hide) +void UAVGadgetView::showToolbar(bool show) { - m_top->setHidden(hide); + m_top->setHidden(!show); } void UAVGadgetView::closeView() @@ -180,7 +180,9 @@ void UAVGadgetView::setUAVGadget(IUAVGadget *uavGadget) tl->addWidget(m_uavGadget->widget()); m_uavGadget->widget()->setParent(this); m_uavGadget->widget()->show(); - m_uavGadgetList->setCurrentIndex(m_uavGadget->index()); + int index = indexOfGadgetKind(m_uavGadget->gadgetKind()); + Q_ASSERT(index >= 0); + m_uavGadgetList->setCurrentIndex(index); // updateToolBar(); } @@ -201,17 +203,22 @@ void UAVGadgetView::updateToolBar() void UAVGadgetView::listSelectionActivated(int index) { - if (m_uavGadget && m_uavGadget->index() == index) - return; - if (m_uavGadgetManager->uavGadgetFactories().count() == 0) + if (index < 0 || m_uavGadgetManager->uavGadgetFactories().count() == 0) return; IUAVGadgetFactory *factory = m_uavGadgetManager->uavGadgetFactories().at(index); + if (m_uavGadget && m_uavGadget->gadgetKind() == factory->gadgetKind()) + return; IUAVGadget *gadget = factory->createUAVGadget(this); - gadget->setIndex(index); setUAVGadget(gadget); m_uavGadgetManager->setCurrentUAVGadget(gadget); } +int UAVGadgetView::indexOfGadgetKind(QString gadgetKind) +{ + return m_uavGadgetList->findData(gadgetKind); +} + + SplitterOrView::SplitterOrView(UAVGadgetManager *uavGadgetManager, Core::IUAVGadget *uavGadget, bool isRoot) : m_uavGadgetManager(uavGadgetManager), m_isRoot(isRoot) @@ -251,7 +258,7 @@ void SplitterOrView::paintEvent(QPaintEvent *event) // if (hasUAVGadget()) // return; - if (m_uavGadgetManager->toolbarsHidden()) + if (m_uavGadgetManager->toolbarsShown()) return; // Discreet indication where an uavGadget would be if there is none @@ -523,64 +530,43 @@ void SplitterOrView::unsplit() QByteArray SplitterOrView::saveState() const { QByteArray bytes; -// QDataStream stream(&bytes, QIODevice::WriteOnly); -// -// if (m_splitter) { -// stream << QByteArray("splitter") -// << (qint32)m_splitter->orientation() -// << m_splitter->saveState() -// << static_cast(m_splitter->widget(0))->saveState() -// << static_cast(m_splitter->widget(1))->saveState(); -// } else { -// IUAVGadget* e = uavGadget(); -// UAVGadgetManager *em = CoreImpl::instance()->uavGadgetManager(); -// -// if (e && e == em->uavGadget()) { -// stream << QByteArray("currentuavGadget") -// << e->file()->fileName() << e->kind() << e->saveState(); -// } else if (e) { -// stream << QByteArray("uavGadget") -// << e->file()->fileName() << e->kind() << e->saveState(); -// } else { -// stream << QByteArray("empty"); -// } -// } + QDataStream stream(&bytes, QIODevice::WriteOnly); + + if (m_splitter) { + stream << QByteArray("splitter") + << (qint32)m_splitter->orientation() + << m_splitter->saveState() + << static_cast(m_splitter->widget(0))->saveState() + << static_cast(m_splitter->widget(1))->saveState(); + } else { + if (uavGadget()) + stream << QByteArray("uavGadget") << uavGadget()->gadgetKind() << uavGadget()->saveState(); + } return bytes; } void SplitterOrView::restoreState(const QByteArray &state) { -// QDataStream stream(state); -// QByteArray mode; -// stream >> mode; -// if (mode == "splitter") { -// qint32 orientation; -// QByteArray splitter, first, second; -// stream >> orientation >> splitter >> first >> second; -// split((Qt::Orientation)orientation); -// m_splitter->restoreState(splitter); -// static_cast(m_splitter->widget(0))->restoreState(first); -// static_cast(m_splitter->widget(1))->restoreState(second); -// } else if (mode == "uavGadget" || mode == "currentuavGadget") { -// UAVGadgetManager *em = CoreImpl::instance()->uavGadgetManager(); -// QString fileName; -// QByteArray kind; -// QByteArray uavGadgetState; -// stream >> fileName >> kind >> uavGadgetState; -// IUAVGadget *e = em->openUAVGadget(view(), fileName, kind, Core::UAVGadgetManager::IgnoreNavigationHistory -// | Core::UAVGadgetManager::NoActivate); -// -// if (!e) { -// QModelIndex idx = em->openedUAVGadgetsModel()->firstRestoredUAVGadget(); -// if (idx.isValid()) -// em->activateUAVGadget(idx, view(), Core::UAVGadgetManager::IgnoreNavigationHistory -// | Core::UAVGadgetManager::NoActivate); -// } -// -// if (e) { -// e->restoreState(uavGadgetState); -// if (mode == "currentuavGadget") -// em->setUAVGadget(e); -// } -// } + QDataStream stream(state); + QByteArray mode; + stream >> mode; + if (mode == "splitter") { + qint32 orientation; + QByteArray splitter, first, second; + stream >> orientation >> splitter >> first >> second; + split((Qt::Orientation)orientation); + m_splitter->restoreState(splitter); + static_cast(m_splitter->widget(0))->restoreState(first); + static_cast(m_splitter->widget(1))->restoreState(second); + } else if (mode == "uavGadget") { + QString gadgetKind; + QByteArray uavGadgetState; + stream >> gadgetKind >> uavGadgetState; + m_view = new UAVGadgetView(m_uavGadgetManager, 0); + int index = m_view->indexOfGadgetKind(gadgetKind); + m_view->listSelectionActivated(index); + m_layout->addWidget(m_view); + m_layout->setCurrentWidget(m_view); + uavGadget()->restoreState(uavGadgetState); + } } diff --git a/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetview.h b/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetview.h index a3c2e6ffd..d9ef95375 100644 --- a/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetview.h +++ b/ground/src/plugins/coreplugin/uavgadgetmanager/uavgadgetview.h @@ -70,12 +70,11 @@ public: IUAVGadget *uavGadget() const; void setUAVGadget(IUAVGadget *uavGadget); bool hasUAVGadget(IUAVGadget *uavGadget) const; - void hideToolbar(bool hide); + int indexOfGadgetKind(QString gadgetKind); + void showToolbar(bool show); public slots: void closeView(); - -private slots: void listSelectionActivated(int index); private: diff --git a/ground/src/plugins/coreplugin/uavgadgetmode.cpp b/ground/src/plugins/coreplugin/uavgadgetmode.cpp index 3b82054cd..e439c407a 100644 --- a/ground/src/plugins/coreplugin/uavgadgetmode.cpp +++ b/ground/src/plugins/coreplugin/uavgadgetmode.cpp @@ -36,6 +36,7 @@ #include "rightpane.h" #include "iuavgadget.h" +#include #include #include #include @@ -66,8 +67,8 @@ UAVGadgetMode::UAVGadgetMode(UAVGadgetManager *uavGadgetManager, QString name, Q // this shouldn't happen m_uniqueName = uniqueName + QString::number(quint64(this)); } - QByteArray ba = m_uniqueName.toLatin1(); - m_uniqueNameC = ba.data(); + m_uniqueNameBA = m_uniqueName.toLatin1(); + m_uniqueNameC = m_uniqueNameBA.data(); connect(modeManager, SIGNAL(currentModeChanged(Core::IMode*)), this, SLOT(grabUAVGadgetManager(Core::IMode*))); m_widget->setFocusProxy(m_uavGadgetManager); diff --git a/ground/src/plugins/coreplugin/uavgadgetmode.h b/ground/src/plugins/coreplugin/uavgadgetmode.h index b5d44fd9b..6c7e941b7 100644 --- a/ground/src/plugins/coreplugin/uavgadgetmode.h +++ b/ground/src/plugins/coreplugin/uavgadgetmode.h @@ -75,6 +75,7 @@ private: int m_priority; QVBoxLayout *m_layout; QString m_uniqueName; + QByteArray m_uniqueNameBA; const char *m_uniqueNameC; };