ObjectsInCanvas

Buon giorno,

sto facendo dei test con l’esempio ObjectsInCanvas.
L’esempio permette di caricare immagini predefinite che sono di dimensioni uguali per larghezza ed altezza.
Se pero si prova a caricare uni immagine con larghezza ed altezza di dimensioni differenti succede una cosa strana:
l’immagine viene visualizzata in un’area sempre quadrata tagliandone una parte, se si seleziona l’oggetto caricato
viene visualizzato il bordo si rettangolare e di dimensione esatta ma in senso invertito…

Qualcuno si gi imbattuto in questo problema?

Grazie
Enzo

Non un problema.
solo una svista nell’oggetto CanvasObject, propriet computata image, GET
Nell’else (non essendoci caption) l’immagine viene creata con i parametri invertiti
p = New Picture(h,w)
invece di
p = New Picture(w,h)

da cui ne derive l’errore.

Puoi segnalare la cosa con un feedback in modo che l’esempio venga corretto per le prossime versioni

Buon giorno Antonio,
preciso e tempestivo come sempre…
Ora tutto va per il verso giusto!!

Grazie
Enzo

Buon giorno,
continuando a testare l’esempio ed a modificarlo per risolvere le mie esigenze
mi sono imbattuto in due aspetti a cui non sono riuscito a dare una spiegazione:

1 non riesco a modificare solo la larghezza o solo l’altezza dell oggetto, posso solo scalarlo…

2 quando invece che caricare un oggetto immagine ne carico uno che contiene solo del testo, non riesco a fargli scrivere un testo stilizzato

qualcuno sa darmi lumi?

Grazie
Enzo

L’oggetto lo inserisci con il pulsante AddObjectButton della MainWindow

qui crei l’ICON da utilizzare. Quindi qui puoi creare una icon delle dimensioni che vuoi, scrivere del testo e usare bold, italic per il testo, cambiare colore e font.

Se vuoi cambiare queste cose nell’oggetto creato devi ricreare questa immagine in quanto non sono memorizzate come informazioni ma come immagine (di default l’esempio utilizza immagini precostituite)

… sempre se ho capito il tuo problema

Prendi l’esempio come, appunto, un esempio.
Ci sono diversi miglioramenti da fare come ad esempio utilizzare un xojo.core.rect per le dimensioni (che ha gi internamente la possibilit di vedere se un punto al suo interno, semplificando quindi il mouseDown)
Sempre nel mouseDown il vettore degli oggetti andrebbe scorso al contrario (altrimenti selezionando oggetti sovrapposti) selezioni quello dietro invece che quello davanti.
In ogni caso un buon esempio per vedere come puoi selezionare, creare, spostare, eliminare oggetti grafici con una resa ottimale

Buon giorno Antonio,

si ho preso l’esempio come esempio e da li mi sono sviluppato
tutta una serie di varianti ed accorgimenti come ad esempio cambiare l’ordinamento degli per far si che nel caso di sovrapposizione il mousedown selezioni l’oggetto correttamente.
All’oggetto ho aggiunto altri parametri ed implementato gli eventi rendendo l’oggetto visibile o invisibile, bloccato o modificabile e cos via…, poi tutte le informazioni le salvo su un db cos da poter ricreare le composizioni.
Per quel che riguarda il ridimensionamento ho pensato e provato la soluzione di ricreare l’immagine, ma speravo nella possibilit di impostarla senza dover ricreare, poco male far cos.

Per quanto riguarda il testo invece:
il massimo sarebbe poter scrivere direttamente dentro all’oggetto, ho visto qualche esempio in giro su come editare del testo direttamente in una canvas ed ho fatto qualche prova con il plugin TextInputCanvas ma vorrei arrivarci per gradi.
Per ora per inserire dei blocchi di testo ho provato a fare questo:
Inserisco l’oggetto creando una immagine delle dimensioni che voglio che per lascio vuota
poi come caption gli passo un testo e setto il WrapWidth con la dimensione della larghezza che mi serve ossia quella dell’immagine.
Questo funziona ma se gli passo un testo gi stilizzato non prende la gli stili.
Mi spiego meglio, ho fatto alcuni test su questo:

prendo una TextArea che chiamo StyledTextArea

in un bottone metto

dim t as TextArea=StyledTextArea
t.text=“a,b,c,d,e,f”
t.SelStart=0
t.SelLength=1
t.SelBold=true
t.SelStart=2
t.SelTextColor=&cff0000
t.selstart=4
t.SelBold=false
t.SelStart=6
t.SelTextColor=&cff00ff
t.SelStart=8
t.SelTextColor=&c00ff00

