BasicC/Obiekty GEM
Występują 2 podstawowe rodzaje obiektów GEMBOX: przyciski i pola tekstowe, które dzielą sią na podtypy. Typ obiektu określa pole Type struktury GEMBOX, dla przycisków Type przyjmuje wartości 0-9, dla pól tekstowych - 10-19.
Przyciski
edytujPrzyciski są podstawowym elementem menu GEM. Nie ma typowego menu w postaci belki i rozwijanych list, ale podobny efekt można uzyskać za pomocą przycisków wykorzystując możliwość ich ukrywania. Rodzaj przycisku określany w polu Type ma obecnie charakter tylko umowny, a sposób ich obsługi przez procedury GEM ustalany jest na podstawie innych cech.
Na przycisku może być wyświetlany obraz i/lub tekst, w zależności od wartości pól P i Text.
- Pole n to kolor powierzchni przycisku, gdy n=0 kolor określa stała CFACE lub CLOWER (dla wciśniętego).
- Pole s to kolor tekstu, gdy s=0 kolor określa stała CTEXT lub CDIS (dla nieaktywnego).
- Pole State określa stan i sposób zachowania przycisków. Ustawienie bitów 0, 1 i 2 oznacza odpowiednio: przycisk włączony, widoczny i wciśnięty (dotyczy to wszystkich obiektów GEMBOX). Ustawienie bitu 3 oznacza, że po wywołaniu GEMMenu zostanie on "odciśnięty" (OFF). Bit 4 oznacza przycisk radiowy - pozostaje on wciśnięty dopóki nie zostanie wciśnięty inny przycisk tego typu. Bit 5 oznacza przycisk XOR - kolejne klikania przycisku powodują jego wciśnięcie/odciśnięcie. Ponieważ ustawianie kolejnych bitów powoduje zwiększenie wartości State odpowiednio o 1,2,4,8,16,32, to jeśli np. chcemy, by przycisk przypisany zmiennej przycisk był aktywny, widoczny i był przyciskiem radiowym - wywołujemy
przycisk.State=1+2+16
albo nadajemy odpowiednie wartości komendą GEMBox, po której przycisk.State bedzie miał wartość 3, następnie wywołujemyprzycisk.State+=16;
. Jeśli bity 5,6,7 będą ustawione na 0 - przycisk po wciśnięciu pozostanie wciśnięty dopóki programowo nie zmienimy jego stanu, np. komendąBclr(przycisk.State,2)
(ustawienie bitu 2 na 0). Do sprawdzania stanu danego bitu służy komenda Btst.
Pusty przycisk
edytujPrzycisk, na którym komenda GEMBoxDraw (lub GEMDrawBox) nie wyświetla tekstu ani obrazu. Umownie przyjmujemy, że wartość Type=0, jednak, dla wszystkich typów przycisków, o tym co będzie na nich wyświetlane określają pola P i Text, które są wskaźnikami na obraz lub napis, jeśli mają wartość NULL - nic nie jest wyświetlane, jeśli P wskazuje na obraz - jest on wyświetlany, jeśli Text wskazuje na napis - jest wyświetlany. Przykładowo przycisk taki pełni rolę belki przewijania listy w wybieraku plików, strzałki są na nim rysowane oddzielnymi komendami
Przycisk tworzymy poprzez zadeklarowanie zmiennej typu GEMBOX oraz nadanie odpowiednich wartości jej polom, np: struct GEMBOX box; GEMBox(box,0,NULL,X,Y,W,H)
powołuje przycisk przypisany do zmiennej box mający typ 0, współrzędne X,Y, o wymiarach W,H. Oczywiście - jeśli zamienna box ma mieć zasięg globalny - jej deklaracja musi nastąpić wcześniej - przed MAIN, a komenda GEMBox - później.
Przycisk tekstowy
edytujPrzycisk, na którym wyświetlany jest napis, na który wskazuje pole Text. Umownie Type=1. Napis jest wyświetlany na środku. Przykładowa deklaracja: struct GEMBOX box; GEMBox(box,1,"Napis",X,Y,W,H)
Przycisk obrazkowy
edytujPrzycisk, na którym wyświetlany jest obraz, na który wskazuje pole P. Umownie Type=2. Obraz jest skalowany do wielkości przycisku i zajmuje cały jego obszar. Przykładowa deklaracja: struct GEMBOX box; GEMBox(box,2,NULL,X,Y,W,H) box.P=obraz;
Pola tekstowe
edytujSłużą do wprowadzania i edycji lub tylko wyświetlania tekstu. Mogą być jedno lub wieloliniowe, można w kolejnych liniach wyświetlać napisy z tablicy.
GEMTextEdit(B)
lub GEMEdit(B);
rozpoczyna edycję tekstu w polu przypisanym do zmiennej B, możemy ją wywołać np. po kliknięciu myszką w polu. Jeśli B.s=0 - kursor ustawiany jest na początek tekstu, jeśli B.s>0 - na koniec. Przerwanie edycji następuje po kliknięciu poza polem lub wciśnięciu Enter. Obsługa schowka systemowego jest uproszczona i dotyczy całego tekstu: Ctrl-X powoduje skopiowanie tekstu do schowka i skasowanie go, Ctrl-C - skopiowanie bez kasowania, Ctrl-V - zastąpienie tekstu w polu tekstem ze schowka. Obsługa kodowania UTF-8 również jest uproszczona, można używać liter narodowych, jeśli składają się maks. z 2 znaków, do wyświetlania liter służy komenda GPrint, która standardowo wyświetla polskie litery. Podczas edycji pole tekstowe rysowane jest w GEMScreen i wyświetlane za pomocą GEMShow, jeśli GEMScreen wskazuje na NULL - rysowane jest w projektorze.
Puste pole
edytujTyp=10. GEMBoxDraw nic w nim nie wyświetla poza powierzchnią w danym kolorze, jego zawartość można wypełniać innymi metodami. Przykładowa deklaracja: struct GEMBOX box; GEMBox(box,10,NULL,X,Y,W,H)
Linia tekstowa
edytujTyp=11. Służy do edycji tekstu w jednej linii. Przykładowa deklaracja: struct GEMBOX box; GEMBox(box,11,txt,X,Y,W,H)
, gdzie txt jest zmienną tekstową typu STRING.
Pole tekstowe
edytujTyp=12. Służy do edycji tekstu w wielu liniach. Przykładowa deklaracja: struct GEMBOX box; GEMBox(box,12,txt,X,Y,W,H)
, gdzie txt jest zmienną tekstową typu STRING.
Lista
edytujTyp=13. Służy do wyświetlania zawartości tablicy napisów typu STRING. Przykładem jest pole wyświetlające zawartość katalogu w wybieraku pliku.
- Text zawiera wskaźnik na tablicę
- n - ilość wyświetlanych linii
- s - nr wyróżnionej linii, jeśli <0 - żadna nie wyróżniona
Przykładowa deklaracja: struct GEMBOX box; GEMBox(box,13,txt,X,Y,W,H) box.n=10;box.s=-1;
, gdzie txt jest tablicą napisów typu STRING. Przykładowa deklaracja tablicy: STRING txt[10]
Komendy
edytujGEMBox(B,T,N,X,Y,W,H)
edytujKomenda ustawiająca pola zmiennej B typu struct GEMBOX:
- T - typ
- N - wyświetlany tekst lub tablica napisów, najlepiej typu STRING
- X,Y,W,H - współrzędne, wysokość i szerokość
Pozostałe pola otrzymują domyślne wartości: State=3, P=NULL, n=0, s=0, wykonuje: {B.State=3;B.Type=T;B.Text=(char*)N;B.x=X;B.y=Y;B.w=W;B.h=H;B.P=NULL;B.n=0;B.s=0;}
GEMBoxClick(B)
edytujSprawdza, czy obiekt B został kliknięty, wykonuje (MouseK?(MouseX<B.x+B.w && MouseX>=B.x && MouseY<B.y+B.h && MouseY>=B.y):0)
W celu sprawdzenia czy mysz znajduje się nad obiektem można skorzystać z funkcji PointInRect.
Zmienne dotyczące myszy są ustawiane np. przez GetEvents lub GEMMenu, jednak są między nimi różnice. GEMMenu wstrzymuje działanie programu do czasu wystąpienia pierwszego zdarzenia, które obsługuje, i przerywa dalsze sprawdzanie, pozycja myszy jest aktualizowana tylko po kliknięciu (ew. puszczeniu) klawisza. GetEvents nie wstrzymuje działania i zapamiętuje ostatnie zdarzenia danego typu, czyli np. pozycja myszy będzie bardziej aktualna, "czyści" kolejkę zdarzeń.
Przydatne mogą być też komendy: WaitInKey, WaitMouseU, WaitMouseD.
GEMColor(k)
edytujKomenda ustawia aktualny kolor rysowania, gdzie k jest numerem koloru w tablicy GEMColor. Wywołuje SDL_SetRenderDrawColor(SDLRenderer,GEMColor[k].SDL.r,GEMColor[k].SDL.g,GEMColor[k].SDL.b,GEMColor[k].SDL.a);
GEMBoxDraw(B)
edytujRysuje obiekt B w aktualnym targecie. Wywołuje GEMDrawBox(B);
GEMBoxesDraw(B,n)
edytujRysuje obiekty GEM zawarte w tablicy B, n to ilość obiektów. Wywołuje GEMDrawBoxes(B,n);
GEMBoxRow(B,Y)
edytujPodaje nr wiersza obiektu B odpowiadający współrzędnej Y przy aktualnej wysokości czcionki. Wywołuje ((Y-B.y-(B.h-B.h/GPR.h*GPR.h)/2)/GPR.h)
GEMMenu(B,n,w,sel)
edytujSprawdza i czeka na wystąpienie zdarzeń dotyczących obiektów GEMBOX zawartych w tablicy B oraz myszy, klawiatury i okna. n to ilość obiektów GEM, sel zawiera numer wybranego obiektu, sprawdzanie jest przerywane gdy:
- kliknięto lewym klawiszem myszy w obiekt, wartości zmiennych MouseX, MouseY, MouseK są aktualizowane nawet gdy kliknięcie nastąpiło poza obiektem (wtedy oczekiwanie na zdarzenia nie jest przerywane), dodatkowo w MouseK ustwiany jest bit nr 5 (wartość zwiększana o 32) jeśli nastąpiło podwójne kliknięcie
- jeśli stała GEMMOUSEBUTTONUP != 0 i puszczono klawisz myszy, aktualizowane są zmienne stanu myszy, w MouseK ustawiony zostaje bit nr 4 (+16)
- wciśnięty był klawisz, jego kod zostaje zapisany w InKey
- gdy parametr w != 0 i wykryto zdarzenie okienne (SDL_WINDOWEVENT), aktualizowana jest WindowEvent
Wywołuje sel=GEMWaitBoxClick(B,n,w);
GEMShow
edytujOdpowiednik ShowPage wykorzystujący GEMScreen. Powoduje wstawienie GEMScreen do projektora i wyświetlenie jego zawartości. Ustawia target na projektor, więc jeśli chcemy dalej tworzyć obraz w GEMScreen musimy wywołać Target(GEMScreen). Wykonuje {SDL_SetRenderTarget(SDLRenderer,0);SDL_RenderCopy(SDLRenderer,GEMScreen,0,0);SDL_RenderPresent(SDLRenderer);}
GEMTextEdit(B)
edytujRozpoczyna procedurę edycji tekstu w obiekcie B. Wywołuje GEMEdit(B);
Przykład:
#include "BasicGEM.h"
MAIN
int w;
struct GEMBOX b[5];
STRING txt;
// SetFont(8,8)
SDLOpen(0)
GEMBox(b[0],2,NULL,10,10,200,20) b[0].P=BASFont;b[0].State=3;
GEMBox(b[1],1,"Przycisk",10,100,200,20) b[1].State=35;
GEMBox(b[2],12,txt,10,200,320,128)
GEMBox(b[3],11,txt,10,150,320,32)
Colors(-1,255)
Print GEMMessage(10,30,"tekst komunikatu okna alert",0,"O|OK|COFNIJ|PRZERWIJ") NL
GEMFileSelect("File load","","*.*",txt)
Print$ txt NL
Do
Target(GEMScreen)
Color(CFACE)
Cls
GEMBoxesDraw(b,4)
GEMShow
GEMMenu(b,4,0,w)
if(w>1) GEMTextEdit(b[w])
else Print$ "Wciśnięto przycisk nr" _ w NL
Loop
SDLQuit
ENDMAIN