newt grid
Jarek Woloszyn
yossa w devil.inside.pin.pl
Wto, 14 Wrz 1999, 23:36:39 CEST
Stwierdziłem, że zrobię pkgssela tak żeby był niezależny od locale i użyję
tych newtowych gridów. Ponieważ nie ma tego w dokumentacji sam spróbowałem to
rozpracować i oto co mi wyszło:
Gridy to nic innego jak siatka na której newt rozkłada elementy. Służy to
tylko do rozplanowania układu elementów i do niczego więcej. Tzn. cała obsługa
formsów pozostaje taka jak wcześniej.
Na początek tworzymy sobie siatkę:
grid=newtCreateGrid(2,2);
gdzie grid jest typu newtGrid. Parametry to ilość kolumn i wierszy w siatce,
tzn. ile elementów możemy umieścić obok siebie i ile w pionie. Nie jest to tak
do końca prawdą, bo można umieszczać siatki w siatce i wtedy np. komórka 0,0
jest dzielona na kilka innych.
Teraz deklarujemy wszystkie komponenty, które będziemy umieszczać na siatce
podając x i y jako -1. Np:
lblGrpName = newtLabel(-1, -1, "ble ble");
Do tworzenia lini z przyciskami jest mały wraper:
buttons = newtButtonBar("Ok", &btOK, "Add Deps", &btAddDeps,
"Remove Deps", &btRemoveDeps, NULL);
Teraz ustawiamy te dwa komponenty na siatce:
newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, lblGrpName,
0, 0, 0, 0, 0, 0);
newtGridSetField(grid, 1, 1, NEWT_GRID_SUBGRID, buttons,
0, 0, 0, 0, 0, 0);
W ten sposób mamy label w 0,0 i trzy przyciski w 1,1
Czasami chce się, żeby te przyciski były w lewej strony. Ja próbowałem wstawić
wtedy w komórkę 0,1 pustą formę:
blank = newtForm(NULL, NULL, 0);
newtFormSetWidth(blank, 1);
newtFormSetHeight(blank, 1);
newtGridSetField(grid, 0, 1, NEWT_GRID_COMPONENT, blank,
0, 0, 0, 0, 0, NEWT_GRID_FLAG_GROWX);
Teraz musimy pokazać okno z naszą siateczką. Do wybory 4 funkcje:
newtGrid newtGridBasicWindow(newtComponent text, newtGrid middle,
newtGrid buttons);
newtGrid newtGridSimpleWindow(newtComponent text, newtComponent middle,
newtGrid buttons);
void newtGridWrappedWindow(newtGrid grid, char * title);
void newtGridWrappedWindowAt(newtGrid grid, char * title, int left, int top);
pierwsze dwie tworzą siatkę (1,3) i umieszczają w pionie kolejno text,
middle, buttons, a potem dają nam tą siatkę, tak że można ją pokazać przez
WrappedWindow.
Kolejne dwie pokazują naszą siatkę.
Na koniec jeszcze wywalamy z pamięci dane siatki:
newtGridFree(grid, 1);
Teraz dodajemy sobie nasze elementy do głównej formy, puszczamy formę w ruch i
działamy tak jakby zabawy z siatkami w ogóle nie było.
Aha. Siatkę też można dodać do formy:
void newtGridAddComponentsToForm(newtGrid grid, newtComponent form,
int recurse);
Istnieją jeszcze 4 funkcje:
newtGrid newtGridVStacked(enum newtGridElement type, void * what, ...);
newtGrid newtGridVCloseStacked(enum newtGridElement type, void * what, ...);
newtGrid newtGridHStacked(enum newtGridElement type1, void * what1, ...);
newtGrid newtGridHCloseStacked(enum newtGridElement type1, void * what1, ...);
niezbyt wiem co one robią, ale domyślam się, że chodzi o upychanie elementów w
pionie i poziomie. (bez odstępów, z odstępami).
Definicja newtGridSetField:
void newtGridSetField(newtGrid grid, int col, int row,
enum newtGridElement type, void * val, int padLeft,
int padTop, int padRight, int padBottom, int anchor,
int flags);
jak widać możemy ustawić sobie ostępy jakie mają być wstawiane z różnych stron
dodanego elementu (pad*). Flagi to NEWT_GRID_FLAG_GROW(X|Y) - to pewnie też
coś z rozciąganiem.
Wybaczcie, że opis może taki trochę pogmatwany, ale wszystko sprawdzałem
testowo+trochę źródeł, w których niestety nie ma ani krzty dokumentacji.
Proponowałbym teraz przeglądnąć swój kod i zrobić rozstawianie elementów właśnie
tymi gridami. Chodzi o to, że przy tłumaczeniu nazw przycisków (i nie tylko)
na inne języki ich szerokości mogą się zmieniać, a wtedy wszystko się wali.
--
( Jarek Woloszyn ) ( yossa w pld.org.pl ) ( member of the GNU generation )
( Certificated in C & Linux adm. - http://www.tekmetrics.com ID=85232 )
( HomePage http://dione.ids.pl/~yossa - PGP and Monopoly <ppp counter> )
Więcej informacji o liście dyskusyjnej pld-installer