aboutsummaryrefslogtreecommitdiff
path: root/lib/gui/elabel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gui/elabel.cpp')
-rw-r--r--lib/gui/elabel.cpp253
1 files changed, 253 insertions, 0 deletions
diff --git a/lib/gui/elabel.cpp b/lib/gui/elabel.cpp
new file mode 100644
index 00000000..ae04eb46
--- /dev/null
+++ b/lib/gui/elabel.cpp
@@ -0,0 +1,253 @@
+#include <lib/gui/elabel.h>
+
+#include <lib/gdi/fb.h>
+#include <lib/gdi/font.h>
+#include <lib/gdi/lcd.h>
+#include <lib/gui/eskin.h>
+#include <lib/base/init.h>
+#include <lib/base/init_num.h>
+
+eLabel::eLabel(eWidget *parent, int flags, int takefocus, const char *deco ):
+ eDecoWidget(parent, takefocus, deco), blitFlags(0), flags(flags),
+ para(0), align( eTextPara::dirLeft ), shortcutPixmap(0)
+{
+}
+
+eLabel::~eLabel()
+{
+ if (para)
+ {
+ para->destroy();
+ para=0;
+ }
+}
+
+void eLabel::setPixmapPosition( const ePoint &p )
+{
+ pixmap_position = p;
+ invalidate();
+}
+
+void eLabel::validate( const eSize* s )
+{
+ if (!para)
+ {
+ if (s)
+ para=new eTextPara( eRect(text_position.x(), text_position.y(), s->width() - text_position.x(), s->height() - text_position.y()));
+ else
+ para=new eTextPara( eRect(text_position.x(), text_position.y(), size.width() - text_position.x(), size.height() - text_position.y()));
+
+ para->setFont(font);
+ para->renderString(text, flags);
+ para->realign(align);
+ }
+}
+
+void eLabel::invalidate()
+{
+ if (para)
+ {
+ para->destroy();
+ para=0;
+ }
+ if (isVisible())
+ eDecoWidget::invalidate(); // we must redraw...
+}
+
+void eLabel::setFlags(int flag)
+{
+ flags|=flag;
+ if (flag)
+ invalidate();
+}
+
+void eLabel::setBlitFlags( int flags )
+{
+ blitFlags |= flags;
+}
+
+void eLabel::removeFlags(int flag)
+{
+ flags &= ~flag;
+ if (flag)
+ invalidate();
+}
+
+void eLabel::setAlign(int align)
+{
+ this->align = align;
+ invalidate();
+}
+
+void eLabel::redrawWidget(gPainter *target, const eRect &rc)
+{
+/* eDebug("decoStr = %s, text=%s, name=%s, %p left = %d, top = %d, width=%d, height = %d", strDeco?strDeco.c_str():"no", text?text.c_str():"no" , name?name.c_str():"no", this, this->getPosition().x(), this->getPosition().y(), this->getSize().width(), this->getSize().height() );
+ eDebug("renderContext left = %d, top = %d, width = %d, height = %d", rc.left(), rc.top(), rc.width(), rc.height() );*/
+
+ target->clip( rc );
+ eRect area=eRect(ePoint(0, 0), ePoint(width(), height()));
+/* eDebug("area left = %d, top = %d, width = %d, height = %d",
+ area.left(), area.top(),
+ area.width(), area.height() );*/
+
+ if (deco_selected && have_focus)
+ {
+ deco_selected.drawDecoration(target, ePoint(width(), height()));
+ area=crect_selected;
+ } else if (deco)
+ {
+ deco.drawDecoration(target, ePoint(width(), height()));
+ area=crect;
+ }
+/* eDebug("area left = %d, top = %d, width = %d, height = %d",
+ area.left(), area.top(),
+ area.width(), area.height() );*/
+
+ if (shortcutPixmap)
+ {
+ //area.setWidth(area.width()-area.height());
+ area.setX(area.height());
+ }
+
+ if (text.length())
+ {
+ if ( area.size().height() < size.height() ||
+ area.size().width() < size.width() )
+ {
+ // then deco is drawed
+ eSize s=area.size();
+ validate( &s );
+ } else
+ validate();
+
+ if (flags & flagVCenter)
+ yOffs = ( (area.height() - para->getBoundBox().height() ) / 2 + 0) - para->getBoundBox().top();
+ else
+ yOffs = 0;
+
+ eWidget *w;
+ if ((blitFlags & BF_ALPHATEST) && (transparentBackgroundColor >= 0))
+ {
+ w=this;
+ target->setBackgroundColor(transparentBackgroundColor);
+ } else
+ {
+ w=getNonTransparentBackground();
+ target->setBackgroundColor(w->getBackgroundColor());
+ }
+ target->setFont(font);
+ target->renderPara(*para, ePoint( area.left(), area.top()+yOffs) );
+ }
+ if (pixmap)
+ {
+// eDebug("blit pixmap area left=%d, top=%d, right=%d, bottom=%d", rc.left(), rc.top(), rc.right(), rc.bottom() );
+// eDebug("pixmap_pos x = %d, y = %d, xsize=%d, ysize=%d", pixmap_position.x(), pixmap_position.y(), pixmap->x, pixmap->y );
+ target->blit(pixmap, shortcutPixmap?pixmap_position+ePoint( area.left(), 0):pixmap_position, area, (blitFlags & BF_ALPHATEST) ? gPixmap::blitAlphaTest : 0);
+ }
+ if (shortcutPixmap)
+ target->blit(shortcutPixmap,
+ ePoint((area.height()-shortcutPixmap->x)/2, area.top()+(area.height()-shortcutPixmap->y)/2),
+ eRect(),
+ gPixmap::blitAlphaTest);
+ target->clippop();
+}
+
+int eLabel::eventHandler(const eWidgetEvent &event)
+{
+ switch (event.type)
+ {
+ case eWidgetEvent::changedFont:
+ case eWidgetEvent::changedText:
+ if (para)
+ {
+ para->destroy();
+ para=0;
+ }
+ if ( have_focus && deco_selected )
+ eDecoWidget::invalidate( crect_selected );
+ else if ( deco )
+ eDecoWidget::invalidate( crect );
+ else
+ eDecoWidget::invalidate();
+ break;
+
+ case eWidgetEvent::changedSize:
+ invalidate();
+ break;
+
+ default:
+ return eDecoWidget::eventHandler(event);
+ break;
+ }
+ return 1;
+}
+
+eSize eLabel::getExtend()
+{
+ validate();
+ return eSize(para->getBoundBox().width()+(shortcutPixmap?shortcutPixmap->x*2:0), para->getBoundBox().height());
+}
+
+ePoint eLabel::getLeftTop()
+{
+ validate();
+ return ePoint(para->getBoundBox().left(), para->getBoundBox().top());
+}
+
+int eLabel::setProperty(const eString &prop, const eString &value)
+{
+ if (prop=="wrap" && value == "on")
+ setFlags(RS_WRAP);
+ else if (prop=="alphatest" && value == "on")
+ {
+ transparentBackgroundColor=getBackgroundColor();
+ setBackgroundColor(-1);
+ blitFlags |= BF_ALPHATEST;
+ } else if (prop=="align")
+ {
+ if (value=="left")
+ setAlign(eTextPara::dirLeft);
+ else if (value=="center")
+ setAlign(eTextPara::dirCenter);
+ else if (value=="right")
+ setAlign(eTextPara::dirRight);
+ else if (value=="block")
+ setAlign(eTextPara::dirBlock);
+ else
+ setAlign(eTextPara::dirLeft);
+ }
+ else if (prop=="vcenter")
+ setFlags( flagVCenter );
+ else if (prop == "shortcut")
+ {
+ setShortcutPixmap(value);
+ return eWidget::setProperty(prop, value);
+ } else
+ return eDecoWidget::setProperty(prop, value);
+ return 0;
+}
+
+void eLabel::setShortcutPixmap(const eString &shortcut)
+{
+ eSkin::getActive()->queryImage(shortcutPixmap, "shortcut." + shortcut);
+}
+
+static eWidget *create_eLabel(eWidget *parent)
+{
+ return new eLabel(parent);
+}
+
+class eLabelSkinInit
+{
+public:
+ eLabelSkinInit()
+ {
+ eSkin::addWidgetCreator("eLabel", create_eLabel);
+ }
+ ~eLabelSkinInit()
+ {
+ eSkin::removeWidgetCreator("eLabel", create_eLabel);
+ }
+};
+
+eAutoInitP0<eLabelSkinInit> init_eLabelSkinInit(eAutoInitNumbers::guiobject, "eLabel");