aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/General/gen_ml/skinnedprogressbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/General/gen_ml/skinnedprogressbar.cpp')
-rw-r--r--Src/Plugins/General/gen_ml/skinnedprogressbar.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_ml/skinnedprogressbar.cpp b/Src/Plugins/General/gen_ml/skinnedprogressbar.cpp
new file mode 100644
index 00000000..45097b83
--- /dev/null
+++ b/Src/Plugins/General/gen_ml/skinnedprogressbar.cpp
@@ -0,0 +1,131 @@
+#include "api__gen_ml.h"
+#include "main.h"
+#include "./skinnedprogressbar.h"
+#include "./skinning.h"
+#include "../winamp/wa_dlg.h"
+#include "./colors.h"
+#include <strsafe.h>
+
+SkinnedProgressBar::SkinnedProgressBar(void)
+ : SkinnedWnd(FALSE), skinCursor(NULL)
+{
+}
+
+SkinnedProgressBar::~SkinnedProgressBar(void)
+{
+}
+
+BOOL SkinnedProgressBar::Attach(HWND hProgressBar)
+{
+ if(!__super::Attach(hProgressBar)) return FALSE;
+
+ SetType(SKINNEDWND_TYPE_PROGRESSBAR);
+ return TRUE;
+}
+
+void SkinnedProgressBar::OnSkinChanged(BOOL bNotifyChildren, BOOL bRedraw)
+{
+ skinCursor = (0 != (SWS_USESKINCURSORS & style)) ?
+ (HCURSOR)SENDWAIPC(plugin.hwndParent, IPC_GETSKINCURSORS, WACURSOR_NORMAL) : NULL;
+
+ HFONT hfOld = (HFONT)CallPrevWndProc(WM_GETFONT, 0, 0L);
+
+ __super::OnSkinChanged(bNotifyChildren, bRedraw);
+
+ if (hfOld != (HFONT)CallPrevWndProc(WM_GETFONT, 0, 0L))
+ CallPrevWndProc(TTM_UPDATE, 0, 0L);
+}
+
+void SkinnedProgressBar::OnPaint()
+{
+ PAINTSTRUCT ps;
+ HDC hdc = BeginPaint(hwnd, &ps);
+ if (NULL == hdc) return;
+
+ int radius = (ps.rcPaint.bottom - ps.rcPaint.top - WASABI_API_APP->getScaleY(1)) / WASABI_API_APP->getScaleY(2);
+ int radius2 = WASABI_API_APP->getScaleY(5);
+
+ RECT r;
+ CopyRect(&r, &ps.rcPaint);
+ // fill the background accordingly
+ FillRect(hdc, &r, (HBRUSH)MlStockObjects_Get(WNDBCK_BRUSH));
+
+ r.right -= WASABI_API_APP->getScaleX(1);
+ r.bottom -= WASABI_API_APP->getScaleY(1);
+ OffsetRect(&r, 1, 1);
+ HPEN oldPen = SelectPen(hdc, MlStockObjects_Get(HILITE_PEN));
+ HBRUSH oldBrush = SelectBrush(hdc, MlStockObjects_Get(WNDBCK_BRUSH));
+ // draw the border edge offset to add a 'shadow'
+ RoundRect(hdc, r.left, r.top, r.right, r.bottom, radius2, radius);
+
+ ps.rcPaint.bottom -= WASABI_API_APP->getScaleY(1);
+
+ SelectObject(hdc, MlStockObjects_Get(ITEMBCK_PEN));
+ SelectObject(hdc, MlStockObjects_Get(ITEMBCK_BRUSH));
+ // draw the 'empty' part of the bar with a slight overlap of the 'shadow'
+ RoundRect(hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom, radius2, radius);
+
+ int pos = (DWORD)CallPrevWndProc(PBM_GETPOS, 0, 0L);
+ if (pos > 0)
+ {
+ int range = (DWORD)CallPrevWndProc(PBM_GETRANGE, 0, 0L);
+ int val = (((ps.rcPaint.right) * pos) / range);
+
+ if (val > 0)
+ {
+ if ((ps.rcPaint.left + val + radius) > ps.rcPaint.right)
+ {
+ SelectObject(hdc, MlStockObjects_Get(ITEMTEXT_PEN));
+ SelectObject(hdc, MlStockObjects_Get(ITEMTEXT_BRUSH));
+ // draws the 'filled' part of the bar with a slight overlap of the 'shadow'
+ RoundRect(hdc, ps.rcPaint.left - WASABI_API_APP->getScaleX(10), ps.rcPaint.top,
+ val + (radius * WASABI_API_APP->getScaleY(2)) - WASABI_API_APP->getScaleY(10), ps.rcPaint.bottom, radius2, radius);
+ }
+ else
+ {
+ ps.rcPaint.right = ps.rcPaint.left + val;
+ FillRect(hdc, &ps.rcPaint, (HBRUSH)MlStockObjects_Get(ITEMTEXT_BRUSH));
+ }
+ }
+
+ // not keen on this at all but it sorts out the progress overlap
+ SelectObject(hdc, MlStockObjects_Get(WNDBCK_PEN));
+ MoveToEx(hdc, ps.rcPaint.left, ps.rcPaint.bottom, NULL);
+ LineTo(hdc, ps.rcPaint.left + ((radius)/ 2), ps.rcPaint.bottom);
+ LineTo(hdc, ps.rcPaint.left, ps.rcPaint.bottom - ((radius)/ WASABI_API_APP->getScaleY(2)));
+ LineTo(hdc, ps.rcPaint.left, ps.rcPaint.bottom);
+
+ MoveToEx(hdc, ps.rcPaint.left, ps.rcPaint.top, NULL);
+ LineTo(hdc, ps.rcPaint.left, ps.rcPaint.top + ((radius)/ WASABI_API_APP->getScaleY(2)));
+
+ MoveToEx(hdc, ps.rcPaint.left, ps.rcPaint.top, NULL);
+ LineTo(hdc, ps.rcPaint.left + ((radius)/ WASABI_API_APP->getScaleY(2)), ps.rcPaint.top);
+ }
+
+ SelectPen(hdc, oldPen);
+ SelectBrush(hdc, oldBrush);
+}
+
+UINT SkinnedProgressBar::GetBorderType(void)
+{
+ return BORDER_NONE;
+}
+
+LRESULT SkinnedProgressBar::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch(uMsg)
+ {
+ case WM_PAINT:
+ OnPaint();
+ return 0;
+ case WM_SETCURSOR:
+ if (NULL != skinCursor)
+ {
+ if (skinCursor != GetCursor())
+ SetCursor(skinCursor);
+ return TRUE;
+ }
+ break;
+ }
+ return __super::WindowProc(uMsg, wParam, lParam);
+} \ No newline at end of file