Eval » Historie » Revision 29
      « Zurück |
    Revision 29/46
      (diff)
      | Weiter »
    
    Maximilian Seesslen, 01.09.2022 16:45 
    
    
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 should be splited to per-Screen-classes. The screens have access to the app.
class CApp: Ocelli
{
   public:
      CScreenMain *screenMain;
      CScreenAlarm *screenAlarm;
      CApp()
      {
         addScreen( screenMain = new CScreenMain() );
      }
}
class CScreenClock: public OScreen
{
      CApp &app;
      OButton buttonAddTimer;
      OLabel labelTime;
      OLabel labelDate;
      lrtimer_t clickTimer;
   public:
      CScreenMain()
         :buttonAddTimer(this)
      {
      }
      virtual clicked(int x,int y)
      {
         clickTimer=ltNow();
         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
      {
         // Dont allow to quit alarm immediately by accident 
         // when playing with the device; 500ms must elapse
         if( ! lrElapsed(activationTimer, MSECS_PER_SEC / 2 ) )
         {
            return;
         }
         app.m_buzzer.setBeepMode(nullptr);
         app.activatePreviousScreen();
         app.
      }
}
Von Maximilian Seesslen vor etwa 3 Jahren aktualisiert · 29 Revisionen