2013-01-24 6 views
5

Test con Pharo 1.4 summer. Penso che sia meglio spiegarlo usando gli screenshot, il codice è sotto.Morphic: ridimensiona automaticamente la casella di gruppo contenuta in un riquadro di scorrimento?

Questo è il mio stato iniziale (quello che sto ottenendo ora con il mio codice):

Initial State

Voglio che il morph casella di gruppo da riempire orizzontalmente in apertura, in questo modo:

Initial Desired State

E dopo il ridimensionamento, voglio il Variante casella di gruppo per mantenere i limiti, vale a dire:

Resize Desired State

Questo è il codice che ho provato:

| s morph1 morph2 row groupBox scroller | 
s := ScrollPane new. 
morph1 := BorderedMorph new. 
morph2 := BorderedMorph new. 
row := UITheme builder newRow: {morph1 . morph2}. 
groupBox := UITheme builder newGroupbox: 'Group Box Test' for: row. 
    groupBox 
     layoutFrame: (LayoutFrame fractions: (0 @ 0 corner: 1 @ 0.8)); 
     vResizing: #spaceFill; 
     hResizing: #spaceFill; 
     layoutChanged. 
scroller := s scroller. 
scroller 
    addMorph: (groupBox position: [email protected]) 
    fullFrame: (0 @ 0 corner: [email protected]). 
s scroller color: Color white. 
s 
extent: [email protected]; 
openCenteredInWorld 

Il contenitore deve essere uno ScrollPane.

ho adattato il codice di Bert non utilizzare il polimorfo UIBuilder, con conseguente:

morph1 := Morph new. 
morph2 := Morph new. 
row := ScrollPane new. 
row 
    color: Color white; borderColor: Color gray; borderWidth: 1; 
    layoutPolicy: ProportionalLayout new. 
row scroller 
    addMorph: morph1 fullFrame: (LayoutFrame fractions: ([email protected] corner: [email protected]) offsets: ([email protected] corner: [email protected])); 
    addMorph: morph2 fullFrame: (LayoutFrame fractions: ([email protected] corner: [email protected]) offsets: ([email protected] corner: [email protected])). 
row 
    extent: [email protected]; 
    openInHand 

ma anche non funziona perché morphs blu interni sono sovrapposti e non riempimento della struttura specificata. Ho provato molte combinazioni usando i frame ma niente ha funzionato finora. Sai cosa mi manca?

risposta

3

Utilizzando UIBuilder non è necessario creare manualmente uno scroller. Controllare il seguente script ridimensionando fino a quando le barre di scorrimento verticali o orizzontali vengono visualizzate automaticamente.

| dialog morphList row morph1 morph2 morph3 morph4 | 

morph1 := BorderedMorph new hResizing: #spaceFill. 
morph2 := BorderedMorph new. 
morph3 := BorderedMorph new. 
morph4 := BorderedMorph new. 
row := UITheme builder newRow: {morph1 . morph2 . morph3}. 
morphList := UITheme builder 
    newMorphListFor: (ListModel new list: {row . morph4}) 
    list: #list 
    getSelected: #selectionIndex 
    setSelected: #selectionIndex: 
    help: 'This is a morph list'. 
dialog := UITheme builder newWindowFor: nil title: 'titleString'. 
dialog addMorph: morphList fullFrame: (LayoutFrame fractions: ([email protected] corner: [email protected])). 
dialog openInWorld 
2

Stai mancante che ProportionalLayout non usa #spaceFill ecc Quindi, o utilizzare TableLayout:

morph1 := Morph new hResizing: #spaceFill. 
morph2 := Morph new. 
row := Morph new 
    color: Color white; borderColor: Color gray; borderWidth: 1; 
    layoutPolicy: TableLayout new; 
    layoutInset: 5; cellInset: 5; 
    listDirection: #leftToRight; 
    addAllMorphs: {morph1. morph2}; 
    extent: [email protected]; 
    openInHand 

o un ProportionalLayout con offset, che è come si possono mescolare a larghezza fissa e relative dimensioni:

morph1 := Morph new. 
morph2 := Morph new. 
row := Morph new 
    color: Color white; borderColor: Color gray; borderWidth: 1; 
    layoutPolicy: ProportionalLayout new; 
    addMorph: morph1 fullFrame: (LayoutFrame fractions: ([email protected] corner: [email protected]) offsets: ([email protected] corner: [email protected])); 
    addMorph: morph2 fullFrame: (LayoutFrame fractions: ([email protected] corner: [email protected]) offsets: ([email protected] corner: [email protected])); 
    extent: [email protected]; 
    openInHand 

Ho provato questo in Squeak che non ha UITheme, quindi questo usa Morph direttamente.

+0

Ho modificato la mia domanda aggiungendo una versione dell'adattatore del codice, ma non sembra funzionare neanche. Forse è un bug ScrollPane? – user183928

Problemi correlati