Tworzenie interfejsu programu, przekazywanie "eventu" do odpowiedniego objektu i template obiektu.
Witam,
Ostatnio staram się zrobić program który będzie posiadać mój własny interfejs, czyli przyciski, checkboxy, menu, listy itp.
Stworzyłem więc klasę którą nazwałem "qlCanvas"
qlCanvas posiada polimorficzny wskaźnik typu qlCanvasUnit, wszystkie elementy interfejsu korzystają z tej klasy jako bazowej.
Obecnie posiadam 3 typy interfejsu, Slider, Button oraz Checkbox.
Posiadam również klasę qlAction
Za każdym razem jak użytkownik naciśnie jakiś przycisk jest on wysyłany z CallBack-u do qlAction, robotą qlAction jest
aby zdecydować który Canvas otrzyma ten event, i tutaj pojawia się niewielki problem.
Każdy qlAction czyta eventy z zarejestrowanego do niego CallBack-u ( z okna )
Każdy qlCanvas musi być zarejestrowany do qlAction ( inaczej nie otrzyma żadnych eventów )
Każdy qlCanvasUnit jest polimorficznym wskaźnikiem w qlCanvas
Przyjmijmy że robić grę komputerową, na dole ekranu mam przyciski które mogę kliknąć, a WASD mogę poruszać się po świecie.
Ale podczas naciśnięcia Enter-a powinien uruchomić się qlCanvas "Chat / Konsola"
Od momentu otwarcia Czatu / konsoli WASD powinno przestać działać, a każdy input powinien być od teraz kierowany do konsoli.
Z tym problemu wielkiego nie mam, ale chciałbym wysłuchać czy ktoś posiada jakieś lepsze rozwiązania tego problemu,
Obecnie posiadam wskaźnik który przestawia się na Canvas który ma otrzymywać eventy
Jeśli Wskaźnik == NULL, event kierowany jest do qlAction ( czyli defaultowe eventy )
Jeśli wskaźnik == AnyCanvas, zamiast Action, event kierowany jest do Canvas-u z wskaźnika.
Ale tutaj pojawia mi się inny problem, co z wieloma pojawiającymi się okienkami?
Przyjmijmy że posiadam ( a posiadam ) mini tutoriale które pojawiają się w prawym dolnym rogu ekranu,
Tutorial w skrócie opowiada o tym jak gra działa a gracz może użyć przycisku "Q" aby zamknąć okienko
lub kliknąć X aby zamknąć / kliknąć przycisk na dole aby przeczytać więcej.
I z tym mam niewielki problem bo nie bardzo wiem jak mógłbym to zrobić optymalnie i aby nie tworzyć 256 eventów
dla każdego nawet małego przycisku ( bo tak właśnie teraz robię ), tworzę nową listę 256 eventów dla każdego Canvasu.
Przy okazji, bo obecnie używam w moim qlCanvasUnit template
template < typename T >
class qlCanvasUnit {
public:
Bo różne obiekty interfejsu posiadają różne statystki,
np.
Przycisk posiada tylko swoje wymiary i pozycję,
Checkbox posiada to samo co przycisk ale również jego stan ( YES / NO )
Slider posiada jeszcze więcej i między innymi wartość 0 / 256 ( short ) ( szerokość slidera, wielkość przycisku itp. )
Obecnie wszystko ustawiam poprzez osobną funkcję, czyli najpierw robię nowy przycisk itp. potem osobno wywołuję
funkcję aby ustawić "startowe" parametry tego elementu, wiem że mógłbym zrobić:
template < typename T, int a, int b, int c ... >
Tylko w tym przypadku pojawia się problem że nie wszystkie elementy mają taką samą ilość atrybutów,
oraz niektóre z nich w przyszłości mogą mieć np. tekst na sobie albo obrazek... co wtedy?
Więc moje drugie pytanie czy da się jakoś przekazać wartości do konstruktora z typu którego używamy w Template?
Czy może jednak wywołanie osobno funkcji po utworzeniu go to jedyna opcja?
Nie wiem czy dostatecznie jasno określam czego potrzebuję.
Mam nadzieję że jeśli rozumiecie to otrzymam jakąś pomoc :) A jeśli trzeba to wyjaśnię więcej.