268 lines
7.0 KiB
C++
268 lines
7.0 KiB
C++
#ifndef widgets_h
|
|
#define widgets_h
|
|
|
|
#include "Arduino.h"
|
|
//#include "../../core/config.h"
|
|
enum WidgetAlign { WA_LEFT, WA_CENTER, WA_RIGHT };
|
|
enum BitrateFormat { BF_UNCNOWN, BF_MP3, BF_AAC, BF_FLAC, BF_OGG, BF_WAV };
|
|
|
|
typedef struct clipArea {
|
|
uint16_t left;
|
|
uint16_t top;
|
|
uint16_t width;
|
|
uint16_t height;
|
|
} clipArea;
|
|
|
|
struct WidgetConfig {
|
|
uint16_t left;
|
|
uint16_t top;
|
|
uint16_t textsize;
|
|
WidgetAlign align;
|
|
};
|
|
|
|
struct ScrollConfig {
|
|
WidgetConfig widget;
|
|
uint16_t buffsize;
|
|
bool uppercase;
|
|
uint16_t width;
|
|
uint16_t startscrolldelay;
|
|
uint8_t scrolldelta;
|
|
uint16_t scrolltime;
|
|
};
|
|
|
|
struct FillConfig {
|
|
WidgetConfig widget;
|
|
uint16_t width;
|
|
uint16_t height;
|
|
bool outlined;
|
|
};
|
|
|
|
struct ProgressConfig {
|
|
uint16_t speed;
|
|
uint16_t width;
|
|
uint16_t barwidth;
|
|
};
|
|
|
|
struct VUBandsConfig {
|
|
uint16_t width;
|
|
uint16_t height;
|
|
uint8_t space;
|
|
uint8_t vspace;
|
|
uint8_t perheight;
|
|
uint8_t fadespeed;
|
|
};
|
|
|
|
struct MoveConfig {
|
|
uint16_t x;
|
|
uint16_t y;
|
|
int16_t width;
|
|
};
|
|
|
|
struct BitrateConfig {
|
|
WidgetConfig widget;
|
|
uint16_t dimension;
|
|
};
|
|
|
|
class Widget{
|
|
public:
|
|
Widget(){ _active = false; }
|
|
virtual ~Widget(){}
|
|
virtual void loop(){}
|
|
virtual void init(WidgetConfig conf, uint16_t fgcolor, uint16_t bgcolor){
|
|
_config = conf;
|
|
_fgcolor = fgcolor;
|
|
_bgcolor = bgcolor;
|
|
_width = _backMove.width = 0;
|
|
_backMove.x = _config.left;
|
|
_backMove.y = _config.top;
|
|
_moved = _locked = false;
|
|
}
|
|
void setAlign(WidgetAlign align){
|
|
_config.align = align;
|
|
}
|
|
void setActive(bool act, bool clr=false) { _active = act; if(_active && !_locked) _draw(); if(clr && !_locked) _clear(); }
|
|
void lock(bool lck=true) { _locked = lck; if(_locked) _reset(); if(_locked && _active) _clear(); }
|
|
void unlock() { _locked = false; }
|
|
bool locked() { return _locked; }
|
|
void moveTo(MoveConfig mv){
|
|
if(mv.width<0) return;
|
|
_moved = true;
|
|
if(_active && !_locked) _clear();
|
|
_config.left = mv.x;
|
|
_config.top = mv.y;
|
|
if(mv.width>0) _width = mv.width;
|
|
_reset();
|
|
_draw();
|
|
}
|
|
void moveBack(){
|
|
if(!_moved) return;
|
|
if(_active && !_locked) _clear();
|
|
_config.left = _backMove.x;
|
|
_config.top = _backMove.y;
|
|
_width = _backMove.width;
|
|
_moved = false;
|
|
_reset();
|
|
_draw();
|
|
}
|
|
protected:
|
|
bool _active, _moved, _locked;
|
|
uint16_t _fgcolor, _bgcolor, _width;
|
|
WidgetConfig _config;
|
|
MoveConfig _backMove;
|
|
virtual void _draw() {}
|
|
virtual void _clear() {}
|
|
virtual void _reset() {}
|
|
};
|
|
|
|
class TextWidget: public Widget {
|
|
public:
|
|
TextWidget() {}
|
|
TextWidget(WidgetConfig wconf, uint16_t buffsize, bool uppercase, uint16_t fgcolor, uint16_t bgcolor) { init(wconf, buffsize, uppercase, fgcolor, bgcolor); }
|
|
~TextWidget();
|
|
void init(WidgetConfig wconf, uint16_t buffsize, bool uppercase, uint16_t fgcolor, uint16_t bgcolor);
|
|
void setText(const char* txt);
|
|
void setText(int val, const char *format);
|
|
void setText(const char* txt, const char *format);
|
|
bool uppercase() { return _uppercase; }
|
|
protected:
|
|
char *_text;
|
|
char *_oldtext;
|
|
bool _uppercase;
|
|
uint16_t _buffsize, _textwidth, _oldtextwidth, _oldleft, _textheight;
|
|
uint8_t _charWidth;
|
|
protected:
|
|
void _draw();
|
|
uint16_t _realLeft();
|
|
};
|
|
|
|
class FillWidget: public Widget {
|
|
public:
|
|
FillWidget() {}
|
|
FillWidget(FillConfig conf, uint16_t bgcolor) { init(conf, bgcolor); }
|
|
void init(FillConfig conf, uint16_t bgcolor);
|
|
protected:
|
|
uint16_t _height;
|
|
void _draw();
|
|
};
|
|
|
|
class ScrollWidget: public TextWidget {
|
|
public:
|
|
ScrollWidget(){}
|
|
ScrollWidget(const char* separator, ScrollConfig conf, uint16_t fgcolor, uint16_t bgcolor);
|
|
~ScrollWidget();
|
|
void init(const char* separator, ScrollConfig conf, uint16_t fgcolor, uint16_t bgcolor);
|
|
void loop();
|
|
void setText(const char* txt);
|
|
void setText(const char* txt, const char *format);
|
|
private:
|
|
char *_sep;
|
|
char *_window;
|
|
int16_t _x;
|
|
bool _doscroll;
|
|
uint8_t _scrolldelta;
|
|
uint16_t _scrolltime;
|
|
uint32_t _scrolldelay;
|
|
uint16_t _sepwidth, _startscrolldelay;
|
|
uint8_t _charWidth;
|
|
private:
|
|
void _setTextParams();
|
|
void _calcX();
|
|
void _drawFrame();
|
|
void _draw();
|
|
bool _checkIsScrollNeeded();
|
|
bool _checkDelay(int m, uint32_t &tstamp);
|
|
void _clear();
|
|
void _reset();
|
|
};
|
|
|
|
class SliderWidget: public Widget {
|
|
public:
|
|
SliderWidget(){}
|
|
SliderWidget(FillConfig conf, uint16_t fgcolor, uint16_t bgcolor, uint32_t maxval, uint16_t oucolor=0){
|
|
init(conf, fgcolor, bgcolor, maxval, oucolor);
|
|
}
|
|
void init(FillConfig conf, uint16_t fgcolor, uint16_t bgcolor, uint32_t maxval, uint16_t oucolor=0);
|
|
void setValue(uint32_t val);
|
|
protected:
|
|
uint16_t _height, _oucolor, _oldvalwidth;
|
|
uint32_t _max, _value;
|
|
bool _outlined;
|
|
void _draw();
|
|
void _drawslider();
|
|
void _clear();
|
|
};
|
|
|
|
class VuWidget: public Widget {
|
|
public:
|
|
VuWidget() {}
|
|
VuWidget(WidgetConfig wconf, VUBandsConfig bands, uint16_t vumaxcolor, uint16_t vumincolor, uint16_t bgcolor) { init(wconf, bands, vumaxcolor, vumincolor, bgcolor); }
|
|
~VuWidget();
|
|
void init(WidgetConfig wconf, VUBandsConfig bands, uint16_t vumaxcolor, uint16_t vumincolor, uint16_t bgcolor);
|
|
void loop();
|
|
protected:
|
|
#if !defined(DSP_LCD) && !defined(DSP_OLED)
|
|
Canvas *_canvas;
|
|
#endif
|
|
VUBandsConfig _bands;
|
|
uint16_t _vumaxcolor, _vumincolor;
|
|
void _draw();
|
|
void _clear();
|
|
};
|
|
|
|
class NumWidget: public TextWidget {
|
|
public:
|
|
void init(WidgetConfig wconf, uint16_t buffsize, bool uppercase, uint16_t fgcolor, uint16_t bgcolor);
|
|
void setText(const char* txt);
|
|
void setText(int val, const char *format);
|
|
protected:
|
|
void _getBounds();
|
|
void _draw();
|
|
};
|
|
|
|
class ProgressWidget: public TextWidget {
|
|
public:
|
|
ProgressWidget() {}
|
|
ProgressWidget(WidgetConfig conf, ProgressConfig pconf, uint16_t fgcolor, uint16_t bgcolor) {
|
|
init(conf, pconf, fgcolor, bgcolor);
|
|
}
|
|
void init(WidgetConfig conf, ProgressConfig pconf, uint16_t fgcolor, uint16_t bgcolor){
|
|
TextWidget::init(conf, pconf.width, false, fgcolor, bgcolor);
|
|
_speed = pconf.speed; _width = pconf.width; _barwidth = pconf.barwidth;
|
|
_pg = 0;
|
|
}
|
|
void loop();
|
|
private:
|
|
uint8_t _pg;
|
|
uint16_t _speed, _barwidth;
|
|
uint32_t _scrolldelay;
|
|
void _progress();
|
|
bool _checkDelay(int m, uint32_t &tstamp);
|
|
};
|
|
|
|
class ClockWidget: public Widget {
|
|
public:
|
|
void draw();
|
|
protected:
|
|
void _draw();
|
|
void _clear();
|
|
};
|
|
|
|
class BitrateWidget: public Widget {
|
|
public:
|
|
BitrateWidget() {}
|
|
BitrateWidget(BitrateConfig bconf, uint16_t fgcolor, uint16_t bgcolor) { init(bconf, fgcolor, bgcolor); }
|
|
~BitrateWidget(){}
|
|
void init(BitrateConfig bconf, uint16_t fgcolor, uint16_t bgcolor);
|
|
void setBitrate(uint16_t bitrate);
|
|
void setFormat(BitrateFormat format);
|
|
protected:
|
|
BitrateFormat _format;
|
|
char _buf[6];
|
|
uint8_t _charWidth;
|
|
uint16_t _dimension, _bitrate, _textheight;
|
|
void _draw();
|
|
void _clear();
|
|
};
|
|
|
|
#endif
|