diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/omBrowser/toolbarProgress.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/omBrowser/toolbarProgress.cpp')
-rw-r--r-- | Src/omBrowser/toolbarProgress.cpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/Src/omBrowser/toolbarProgress.cpp b/Src/omBrowser/toolbarProgress.cpp new file mode 100644 index 00000000..3e544711 --- /dev/null +++ b/Src/omBrowser/toolbarProgress.cpp @@ -0,0 +1,197 @@ +#include "main.h" +#include "./toolbarProgress.h" +#include "./toolbar.h" +#include "./graphics.h" +#include "./resource.h" +#include "../Plugins/General/gen_ml/ml_ipc_0313.h" +#include "./ifc_imageloader.h" +#include <strsafe.h> + +#define PROGRESS_FRAMECOUNT 9 + +static ATOM TOOLBARPROGRESS_PROP = 0; +#define TIMER_PROGRESSSTEP_ID 111 +#define TIMER_PROGRESSSTEP_INTERVAL 120 + + +ToolbarProgress::ToolbarProgress(LPCSTR pszName, UINT nStyle, LPCWSTR pszText, LPCWSTR pszDescription) + : ToolbarItem(pszName, nStyle, ICON_NONE, pszText, pszDescription), + bitmap(NULL), frame(0), hTimer(NULL) + +{ +} + +ToolbarProgress::~ToolbarProgress() +{ + if (NULL != hTimer) + Animate(hTimer, FALSE); + + if (NULL != bitmap) + DeleteObject(bitmap); +} + +static void CALLBACK ToolbarProgress_TimerElapsed(HWND hwnd, UINT uMsg, UINT_PTR eventId, DWORD dwTime) +{ + ToolbarProgress *item = (ToolbarProgress*)GetProp(hwnd, MAKEINTATOM(TOOLBARPROGRESS_PROP)); + if (NULL == item || 0 != ((ToolbarItem::stateDisabled | ToolbarItem::stateHidden) & item->GetStyle())) + { + if (NULL != item) + item->Animate(hwnd, FALSE); + else + KillTimer(hwnd, TIMER_PROGRESSSTEP_ID); + return; + } + item->Animate(hwnd, TRUE); +} + + +ToolbarItem* CALLBACK ToolbarProgress::CreateInstance(ToolbarItem::Template *item) +{ + if (NULL == item) + return NULL; + + return new ToolbarProgress( (NULL != item->name) ? item->name : TOOLCLS_PROGRESS, + item->style | styleNoChevron, + item->text, + item->description); +} + +void ToolbarProgress::SetStyle(HWND hToolbar, UINT newStyle, UINT styleMask) +{ + __super::SetStyle(hToolbar, newStyle, styleMask); + + if (0 == ((stateDisabled | stateHidden) & style)) + { + Animate(hToolbar, TRUE); + } +} + +BOOL ToolbarProgress::Animate(HWND hToolbar, BOOL fAnimate) +{ + if (FALSE == fAnimate) + { + if (NULL != hTimer) + { + RemoveProp(hTimer, MAKEINTATOM(TOOLBARPROGRESS_PROP)); + KillTimer(hTimer, TIMER_PROGRESSSTEP_ID); + hTimer = NULL; + } + + if (0 != frame) + { + frame = 0; + InvalidateRect(hToolbar, &rect, FALSE); + } + + + } + else + { + if (NULL == hTimer) + { + if (0 == TOOLBARPROGRESS_PROP) + { + TOOLBARPROGRESS_PROP = GlobalAddAtom(L"omToolbarProgressProp"); + if (0 == TOOLBARPROGRESS_PROP) return FALSE; + } + + if (!SetProp(hToolbar, MAKEINTATOM(TOOLBARPROGRESS_PROP), (HANDLE)this)) + return FALSE; + + if (!SetTimer(hToolbar, TIMER_PROGRESSSTEP_ID, TIMER_PROGRESSSTEP_INTERVAL, + ToolbarProgress_TimerElapsed)) + { + RemoveProp(hToolbar, MAKEINTATOM(TOOLBARPROGRESS_PROP)); + return FALSE; + + } + hTimer = hToolbar; + } + + if (++frame >= PROGRESS_FRAMECOUNT) + { + frame = 1; + } + InvalidateRect(hToolbar, &rect, FALSE); + + } + + return TRUE; +} + +void ToolbarProgress::UpdateSkin(HWND hToolbar) +{ + + if (NULL != bitmap) + { + DeleteObject(bitmap); + bitmap = NULL; + } + + ifc_omimageloader *loader; + + if (SUCCEEDED(Plugin_QueryImageLoader(Plugin_GetInstance(), MAKEINTRESOURCE(IDR_TOOLBARPROGRESS_IMAGE), TRUE, &loader))) + { + BITMAPINFOHEADER headerInfo; + BYTE *pixelData; + if (SUCCEEDED(loader->LoadBitmapEx(&bitmap, &headerInfo, (void**)&pixelData))) + { + if (headerInfo.biHeight < 0) headerInfo.biHeight = -headerInfo.biHeight; + + Image_Colorize(pixelData, headerInfo.biWidth, headerInfo.biHeight, headerInfo.biBitCount, + Toolbar_GetBkColor(hToolbar), Toolbar_GetFgColor(hToolbar), TRUE); + } + loader->Release(); + } + +} + +BOOL ToolbarProgress::AdjustRect(HWND hToolbar, RECT *proposedRect) +{ + BITMAP bm; + if (NULL == bitmap || sizeof(BITMAP) != GetObject(bitmap, sizeof(BITMAP), &bm)) + return FALSE; + + if (bm.bmHeight < 0) bm.bmHeight = -bm.bmHeight; + bm.bmHeight /= PROGRESS_FRAMECOUNT; + proposedRect->right = proposedRect->left + bm.bmWidth; + proposedRect->top += (((proposedRect->bottom - proposedRect->top) - bm.bmHeight)/2); + proposedRect->bottom = proposedRect->top + bm.bmHeight; + + return TRUE; +} + +BOOL ToolbarProgress::Paint(HWND hToolbar, HDC hdc, const RECT *paintRect, UINT state) +{ + BITMAP bm; + if (NULL == bitmap || sizeof(BITMAP) != GetObject(bitmap, sizeof(BITMAP), &bm)) + return FALSE; + + if (bm.bmHeight < 0) bm.bmHeight = -bm.bmHeight; + bm.bmHeight /= PROGRESS_FRAMECOUNT; + + RECT blitRect; + if (!IntersectRect(&blitRect, paintRect)) + return TRUE; + + BOOL success = FALSE; + HDC hdcSrc = CreateCompatibleDC(hdc); + + if (NULL != hdcSrc) + { + HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcSrc, bitmap); + + success = BitBlt(hdc, blitRect.left, blitRect.top, + blitRect.right - blitRect.left, blitRect.bottom - blitRect.top, + hdcSrc, + blitRect.left - rect.left, + bm.bmHeight * frame + (blitRect.top - rect.top), + SRCCOPY); + + SelectObject(hdcSrc, hbmpOld); + DeleteDC(hdcSrc); + } + + return success; + +}
\ No newline at end of file |