diff --git a/src/libs/utils/fadingindicator.cpp b/src/libs/utils/fadingindicator.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ee8c2c70b3a1cd2583aba51de2867fb2549be742 --- /dev/null +++ b/src/libs/utils/fadingindicator.cpp @@ -0,0 +1,146 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms and +** conditions see http://www.qt.io/terms-conditions. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** 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 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "fadingindicator.h" + +#include "stylehelper.h" + +#include <QGraphicsOpacityEffect> +#include <QHBoxLayout> +#include <QLabel> +#include <QPainter> +#include <QPixmap> +#include <QPropertyAnimation> +#include <QTimer> + +namespace Utils { +namespace Internal { + +class FadingIndicatorPrivate : public QWidget +{ + Q_OBJECT + +public: + FadingIndicatorPrivate(QWidget *parent = 0) + : QWidget(parent) + { + m_effect = new QGraphicsOpacityEffect(this); + setGraphicsEffect(m_effect); + m_effect->setOpacity(1.); + + m_label = new QLabel; + QFont font = m_label->font(); + font.setPixelSize(45); + m_label->setFont(font); + QPalette pal = palette(); + pal.setColor(QPalette::Foreground, pal.color(QPalette::Background)); + m_label->setPalette(pal); + auto layout = new QHBoxLayout; + setLayout(layout); + layout->addWidget(m_label); + } + + void setText(const QString &text) + { + m_pixmap = QPixmap(); + m_label->setText(text); + adjustSize(); + if (QWidget *parent = parentWidget()) + move(parent->rect().center() - rect().center()); + } + + void setPixmap(const QString &uri) + { + m_label->hide(); + m_pixmap.load(Utils::StyleHelper::dpiSpecificImageFile(uri)); + resize(m_pixmap.size() / m_pixmap.devicePixelRatio()); + if (QWidget *parent = parentWidget()) + move(parent->rect().center() - rect().center()); + } + + void run(int ms) + { + show(); + raise(); + QTimer::singleShot(ms, this, SLOT(runInternal())); + } + +protected: + void paintEvent(QPaintEvent *) + { + QPainter p(this); + p.setRenderHint(QPainter::Antialiasing); + if (!m_pixmap.isNull()) { + p.drawPixmap(rect(), m_pixmap); + } else { + p.setBrush(palette().color(QPalette::Foreground)); + p.setPen(Qt::NoPen); + p.drawRoundedRect(rect(), 15, 15); + } + } + +private slots: + void runInternal() + { + QPropertyAnimation *anim = new QPropertyAnimation(m_effect, "opacity", this); + anim->setDuration(200); + anim->setEndValue(0.); + connect(anim, SIGNAL(finished()), this, SLOT(deleteLater())); + anim->start(QAbstractAnimation::DeleteWhenStopped); + } + +private: + QGraphicsOpacityEffect *m_effect; + QLabel *m_label; + QPixmap m_pixmap; +}; + +} // Internal + +namespace FadingIndicator { + +void showText(QWidget *parent, const QString &text) +{ + auto indicator = new Internal::FadingIndicatorPrivate(parent); + indicator->setText(text); + indicator->run(1000); // deletes itself +} + +void showPixmap(QWidget *parent, const QString &pixmap) +{ + auto indicator = new Internal::FadingIndicatorPrivate(parent); + indicator->setPixmap(pixmap); + indicator->run(300); // deletes itself +} + +} // FadingIndicator +} // Utils + +#include "fadingindicator.moc" diff --git a/src/libs/utils/fadingindicator.h b/src/libs/utils/fadingindicator.h new file mode 100644 index 0000000000000000000000000000000000000000..7738e751a641fb6fc916b7afb418cee9118079bb --- /dev/null +++ b/src/libs/utils/fadingindicator.h @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms and +** conditions see http://www.qt.io/terms-conditions. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** 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 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + + +#ifndef FADINGINDICATOR_H +#define FADINGINDICATOR_H + +#include "utils_global.h" + +#include <QString> +#include <QWidget> + +namespace Utils { +namespace FadingIndicator { + +QTCREATOR_UTILS_EXPORT void showText(QWidget *parent, const QString &text); +QTCREATOR_UTILS_EXPORT void showPixmap(QWidget *parent, const QString &pixmap); + +} // FadingIndicator +} // Utils + +#endif // FADINGINDICATOR_H + diff --git a/src/libs/utils/utils-lib.pri b/src/libs/utils/utils-lib.pri index bd138d0f18a455809c6b13f834b08560a3d2fdaf..34b3549dc8eaf17695b1908ad228ae75934d5175 100644 --- a/src/libs/utils/utils-lib.pri +++ b/src/libs/utils/utils-lib.pri @@ -92,7 +92,8 @@ SOURCES += $$PWD/environment.cpp \ $$PWD/proxycredentialsdialog.cpp \ $$PWD/macroexpander.cpp \ $$PWD/theme/theme.cpp \ - $$PWD/progressindicator.cpp + $$PWD/progressindicator.cpp \ + $$PWD/fadingindicator.cpp win32:SOURCES += $$PWD/consoleprocess_win.cpp else:SOURCES += $$PWD/consoleprocess_unix.cpp @@ -190,7 +191,8 @@ HEADERS += \ $$PWD/macroexpander.h \ $$PWD/theme/theme.h \ $$PWD/theme/theme_p.h \ - $$PWD/progressindicator.h + $$PWD/progressindicator.h \ + $$PWD/fadingindicator.h FORMS += $$PWD/filewizardpage.ui \ $$PWD/projectintropage.ui \ diff --git a/src/libs/utils/utils.qbs b/src/libs/utils/utils.qbs index a2260ba1b69eb37c7064763a767c834d54992c02..603a0e6e49fff4b3eccb02297494e7c45a898ef8 100644 --- a/src/libs/utils/utils.qbs +++ b/src/libs/utils/utils.qbs @@ -72,6 +72,8 @@ QtcLibrary { "environmentmodel.h", "execmenu.cpp", "execmenu.h", + "fadingindicator.cpp", + "fadingindicator.h", "faketooltip.cpp", "faketooltip.h", "fancylineedit.cpp", diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.cpp b/src/plugins/coreplugin/actionmanager/actionmanager.cpp index 121fed8f25e6bcfbfc05a496a990ed58cc8ab8f7..81107deba7cc10d3ce9e6d5796604d1b4c5428d1 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager.cpp +++ b/src/plugins/coreplugin/actionmanager/actionmanager.cpp @@ -35,13 +35,13 @@ #include <coreplugin/icore.h> #include <coreplugin/id.h> +#include <utils/fadingindicator.h> #include <utils/qtcassert.h> #include <QAction> #include <QApplication> #include <QDebug> #include <QDesktopWidget> -#include <QLabel> #include <QMenu> #include <QMenuBar> #include <QSettings> @@ -354,26 +354,12 @@ void ActionManager::setPresentationModeEnabled(bool enabled) } } - // The label for the shortcuts: - if (!d->m_presentationLabel) { - d->m_presentationLabel = new QLabel(0, Qt::ToolTip | Qt::WindowStaysOnTopHint); - QFont font = d->m_presentationLabel->font(); - font.setPixelSize(45); - d->m_presentationLabel->setFont(font); - d->m_presentationLabel->setAlignment(Qt::AlignCenter); - d->m_presentationLabel->setMargin(5); - - connect(&d->m_presentationLabelTimer, SIGNAL(timeout()), d->m_presentationLabel, SLOT(hide())); - } else { - d->m_presentationLabelTimer.stop(); - delete d->m_presentationLabel; - d->m_presentationLabel = 0; - } + d->m_presentationModeEnabled = enabled; } bool ActionManager::isPresentationModeEnabled() { - return d->m_presentationLabel; + return d->m_presentationModeEnabled; } void ActionManager::initialize(QObject *parent) @@ -399,9 +385,8 @@ void ActionManager::setContext(const Context &context) */ ActionManagerPrivate::ActionManagerPrivate() - : m_presentationLabel(0) + : m_presentationModeEnabled(false) { - m_presentationLabelTimer.setInterval(1000); } ActionManagerPrivate::~ActionManagerPrivate() @@ -459,25 +444,18 @@ void ActionManagerPrivate::showShortcutPopup(const QString &shortcut) if (shortcut.isEmpty() || !ActionManager::isPresentationModeEnabled()) return; - m_presentationLabel->setText(shortcut); - m_presentationLabel->adjustSize(); - QWidget *window = QApplication::activeWindow(); - if (!window && !QApplication::topLevelWidgets().isEmpty()) - window = QApplication::topLevelWidgets().first(); - QPoint center; - if (window) { - center = window->mapToGlobal(window->rect().center()); - } else { - QTC_ASSERT(QApplication::desktop(), return); - center = QApplication::desktop()->screenGeometry().center(); + if (!window) { + if (!QApplication::topLevelWidgets().isEmpty()) { + window = QApplication::topLevelWidgets().first(); + } else { + QTC_ASSERT(QApplication::desktop(), return); + window = QApplication::desktop()->screen(); + QTC_ASSERT(window, return); + } } - QPoint p = center - m_presentationLabel->rect().center(); - m_presentationLabel->move(p); - m_presentationLabel->show(); - m_presentationLabel->raise(); - m_presentationLabelTimer.start(); + Utils::FadingIndicator::showText(window, shortcut); } Action *ActionManagerPrivate::overridableAction(Id id) diff --git a/src/plugins/coreplugin/actionmanager/actionmanager_p.h b/src/plugins/coreplugin/actionmanager/actionmanager_p.h index fbdbc787fcd81d108a8849786a6f127fbaf9062d..e47fad44643d9c1e727a082b42b04c44d1f4ae9c 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager_p.h +++ b/src/plugins/coreplugin/actionmanager/actionmanager_p.h @@ -89,6 +89,7 @@ public: Context m_context; + bool m_presentationModeEnabled; QLabel *m_presentationLabel; QTimer m_presentationLabelTimer; }; diff --git a/src/plugins/coreplugin/find/ifindsupport.cpp b/src/plugins/coreplugin/find/ifindsupport.cpp index f08f1fada447779e71a848e21025df3d9949f769..5e26adc20332e95027ccaf1bd235e93588b72afb 100644 --- a/src/plugins/coreplugin/find/ifindsupport.cpp +++ b/src/plugins/coreplugin/find/ifindsupport.cpp @@ -30,64 +30,7 @@ #include "ifindsupport.h" -#include <QTimer> -#include <QPropertyAnimation> -#include <QWidget> -#include <QPaintEvent> -#include <QPainter> - -namespace Core { -namespace Internal { - -class WrapIndicator : public QWidget -{ - Q_OBJECT - Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity USER true) - -public: - WrapIndicator(QWidget *parent = 0) - : QWidget(parent), - m_opacity(1.0) - { - if (parent) - setGeometry(QRect(parent->rect().center() - QPoint(25, 25), - parent->rect().center() + QPoint(25, 25))); - } - - qreal opacity() const { return m_opacity; } - void setOpacity(qreal value) { m_opacity = value; update(); } - - void run() - { - show(); - QTimer::singleShot(300, this, SLOT(runInternal())); - } - -protected: - void paintEvent(QPaintEvent *) - { - static QPixmap foreground(QLatin1String(":/find/images/wrapindicator.png")); - QPainter p(this); - p.setOpacity(m_opacity); - p.drawPixmap(rect(), foreground); - } - -private slots: - void runInternal() - { - QPropertyAnimation *anim = new QPropertyAnimation(this, "opacity", this); - anim->setDuration(200); - anim->setEndValue(0.); - connect(anim, SIGNAL(finished()), this, SLOT(deleteLater())); - anim->start(QAbstractAnimation::DeleteWhenStopped); - } - -private: - qreal m_opacity; -}; - -} // Internal -} // Find +#include <utils/fadingindicator.h> using namespace Core; @@ -116,7 +59,5 @@ int IFindSupport::replaceAll(const QString &before, const QString &after, FindFl void IFindSupport::showWrapIndicator(QWidget *parent) { - (new Internal::WrapIndicator(parent))->run(); + Utils::FadingIndicator::showPixmap(parent, QLatin1String(":/find/images/wrapindicator.png")); } - -#include "ifindsupport.moc"