Projekt

Allgemein

Profil

Aktionen

Eval » Historie » Revision 30

« Zurück | Revision 30/46 (diff) | Weiter »
Maximilian Seesslen, 01.09.2022 17:28


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.
The ocelli-app does not know about the screens directly, it just holds the pointers to them in Ocelli object.
After instanciating the app, also the screens get instanciated and added to the ocelli-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 mehr als 2 Jahren aktualisiert · 30 Revisionen