diff options
Diffstat (limited to 'lib/gui/echeckbox.cpp')
| -rw-r--r-- | lib/gui/echeckbox.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/lib/gui/echeckbox.cpp b/lib/gui/echeckbox.cpp new file mode 100644 index 00000000..c41721ce --- /dev/null +++ b/lib/gui/echeckbox.cpp @@ -0,0 +1,138 @@ +#include <lib/gui/echeckbox.h> + +#include <lib/gdi/font.h> +#include <lib/base/init.h> +#include <lib/base/init_num.h> +#include <lib/gui/eskin.h> + +eCheckbox::eCheckbox(eWidget *parent, int checked, int takefocus, bool swapTxtPixmap, const char *deco) + :eButton(parent, 0, takefocus, deco), swapTxtPixmap(swapTxtPixmap) +{ + align=eTextPara::dirLeft; + ischecked = -1; + setCheck(checked); + CONNECT(selected, eCheckbox::sel); +} + +eCheckbox::~eCheckbox() +{ +} + +void eCheckbox::sel() +{ + setCheck(ischecked?0:1); + /*emit*/ checked(ischecked); +} + +void eCheckbox::gotFocus() +{ +#ifndef DISABLE_LCD + if (parent && parent->LCDElement) + { + LCDTmp = new eLabel(parent->LCDElement); + LCDTmp->hide(); + eSize s = parent->LCDElement->getSize(); + LCDTmp->move(ePoint(0,0)); + LCDTmp->resize(eSize(s.width(), s.height())); + ((eLabel*)LCDTmp)->setFlags(RS_WRAP); + ePtr<gPixmap> pm; + eSkin::getActive()->queryImage(pm, ischecked?"eCheckboxLCD.checked":"eCheckboxLCD.unchecked"); + LCDTmp->setPixmap(pm); + ((eLabel*)LCDTmp)->pixmap_position=ePoint(0, (size.height()-15)/2); + ((eLabel*)LCDTmp)->text_position=ePoint(21, 0); + LCDTmp->setText(text); + LCDTmp->show(); + } +#endif + setForegroundColor(focusF, false); + setBackgroundColor(focusB); +// invalidate(); +} + +void eCheckbox::lostFocus() +{ +#ifndef DISABLE_LCD + if (LCDTmp) + { + delete LCDTmp; + LCDTmp = 0; + } +#endif + eButton::lostFocus(); +} + + +void eCheckbox::setCheck(int c) +{ + if (ischecked != -1 && ischecked == c) + return; + + ischecked=c; + + ePtr<gPixmap> pixmap; + eSkin::getActive()->queryImage(pixmap, ischecked?"eCheckbox.checked":"eCheckbox.unchecked"); + setPixmap(pixmap); +#ifndef DISABLE_LCD + eSkin::getActive()->queryImage(pixmap, ischecked?"eCheckboxLCD.checked":"eCheckboxLCD.unchecked"); + if (LCDTmp) + LCDTmp->setPixmap(pixmap); +#endif +} + +int eCheckbox::setProperty(const eString &prop, const eString &value) +{ + if (prop=="swaptxtpixmap") + { + swapTxtPixmap = (value != "off"); + event( eWidgetEvent::changedSize ); + } + else + return eButton::setProperty(prop, value); + return 0; +} + +int eCheckbox::eventHandler(const eWidgetEvent &event) +{ + switch (event.type) + { + case eWidgetEvent::changedSize: + if (swapTxtPixmap) + { + text_position=ePoint(0,0); + eLabel::invalidate(); + validate(); + pixmap_position=ePoint( para->getBoundBox().right()+5, (size.height()-pixmap->y) / 2 ); + } + else + { + pixmap_position=ePoint(0, (size.height()-pixmap->y)/2); + text_position=ePoint((int)(pixmap->x*1.25), 0); + } + //return eButton::eventHandler(event); // changed Size must seen by eLabel... + break; + + default: + return eButton::eventHandler(event); + } + return 1; +} + +static eWidget *create_eCheckbox(eWidget *parent) +{ + return new eCheckbox(parent); +} + +class eCheckboxSkinInit +{ +public: + eCheckboxSkinInit() + { + eSkin::addWidgetCreator("eCheckbox", create_eCheckbox); + } + ~eCheckboxSkinInit() + { + eSkin::removeWidgetCreator("eCheckbox", create_eCheckbox); + } +}; + +eAutoInitP0<eCheckboxSkinInit> init_eCheckboxSkinInit(eAutoInitNumbers::guiobject, "eCheckbox"); |
