U pitanju je jako prost problem. Svaki od tih "objekata" na prozoru, ili unutar nekakvog tzv. compound objekta (razliciti toolkiti to razlicito zovu, FLTK recimo to zove prosto "Group", Borland C++ "Panel" (ili "Canvas" objasnicu kasnije zasto spominjem oboje), itd.).
Neki koji poznaju Borland C++ (Builder) vec mozda naziru dva resenja, jedno je da se naprave komponente (widget-i) za svaki tip objekta (pravougaonik, krug, itd), drugo resenje je da se sve iscrtava u Canvas objektu... Pitanje je ukusa sta ce covek izabrati.
Generalno se ovako proste stvari resavaju tako sto se napravi prosto zaseban Widget (Component), tako da cu nastaviti sa alternativom broj 1.
Svaki toolkit, kao sto rekoh, ima tip Widget (ili Component), ja cu koristiti termin Widget u nastavku teksta.
Scenario: zelis da imas samo dva tipa objekata (za pocetak) - Pravougaonik i Krug. I zelis da te objekte vizualno vezujes Konektorima (one linije koje vezuju tvoje pravougaonike i krugove). Za realizaciju ovoga trebace ti TRI klase:
- VisualEditor klasa ce naslediti Group (Panel u Borland C++) i bice zaduzena za iscrtavanje konektora i dva nova Widget-a o kojima cu govoriti u narednoj recenici.
- Objekti Pravougaonik i Krug koji ce naslediti klasu Widget (Component u Borland C++, tacnije VCL framework) . Ovi objekti imaju samo jednu jedinu ulogu - da iscrtavaju sami sebe kada treba, i da drze podatke koje treba da sadrzavaju (recimo naziv, boju, itd.).
VisualEditor je, kao sto se moze naslutiti "glavna stvar". On osvezava (samim tim iscrtava) ceo dijagram (ili deo dijagrama, ali to mozes kasnije da optimizujes) kad god se nesto izmeni.
Sada kada sam objasnio sta od klasa imamo mogu odgoviriti na pitanje kako da znamo kako i kada sta mozemo da "povezemo". :)
To se radi na sledeci nacin: VisualEditoru se posalje "poruka" (pozivom nekog metoda), da ulazimo u (recimo) "Connect" mod, pozivanjem metoda connectStart(). Tada se ceka klik na neki od objekata koji se trenutno nalaze na VisualEditoru (mozemo imati N Pravougaonika i M Krugova), kada se klikne na neki od ova dva tipa objekata, onda VisualEditor zna gde je pocetak Konektora, tada on automatski ulazi u mod cekanja na kraj konektora. Tada VisualEditor ocekuje da korisnik ili klikne na neki od objekata tipa Pravougaonik i Krug, ili na nesto drugo (recimo na sam VisualEditor). Ako je kliknut neki od Objekata, onda znamo tacno koji objekat se vezuje sa kojim objektom, i VisualEditor zna tacno sta da crta. Ako je korisnik kliknuo na nesto drugo, ili pritisnuo ESC, onda se izlazi iz ovog moda, i znaci prekida se proces vezivanja dva objekta.
Sigurno ce se neko pitati kako VisualEditor, prilikom iscrtavanja zna koje veze postoje i kako zna koji objekti su vezani sa kojim objektima. Postoji dva nacina koji odmah padaju na pamet.
Jedan je da svaki objekat sadrzi vektor (ili listu) objekata za koje je vezan. Drugi je da VisualEditor sadrzi vektor parova Objekat*,Objekat* (pokazivaci) gde svaki element znaci objekat1 je vezan na objekat2. Kad kazem par mislim na std::pair tip. :)
Ako zelis, ja mogu da napisem kompletan primer ovoga u
FLTK-u. :)
[Ovu poruku je menjao leka dana 02.05.2006. u 10:48 GMT+1]