Eval » Historie » Revision 25
« Zurück |
Revision 25/46
(diff)
| Weiter »
Maximilian Seesslen, 24.08.2022 13:51
Eval¶
Widgets¶
There is a ODesktop that holds a list of OScreens (or only the curent).
There is a OScreen that holds a list of OWidgets.
When the touch is pressed, the corresponding button can be determined.
An signal can be emmited.
An press-event can be queued, An release-event can be queued. An click-event can be queued if current button matches original pressed button.
- OButton::draw(): completely draws the widget
- OButton::update(): only draw status-relevant items, e.g. pressed, released, time changed...
All screens can be prepared at start.
A Screen can be active or inactive.
Only one screen is active plus an navigation-screen?
Touch¶
There is an touch class that helps converting raw values to X-Y-coordinates. touch
CTouch will emit signals "pressed, released, clicked" that can be connected to libocelli.
Watch¶
- the OWatch class shows an clock with specific style, analog or digital
Example: Minutnik¶
- Main screen; CWatch, Add-Button
- Add-Screen
- Espresso, Weisswurst, Weiches Ei, Hartes Ei, Nudeln, Pizza, Waschmaschine, Cancel; Height 32
- Alarm Screen
- Logo, Splash screen at boot time and stand-by-screen
- Release v2.0.0: Mode-Screen: Minutnik, Clock, StopWatch
Example: CANDis¶
- Main screen
- Button for Light, Sensemux-Diagram, Activity (TV, Musik, Solder, Off), Miniminutnik
- Header with Clock
- Light-Screen
- Power-Widget
- Ok-Button
- Clock-Screen (Screen saver)
- Clock, Date, Temperature, Quick-Access-Buttons
Pointers¶
Like in Qt an widget has an parent.
Single App class vs. Screens¶
Having everything in an single class may be confusing. It may be split to per-Screen-classes.
class OWidget
{
static GDisplay *m_display;
public:
CSignal signalClicked();
virtual pressed(int x, int y);
virtual released(int x, int y);
virtual clicked(int x, int y);
}
OWidget::m_display=nullptr;
class OScreen
{
CColor background;
CList <OWidget *>m_widgets;
public:
virtual clicked(int x,int y)
{
OWidget *widget=getWidget(x,y);
if(widget)
widget->clicked( x, y);
}
}
class Ocelli
{
OScreen *currentScreen;
OScreen *previousScreen;
public:
Ocelli(CGDisplay &display, CTouch &touch)
{
OWidget::m_pDisplay=&display;
touch.signalClicked.connect( this, Ocelli::clicked )
}
setCurrentScreen(OScreen *screen);
setPreviousScreen();
clicked( int x, int y)
{
if(currentScreen)
{
currentScreen->clicked( x, y);
}
}
}
class CApp: Ocelli
{
public:
// OScreen *screens[3];
CScreenMain *screenMain;
CScreenAlarm *screenAlarm;
CApp()
{
addScreen( screenMain = new CScreenMain() );
}
}
class CScreenClock: public OScreen
{
CApp &app;
OButton buttonAddTimer;
OLabel labelTime;
OLabel labelDate;
public:
CScreenMain()
buttonAddTimer(this)
{
}
virtual clicked(int x,int y)
{
app.m_pwmBacklight.setPwmValue(800);
}
void eventLoop()
{
app.m_pwmBacklight.setPwmValue(100);
}
addItemPressed()
{
app.switchScreen( eDesktopItems );
}
}
class CScreenMain: public OScreen
{
CApp &app;
public:
virtual clicked(int x,int y);
}
class CScreenAlarm: public OScreen
{
CApp &app;
OLabel alarmText;
lrtimer_t activationTimer;
public:
CScreenAlarm()
:alarmText("-", centerX, centerY-200)
{
}
virtual avctivate() override
{
app.m_buzzer.setBeepMode(alarm);
activationTimer=lrNow();
}
virtual clicked(int x,int y) override
{
if( ! lrElapsed(lrtimer_t, MSECS_PER_SEC / 2 ) )
{
return;
}
app.m_buzzer.setBeepMode(nullptr);
app.setPreviousScreen();
}
}
Von Maximilian Seesslen vor mehr als 2 Jahren aktualisiert · 25 Revisionen