Projekt

Allgemein

Profil

Eval » Historie » Version 28

Maximilian Seesslen, 24.08.2022 14:13

1 1 Maximilian Seesslen
h1. Eval
2
3
h2. Widgets
4
5 3 Maximilian Seesslen
There is a ODesktop that holds a list of OScreens (or only the curent).
6 1 Maximilian Seesslen
There is a OScreen that holds a list of OWidgets.
7
When the touch is pressed, the corresponding button can be determined.
8
An signal can be emmited.
9
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.
10
11
* OButton::draw(): completely draws the widget
12
* OButton::update(): only draw status-relevant items, e.g. pressed, released, time changed...
13
14 2 Maximilian Seesslen
All screens can be prepared at start.
15 1 Maximilian Seesslen
A Screen can be active or inactive.
16 3 Maximilian Seesslen
17 12 Maximilian Seesslen
Only one screen is active plus an navigation-screen?
18
19 3 Maximilian Seesslen
h2. Touch
20
21 16 Maximilian Seesslen
There is an touch class that helps converting raw values to X-Y-coordinates. [[Biwak:touch]]
22 17 Maximilian Seesslen
CTouch will emit signals "pressed, released, clicked" that can be connected to libocelli.
23 2 Maximilian Seesslen
24 1 Maximilian Seesslen
h2. Watch
25
26 5 Maximilian Seesslen
* the OWatch class shows an clock with specific style, analog or digital
27 1 Maximilian Seesslen
28 6 Maximilian Seesslen
h2. Example: Minutnik
29 1 Maximilian Seesslen
30
* Main screen; CWatch, Add-Button
31
* Add-Screen
32
** Espresso, Weisswurst, Weiches Ei, Hartes Ei, Nudeln, Pizza, Waschmaschine, Cancel; Height 32
33
* Alarm Screen
34
* Logo, Splash screen at boot time and stand-by-screen
35 7 Maximilian Seesslen
* Release v2.0.0: Mode-Screen: Minutnik, Clock, StopWatch
36 6 Maximilian Seesslen
37 7 Maximilian Seesslen
h2. Example: CANDis
38 1 Maximilian Seesslen
39 7 Maximilian Seesslen
* Main screen
40 10 Maximilian Seesslen
** Button for Light, Sensemux-Diagram, Activity (TV, Musik, Solder, Off), Miniminutnik
41 7 Maximilian Seesslen
** Header with Clock
42 8 Maximilian Seesslen
* Light-Screen
43
** Power-Widget
44
** Ok-Button
45 7 Maximilian Seesslen
* Clock-Screen (Screen saver)
46 9 Maximilian Seesslen
** Clock, Date, Temperature, Quick-Access-Buttons
47 18 Maximilian Seesslen
48
h2. Pointers
49
50
Like in Qt an widget has an parent.
51
52
h2. Single App class vs. Screens
53
54 27 Maximilian Seesslen
Having everything in an single class may be confusing. It should be splited to per-Screen-classes. The screens have access to the app.
55 19 Maximilian Seesslen
<pre><code class="cpp">
56 18 Maximilian Seesslen
57 28 Maximilian Seesslen
enum EEvent
58
{
59
   pressed,
60
   released,
61
   clicked
62
};
63
64 25 Maximilian Seesslen
class OWidget
65
{
66
   static GDisplay *m_display;
67 1 Maximilian Seesslen
   public:
68 25 Maximilian Seesslen
   CSignal signalClicked();
69
70 28 Maximilian Seesslen
   virtual event(int x, int y, EEvent event);
71 25 Maximilian Seesslen
}
72
73
OWidget::m_display=nullptr;
74 24 Maximilian Seesslen
75
class OScreen
76 1 Maximilian Seesslen
{
77 25 Maximilian Seesslen
      CColor background;
78 1 Maximilian Seesslen
      CList <OWidget *>m_widgets;
79
   public:
80 28 Maximilian Seesslen
      virtual event(int x,int y, EEvent event)
81 25 Maximilian Seesslen
      {
82
         OWidget *widget=getWidget(x,y);
83
         if(widget)
84 28 Maximilian Seesslen
             widget->event( x, y, event);
85 25 Maximilian Seesslen
      }
86 22 Maximilian Seesslen
}
87
88
class Ocelli
89
{
90 26 Maximilian Seesslen
   private:
91 22 Maximilian Seesslen
      OScreen *currentScreen;
92
      OScreen *previousScreen;
93 26 Maximilian Seesslen
      bool m_darkened=false;
94 1 Maximilian Seesslen
95 25 Maximilian Seesslen
   public:
96
      Ocelli(CGDisplay &display, CTouch &touch)
97 1 Maximilian Seesslen
      {
98 27 Maximilian Seesslen
         OWidget::m_pDisplay=&display;
99 25 Maximilian Seesslen
         touch.signalClicked.connect( this, Ocelli::clicked );
100 1 Maximilian Seesslen
      }
101 18 Maximilian Seesslen
      setCurrentScreen(OScreen *screen);
102 1 Maximilian Seesslen
      setPreviousScreen();
103 28 Maximilian Seesslen
      event( int x, int y, EEvent event)
104 25 Maximilian Seesslen
      {
105
         if(currentScreen)
106
         {
107 28 Maximilian Seesslen
            currentScreen->event( x, y, event);
108 25 Maximilian Seesslen
         }
109
      }
110 1 Maximilian Seesslen
      eventLoop()
111
      {
112 27 Maximilian Seesslen
         if(currentScreen)
113
         {
114
            currentScreen->eventLoop();
115
         }
116 26 Maximilian Seesslen
      }
117 22 Maximilian Seesslen
}
118 24 Maximilian Seesslen
119 1 Maximilian Seesslen
class CApp: Ocelli
120 24 Maximilian Seesslen
{
121 1 Maximilian Seesslen
   public:
122
123 25 Maximilian Seesslen
      CScreenMain *screenMain;
124
      CScreenAlarm *screenAlarm;
125 21 Maximilian Seesslen
      CApp()
126 24 Maximilian Seesslen
      {
127 25 Maximilian Seesslen
         addScreen( screenMain = new CScreenMain() );
128 21 Maximilian Seesslen
      }
129 1 Maximilian Seesslen
}
130
131 25 Maximilian Seesslen
class CScreenClock: public OScreen
132 1 Maximilian Seesslen
{
133 23 Maximilian Seesslen
      CApp &app;
134 18 Maximilian Seesslen
      OButton buttonAddTimer;
135 25 Maximilian Seesslen
      OLabel labelTime;
136 26 Maximilian Seesslen
      OLabel labelDate;
137 24 Maximilian Seesslen
      lrtimer_t clickTimer;
138 1 Maximilian Seesslen
139 20 Maximilian Seesslen
   public:
140
141 1 Maximilian Seesslen
      CScreenMain()
142 27 Maximilian Seesslen
         :buttonAddTimer(this)
143 1 Maximilian Seesslen
      {
144
      }
145 25 Maximilian Seesslen
      virtual clicked(int x,int y)
146
      {
147 26 Maximilian Seesslen
         clickTimer=ltNow();
148 25 Maximilian Seesslen
         app.m_pwmBacklight.setPwmValue(800);
149
      }
150
      void eventLoop()
151
      {
152
         app.m_pwmBacklight.setPwmValue(100);
153
      }
154 18 Maximilian Seesslen
      addItemPressed()
155 1 Maximilian Seesslen
      {
156
         app.switchScreen( eDesktopItems );
157 18 Maximilian Seesslen
      }
158 24 Maximilian Seesslen
}
159 23 Maximilian Seesslen
160 1 Maximilian Seesslen
class CScreenMain: public OScreen
161
{
162 24 Maximilian Seesslen
      CApp &app;
163
164
   public:
165
166
      virtual clicked(int x,int y);
167
}
168
169
class CScreenAlarm: public OScreen
170
{
171
      CApp &app;
172 1 Maximilian Seesslen
      OLabel alarmText;
173 24 Maximilian Seesslen
      lrtimer_t activationTimer;
174
175
   public:
176
      CScreenAlarm()
177 27 Maximilian Seesslen
         :alarmText( centerX, centerY-200, "-")
178 24 Maximilian Seesslen
      {
179
      }
180
      virtual avctivate() override
181 1 Maximilian Seesslen
      {
182
         app.m_buzzer.setBeepMode(alarm);
183
         activationTimer=lrNow();
184 24 Maximilian Seesslen
      }
185
      virtual clicked(int x,int y) override
186
      {
187 27 Maximilian Seesslen
         // Dont allow to quit alarm immediately by accident 
188
         // when playing with the device; 500ms must elapse
189
         if( ! lrElapsed(activationTimer, MSECS_PER_SEC / 2 ) )
190 24 Maximilian Seesslen
         {
191
            return;
192
         }
193
         app.m_buzzer.setBeepMode(nullptr);
194 27 Maximilian Seesslen
         app.activatePreviousScreen();
195 24 Maximilian Seesslen
      }
196 18 Maximilian Seesslen
}
197 19 Maximilian Seesslen
</code></pre>