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/Wasabi/api/wnd/wndclass/labelwnd.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Wasabi/api/wnd/wndclass/labelwnd.cpp')
-rw-r--r-- | Src/Wasabi/api/wnd/wndclass/labelwnd.cpp | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wnd/wndclass/labelwnd.cpp b/Src/Wasabi/api/wnd/wndclass/labelwnd.cpp new file mode 100644 index 00000000..d9aedd0f --- /dev/null +++ b/Src/Wasabi/api/wnd/wndclass/labelwnd.cpp @@ -0,0 +1,203 @@ +#include <precomp.h> + +#include "labelwnd.h" + +#include <api/locales/xlatstr.h> +#include <api/wnd/paintsets.h> + +#include <tataki/canvas/bltcanvas.h> +#include <tataki/color/skinclr.h> +#include <api/wnd/notifmsg.h> +#include <tataki/region/region.h> +#include <api/wnd/PaintCanvas.h> + +static SkinColor labelfg(L"wasabi.labelwnd.foreground"); +static SkinColor labelbg(L"wasabi.labelwnd.background", L"Text backgrounds"); + +#define DEF_LABEL_HEIGHT 0 +#define DEF_LABEL_FONTSIZE 16 + +LabelWnd::LabelWnd() { + show_label = FALSE; + labelsize = DEF_LABEL_FONTSIZE; + labelHeight = 0; + margin=0; + setVirtual(0); +} + +void LabelWnd::getClientRect(RECT *r) { + LABELWND_PARENT::getClientRect(r); + r->top += getLabelHeight(); +} + +int LabelWnd::onResize() { + LABELWND_PARENT::onResize(); + invalidateLabel(); +/* if (getLabelHeight() <= 0) return 0; + RECT r,ir; + LABELWND_PARENT::getClientRect(&r); + LABELWND_PARENT::getNonClientRect(&ir); + ir.bottom = ir.top + getLabelHeight()+margin; + invalidateRect(&ir);*/ + return 1; +} + +int LabelWnd::onPaint(Canvas *canvas) { + if (getLabelHeight() <= 0) return LABELWND_PARENT::onPaint(canvas); + + PaintBltCanvas paintcanvas; + if (canvas == NULL) { + if (!paintcanvas.beginPaintNC(this)) return 0; + canvas = &paintcanvas; + } + + RECT r; + LabelWnd::getNonClientRect(&r); + + if (canvas->isFixedCoords()) { // handle possible double buffer + // convert to canvas coords + r.right -= r.left; r.left = 0; + r.bottom -= r.top; r.top = 0; + } + + r.bottom = r.top + getLabelHeight(); + + if (margin) { + r.left+=margin; + r.right-=margin; + r.bottom+=margin*2; + } + + LABELWND_PARENT::onPaint(canvas); + int got_focus = gotFocus() || forceFocus(); + + if (wantRenderBaseTexture()) { + WASABI_API_WND->skin_renderBaseTexture(getBaseTextureWindow(), canvas, r, this); + } + +#ifdef WASABI_COMPILE_PAINTSETS + WASABI_API_WND->paintset_render(Paintset::LABEL, canvas, &r, got_focus ? 255 : 64); +#endif + Wasabi::FontInfo fontInfo; + fontInfo.opaque=false; + fontInfo.pointSize = getLabelHeight()-1; + const wchar_t *name = getName(); + if (name == NULL || *name == '\0') + name = L"Label"; +#define LEFTMARGIN 3 + fontInfo.color = labelbg; + const wchar_t *xname = name; + + switch(wantTranslation()) + { + case 1: + xname = _(name); + break; + case 2: + xname = __(name); + break; + } + + canvas->textOut(r.left+LEFTMARGIN+1, r.top+1, xname, &fontInfo); + fontInfo.color = labelfg; + canvas->textOut(r.left+LEFTMARGIN, r.top, xname, &fontInfo); + + return 1; +} + +void LabelWnd::onSetName() { + LABELWND_PARENT::onSetName(); + // make sure label gets repainted + if (isInited()) { + RECT r; + LabelWnd::getNonClientRect(&r); + r.bottom = r.top + getLabelHeight(); + invalidateRect(&r); + } +} + +//CUTint LabelWnd::childNotify(api_window *child, int msg, intptr_t param1, intptr_t param2) { +//CUT switch (msg) { +//CUT case CHILD_WINDOWSHADE_CAPABLE: return show_label; +//CUT case CHILD_WINDOWSHADE_ENABLE: return TRUE; +//CUT } +//CUT return LABELWND_PARENT::childNotify(child, msg, param1, param2); +//CUT} + +int LabelWnd::showLabel(int show) { + show_label = show; + setFontSize(-1); + if (isPostOnInit()) { + onResize(); + } + return 1; +} + +int LabelWnd::getLabelHeight() { + return show_label ? labelHeight : 0; +} + +void LabelWnd::setMargin(int newmargin) { + margin = newmargin; + RECT r; + getNonClientRect(&r); + r.bottom = getLabelHeight()+margin; + invalidateRect(&r); +} + +int LabelWnd::onGetFocus() { + LABELWND_PARENT::onGetFocus(); + invalidateLabel(); + return 1; +} + +int LabelWnd::onKillFocus() { + LABELWND_PARENT::onKillFocus(); + invalidateLabel(); + return 1; +} + +void LabelWnd::invalidateLabel() { + if (labelHeight <= 0) return; + RECT ncr; + RECT cr; +// RECT lr; + LabelWnd::getNonClientRect(&ncr); + LabelWnd::getClientRect(&cr); + RegionI nonClientRgn(&ncr); + RegionI clientRgn(&cr); + nonClientRgn.subtractRgn(&clientRgn); + invalidateRgn(&nonClientRgn); +// SubtractRect(&lr, &ncr, &cr); // PORT ME +// invalidateRect(&lr); +} + +int LabelWnd::wantFocus() { + return (labelHeight > 0); +} + +void LabelWnd::reloadResources() +{ + LABELWND_PARENT::reloadResources(); + if (isPostOnInit()) + onResize(); + invalidateLabel(); +} + +int LabelWnd::setFontSize(int size) +{ + LABELWND_PARENT::setFontSize(size); + TextInfoCanvas blt(this); + Wasabi::FontInfo fontInfo; +#ifndef WASABINOMAINAPI + fontInfo.pointSize = labelsize+api->metrics_getDelta(); +#else + fontInfo.pointSize = labelsize; + //MULTIAPI-FIXME: not handling delta +#endif + labelHeight = blt.getTextHeight(&fontInfo) + 1; + invalidate(); + if (isPostOnInit()) onResize(); + return 1; +} + |