W tym poradniku nauczyliśmy się jak utworzyć podstawę dla wtyczki z wykorzystaniem klasy Wtyczka z biblioteki kAPI. Utworzona wtyczka na razie nic nie potrafiła. Teraz nauczymy się jak wykorzystać możliwości klasy Wtyczka dzięki którym nasza wtyczka nabierze pewnej funkcjonalności. Będziemy dalej rozwijać naszą przykładową wtyczkę o nazwie "Moja Wtyczka".
Większość wtyczek posiada swoje okno konfiguracji. Dzięki wykorzystaniu kAPI możemy bardzo szybko takie okno stworzyć. Należy jedynie w konstruktorze naszej wtyczki zainicjalizować pole cfg_main. Będzie ono od teraz identyfikatorem zakładki naszej wtyczki w konfiguracji
MojaWtyczka::MojaWtyczka()
{
cfg_main = ID * 1000 + 10;
}
Zainicjalizowaliśmy nasza zmienna jak każdą inną akcję i to wystarczy.
Jeśli chcemy teraz dodać jakąś kontrolkę do okna konfiguracji należy to uczynić w przeznaczonej do tego metodzie czyli Rejestruj_Konfiguracje(). Dodajmy dla przykładu pole tekstowe.
void MojaWtyczka::Rejestruj_Konfiguracje()
{
UIActionCfgAdd( cfg_main, IMIB_CFG, ACTT_EDIT, 0, cfg_tekstBox, 0, 0, 150 );
}
Oczywiście zmienna cfg_tekstBox to wcześniej zainicjalizowany identyfikator kontrolki.
Jeśli mamy już utworzone okno konfiguracji, wtyczka będzię nas informowała o dwuch dodatkowych zdarzeniach.
1. Okno konfiguracji utworzone
Pierwsze, to moment utworzenia całego okna konfiguracji. Jest to przydatne gdy chemy być
pewni iż wszystkie kontrolki zostały już utworzone i zainicjowane przez rdzeń. W tym momencie
możemy poustawiać wartości domyślne, powyłączać lub poukrywać odpowiednie kontrolki itp. Jeśli
byśmy takiego komunikatu nie mieli byśmy byli zmuszeni wykonać te czynności przy tworzeniu
ostatniej kontroliki. Ale jeśli dodamy nową kontrolkę lub usuniemy tą ostatnią? Musimy zmieniać
kod a tak mamy święty spokuj.
Obsługa tego zdażenia jest bardzo prosta wystarczy nadpisać metodę onKonfig_Utworzony(). W naszym przykładzie zainicjujemy wartość pola tekstowego wartości pola wtyczki o nazwie wartosc_textBoxa.
void Wtyczka::onKonfig_Utworzony()
{
char wartosc[] = "0000";
sprintf( wartosc, "%d", wartosc_textBoxa );
UIActionCfgSetValue( sUIAction(cfg_main, IMIB_CFG|cfg_tekstBox), wartosc);
}
2. Zapisywanie konfiguracji
Dokładnie w momencie gdy użytkownik zamyka okno konfiguracji wybierając przycisk
"OK" i jeśli wcześniej otwierał naszą zakładkę w konfiguracji, wtyczka wywołuje funkcję
onKonfig_Zapisz(). Dzięki temu mamy możliwość sprawdzenia czy użytkownik wprowadził poprawne
dane w oknie konfiguracji lub poprostu zapisać nowe ustawienia.
My sprawdzimy czy użytkownik podał w polu teksotwym liczbe większą od 5 a mniejszą od 20. Jeśli jest mniejsza od 5 to poprawimy na 5 a jeśli większa od 20 to poprawimy na 20. Ostatecznie wartość ta zostanie zapamiętana w zmiennej wartosc_textBoxa.
void Wtyczka::onKonfig_Zapisz()
{
bool blad = false;
const char* wartosc = UIActionCfgGetValue( sUIAction(cfg_main, IMIB_CFG|cfg_tekstBox), 0, 0);
size_t dlugosc = strlen( wartosc );
for (size_t i = 0; i < dlugosc; ++i)
if( wartosc[i] < '0' || wartosc[i] > '9' ) { blad = true; break; }
if ( dlugosc == 0 || blad )
{
wartosc_textBoxa = 5;
UIActionCfgSetValue( sUIAction(cfg_main, IMIB_CFG|cfg_tekstBox), "5", 0);
}
else if ( dlugosc > 2 || atoi( wartosc ) > 20 )
{
wartosc_textBoxa = 20;
UIActionCfgSetValue( sUIAction(cfg_main, IMIB_CFG|cfg_tekstBox), "20", 0);
}
else wartosc_textBoxa = atoi( wartosc );
}
Jedną akcję mamy już dodaną, jest nią cfg_tekstBox. Dodajmy jeszcze jedną w postaci przycisku w menu kontekstowym kontaktu. Wszystkie pozostałe akcje nie znajdujące się w konfiguracji rejestrujemy w metodzie Rejestruj_Akcje().
void MojaWtyczka::Rejestruj_Akcje()
{
UIActionAdd( IMIG_MSGTB, act_pokaz_okno, ACTR_INIT, "Link" );
}
Kolejną rzeczą w jakiej nas kAPI wyręcza to rozdzielenie komunikatów akcji z okna konfiguracij i pozostałych akcji do dwuch oddzielnych metod. Akcje okna konfiguracji są przesyłane do metody ActionCfgProc(). Dodatkowo przed wywołąniem tej metody, z identyfikatora akcji jest usuwana flaga IMIB_CFG, więc już nie musisz się tym więcej przejmować.
Pozostałe komunikaty akcji są wysyłane do metody ActionProc()