winamp/Src/omBrowser/toolbarProgress.cpp
2024-09-24 14:54:57 +02:00

197 lines
4.6 KiB
C++

#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;
}