SPECTRAL_IMAGE , CUT..e UNDO
In colibrì è definito un meccanismo di definizione ed interfazione fra gli oggetti documento e gli strumenti di modifica, tutti derivati dalla classe TOOL. In un altro articolo spiegheremo questo meccanismo. In questo contesto ci basta sapere che all’istanza della classe SPECTRAL_IMAGE, attraverso la gestione dei messaggi dei TOOL arrivano richieste di azione; una di queste, il taglio di un’area, arriverà da un tool di azione su un’area. La funzione SPECTRAL_IMAGE::ReceiveToolInfo() che riceve la richiesta, individua il messaggio OPCUT mandato dal tool e, di conseguenza, chiama una funzione CUT_RECT_AREA che esegue l’azione;
[sourcecode language=”cpp”]
static bool CUT_RECT_AREA(CLASS_STR, TOOLS::AREA_SELECTOR *tool)
{
// area interessata
float x,y,dx,dy;
tool->GetRectArea(&x,&y,&dx,&dy);
IRECT rect=_OBJ->GetPixelArea( x, y, dx, dy);
ACTIONS::AREA_RESTORE *ars=GET_AREA(STR,rect); // copia l’area rettangolare..
if (ars) {
ars->SetParam(MAGIC,_OBJ); // crea un parametro relativo all’origine dell’area..
ars->SetBitmap(BMAP->GetBitmap(rect.x,rect.y,rect.dx,rect.dy));
ACTIONS::CLIPBOARD::SetData(ars);
PUSH_AREA(STR,rect);
_OBJ->Clear(x,y,dx,dy);
SEND_APP_MESSAGE(MSG_REDRAW_DOCUMENT_VIEW,_OBJ);
return true;
}
return false;
}
[/sourcecode]
La funzione, statica nel file SPECTRAL_IMAGE.cpp. estrae le informazioni relative all’area da tagliare, chiama un’altra funzione locale, la GET_AREA, che estrae l’area spettrale relativa e inizializza con questa un buffer AREA_RESTORE; quindi assegna un parametro per ricordare l’origine dell’area (SetParams), estrae anche la Bitmap RGB di visualizzazione (SPECTRAL_IMAGE contiene sia la mappa spettrale dell’immagine che la sua rappresentazione rgb) e la assegna alla AREA_RESTORE. Per eventuali usi futuri assegna alla CLIPBOARD l’area tagliata, quindi chiama la funzione PUSH_AREA
[sourcecode language=”cpp”]
static bool PUSH_AREA(CLASS_STR,IRECT rect)
{
ACTIONS::AREA_RESTORE *ars=GET_AREA(STR,rect);
return _OBJ->Push(ars);
}
[/sourcecode]
In questo esempio la AREA_RESTORE è usata due volte: la prima per salvare nella clipboard di Colibri un’area (nella logica del comando CUT richiamato), La seconda, interna alla funzione PUSH_AREA per salvare l’area tagliata nella DOCUMENT_HISTORY (funzione Push() richiamata).
CUT_RECT_AREA ha dunque svolto due compiti: Inserito l’area tagliata nella clipboard (l’area sarà gestita da quest’ultima, e resa disponibile alla eventuale richiesta di PASTE), e inserito l’area nella storia delle revisioni, per garantirne il ripristino se richiesto (Undo). Vedremo ora come viene gestito il comando di Undo