Projekt

Allgemein

Profil

Aktionen

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