| Hola Gente Intento usar lo mismo que usa dolphin en el ViewComposer para mostrar las propiedades de un objeto, el Property Inspector. El tema es que necesitaría darle un orden particular para cada objeto y no en orden alfabetico como esta en el ViewComposer. Es posible hacer esto ?. Veo que el LookupTable agrega las cosas en orden y no encuentro forma de cambiar esto. Alguna idea ? |
--
To post to this group, send email to clubSm...@googlegroups.com
To unsubscribe from this group, send email to clubSmalltal...@googlegroups.com
http://www.clubSmalltalk.org
| Hola gallego ok, me fijo y cualquier cosa pregunto, gracias kiko --- El vie 19-feb-10, GallegO <fxga...@gmail.com> escribió: |
| Hola Gallego Yo lo resolví subclasificando y reimplementando este método: getSubAspectsFor: anObject "Private - Answer a <sequencedReadableCollection> of the Aspects below anAspectAccessor" | aspects | aspects := #(). [aspects := anObject publishedAspects reject: [:each | each name == #yourself]] on: Error do: [:ex | "If an error occurs attempting to access publishedAspects of the object, answer an empty collection" ex toTrace]. ^aspects En el original , se retornaba una SortedCollecton. Vos hablastes de un OrderedDictionary, pero no existe tal clase. Es una clase que agregaste ? Pregunto porque mi solución parece un tanto diferente a la tuya. Al no convertir en Sorted queda el orden definido en #publishedEventsOfInstances saludos kiko --- El dom 21-feb-10, Jose Gregoris <kikod...@yahoo.com.ar> escribió: |
| Hola Gallego Bueno, creo que no anda así jajaj. No había mirado bien el orden en que se mostraban las propiedades. Ese OrderedDictionary de donde lo sacaste ? Estuve viendo los goodies y no existe. Si hay algo como eso en Smalltalk X, lo sacaste de hay ? saludos kiko --- El lun 22-feb-10, Jose Gregoris <kikod...@yahoo.com.ar> escribió: |
| Hola Guillermo Gracias, no conocía esto. Trataré de hacerlo andar, cualquier cosa pregunto saludos kiko --- El lun 22-feb-10, Guillermo Schwarz <guillerm...@gmail.com> escribió: |
| Hola Guillermo, gallego, gente Ahora anda !. Tengo dos consultas mas. 1) Se puede agregar una etiqueta como título ? Algo así: anObject + basic settings "Es una etiqueta" - name - size - etc + texture settings "es una etiqueta " - baseTexture - textureScale - etc Se entiende ? De la misma forma que se ve por ejemplo en las propiedades de un ViewContainer la posición. - position = 0@100 - x = 0 - y=100. 2) En algunas propiedades debo pedir confirmación en los cambios. Yo puse un MessageBox en el accessor algo así: >>chunkHeight: aHeightInChunkSize "Set the height of the reciever. " (MessageBox confirm: 'Warning! Changing size flattens the terrain. Proceed?' caption: 'Reinitialize?') ifTrue: [chunkHeight := aHeightInChunkSize. self reinitialize] ifFalse: [^self] Esto anda, pero creo que debe haber otra forma de pedir la confirmación. Estuve mirando la clase Aspect y veo como se colocan dialogos para editar, pero no veo la forma de poner la confirmación hay. SAludos kiko |
| Hola Gallego ! |
La nuestra hereda de LookupTable y para hacerla me base en la técnica de una de VisualSmalltalk. Supongo que esa era de una empresa Tec4 o algo asi. La implementacion no es la misma pero la técnica ayuda bastante. No es file-in file-out |
| Gallego pirataaaaaaaaa ajajjaj. Yo lo solucione tomando prestada la implementación del STX, hay te la mande si te sirve de algo. Con respecto a 1) La unica forma de hacer eso son
cambiar varias cosas es teniendo un objeto para cada cosa que pretendes
tener como label. Puede ser un objeto o un wrapper al cual le agregues
publishedAspects y le redefinas el #doesNotUnderstand:Siguiendo tu referencía, implemente algo así: WrapperPublishedAspect>> title: aString publishedAspects: anArrayOfSymbols subject: anObject "Return a new instance of the reciever" ^(self new) title: aString; publishedAspects: anArrayOfSymbols; subject: anObject; yourself Luego construyo los aspects según lo que mande en la colección. Redefiní : >>doesNotUnderstand: failedMessage ^failedMessage forwardTo: self subject Esto anda, pero tiene un problema. Si el aspect que mande termina siendo un mensaje que entiende el Wrapper, ese aspect funciona mal. Pues en ves de reenviar el mensaje al subject por medio de #doesNotUnderstand: , usa el mensaje propio. Ejemplo #size. Fijate en la captura, yo definí el #size como String y esta mostrando un 0. Se me occurrio algo medio trucho, que es redefinir esto: >>onAspectValueChanged: anAspectAccessor "Private - The currently inspected aspect value has been updated." | oldSubject | anAspectAccessor name == #yourself ifFalse: [oldSubject := anAspectAccessor subject. (anAspectAccessor subject: oldSubject subject) editedValue: aspectValueModel value. self propagate: anAspectAccessor]. self refreshAccessor: anAspectAccessor. self trigger: #inspecteeChanged Y cambiar el subject del anAspectAccessor por el del Wrapper. No sé si esto es lo que pensabas. Era algo así ?. Si es así , alguna idea para mejorar esto ?. Si no es así, podes explicarme tu idea más en detalle ? |
Es un tema. Siendo pragmatico te diria que simplemente implementes un metodo que no sea el setter y uses ese como aspect ya que luego si queres settear algo no vas a poder hacerlo sin la confirmación. |
| Si entiendo, pero en este caso solo puedo setear el valor de la variable por medio de la interface , igual lo voy a tener en cuenta. Por otro lado, esta bien hacer esto ?. Digo colocar la confirmación del lado del modelo y no del presenter ? Y la última por hoy, fijate que en la captura en basicSetting no solo queda el título, sino basicSetting = Basic Settings. Se puede sacar el nombre del selector #basicSetting saludos kiko --- El mié 24-feb-10, GallegO <fxga...@gmail.com> escribió: |
|
Fecha: miércoles, 24 de febrero de 2010, 10:51 |
|
|
|
|
|
Gallego pirataaaaaaaaa ajajjaj.
Yo lo solucione tomando prestada la implementación del STX, hay te la mande si te sirve de algo.
Con respecto a 1)
No sé si esto es lo que pensabas.
Era algo así ?.
Si es así , alguna idea para mejorar esto ?.
Si no es así, podes explicarme tu idea más en detalle ?
Si entiendo, pero en este caso solo puedo setear el valor de la variable por medio de la interface , igual lo voy a tener en cuenta.
Por otro lado, esta bien hacer esto ?.
Digo colocar la confirmación del lado del modelo y no del presenter ?
Y la última por hoy, fijate que en la captura en basicSetting no solo queda el título, sino basicSetting = Basic Settings.
Se puede sacar el nombre del selector #basicSetting
| Hola Gallego Bien, ahora funciona ! Hay mando una captura. Para mostrar la etiqueta sola, puse esto: >> aStream initialize. [self displayOn: aStream] on: Error do: [:ex | ex displayOn: aStream] Lo reinicialize porque ya tenía el symbol del Aspect, es algo medio medio, pero funciona. Se escuchan alternatibas. Lo que no puedo hacer es poner la etiqueta en negrita y cambiarle el color. Me tiras una idea de por donde buscar ?. NO. |
Te tire algo para que lo elabores vos :) Por ahora no tengo tiempo che. |
No hay drama , yo entiendo perfectamente. |
No, no esta bien. Cada uno sabe qué está bien y qué no en su aplicación.
|
Todo depende de los usos que le vas a dar a ese inspector. Ademas,
cuando un modelo define su interfaz dinámicamente te va a pasar eso.
Empieza a ser difuso donde es modelo y donde es interfaz. La mejor
opción que encontre hasta ahora es delegarlo en una session de usuario.
Entonces en ese lugar pongo: ( self sessionManager confirm: 'Estas loco?') ifTrue: [...] |
Hay no entendí, donde estas poniendo eso ?. No en el accesor ? A mi se me ocurría que podía poner algo de eso en el editBlock del Aspect, pero no logro que ande. saludos kiko |
--- El mié 24-feb-10, GallegO <fxga...@gmail.com> escribió: |
|
|
|
Lo que no puedo hacer es poner la etiqueta en negrita y cambiarle el color.
Me tiras una idea de por donde buscar ?.
, yo entiendo perfectamente.No, no esta bien.Cada uno sabe qué está bien y qué no en su aplicación.Todo depende de los usos que le vas a dar a ese inspector. Ademas, cuando un modelo define su interfaz dinámicamente te va a pasar eso. Empieza a ser difuso donde es modelo y donde es interfaz. La mejor opción que encontre hasta ahora es delegarlo en una session de usuario. Entonces en ese lugar pongo:Hay no entendí, donde estas poniendo eso ?.
( self sessionManager confirm: 'Estas loco?') ifTrue: [...]
No en el accesor ?
A mi se me ocurría que podía poner algo de eso en el editBlock del Aspect, pero no logro que ande.
| Hola Gallego Lo de poner en negrita ya esta. Pero tengo un problema mas, fijate la captura. El texto en negrita no se ve completo. Alguna idea ? |
mmm no se, podes usar un Presenter tuyo tambien para esa tarea con
confirmacion. Si no me equivoco en el #aspect podes especificar que
presenter usa. |
Para la confirmación se me ocurrio esto. Que el Aspect se encargue de pedir la confirmación Para eso subclasifique Aspect por ConfirmedAspect, el nombre no me suena muy bien pero bue(se escuchan ofertas). Luego reimplmente : >>writeInto: subjectObject value: valueObject "Private - Set the attribute of subjectObject described by the receiver to valueObject." (subjectObject perform: self getSelector) == valueObject ifTrue: [^self]. (MessageBox confirm: self confirm caption: self caption) ifTrue: [^super writeInto: subjectObject value: valueObject] Es algo que yo suponía que ya estaba , pero no . Creo que es una solución mucho mejor que la primera. Qué te parece ? saludos kiko --- El jue 25-feb-10, GallegO <fxga...@gmail.com> escribió: |
|
|
|
Hola Gallego
Lo de poner en negrita ya esta. Pero tengo un problema mas, fijate la captura.
El texto en negrita no se ve completo. Alguna idea ?
Para la confirmación se me ocurrio esto.
Que el Aspect se encargue de pedir la confirmación
Para eso subclasifique Aspect por ConfirmedAspect, el nombre no me suena muy bien pero bue(se escuchan ofertas).
Luego reimplmente :
>>writeInto: subjectObject value: valueObject
"Private - Set the attribute of subjectObject described by the receiver
to valueObject."
(subjectObject perform: self getSelector) == valueObject ifTrue: [^self].
(MessageBox confirm: self confirm caption: self caption)
ifTrue: [^super writeInto: subjectObject value: valueObject]
| Hola Gallego |
Lo unico que se me ocurre con respecto a tu problema es que hayas hecho algo mal. Igual el TreeView es uno de los controles famosos por la cantidad de bugs que tiene. No me extrañaria que exista algun truco. Tenelo en cuenta. |
| mmm, ok . La verdad es que no veo nada mal, pero vere si puedo localizar el error. |
Definitivamente NO. No es una opcion subclasificar para eso. |
| Porque no ¿? |
Por que no haces un Presenter y le pasas al Aspect que use ese presenter. En ese mismo presenter, cuando cambia un valor (o cuando pirde foco), implementas que confirme el usuario. Si tengo tiempo despues te paso un ejemplo. |
| Esto contradice lo que decis arriba, pero subclasifique ChoicePresenter donde implemente así: onChoiceChanged "Private - Handler for a choice change in the receiver's view" | oldSelection newSelection | oldSelection := self value. newSelection := self getValue. oldSelection = newSelection ifTrue: [^self]. (MessageBox confirm: self confirm caption: self caption) ifTrue: [^self value: self getValue] Le paso al Aspect este presenter , con todos la opciones más el caption y confirm. De otra forma tenía que hacer un presenter que es igual a ChoicePresenter , para hacer esto. Creo que no tiene sentido, cuando ya existe ChoicePresenter. Te parece ¿? jajaja. Si no , escucho ofertas ... saludos kiko --- El dom 28-feb-10, GallegO <fxga...@gmail.com> escribió: |
|
|
|
| Hola Gallego |
Yo hubiera hecho una subclase de Presenter, por mas que haga los mismo que el ChoicePresenter. |
| El problema con esto, es que solo sirve para ChoicePresenter. Tambien debo pedir confirmación para otros Aspect. Tratando de entender lo que sugeris, se me ocurre que podría tener un presenter donde pida la confirmación y este presenter agrege de forma dínamica , cualquier tipo de presenter. Algo como lo que hace el "display" de PublishedAspectInspector . Algo como esto: >>createAspectPresenters: anAspectAccessor "Private - Create the Workspace and Value presenters for the currently selected aspect" aspectPresenter := anAspectAccessor aspectDescriptor presenterFor: aspectValueModel in: displayPresenter. Solo que esto debería hacerlo mi presenter, que luego se agregaría al PublishedAspectInspector de la misma forma. Aunque parece medio rebuscado. No sé, no conozco bien la estructura de Presenter y trato de interpretar lo que me comentas. Voy a ver si puedo hacer algo por el estilo. Se aceptan sugerencias jajaa saludos kiko --- El lun 1-mar-10, GallegO <fxga...@gmail.com> escribió: |
| Hola Gallego |
Definitivamente NO. No es una opcion subclasificar para eso. Por que no haces un Presenter y le pasas al Aspect que use ese presenter. En ese mismo presenter, cuando cambia un valor (o cuando pirde foco), implementas que confirme el usuario. Si tengo tiempo despues te paso un ejemplo. |
| Disculpa la molestia. Implemente esto y
funciona, pero tiene un problema. El tema es que cuando se captura el #valueChanged, el valor ya se seteo en el objeto que estaba esperando esto. Si bien uno puede, através de la confirmación deshacer los cambios, el echo es que ya se seteo . El problema principal con esto, es que una vez seteado el valor de la variable, mi objeto es forzado a reinicializar y es algo que no quiero. Pues perdería todos los cambios que hay sobre el terreno. Que es en este caso el objeto en cuestión. Es posible que no este implementando bien, esto es lo que hay: ConfirmPresenter>>addPresenter: aClassPresenter on: aModel "Add a new presenter on aModel " currentPresenter := aClassPresenter createIn: card on: aModel. currentPresenter when: #valueChanged send: #onValueChanged to: self. oldValue := aModel value ConfirmPresenter>>onValueChanged "The model held by the receiver has changed so refresh the parentView. The default is to invalidate the receiver and cause it to repaint." oldValue = currentPresenter value ifTrue: [^self]. |
(MessageBox confirm: self confirm caption: self caption) |
| ifFalse: [currentPresenter value: oldValue]. oldValue := currentPresenter value. ConfirmPresenter>>addChoicePresenterOn: aModel choiceFrom: aArray "Add a Choice presenter on aModel " self addPresenter: ChoicePresenter on: aModel. currentPresenter choices: aArray Test>>basicSetting | wrapper aspects | aspects := OrderedDictionary new. aspects add: (Aspect name: #position presenterBlock: [:p :m | | confirm | confirm := ConfirmPresenter createIn: p. confirm addChoicePresenterOn: m choiceFrom: #(#TV_PRECISION_BEST #TV_PRECISION_HIGH #TV_PRECISION_ULTRA #TV_PRECISION_AVERAGE). ]); add: (Aspect name: #size presenterBlock: [:p :m | | confirm | confirm := ConfirmPresenter createIn: p. confirm addPresenter: NumberPresenter on: m. ]); add: (Aspect string: #name). wrapper := WrapperPublishedAspect title: ' Basic Settings ' publishedAspects: aspects subject: self. ^wrapper |
saludos kiko --- El dom 28-feb-10, GallegO <fxga...@gmail.com> escribió: |
|
|
|