prendo una canvas e nel suo evento paint scrivo:

dim t as TextArea=StyledTextArea
dim p as StyledTextPrinter=t.styledTextPrinter(g,t.Width)
p.DrawBlock(0,0,len(StyledTextArea.Text))

nella canvas mi ritrovo il testo esattamente come formattato nella textArea

Vorrei replicare la cosa nell’oggetto ma non ho capito come farlo…

Come sempre,
Grazie per il tuo interessamento
Enzo

Ci sei quasi:
dim pic as picture=new picture(,) //Le tue dimensioni
Dim p as StyledTextPrinter
p=t.StyledTextPrinter(pic.Graphics,pic.Width)
p.DrawBlock (0,0,pic.Height)

ora pic l’immagine che vuoi utilizzare… styled

Buon giorno Antonio,
le sai proprio tutte!!!

Si funziona proprio bene, l’unica cosa che non non sono riuscito a fare
determinare quanto grande dev’essere la pict per farci stare dentro il testo…

Mi spiego meglio,
se il testo lo scrivo con drawstrig settando il WrapWidth ( come facevo prima…) la dimensione h della pict
viene adattata in modo automatico all’altezza del testo nel caso in cui questo non ci stia …

Per cortesia sapresti dirmi se esiste un modo per determinare quanto grande dev’essere la dimensione h della pict adattando il testo alla larghezza?

Grazie
Enzo

un po pi complicato (lo stile ingrossa le ampiezze per cui potresti avere dei casi border line) ma hai provato ad usare
graphics.stringHeight?

Buon giorno Antonio,
no stringHeight non l’ho provato, lo credevo legato a DrawString…

Azz… mi sono imbattuto in un’altro problema…
Sto cercando di creare la pict con il testo formattato direttamente nel get della propriet computata image.
Come mi hai suggerito tu:
dim pic as picture=new picture(,) //Le tue dimensioni
Dim p as StyledTextPrinter
p=t.StyledTextPrinter(pic.Graphics,pic.Width)
p.DrawBlock (0,0,pic.Height)

va bene ma implica 3 cose ( almeno per come l’ho capita io…)
1 la pict viene creata prima di inserire l’oggetto
2 c’ bisogno di una textArea fisica
3 se dopo aver creato l’oggetto cambio le dimensioni della pict il testo si distorce…

Ora mi sto scervellando per capire come:
1 leggere da record il testo (salvato formattato)
2 caricarlo in una propriet dell’oggetto come salvato nel record
3 fargli scrivere il testo nella pict nel get della propriet computata image.
in questo modo se cambio la dimensione della pict il testo dovrebbe distribuirsi in base alle nuove dimensioni

ps il testo nel record salvato correttamente e se lo ricarico in un textArea fisica lo vedo in modo corretto…
come nell’esempio StyledText

Io non lo metterei nella get
Ad ogni invalidate dell’immagine lo ricrei.

Confermo che c’ bisogno di una textArea fisica.
Per puoi creare una sottoclasse di textArea che terrai disabilitata e nascosta, a cui aggiungi un metodo che accetta come parametro la stringa RTF e la classe che genera/gestisce l’immagine
Questo perch hai bisogno di sapere le dimensioni da impostare alla styledTextPrinter
In pratica quando chiami questo metodo, la textArea specializzata crea l’immagine e la assegna alla classe
Nella classe l’immagine la metti come computed property in modo da chiamare in automatico tutto quello che necessario per aggiornare la visualizzazione

Buona sera Antonio,

ho seguito il tuo consiglio ho spostato l’aggiornamento del testo dalla get
e l’ho messo nell’evento mouseDrag nella parte di codice che mi gestisce l’aggancio ai vertici per il ridimensionamento.
Cos funziona molto meglio, ora il testo va a capo in funzione della larghezza della canvas
indipendentemente dalla dimensione della larghezza della textarea.
Per me un bel passo avanti…
Purtroppo grazie alla mia incompetenza
quel giochino di classi e sottoclassi che mi hai consigliato devo studiarmelo bene prima di riuscire ad implementarlo
ma per onorare la tua disponibilit mi impegner nel farlo…

grazie
Enzo

Ho in programma, ma succede sempre qualcosa che mi ferma :frowning: un video su classi e sottoclassi magari potr tornarti utile