QmlJSOutline: Store the filter settings when switching files

This commit is contained in:
Kai Koehne
2010-07-16 11:04:20 +02:00
parent ff5506f3b9
commit 97ca483d33
5 changed files with 70 additions and 14 deletions

View File

@@ -1,12 +1,15 @@
#include "qmljsoutline.h" #include "qmljsoutline.h"
#include "qmloutlinemodel.h" #include "qmloutlinemodel.h"
#include <coreplugin/icore.h>
#include <coreplugin/ifile.h> #include <coreplugin/ifile.h>
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <QtCore/QDebug>
#include <QtCore/QSettings>
#include <QtGui/QAction> #include <QtGui/QAction>
#include <QtGui/QVBoxLayout> #include <QtGui/QVBoxLayout>
#include <QDebug>
using namespace QmlJS; using namespace QmlJS;
enum { enum {
@@ -35,7 +38,9 @@ bool QmlJSOutlineFilterModel::filterAcceptsRow(int sourceRow,
{ {
if (m_filterBindings) { if (m_filterBindings) {
QModelIndex sourceIndex = sourceModel()->index(sourceRow, 0, sourceParent); QModelIndex sourceIndex = sourceModel()->index(sourceRow, 0, sourceParent);
if (sourceIndex.data(QmlOutlineModel::ItemTypeRole) == QmlOutlineModel::PropertyType) { QVariant itemType = sourceIndex.data(QmlOutlineModel::ItemTypeRole);
Q_ASSERT(itemType.isValid());
if (itemType.isValid() && itemType == QmlOutlineModel::PropertyType) {
return false; return false;
} }
} }
@@ -49,10 +54,8 @@ bool QmlJSOutlineFilterModel::filterBindings() const
void QmlJSOutlineFilterModel::setFilterBindings(bool filterBindings) void QmlJSOutlineFilterModel::setFilterBindings(bool filterBindings)
{ {
if (m_filterBindings != filterBindings) { m_filterBindings = filterBindings;
m_filterBindings = filterBindings; invalidateFilter();
invalidateFilter();
}
} }
QmlJSOutlineWidget::QmlJSOutlineWidget(QWidget *parent) : QmlJSOutlineWidget::QmlJSOutlineWidget(QWidget *parent) :
@@ -62,6 +65,8 @@ QmlJSOutlineWidget::QmlJSOutlineWidget(QWidget *parent) :
m_enableCursorSync(true), m_enableCursorSync(true),
m_blockCursorSync(false) m_blockCursorSync(false)
{ {
m_filterModel->setFilterBindings(false);
m_treeView->setModel(m_filterModel); m_treeView->setModel(m_filterModel);
QVBoxLayout *layout = new QVBoxLayout; QVBoxLayout *layout = new QVBoxLayout;
@@ -74,7 +79,7 @@ QmlJSOutlineWidget::QmlJSOutlineWidget(QWidget *parent) :
m_showBindingsAction->setText(tr("Show bindings")); m_showBindingsAction->setText(tr("Show bindings"));
m_showBindingsAction->setCheckable(true); m_showBindingsAction->setCheckable(true);
m_showBindingsAction->setChecked(true); m_showBindingsAction->setChecked(true);
connect(m_showBindingsAction, SIGNAL(triggered(bool)), this, SLOT(setShowBindings(bool))); connect(m_showBindingsAction, SIGNAL(toggled(bool)), this, SLOT(setShowBindings(bool)));
setLayout(layout); setLayout(layout);
} }
@@ -109,6 +114,20 @@ void QmlJSOutlineWidget::setCursorSynchronization(bool syncWithCursor)
updateSelectionInTree(m_editor.data()->outlineModelIndex()); updateSelectionInTree(m_editor.data()->outlineModelIndex());
} }
void QmlJSOutlineWidget::restoreSettings(int position)
{
QSettings *settings = Core::ICore::instance()->settings();
bool showBindings = settings->value("QmlJSOutline."+QString::number(position)+".ShowBindings", true).toBool();
m_showBindingsAction->setChecked(showBindings);
}
void QmlJSOutlineWidget::saveSettings(int position)
{
QSettings *settings = Core::ICore::instance()->settings();
settings->setValue("QmlJSOutline."+QString::number(position)+".ShowBindings",
m_showBindingsAction->isChecked());
}
void QmlJSOutlineWidget::modelUpdated() void QmlJSOutlineWidget::modelUpdated()
{ {
m_treeView->expandAll(); m_treeView->expandAll();

View File

@@ -53,6 +53,8 @@ public:
// IOutlineWidget // IOutlineWidget
virtual QList<QAction*> filterMenuActions() const; virtual QList<QAction*> filterMenuActions() const;
virtual void setCursorSynchronization(bool syncWithCursor); virtual void setCursorSynchronization(bool syncWithCursor);
virtual void restoreSettings(int position);
virtual void saveSettings(int position);
private slots: private slots:
void modelUpdated(); void modelUpdated();

View File

@@ -18,6 +18,9 @@ public:
virtual QList<QAction*> filterMenuActions() const = 0; virtual QList<QAction*> filterMenuActions() const = 0;
virtual void setCursorSynchronization(bool syncWithCursor) = 0; virtual void setCursorSynchronization(bool syncWithCursor) = 0;
virtual void restoreSettings(int position) { Q_UNUSED(position); }
virtual void saveSettings(int position) { Q_UNUSED(position); }
}; };
class TEXTEDITOR_EXPORT IOutlineWidgetFactory : public QObject { class TEXTEDITOR_EXPORT IOutlineWidgetFactory : public QObject {

View File

@@ -14,7 +14,8 @@ namespace Internal {
OutlineWidgetStack::OutlineWidgetStack(OutlineFactory *factory) : OutlineWidgetStack::OutlineWidgetStack(OutlineFactory *factory) :
QStackedWidget(), QStackedWidget(),
m_factory(factory), m_factory(factory),
m_syncWithEditor(true) m_syncWithEditor(true),
m_position(-1)
{ {
QLabel *label = new QLabel(tr("No outline available"), this); QLabel *label = new QLabel(tr("No outline available"), this);
label->setAlignment(Qt::AlignCenter); label->setAlignment(Qt::AlignCenter);
@@ -60,6 +61,33 @@ QToolButton *OutlineWidgetStack::filterButton()
return m_filterButton; return m_filterButton;
} }
void OutlineWidgetStack::restoreSettings(int position)
{
m_position = position; // save it so that we can save/restore in updateCurrentEditor
QSettings *settings = Core::ICore::instance()->settings();
const bool toggleSync = settings->value("Outline."+ QString::number(position) + ".SyncWithEditor",
true).toBool();
toggleSyncButton()->setChecked(toggleSync);
if (IOutlineWidget *outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget())) {
outlineWidget->restoreSettings(position);
}
}
void OutlineWidgetStack::saveSettings(int position)
{
Q_ASSERT(position == m_position);
QSettings *settings = Core::ICore::instance()->settings();
settings->setValue("Outline."+QString::number(position)+".SyncWithEditor",
toggleSyncButton()->isEnabled());
if (IOutlineWidget *outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget())) {
outlineWidget->saveSettings(position);
}
}
bool OutlineWidgetStack::isCursorSynchronized() const bool OutlineWidgetStack::isCursorSynchronized() const
{ {
return m_syncWithEditor; return m_syncWithEditor;
@@ -98,10 +126,14 @@ void OutlineWidgetStack::updateCurrentEditor(Core::IEditor *editor)
if (newWidget != currentWidget()) { if (newWidget != currentWidget()) {
// delete old widget // delete old widget
if (IOutlineWidget *outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget())) { if (IOutlineWidget *outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget())) {
if (m_position > -1)
outlineWidget->saveSettings(m_position);
removeWidget(outlineWidget); removeWidget(outlineWidget);
delete outlineWidget; delete outlineWidget;
} }
if (newWidget) { if (newWidget) {
if (m_position > -1)
newWidget->restoreSettings(m_position);
newWidget->setCursorSynchronization(m_syncWithEditor); newWidget->setCursorSynchronization(m_syncWithEditor);
addWidget(newWidget); addWidget(newWidget);
setCurrentWidget(newWidget); setCurrentWidget(newWidget);
@@ -153,18 +185,14 @@ void OutlineFactory::saveSettings(int position, QWidget *widget)
{ {
OutlineWidgetStack *widgetStack = qobject_cast<OutlineWidgetStack *>(widget); OutlineWidgetStack *widgetStack = qobject_cast<OutlineWidgetStack *>(widget);
Q_ASSERT(widgetStack); Q_ASSERT(widgetStack);
QSettings *settings = Core::ICore::instance()->settings(); widgetStack->saveSettings(position);
settings->setValue("Outline."+QString::number(position)+".SyncWithEditor",
widgetStack->toggleSyncButton()->isEnabled());
} }
void OutlineFactory::restoreSettings(int position, QWidget *widget) void OutlineFactory::restoreSettings(int position, QWidget *widget)
{ {
OutlineWidgetStack *widgetStack = qobject_cast<OutlineWidgetStack *>(widget); OutlineWidgetStack *widgetStack = qobject_cast<OutlineWidgetStack *>(widget);
Q_ASSERT(widgetStack); Q_ASSERT(widgetStack);
QSettings *settings = Core::ICore::instance()->settings(); widgetStack->restoreSettings(position);
widgetStack->toggleSyncButton()->setChecked(
settings->value("Outline."+QString::number(position)+".SyncWithEditor", true).toBool());
} }
} // namespace Internal } // namespace Internal

View File

@@ -25,6 +25,9 @@ public:
QToolButton *toggleSyncButton(); QToolButton *toggleSyncButton();
QToolButton *filterButton(); QToolButton *filterButton();
void saveSettings(int position);
void restoreSettings(int position);
private: private:
bool isCursorSynchronized() const; bool isCursorSynchronized() const;
QWidget *dummyWidget() const; QWidget *dummyWidget() const;
@@ -41,6 +44,7 @@ private:
QToolButton *m_filterButton; QToolButton *m_filterButton;
QMenu *m_filterMenu; QMenu *m_filterMenu;
bool m_syncWithEditor; bool m_syncWithEditor;
int m_position;
}; };
class OutlineFactory : public Core::INavigationWidgetFactory class OutlineFactory : public Core::INavigationWidgetFactory