KitChooser: Change kit pre-selection strategy

In case there is a startup project, it will be listed in
an additional entry at the top of the kit list, followed
by a separator.

Kits are remembered by Id now, not by index anymore
*unless* it's the startup kit entry, i.e. if the startup
entry is selected and the project is changed, it will
again select the startup entry, possibly indicatin another
kit.

In case a non-startup entry is selected, the kit will be
remembered by id, changing projects will try to re-select
*that* kit.

Change-Id: I827d2670d9a8681570d9c67405cd662cf6a01b4c
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
hjk
2018-02-14 15:15:37 +01:00
parent afe13e6812
commit 7bbe5979a1
2 changed files with 56 additions and 25 deletions

View File

@@ -28,7 +28,10 @@
#include "kitconfigwidget.h" #include "kitconfigwidget.h"
#include "kitinformation.h" #include "kitinformation.h"
#include "kitmanager.h" #include "kitmanager.h"
#include "project.h"
#include "projectexplorerconstants.h" #include "projectexplorerconstants.h"
#include "session.h"
#include "target.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
@@ -37,6 +40,8 @@
#include <QPushButton> #include <QPushButton>
#include <QSettings> #include <QSettings>
using namespace Core;
namespace ProjectExplorer { namespace ProjectExplorer {
const char lastKitKey[] = "LastSelectedKit"; const char lastKitKey[] = "LastSelectedKit";
@@ -58,7 +63,7 @@ KitChooser::KitChooser(QWidget *parent) :
connect(m_chooser, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), connect(m_chooser, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this, &KitChooser::onCurrentIndexChanged); this, &KitChooser::onCurrentIndexChanged);
connect(m_chooser, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), connect(m_chooser, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated),
this, &KitChooser::activated); this, &KitChooser::onActivated);
connect(m_manageButton, &QAbstractButton::clicked, this, &KitChooser::onManageButtonClicked); connect(m_manageButton, &QAbstractButton::clicked, this, &KitChooser::onManageButtonClicked);
connect(KitManager::instance(), &KitManager::kitsChanged, this, &KitChooser::populate); connect(KitManager::instance(), &KitManager::kitsChanged, this, &KitChooser::populate);
} }
@@ -68,13 +73,22 @@ void KitChooser::onManageButtonClicked()
Core::ICore::showOptionsDialog(Constants::KITS_SETTINGS_PAGE_ID, this); Core::ICore::showOptionsDialog(Constants::KITS_SETTINGS_PAGE_ID, this);
} }
void KitChooser::onCurrentIndexChanged(int index) void KitChooser::onCurrentIndexChanged()
{ {
if (Kit *kit = kitAt(index)) const Id id = Id::fromSetting(m_chooser->currentData());
setToolTip(kitToolTip(kit)); Kit *kit = KitManager::kit(id);
else setToolTip(kit ? kitToolTip(kit) : QString());
setToolTip(QString()); emit currentIndexChanged();
emit currentIndexChanged(index); }
void KitChooser::onActivated()
{
// Active user interaction.
Id id = Id::fromSetting(m_chooser->currentData());
if (m_hasStartupKit && m_chooser->currentIndex() == 0)
id = Id(); // Special value to indicate startup kit.
ICore::settings()->setValue(lastKitKey, id.toSetting());
emit activated();
} }
QString KitChooser::kitText(const Kit *k) const QString KitChooser::kitText(const Kit *k) const
@@ -90,17 +104,39 @@ QString KitChooser::kitToolTip(Kit *k) const
void KitChooser::populate() void KitChooser::populate()
{ {
m_chooser->clear(); m_chooser->clear();
const Id lastKit = Id::fromSetting(ICore::settings()->value(lastKitKey));
bool didActivate = false;
if (Project *project = SessionManager::startupProject()) {
if (Target *target = project->activeTarget()) {
Kit *kit = target->kit();
if (m_kitPredicate(kit)) {
QString display = tr("Kit of Active Project: %1").arg(kitText(kit));
m_chooser->addItem(display, kit->id().toSetting());
m_chooser->setItemData(0, kitToolTip(kit), Qt::ToolTipRole);
if (!lastKit.isValid()) {
m_chooser->setCurrentIndex(0);
didActivate = true;
}
m_chooser->insertSeparator(1);
m_hasStartupKit = true;
}
}
}
foreach (Kit *kit, KitManager::sortKits(KitManager::kits())) { foreach (Kit *kit, KitManager::sortKits(KitManager::kits())) {
if (m_kitPredicate(kit)) { if (m_kitPredicate(kit)) {
m_chooser->addItem(kitText(kit), qVariantFromValue(kit->id())); m_chooser->addItem(kitText(kit), kit->id().toSetting());
m_chooser->setItemData(m_chooser->count() - 1, kitToolTip(kit), Qt::ToolTipRole); m_chooser->setItemData(m_chooser->count() - 1, kitToolTip(kit), Qt::ToolTipRole);
if (!didActivate && kit->id() == lastKit) {
m_chooser->setCurrentIndex(m_chooser->count() - 1);
didActivate = true;
}
} }
} }
const int n = m_chooser->count(); const int n = m_chooser->count();
const int index = Core::ICore::settings()->value(QLatin1String(lastKitKey)).toInt();
if (0 <= index && index < n)
m_chooser->setCurrentIndex(index);
m_chooser->setEnabled(n > 1); m_chooser->setEnabled(n > 1);
if (n > 1) if (n > 1)
@@ -112,15 +148,15 @@ void KitChooser::populate()
Kit *KitChooser::currentKit() const Kit *KitChooser::currentKit() const
{ {
const int index = m_chooser->currentIndex(); const Id id = Id::fromSetting(m_chooser->currentData());
Core::ICore::settings()->setValue(QLatin1String(lastKitKey), index); return KitManager::kit(id);
return index == -1 ? nullptr : kitAt(index);
} }
void KitChooser::setCurrentKitId(Core::Id id) void KitChooser::setCurrentKitId(Core::Id id)
{ {
QVariant v = id.toSetting();
for (int i = 0, n = m_chooser->count(); i != n; ++i) { for (int i = 0, n = m_chooser->count(); i != n; ++i) {
if (kitAt(i)->id() == id) { if (m_chooser->itemData(i) == v) {
m_chooser->setCurrentIndex(i); m_chooser->setCurrentIndex(i);
break; break;
} }
@@ -139,10 +175,4 @@ void KitChooser::setKitPredicate(const Kit::Predicate &predicate)
populate(); populate();
} }
Kit *KitChooser::kitAt(int index) const
{
auto id = qvariant_cast<Core::Id>(m_chooser->itemData(index));
return KitManager::kit(id);
}
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -58,8 +58,8 @@ public:
Kit *currentKit() const; Kit *currentKit() const;
signals: signals:
void currentIndexChanged(int); void currentIndexChanged();
void activated(int); void activated();
public slots: public slots:
void populate(); void populate();
@@ -69,13 +69,14 @@ protected:
virtual QString kitToolTip(Kit *k) const; virtual QString kitToolTip(Kit *k) const;
private: private:
void onCurrentIndexChanged(int index); void onActivated();
void onCurrentIndexChanged();
void onManageButtonClicked(); void onManageButtonClicked();
Kit *kitAt(int index) const;
Kit::Predicate m_kitPredicate; Kit::Predicate m_kitPredicate;
QComboBox *m_chooser; QComboBox *m_chooser;
QPushButton *m_manageButton; QPushButton *m_manageButton;
bool m_hasStartupKit = false;
}; };
} // namespace ProjectExplorer } // namespace ProjectExplorer