summaryrefslogtreecommitdiff
path: root/src/plugins/locator/settingspage.cpp
diff options
context:
space:
mode:
authorcon <qtc-committer@nokia.com>2009-10-16 11:44:18 +0200
committercon <qtc-committer@nokia.com>2009-10-16 11:44:18 +0200
commita5bfacecb7aa926e6685708eb15d4817c14b6901 (patch)
tree90237b1527ebc36fb2ee5ecea2f349012351efd9 /src/plugins/locator/settingspage.cpp
parent450a18b1cb637def7531731fa712248edc966cdc (diff)
downloadqt-creator-a5bfacecb7aa926e6685708eb15d4817c14b6901.tar.gz
Rename directory quickopen --> locator
Diffstat (limited to 'src/plugins/locator/settingspage.cpp')
-rw-r--r--src/plugins/locator/settingspage.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/src/plugins/locator/settingspage.cpp b/src/plugins/locator/settingspage.cpp
new file mode 100644
index 0000000000..99453132fe
--- /dev/null
+++ b/src/plugins/locator/settingspage.cpp
@@ -0,0 +1,222 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "settingspage.h"
+#include "locatorconstants.h"
+
+#include "locatorplugin.h"
+#include "ilocatorfilter.h"
+#include "directoryfilter.h"
+
+#include <qtconcurrent/QtConcurrentTools>
+#include <utils/qtcassert.h>
+
+#include <QtCore/QCoreApplication>
+
+Q_DECLARE_METATYPE(Locator::ILocatorFilter*)
+
+using namespace Locator;
+using namespace Locator::Internal;
+
+SettingsPage::SettingsPage(LocatorPlugin *plugin)
+ : m_plugin(plugin), m_page(0)
+{
+}
+
+QString SettingsPage::id() const
+{
+ return QLatin1String(Constants::FILTER_OPTIONS_PAGE);
+}
+
+QString SettingsPage::trName() const
+{
+ return QCoreApplication::translate("Locator", Locator::Constants::FILTER_OPTIONS_PAGE);
+}
+
+QString SettingsPage::category() const
+{
+ return Constants::LOCATOR_CATEGORY;
+}
+
+QString SettingsPage::trCategory() const
+{
+ return QCoreApplication::translate("Locator", Locator::Constants::LOCATOR_CATEGORY);
+}
+
+QWidget *SettingsPage::createPage(QWidget *parent)
+{
+
+ m_page = new QWidget(parent);
+ m_ui.setupUi(m_page);
+ connect(m_ui.filterList, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
+ this, SLOT(updateButtonStates()));
+ connect(m_ui.filterList, SIGNAL(itemActivated(QListWidgetItem *)),
+ this, SLOT(configureFilter(QListWidgetItem *)));
+ connect(m_ui.editButton, SIGNAL(clicked()),
+ this, SLOT(configureFilter()));
+ connect(m_ui.addButton, SIGNAL(clicked()),
+ this, SLOT(addCustomFilter()));
+ connect(m_ui.removeButton, SIGNAL(clicked()),
+ this, SLOT(removeCustomFilter()));
+
+ m_ui.refreshInterval->setValue(m_plugin->refreshInterval());
+ m_filters = m_plugin->filters();
+ m_customFilters = m_plugin->customFilters();
+ saveFilterStates();
+ updateFilterList();
+ return m_page;
+}
+
+void SettingsPage::apply()
+{
+ // Delete removed filters and clear added filters
+ qDeleteAll(m_removedFilters);
+ m_removedFilters.clear();
+ m_addedFilters.clear();
+
+ // Pass the new configuration on to the plugin
+ m_plugin->setFilters(m_filters);
+ m_plugin->setCustomFilters(m_customFilters);
+ m_plugin->setRefreshInterval(m_ui.refreshInterval->value());
+ requestRefresh();
+ m_plugin->saveSettings();
+ saveFilterStates();
+}
+
+void SettingsPage::finish()
+{
+ // If settings were applied, this shouldn't change anything. Otherwise it
+ // makes sure the filter states aren't changed permanently.
+ restoreFilterStates();
+
+ // Delete added filters and clear removed filters
+ qDeleteAll(m_addedFilters);
+ m_addedFilters.clear();
+ m_removedFilters.clear();
+
+ // Further cleanup
+ m_filters.clear();
+ m_customFilters.clear();
+ m_refreshFilters.clear();
+}
+
+void SettingsPage::requestRefresh()
+{
+ if (!m_refreshFilters.isEmpty())
+ m_plugin->refresh(m_refreshFilters);
+}
+
+void SettingsPage::saveFilterStates()
+{
+ m_filterStates.clear();
+ foreach (ILocatorFilter *filter, m_filters)
+ m_filterStates.insert(filter, filter->saveState());
+}
+
+void SettingsPage::restoreFilterStates()
+{
+ foreach (ILocatorFilter *filter, m_filterStates.keys())
+ filter->restoreState(m_filterStates.value(filter));
+}
+
+void SettingsPage::updateFilterList()
+{
+ m_ui.filterList->clear();
+ foreach (ILocatorFilter *filter, m_filters) {
+ if (filter->isHidden())
+ continue;
+
+ QString title;
+ if (filter->isIncludedByDefault())
+ title = filter->trName();
+ else
+ title = tr("%1 (Prefix: %2)").arg(filter->trName()).arg(filter->shortcutString());
+ QListWidgetItem *item = new QListWidgetItem(title);
+ item->setData(Qt::UserRole, qVariantFromValue(filter));
+ m_ui.filterList->addItem(item);
+ }
+ if (m_ui.filterList->count() > 0)
+ m_ui.filterList->setCurrentRow(0);
+}
+
+void SettingsPage::updateButtonStates()
+{
+ QListWidgetItem *item = m_ui.filterList->currentItem();
+ ILocatorFilter *filter = (item ? item->data(Qt::UserRole).value<ILocatorFilter *>() : 0);
+ m_ui.editButton->setEnabled(filter && filter->isConfigurable());
+ m_ui.removeButton->setEnabled(filter && m_customFilters.contains(filter));
+}
+
+void SettingsPage::configureFilter(QListWidgetItem *item)
+{
+ if (!item)
+ item = m_ui.filterList->currentItem();
+ QTC_ASSERT(item, return);
+ ILocatorFilter *filter = item->data(Qt::UserRole).value<ILocatorFilter *>();
+ QTC_ASSERT(filter, return);
+
+ if (!filter->isConfigurable())
+ return;
+ bool needsRefresh = false;
+ filter->openConfigDialog(m_page, needsRefresh);
+ if (needsRefresh && !m_refreshFilters.contains(filter))
+ m_refreshFilters.append(filter);
+ updateFilterList();
+}
+
+void SettingsPage::addCustomFilter()
+{
+ ILocatorFilter *filter = new DirectoryFilter;
+ bool needsRefresh = false;
+ if (filter->openConfigDialog(m_page, needsRefresh)) {
+ m_filters.append(filter);
+ m_addedFilters.append(filter);
+ m_customFilters.append(filter);
+ m_refreshFilters.append(filter);
+ updateFilterList();
+ }
+}
+
+void SettingsPage::removeCustomFilter()
+{
+ QListWidgetItem *item = m_ui.filterList->currentItem();
+ QTC_ASSERT(item, return);
+ ILocatorFilter *filter = item->data(Qt::UserRole).value<ILocatorFilter *>();
+ QTC_ASSERT(m_customFilters.contains(filter), return);
+ m_filters.removeAll(filter);
+ m_customFilters.removeAll(filter);
+ m_refreshFilters.removeAll(filter);
+ if (m_addedFilters.contains(filter)) {
+ m_addedFilters.removeAll(filter);
+ delete filter;
+ } else {
+ m_removedFilters.append(filter);
+ }
+ updateFilterList();
+}