diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index 1d1ac06ac3b..dca59526ddb 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -568,6 +568,7 @@ void SettingsDialog::ensureCategoryWidget(Category *category) for (int j = 0; j < category->pages.size(); ++j) { IOptionsPage *page = category->pages.at(j); QWidget *widget = page->widget(); + ICore::setupScreenShooter(page->displayName(), widget); SmartScrollArea *ssa = new SmartScrollArea(this); ssa->setWidget(widget); widget->setAutoFillBackground(false); diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index ab2a7f97703..550321396e2 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -290,6 +290,7 @@ #include #include #include +#include using namespace Core::Internal; using namespace ExtensionSystem; @@ -578,6 +579,56 @@ QString ICore::systemInformation() return result; } +static const QByteArray &screenShotsPath() +{ + static const QByteArray path = qgetenv("QTC_SCREENSHOTS_PATH"); + return path; +} + +class ScreenShooter : public QObject +{ +public: + ScreenShooter(QWidget *widget, const QString &name, const QRect &rc) + : m_widget(widget), m_name(name), m_rc(rc) + { + m_widget->installEventFilter(this); + } + + bool eventFilter(QObject *watched, QEvent *event) override + { + QTC_ASSERT(watched == m_widget, return false); + if (event->type() == QEvent::Show) + QTimer::singleShot(0, this, &ScreenShooter::helper); + return false; + } + + void helper() + { + if (m_widget) { + QRect rc = m_rc.isValid() ? m_rc : m_widget->rect(); + QPixmap pm = m_widget->grab(rc); + for (int i = 0; ; ++i) { + QString fileName = screenShotsPath() + '/' + m_name + QString("-%1.png").arg(i); + if (!QFileInfo::exists(fileName)) { + pm.save(fileName); + break; + } + } + } + deleteLater(); + } + + QPointer m_widget; + QString m_name; + QRect m_rc; +}; + +void ICore::setupScreenShooter(const QString &name, QWidget *w, const QRect &rc) +{ + if (!screenShotsPath().isEmpty()) + new ScreenShooter(w, name, rc); +} + void ICore::saveSettings() { emit m_instance->saveSettingsRequested(); diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h index 89c6ada1808..c05db031eb7 100644 --- a/src/plugins/coreplugin/icore.h +++ b/src/plugins/coreplugin/icore.h @@ -29,6 +29,7 @@ #include "id.h" #include +#include #include #include @@ -130,6 +131,7 @@ public: static void addPreCloseListener(const std::function &listener); static QString systemInformation(); + static void setupScreenShooter(const QString &name, QWidget *w, const QRect &rc = QRect()); public slots: static void saveSettings();