Gestione dei widget in un semplice framework GUI

3

Quindi sto ancora lavorando alla mia piccola "biblioteca" della GUI. (C ++ con boost) L'obiettivo è fornire una soluzione semplice per piccoli display SPI, utilizzando un Raspberry o una scheda incorporata.

Così, ho finito per avere una classe Widget da cui derivano i widget concreti. Gli esempi sarebbero una casella di testo o una cornice di immagine. I widget possono contenere altri widget per consentire i gruppi. Ciò è ottenuto tramite aggregazione utilizzando un contenitore STL. Alla fine, il set di dati GUI completo può essere visto come una specie di albero, con alcuni nodi con nodi figlio.

Ogni widget deve avere un metodo di disegno che assomiglia a

    void drawMe(brush *myBrush);

Un pennello fornisce metodi di disegno primitivi come "setPixel" o "drawRectangle" Ciò consente al widget di disegnare se stesso, utilizzando i metodi forniti dal pennello. Un widget si disegna per prima, quindi richiama il metodo drawMe di ogni widget figlio, se presente.

Ora parliamo del mio problema. Ogni widget ha le sue coordinate, relative al genitore. Questo non è abbastanza, il pennello ha bisogno della coordinata assoluta del widget, perché un pennello non sa nulla di bambini o genitori. Un pennello fornisce solo metodi come setPixel (int x, int y) e disegna in un buffer di pixel.

Ma in qualche modo ho una brutta sensazione lasciando che i widget conoscano le sue coordinate assolute. Questo sembra sbagliato. D'altra parte, al momento un bambino non sa che è di proprietà di un genitore, quindi, in nessun modo un widget può calcolare le sue coordinate assolute.

Posso implementare la soluzione alternativa nel pennello, in modo che il pennello supporti più livelli invece di una sola tela (il buffer dei pixel). Un genitore deve quindi impostare i livelli per i propri figli. Sembra un trucco sporco.

Inoltre, è una buona idea che il genitore conosca le sue coordinate figlio?

Vedi, sono da qualche parte perso con questi problemi. Ci sono framework GUI là fuori, come QT e cose del genere. Quindi, il mio problema dovrebbe essere conosciuto e risolto già. Hai qualche suggerimento? Come implementeresti il processo di disegno?

L'intero progetto riguarda l'apprendimento di nuove cose, principalmente paradigmi OOP. Mi piace sentire la tua opinione su questo.

    
posta lugge86 02.01.2016 - 17:54
fonte

2 risposte

4

But I somehow have a bad feeling letting a widgets know its absolute coordinates. This feels wrong.

Buon istinto. I dati sarebbero ridondanti e banalmente calcolati dalla combinazione di un widget padre e le coordinate locali del widget figlio. Meno stato spesso significa meno spazio per errori (più utilizzo di memoria ridotto per widget).

    
risposta data 02.01.2016 - 19:12
fonte
1

Penso che ci sia uno scenario chiave da tenere a mente.

I widget dovrebbero essere in grado di ridisegnarsi

Se non hai questa abilità, quando un widget cambia in qualche modo, puoi solo chiamare il widget di root per fare un redraw completo (che, ovviamente, può essere ottimizzato in qualche modo, diciamo un < strong> sporco flag).

On the other hand, at the moment a child does not know it is owned by a parent, thus, there's no way a widget can compute its absolute coordinates.

probabilmente sarà sbagliato. un bambino deve sapere che è di proprietà di un genitore e conosce anche il genitore, almeno per essere in grado di attivare l'aggiornamento genitore.

Sarebbe qualcosa nelle linee del bambino che chiede al genitore un ridisegno, e poi il genitore che esegue il ridisegno, in modo ricorsivo.

Anche

because a brush does not know anything about children or parents. A brush just provides methods like setPixel(int x, int y) and draws into a pixel buffer.

probabilmente è sbagliato. Ovviamente il pennello dovrebbe saperlo. Ma probabilmente avrai bisogno di un equivalente di ordine superiore, che saprà qualcosa sui widget.

Quando elimini un widget, ad esempio, probabilmente c'era un altro widget nascosto ma il widget ora eliminato. E questo widget deve essere disegnato. Anche in questo caso, se non esiste un gestore di widget che ne sappia qualcosa, la tua unica opzione sarà una chiamata massiccia per tutti i widget da disegnare.

Questo gestore widget non deve necessariamente essere il tuo pennello , ma è un altro componente che deve conoscere il layout

    
risposta data 03.01.2016 - 11:14
fonte

Leggi altre domande sui tag