From 275146afdfc2e75dcdc74f5737e65c315ea5851a Mon Sep 17 00:00:00 2001 From: Daniel Molkentin <daniel.molkentin@nokia.com> Date: Mon, 30 Nov 2009 19:38:02 +0100 Subject: [PATCH] Implement ProgressManager's progress-bar-on-icon on Windows 7. Allow compiling with older Windows SDKs, link ole32 explictly. If you want this feature to work, you need to compile and test it on Windows 7. Task-Number: QTCREATORBUG-252 --- src/plugins/coreplugin/coreplugin.pro | 1 + .../progressmanager/progressmanager.cpp | 5 +- .../progressmanager/progressmanager_mac.mm | 8 ++ .../progressmanager/progressmanager_p.h | 1 + .../progressmanager/progressmanager_win.cpp | 86 +++++++++++++++++++ .../progressmanager/progressmanager_x11.cpp | 8 ++ 6 files changed, 105 insertions(+), 4 deletions(-) diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro index 791aa816714..ba45a0699c0 100644 --- a/src/plugins/coreplugin/coreplugin.pro +++ b/src/plugins/coreplugin/coreplugin.pro @@ -168,6 +168,7 @@ RESOURCES += core.qrc \ win32 { SOURCES += progressmanager/progressmanager_win.cpp + LIBS += -lole32 } else:macx { OBJECTIVE_SOURCES += progressmanager/progressmanager_mac.mm diff --git a/src/plugins/coreplugin/progressmanager/progressmanager.cpp b/src/plugins/coreplugin/progressmanager/progressmanager.cpp index 7418de8cf1b..fce083bf60e 100644 --- a/src/plugins/coreplugin/progressmanager/progressmanager.cpp +++ b/src/plugins/coreplugin/progressmanager/progressmanager.cpp @@ -50,10 +50,7 @@ ProgressManagerPrivate::ProgressManagerPrivate(QObject *parent) ProgressManagerPrivate::~ProgressManagerPrivate() { -} - -void ProgressManagerPrivate::init() -{ + cleanup(); } void ProgressManagerPrivate::cancelTasks(const QString &type) diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_mac.mm b/src/plugins/coreplugin/progressmanager/progressmanager_mac.mm index 296db9258ed..9d1a9ec10e6 100644 --- a/src/plugins/coreplugin/progressmanager/progressmanager_mac.mm +++ b/src/plugins/coreplugin/progressmanager/progressmanager_mac.mm @@ -29,6 +29,14 @@ #include "progressmanager_p.h" +void Core::Internal::ProgressManagerPrivate::init() +{ +} + +void Core::Internal::ProgressManagerPrivate::cleanup() +{ +} + #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 #import <AppKit/NSDockTile.h> #import <AppKit/NSApplication.h> diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_p.h b/src/plugins/coreplugin/progressmanager/progressmanager_p.h index 80819a36d04..e219fb7a7a6 100644 --- a/src/plugins/coreplugin/progressmanager/progressmanager_p.h +++ b/src/plugins/coreplugin/progressmanager/progressmanager_p.h @@ -48,6 +48,7 @@ public: ProgressManagerPrivate(QObject *parent = 0); ~ProgressManagerPrivate(); void init(); + void cleanup(); FutureProgress *addTask(const QFuture<void> &future, const QString &title, const QString &type, ProgressFlags flags); diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp b/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp index a427349c0fd..2e4cb614bd2 100644 --- a/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp +++ b/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp @@ -27,8 +27,91 @@ ** **************************************************************************/ +#include <QtCore/QVariant> +#include <QtGui/QMainWindow> + +#include <coreplugin/icore.h> + #include "progressmanager_p.h" +// for windows progress bar +#include <shobjidl.h> + +// Windows 7 SDK required +#ifdef __ITaskbarList3_INTERFACE_DEFINED__ + +namespace { + int total = 0; + ITaskbarList3* pITask = 0; +} + +void Core::Internal::ProgressManagerPrivate::init() +{ + CoInitialize(NULL); + HRESULT hRes = CoCreateInstance(CLSID_TaskbarList, + NULL,CLSCTX_INPROC_SERVER, + IID_ITaskbarList3,(LPVOID*) &pITask); + if (FAILED(hRes)) + { + pITask = 0; + CoUninitialize(); + return; + } + + pITask->HrInit(); + return; +} + +void Core::Internal::ProgressManagerPrivate::cleanup() +{ + if (pITask) { + pITask->Release(); + pITask = NULL; + CoUninitialize(); + } +} + + +void Core::Internal::ProgressManagerPrivate::setApplicationLabel(const QString &text) +{ + Q_UNUSED(text) +} + +void Core::Internal::ProgressManagerPrivate::setApplicationProgressRange(int min, int max) +{ + total = max-min; +} + +void Core::Internal::ProgressManagerPrivate::setApplicationProgressValue(int value) +{ + if (pITask) { + WId winId = Core::ICore::instance()->mainWindow()->winId(); + pITask->SetProgressValue(winId, value, total); + } +} + +void Core::Internal::ProgressManagerPrivate::setApplicationProgressVisible(bool visible) +{ + if (!pITask) + return; + + WId winId = Core::ICore::instance()->mainWindow()->winId(); + if (visible) + pITask->SetProgressState(winId, TBPF_NORMAL); + else + pITask->SetProgressState(winId, TBPF_NOPROGRESS); +} + +#else + +void Core::Internal::ProgressManagerPrivate::init() +{ +} + +void Core::Internal::ProgressManagerPrivate::cleanup() +{ +} + void Core::Internal::ProgressManagerPrivate::setApplicationLabel(const QString &text) { Q_UNUSED(text) @@ -49,3 +132,6 @@ void Core::Internal::ProgressManagerPrivate::setApplicationProgressVisible(bool { Q_UNUSED(visible) } + + +#endif // __ITaskbarList2_INTERFACE_DEFINED__ diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_x11.cpp b/src/plugins/coreplugin/progressmanager/progressmanager_x11.cpp index a427349c0fd..69bc2d0dcd1 100644 --- a/src/plugins/coreplugin/progressmanager/progressmanager_x11.cpp +++ b/src/plugins/coreplugin/progressmanager/progressmanager_x11.cpp @@ -29,6 +29,14 @@ #include "progressmanager_p.h" +void Core::Internal::ProgressManagerPrivate::init() +{ +} + +void Core::Internal::ProgressManagerPrivate::cleanup() +{ +} + void Core::Internal::ProgressManagerPrivate::setApplicationLabel(const QString &text) { Q_UNUSED(text) -- GitLab