BasicC/Obiekty GEM

Z Wikibooks, biblioteki wolnych podręczników.
 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[edytuj]

Przyciski 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łujemy przycisk.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[edytuj]

Przycisk, 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[edytuj]

Przycisk, 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[edytuj]

Przycisk, 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[edytuj]

 Sł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[edytuj]

Typ=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[edytuj]

Typ=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[edytuj]

Typ=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[edytuj]

Typ=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[edytuj]

GEMBox(B,T,N,X,Y,W,H)[edytuj]

Komenda 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)[edytuj]

Sprawdza, 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)[edytuj]

Komenda 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)[edytuj]

Rysuje obiekt B w aktualnym targecie. Wywołuje GEMDrawBox(B);

GEMBoxesDraw(B,n)[edytuj]

Rysuje obiekty GEM zawarte w tablicy B, n to ilość obiektów. Wywołuje GEMDrawBoxes(B,n);

GEMBoxRow(B,Y)[edytuj]

Podaje 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)[edytuj]

Sprawdza 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[edytuj]

Odpowiednik 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)[edytuj]

Rozpoczyna 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