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