diff options
author | con <qtc-committer@nokia.com> | 2011-03-03 20:50:25 +0100 |
---|---|---|
committer | con <qtc-committer@nokia.com> | 2011-03-03 20:51:53 +0100 |
commit | efc817d8e0603834f8970327210f26c47d100ca6 (patch) | |
tree | ddd513c81257da3efa07464572d1f8665261cae3 | |
parent | 79c899636bcda9b1c5118fd9acd2ae36fc603e44 (diff) | |
download | qt-creator-efc817d8e0603834f8970327210f26c47d100ca6.tar.gz |
Provide way to show a variable chooser widget.
For the Qt Creator variables, currently used in the external tools.
The variable chooser looks if the current focus widget has a variable
support property set and is a line edit, text edit or plain text edit.
For line edits it adds a little icon button that shows the chooser.
-rw-r--r-- | src/plugins/coreplugin/coreconstants.h | 2 | ||||
-rw-r--r-- | src/plugins/coreplugin/dialogs/externaltoolconfig.cpp | 9 | ||||
-rw-r--r-- | src/plugins/coreplugin/variablechooser.cpp | 79 | ||||
-rw-r--r-- | src/plugins/coreplugin/variablechooser.h | 7 |
4 files changed, 82 insertions, 15 deletions
diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h index 7cf5e13847..b00cbbb8e2 100644 --- a/src/plugins/coreplugin/coreconstants.h +++ b/src/plugins/coreplugin/coreconstants.h @@ -261,6 +261,8 @@ const char * const SETTINGS_DEFAULTTEXTENCODING = "General/DefaultFileEncoding"; const char * const ALL_FILES_FILTER = QT_TRANSLATE_NOOP("Core", "All Files (*)"); +const char * const VARIABLE_SUPPORT_PROPERTY = "QtCreator.VariableSupport"; + const int TARGET_ICON_SIZE = 32; } // namespace Constants diff --git a/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp b/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp index 41e509bd20..20a317a75c 100644 --- a/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp +++ b/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp @@ -37,6 +37,7 @@ #include <utils/qtcassert.h> #include <coreplugin/coreconstants.h> +#include <coreplugin/variablechooser.h> #include <QtCore/QTextStream> #include <QtCore/QFile> @@ -398,6 +399,11 @@ ExternalToolConfig::ExternalToolConfig(QWidget *parent) : connect(ui->toolTree->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(handleCurrentChanged(QModelIndex,QModelIndex))); + ui->executable->lineEdit()->setProperty(Constants::VARIABLE_SUPPORT_PROPERTY, true); + ui->arguments->setProperty(Constants::VARIABLE_SUPPORT_PROPERTY, true); + ui->workingDirectory->lineEdit()->setProperty(Constants::VARIABLE_SUPPORT_PROPERTY, true); + ui->inputText->setProperty(Constants::VARIABLE_SUPPORT_PROPERTY, true); + connect(ui->description, SIGNAL(editingFinished()), this, SLOT(updateCurrentItem())); connect(ui->executable, SIGNAL(editingFinished()), this, SLOT(updateCurrentItem())); connect(ui->executable, SIGNAL(browsingFinished()), this, SLOT(updateCurrentItem())); @@ -420,7 +426,8 @@ ExternalToolConfig::ExternalToolConfig(QWidget *parent) : connect(addCategory, SIGNAL(triggered()), this, SLOT(addCategory())); showInfoForItem(QModelIndex()); -// updateButtons(ui->toolTree->currentItem()); + + new VariableChooser(this); } ExternalToolConfig::~ExternalToolConfig() diff --git a/src/plugins/coreplugin/variablechooser.cpp b/src/plugins/coreplugin/variablechooser.cpp index ea9def90ef..285ae67659 100644 --- a/src/plugins/coreplugin/variablechooser.cpp +++ b/src/plugins/coreplugin/variablechooser.cpp @@ -34,6 +34,7 @@ #include "variablechooser.h" #include "ui_variablechooser.h" #include "variablemanager.h" +#include "coreconstants.h" using namespace Core; @@ -44,7 +45,6 @@ VariableChooser::VariableChooser(QWidget *parent) : m_textEdit(0), m_plainTextEdit(0) { - setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(this); m_defaultDescription = ui->variableDescription->text(); ui->variableList->setAttribute(Qt::WA_MacSmallSize); @@ -63,12 +63,13 @@ VariableChooser::VariableChooser(QWidget *parent) : connect(ui->variableList, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(handleItemActivated(QListWidgetItem*))); connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), - this, SLOT(updateCurrentEditor(QWidget*))); - updateCurrentEditor(qApp->focusWidget()); + this, SLOT(updateCurrentEditor(QWidget*,QWidget*))); + updateCurrentEditor(0, qApp->focusWidget()); } VariableChooser::~VariableChooser() { + delete m_iconButton; delete ui; } @@ -80,23 +81,72 @@ void VariableChooser::updateDescription(const QString &variable) ui->variableDescription->setText(VariableManager::instance()->variableDescription(variable)); } -void VariableChooser::updateCurrentEditor(QWidget *widget) +void VariableChooser::updateCurrentEditor(QWidget *old, QWidget *widget) { + Q_UNUSED(old) + if (!widget) // we might loose focus, but then keep the previous state + return; + // prevent children of the chooser itself, and limit to children of chooser's parent + bool handle = false; + QWidget *parent = widget; + while (parent) { + if (parent == this) + return; + if (parent == this->parentWidget()) { + handle = true; + break; + } + parent = parent->parentWidget(); + } + if (!handle) + return; + QLineEdit *previousLineEdit = m_lineEdit; + m_lineEdit = 0; + m_textEdit = 0; + m_plainTextEdit = 0; + QVariant variablesSupportProperty = variablesSupportProperty = widget->property(Constants::VARIABLE_SUPPORT_PROPERTY); + bool supportsVariables = (variablesSupportProperty.isValid() + ? variablesSupportProperty.toBool() : false); if (QLineEdit *lineEdit = qobject_cast<QLineEdit *>(widget)) { - m_lineEdit = lineEdit; - m_textEdit = 0; - m_plainTextEdit = 0; + m_lineEdit = (supportsVariables ? lineEdit : 0); } else if (QTextEdit *textEdit = qobject_cast<QTextEdit *>(widget)) { - m_lineEdit = 0; - m_textEdit = textEdit; - m_plainTextEdit = 0; + m_textEdit = (supportsVariables ? textEdit : 0); } else if (QPlainTextEdit *plainTextEdit = qobject_cast<QPlainTextEdit *>(widget)) { - m_lineEdit = 0; - m_textEdit = 0; - m_plainTextEdit = plainTextEdit; + m_plainTextEdit = (supportsVariables ? plainTextEdit : 0); + } + if (!(m_lineEdit || m_textEdit || m_plainTextEdit)) + hide(); + if (m_lineEdit != previousLineEdit) { + if (previousLineEdit) + previousLineEdit->setTextMargins(0, 0, 0, 0); + if (m_iconButton) { + m_iconButton->hide(); + m_iconButton->setParent(0); + } + if (m_lineEdit) { + if (!m_iconButton) + createIconButton(); + int margin = m_iconButton->pixmap().width() + 8; + if (style()->inherits("OxygenStyle")) + margin = qMax(24, margin); + m_lineEdit->setTextMargins(0, 0, margin, 0); + m_iconButton->setParent(m_lineEdit); + m_iconButton->setGeometry(m_lineEdit->rect().adjusted( + m_lineEdit->width() - (margin + 4), 0, 0, 0)); + m_iconButton->show(); + } } } +void VariableChooser::createIconButton() +{ + m_iconButton = new Utils::IconButton; + m_iconButton->setPixmap(QPixmap(QLatin1String(":/core/images/replace.png"))); + m_iconButton->setToolTip(tr("Insert variable")); + m_iconButton->hide(); + connect(m_iconButton, SIGNAL(clicked()), this, SLOT(show())); +} + void VariableChooser::handleItemActivated(QListWidgetItem *item) { if (item) @@ -108,9 +158,12 @@ void VariableChooser::insertVariable(const QString &variable) const QString &text = QLatin1String("${") + variable + QLatin1String("}"); if (m_lineEdit) { m_lineEdit->insert(text); + m_lineEdit->activateWindow(); } else if (m_textEdit) { m_textEdit->insertPlainText(text); + m_textEdit->activateWindow(); } else if (m_plainTextEdit) { m_plainTextEdit->insertPlainText(text); + m_plainTextEdit->activateWindow(); } } diff --git a/src/plugins/coreplugin/variablechooser.h b/src/plugins/coreplugin/variablechooser.h index 71e2db5691..a39feff58d 100644 --- a/src/plugins/coreplugin/variablechooser.h +++ b/src/plugins/coreplugin/variablechooser.h @@ -36,6 +36,8 @@ #include "core_global.h" +#include <utils/fancylineedit.h> + #include <QtCore/QPointer> #include <QtGui/QWidget> #include <QtGui/QLineEdit> @@ -59,16 +61,19 @@ public: private slots: void updateDescription(const QString &variable); - void updateCurrentEditor(QWidget *widget); + void updateCurrentEditor(QWidget *old, QWidget *widget); void handleItemActivated(QListWidgetItem *item); void insertVariable(const QString &variable); private: + void createIconButton(); + Ui::VariableChooser *ui; QString m_defaultDescription; QPointer<QLineEdit> m_lineEdit; QPointer<QTextEdit> m_textEdit; QPointer<QPlainTextEdit> m_plainTextEdit; + QPointer<Utils::IconButton> m_iconButton; }; |