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