[C++] GUI microcontroller

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • alfaleader
  • Registratie: Mei 2009
  • Laatst online: 02-12-2024
Hallo

Ik ben bezig aan een GUI library te maken voor mijn Mini-DK2 microcontroller met ingebouwd 320x240 LCD scherm en touchscreen (de mini-dk2 is compatibel met de online mbed compiler, zodat je hier gemakkelijk in C++ kunt coden).

Wat ik nu heb (deels overgenomen van een andere library):
Een klasse "Menuitems" met daarin alleen informatie zoals een char* met de naam, een functiepointer voor wat te doen als er op dit menuitem is geklikt, een pointer naar een ander menuitem...
Dan is er een klasse "Menu", wat eigelijk niet meer is dan een vector van verschillende menuitems.
Ten slotte is er de "Navigator" klasse, die alles doet in verband met het tonen van de menu's, het controleren dat er een touch plaatsvind en hiermee de juiste dingen doet, de navigator houd ook bij wat het actieve menu is (zodat hij de juiste dingen doet bij een touch).

Het grote nadeel is dat dit alleen maar werkt met "normale" statische menus (dus "menuitem1", "menuitem2" ...). Nu wil ik deze boel wat uitbreiden zodat ik ook andere dingen kan tonen op het scherm (bijvoorbeeld een fader, numeriek toetsenbord voor nummers in te geven, labels...

Nu wil ik helemaal opnieuw beginnen en is mijn vraag hoe ik dit het best zou doen? Dit is wat ik al bedacht heb (copy paste van stackoverflow, maar daar krijg ik geen reactie):

My first thought was using an Abstract class "InterfaceElement", with in it functions like "touchEvent() , draw(), update()". Then I would use different IntefaceElements like Button, Slider, Label... All those InterfaceElements would go into a vector that is in a certain Container (with for each container a different layout). Then a Controller that remembers the currently active Container, and gives through the touchEvents to the container which handles it to the InterfaceElement.

Of zou ik het best overstappen op iets meer MVC achtigs?

Bedankt!

Jannes

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
"Navigator" is iets dubieus. Het klinkt eerlijk gezegd meer als wat "menu" had moeten wezen.

De normale GUI opzet verdeelt het scherm in overlappende rechthoeken ("windows") met voor elk window een object. Windows hebben dus afmetingen en een z-order. Ook is het gebruikelijk dat ze parents kunnen hebben, wat wil zeggen dat hun positie relatief t.o.v. hun parent is en de z-order gelijk. Een window is niet eens abstract: je kunt 't gewoon maken en dan heb je een leeg window. Touch() en Draw() zijn vrij heldere virtuals, maar Update() niet.

Een bijzonder soort window is de control, wat altijd een child window is. Je menu class is dan gewoon een nieuw soort control. Control is wel abstract.

Een nuttig UI concept is te zien in Qt, namelijk signals en slots. Een slot ontvangt signals, en is dus feitelijk een functie/functor. Een control zendt een signal zonder zich druk te maken over de ontvangende slots. Met C++11 is dit veel makkelijker te doen in standaard C++ code, via oa. std::function<>.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • alfaleader
  • Registratie: Mei 2009
  • Laatst online: 02-12-2024
Eens rondgekeken vandaag en veel opgezocht, en ik ga dan toch voor MVC gaan.

Nu zit ik wel nog met een paar problemen:
-Ik zou dus alles van mijn programma zelf zonder de GUI in de model zetten, daar nog geen problemen.
-Maar met de controller en de view loopt het wat vast. In mijn view zou ik alles van layout zetten (dus bijvoorbeeld een layout voor alle elementen mooi onder elkaar, een layout voor een grid van interface elementen...). Deze componenten zouden nog aangemaakt moeten worden, dus bijvoorbeeld een button of slider.
De controller zou alle touch events regelen, en als hij er bijvoorbeeld één binnenkrijgt moet hij kijken in welk deel van de layout er een aanraking is. Dan zou hij moeten kijken naar wat soort interface element dit is voor uit te maken welke actie hij zou moeten doen. Maar hoe kan ik nu de interface elementen in de view zetten, én tegelijk zou dit interface element ook moeten kunnen kijken naar wat hij moet doen met de touch (terwijl dit eigelijk in de controller zou moeten staan)?
Kan ik dit oplossen door een klasse te maken genaamd Widget, die beide een controller en view is?

Dus:
code:
1
2
3
4
MODEL                      CONTROLLER                       VIEW                           WIDGET
                           merkt touch event --------------> welke widget? -------------> button
                          verwerkt deze input <--------------------------------------------------
Aanpassing van model <--                   -------------> aanpassing van view


Zo schaad ik toch eigelijk wat de scheiding van mijn controller en view?

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Je "controller" is weer zo'n onduidelijk object. Eerlijk gezegd ben ik toch al geen fan van MVC, Model-View is vaak voldoende.

In elk geval moeten je touch events naar virtual Window::Touch() gaan. Je controller moet niets weten van de verschillende soorten windows cq. controls. De verschillende acties zijn volledig de verantwoordelijkheid van elk individueel window.

Dus

code:
1
2
3
4
CONTROLLER    BUTTON(WINDOW)       MODEL
  touch ------> .Touch()
                   =
                  click -----> OnOKbuttonClicked()

Voor alle duidelijkheid: Model is geen klasse, en View ook niet. Het zijn mogelijk namespaces. Button en Window zijn klasses in de View

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • alfaleader
  • Registratie: Mei 2009
  • Laatst online: 02-12-2024
Ok, bedankt voor de hulp! Hier kan ik al wat verder mee werken.

Ik heb eerlijk gezegd nog nooit zo'n groot project gedaan, dus het is soms een beetje overweldigend. Met text LCDs en een rotary encoder ging het toch veel makkelijker :)

Dit is wel een zeer leerzaam project, ik heb al veel bijgeleerd over netwerk protocols (al een OSC library gemaakt, wat een protocol is dat over UDP berichten zend). Nu ook veel over hoe een GUI aan te pakken.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:35
alfaleader schreef op woensdag 15 januari 2014 @ 10:57:
Dit is wel een zeer leerzaam project, ik heb al veel bijgeleerd over netwerk protocols (al een OSC library gemaakt, wat een protocol is dat over UDP berichten zend). Nu ook veel over hoe een GUI aan te pakken.
Software maken is vet cool eh? :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • alfaleader
  • Registratie: Mei 2009
  • Laatst online: 02-12-2024
Het hardware aspect is ook wel pretty cool :)

Al een behuizing besteld waar alles in zou passen, nog wat kijken voor de montage en dergelijke. Het project is een module te maken voor ene videomixer (tot 2k resolutie :D ), deze videomixer heeft geen fader en ik ben nu een module aan het maken waarin er een fader zit voor de mixen tussen de 2 DVI sources. Ook kan je eenvoudig met het touchscreen de resolutie, keying, aspect-ratio... aanpassen. Coolcoolcool!
Pagina: 1