#ifndef UI_BUTTON_H #define UI_BUTTON_H #include "UIElement.h" class UIButton : public UIElement { public: class Listener { public: virtual void onClick(UIButton*) = 0; }; private: bool enabled = true; const char* txt; uint8_t txtH; uint16_t txtW; bool down = false; const Color fillNormal = Color::fromRGB(180,180,180); const Color fillDown = Color::fromRGB(120,120,120); const Color frameBright = Color::fromRGB(230,230,230); const Color frameDark = Color::fromRGB(50,50,50); const Color cText = Color::fromRGB(0,0,0); const Color cTextDisabled = Color::fromRGB(140,140,140); Listener* listener = nullptr; static constexpr const char* TAG = "UIButton"; public: UIButton(const char* txt) : txt(txt) { txtW = fnt_f1.getWidth(txt); txtH = fnt_f1.getHeight(); } void setText(const char* txt) { this->txt = txt; } const char* getText() const { return this->txt; } void setListener(Listener* l) { this->listener = l; } void setEnabled(const bool en) { this->enabled = en; setNeedsRedraw(); } void draw(UIPainter& p) override { p.setFG( down ? fillDown : fillNormal ); p.fillRect(rect); p.setFG( down ? frameDark : frameBright ); // p.drawLine(rect.x, rect.y, rect.x+rect.w, rect.y); // top // p.drawLine(rect.x, rect.y, rect.x, rect.y+rect.h); // left p.drawLineHor(rect.x, rect.x+rect.w, rect.y); // top p.drawLineVer(rect.y, rect.y+rect.h, rect.x); // left; p.setFG( down ? frameBright : frameDark ); // p.drawLine(rect.x, rect.y+rect.h, rect.x+rect.w, rect.y+rect.h); // bottom // p.drawLine(rect.x+rect.w, rect.y, rect.x+rect.w, rect.y+rect.h); // right p.drawLineHor(rect.x, rect.x+rect.w, rect.y+rect.h); // bottom p.drawLineVer(rect.y, rect.y+rect.h, rect.x+rect.w); // right; p.setFG( enabled ? cText : cTextDisabled ); uint16_t o = down ? 1 : 0; p.drawText(rect.x+rect.w/2-txtW/2+o, rect.y+rect.h/2-txtH/2+o, txt); } void onTouchDown(const uint16_t, const uint16_t) override { ESP_LOGI(TAG, "onTouchDown()"); if (!enabled) {return;} down = true; setNeedsRedraw(); } void onTouchUp() override { if (!enabled) {return;} down = false; setNeedsRedraw(); if (listener) {listener->onClick(this);} } }; #endif // UI_BUTTON_H