forked from qt-creator/qt-creator
Allow starting a run config from the MiniProjectTargetSelector
For non-trivial projects, this provides a much faster way to start a non-active run configuration than going via the project tree. Fixes: QTCREATORBUG-21799 Change-Id: I0078d905dbd8a3a417920584c9f3bb9742cb4756 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "buildconfiguration.h"
|
#include "buildconfiguration.h"
|
||||||
|
#include "buildmanager.h"
|
||||||
#include "deployconfiguration.h"
|
#include "deployconfiguration.h"
|
||||||
#include "kit.h"
|
#include "kit.h"
|
||||||
#include "kitmanager.h"
|
#include "kitmanager.h"
|
||||||
@@ -42,6 +43,7 @@
|
|||||||
#include <utils/styledbar.h>
|
#include <utils/styledbar.h>
|
||||||
#include <utils/stylehelper.h>
|
#include <utils/stylehelper.h>
|
||||||
#include <utils/theme/theme.h>
|
#include <utils/theme/theme.h>
|
||||||
|
#include <utils/utilsicons.h>
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
#include <coreplugin/coreconstants.h>
|
#include <coreplugin/coreconstants.h>
|
||||||
@@ -167,6 +169,8 @@ private:
|
|||||||
|
|
||||||
QVariant data(int column, int role) const override
|
QVariant data(int column, int role) const override
|
||||||
{
|
{
|
||||||
|
if (column == 1 && role == Qt::ToolTipRole)
|
||||||
|
return QCoreApplication::translate("RunConfigSelector", "Run Without Deployment");
|
||||||
if (column != 0)
|
if (column != 0)
|
||||||
return {};
|
return {};
|
||||||
switch (role) {
|
switch (role) {
|
||||||
@@ -337,6 +341,8 @@ public:
|
|||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setColumnCount(int columns) { m_columnCount = columns; }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void displayNameChanged();
|
void displayNameChanged();
|
||||||
|
|
||||||
@@ -407,10 +413,35 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
GenericModel *theModel() const { return static_cast<GenericModel *>(model()); }
|
GenericModel *theModel() const { return static_cast<GenericModel *>(model()); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void mousePressEvent(QMouseEvent *event) override
|
||||||
|
{
|
||||||
|
const QModelIndex pressedIndex = indexAt(event->pos());
|
||||||
|
if (pressedIndex.column() == 1) {
|
||||||
|
m_pressedIndex = pressedIndex;
|
||||||
|
return; // Clicking on the run button should not change the current index
|
||||||
|
}
|
||||||
|
m_pressedIndex = QModelIndex();
|
||||||
|
TreeView::mousePressEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mouseReleaseEvent(QMouseEvent *event) override
|
||||||
|
{
|
||||||
|
const QModelIndex pressedIndex = m_pressedIndex;
|
||||||
|
m_pressedIndex = QModelIndex();
|
||||||
|
if (pressedIndex.isValid() && pressedIndex == indexAt(event->pos())) {
|
||||||
|
const auto rc = qobject_cast<RunConfiguration *>(
|
||||||
|
theModel()->itemForIndex(pressedIndex)->object());
|
||||||
|
QTC_ASSERT(rc, return);
|
||||||
|
if (!BuildManager::isBuilding(rc->project()))
|
||||||
|
ProjectExplorerPlugin::runRunConfiguration(rc, Constants::NORMAL_RUN_MODE, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TreeView::mouseReleaseEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
GenericItem *itemForObject(const QObject *object)
|
GenericItem *itemForObject(const QObject *object)
|
||||||
{
|
{
|
||||||
return theModel()->findItemAtLevel<1>([object](const GenericItem *item) {
|
return theModel()->findItemAtLevel<1>([object](const GenericItem *item) {
|
||||||
@@ -438,6 +469,8 @@ private:
|
|||||||
if (index.isValid())
|
if (index.isValid())
|
||||||
emit changeActiveProjectConfiguration(objectAt(index));
|
emit changeActiveProjectConfiguration(objectAt(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QModelIndex m_pressedIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
////////
|
////////
|
||||||
@@ -472,7 +505,7 @@ void TargetSelectorDelegate::paint(QPainter *painter,
|
|||||||
QColor textColor = creatorTheme()->color(Theme::MiniProjectTargetSelectorTextColor);
|
QColor textColor = creatorTheme()->color(Theme::MiniProjectTargetSelectorTextColor);
|
||||||
if (option.state & QStyle::State_Selected) {
|
if (option.state & QStyle::State_Selected) {
|
||||||
QColor color;
|
QColor color;
|
||||||
if (option.state & QStyle::State_HasFocus) {
|
if (m_view->hasFocus()) {
|
||||||
color = option.palette.highlight().color();
|
color = option.palette.highlight().color();
|
||||||
textColor = option.palette.highlightedText().color();
|
textColor = option.palette.highlightedText().color();
|
||||||
} else {
|
} else {
|
||||||
@@ -505,6 +538,16 @@ void TargetSelectorDelegate::paint(QPainter *painter,
|
|||||||
const_cast<QAbstractItemModel *>(index.model())
|
const_cast<QAbstractItemModel *>(index.model())
|
||||||
->setData(index, index.model()->data(index, Qt::UserRole + 1).toString(), Qt::ToolTipRole);
|
->setData(index, index.model()->data(index, Qt::UserRole + 1).toString(), Qt::ToolTipRole);
|
||||||
painter->drawText(option.rect.left() + 6, option.rect.top() + (option.rect.height() - fm.height()) / 2 + fm.ascent(), elidedText);
|
painter->drawText(option.rect.left() + 6, option.rect.top() + (option.rect.height() - fm.height()) / 2 + fm.ascent(), elidedText);
|
||||||
|
if (index.column() == 1 && option.state & QStyle::State_MouseOver) {
|
||||||
|
const QIcon icon = Utils::Icons::RUN_SMALL.icon();
|
||||||
|
QRect iconRect(option.rect.right() - option.rect.height(),
|
||||||
|
option.rect.top(),
|
||||||
|
option.rect.height() / painter->device()->devicePixelRatio(),
|
||||||
|
option.rect.height() / painter->device()->devicePixelRatio());
|
||||||
|
iconRect.translate((option.rect.width() - iconRect.width()) / 2,
|
||||||
|
(option.rect.height() - iconRect.height()) / 2);
|
||||||
|
icon.paint(painter, iconRect, Qt::AlignHCenter | Qt::AlignVCenter);
|
||||||
|
}
|
||||||
|
|
||||||
painter->restore();
|
painter->restore();
|
||||||
}
|
}
|
||||||
@@ -521,6 +564,7 @@ SelectorView::SelectorView(QWidget *parent) : TreeView(parent)
|
|||||||
setIndentation(0);
|
setIndentation(0);
|
||||||
setFocusPolicy(Qt::WheelFocus);
|
setFocusPolicy(Qt::WheelFocus);
|
||||||
setItemDelegate(new TargetSelectorDelegate(this));
|
setItemDelegate(new TargetSelectorDelegate(this));
|
||||||
|
setSelectionBehavior(SelectRows);
|
||||||
setAttribute(Qt::WA_MacShowFocusRect, false);
|
setAttribute(Qt::WA_MacShowFocusRect, false);
|
||||||
setHeaderHidden(true);
|
setHeaderHidden(true);
|
||||||
const QColor bgColor = creatorTheme()->color(Theme::MiniProjectTargetSelectorBackgroundColor);
|
const QColor bgColor = creatorTheme()->color(Theme::MiniProjectTargetSelectorBackgroundColor);
|
||||||
@@ -725,6 +769,8 @@ MiniProjectTargetSelector::MiniProjectTargetSelector(QAction *targetSelectorActi
|
|||||||
connect(m_listWidgets[i], &QAbstractItemView::doubleClicked,
|
connect(m_listWidgets[i], &QAbstractItemView::doubleClicked,
|
||||||
this, &MiniProjectTargetSelector::hide);
|
this, &MiniProjectTargetSelector::hide);
|
||||||
}
|
}
|
||||||
|
m_listWidgets[RUN]->theModel()->setColumnCount(2);
|
||||||
|
m_listWidgets[RUN]->viewport()->setAttribute(Qt::WA_Hover);
|
||||||
|
|
||||||
// Validate state: At this point the session is still empty!
|
// Validate state: At this point the session is still empty!
|
||||||
Project *startup = SessionManager::startupProject();
|
Project *startup = SessionManager::startupProject();
|
||||||
@@ -967,6 +1013,8 @@ void MiniProjectTargetSelector::doLayout(bool keepSize)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QVector<int> widths = listWidgetWidths(minWidth, 1000);
|
QVector<int> widths = listWidgetWidths(minWidth, 1000);
|
||||||
|
|
||||||
|
const int runColumnWidth = widths[RUN] == -1 ? 0 : 30;
|
||||||
int x = 0;
|
int x = 0;
|
||||||
for (int i = PROJECT; i < LAST; ++i) {
|
for (int i = PROJECT; i < LAST; ++i) {
|
||||||
int optimalWidth = widths[i];
|
int optimalWidth = widths[i];
|
||||||
@@ -974,6 +1022,8 @@ void MiniProjectTargetSelector::doLayout(bool keepSize)
|
|||||||
m_projectListWidget->resize(optimalWidth, listHeight);
|
m_projectListWidget->resize(optimalWidth, listHeight);
|
||||||
m_projectListWidget->move(x, listY);
|
m_projectListWidget->move(x, listY);
|
||||||
} else {
|
} else {
|
||||||
|
if (i == RUN)
|
||||||
|
optimalWidth += runColumnWidth;
|
||||||
m_listWidgets[i]->resize(optimalWidth, listHeight);
|
m_listWidgets[i]->resize(optimalWidth, listHeight);
|
||||||
m_listWidgets[i]->move(x, listY);
|
m_listWidgets[i]->move(x, listY);
|
||||||
}
|
}
|
||||||
@@ -982,6 +1032,8 @@ void MiniProjectTargetSelector::doLayout(bool keepSize)
|
|||||||
x += optimalWidth + 1; //1 extra pixel for the separators or the right border
|
x += optimalWidth + 1; //1 extra pixel for the separators or the right border
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_listWidgets[RUN]->setColumnWidth(0, m_listWidgets[RUN]->size().width() - runColumnWidth);
|
||||||
|
m_listWidgets[RUN]->setColumnWidth(1, runColumnWidth);
|
||||||
m_summaryLabel->resize(x - 1, summaryLabelHeight);
|
m_summaryLabel->resize(x - 1, summaryLabelHeight);
|
||||||
m_kitAreaWidget->resize(x - 1, kitAreaHeight);
|
m_kitAreaWidget->resize(x - 1, kitAreaHeight);
|
||||||
setFixedSize(x, heightWithoutKitArea + kitAreaHeight);
|
setFixedSize(x, heightWithoutKitArea + kitAreaHeight);
|
||||||
|
|||||||
Reference in New Issue
Block a user