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 /src/plugins/coreplugin/variablechooser.cpp | |
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.
Diffstat (limited to 'src/plugins/coreplugin/variablechooser.cpp')
-rw-r--r-- | src/plugins/coreplugin/variablechooser.cpp | 79 |
1 files changed, 66 insertions, 13 deletions
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(); } } |