Hi Esteban

 

Many thanks for your help on this.

 

A.      I managed to get it working with a small change – which looks like it 
was due to issue 1263 as you indicated

And this technique was successful my main application too.

 

Next, I will load the latest merge for Spec2 and do it properly.

 

“Test class>>esteban <example>

| items  |

items := { #one -> 'one'. #two -> 'two' }.

table := SpTablePresenter new 

                addColumn: (SpStringTableColumn title: 'Key' evaluated: #key);

                addColumn: (SpStringTableColumn new

                                title: 'Value';

                                evaluated: #value; 

                                beEditable;

                                onAcceptEdition: [ :item :newValue | item 
value: (newValue getText string) ];

                                yourself).

table      items: items.

                

table openWithSpec .”

 

B.      Do you think there is any merit in using a notifications design 
approach in this example? (e.g. using ‘model changed’)?

(That was my first instinct…but I couldn’t see how to do it.)

If you think that makes sense, does Spec2 have the hooks required to do it this 
way?

 

C.      My comment on documentation was a good hearted grumble - and is not 
about the source code...

I think the community urgently needs guides like the ‘An Introduction to user 
interface

building with Spec 2.0’ – this one is still WIP after many months.

The trial and error learning curve for all the part timers like me is very 
inefficient and frustrating. 

I understand manpower and time are seriously limiting factors, but more good 
learning resources would really help wider adoption of Pharo IMHO. 

That’s just useful feedback I hope… 😊

 

Again, many thanks for your help.

 

Cheers

Mark, Perth WA

 

From: Esteban Lorenzano <esteba...@netc.eu> 
Sent: Sunday, 20 March 2022 10:15 PM
To: Any question about pharo is welcome <pharo-users@lists.pharo.org>
Cc: pharo-users@lists.pharo.org
Subject: [Pharo-users] Re: Another question about Spec2 and SpTablePresenter

 

Hi, 

 

well, the incomplete documentation of Spec states clearly that you will be 
receiving two parameters: 

 

onAcceptEdition: aBlock

"Set the block to execute when cell edition is accepted.

`aBlock` receives two arguments: 

- the element of the table (See `SpAbstractListPresenter>>#items:`

- the string entered while editing"

acceptAction := aBlock

 

So, when you set beEditable to your column, you can do something like this: 

 

items := { #one -> 'one'. #two -> 'two' }.

table := SpTablePresenter new

addColumn: (SpStringTableColumn title: 'Key' evaluated: #key);

addColumn: (SpStringTableColumn new

title: 'Value';

evaluated: #value;

beEditable;

onAcceptEdition: [ :item :newValue | item value: newValue ];

yourself);

items: items;

open.

and then you can edit whatever you want and update your item.

 

Now, since this is a mechanism that has not been used a lot yet in morphic 
backend, I just discovered and fixed a bug (not in editable tables, but that 
affects it: https://github.com/pharo-spec/Spec/issues/1263), so if you want to 
actually use the functionality, you will need to wait until is merged 
(tomorrow).

 

Esteban 

 

On Mar 20 2022, at 10:26 am, Mark O'Donoghue <mark.odonoghue.2...@gmail.com 
<mailto:mark.odonoghue.2...@gmail.com> > wrote:

Howdy all

 

 

 

I am making progress with quite a large application which relies heavily on 
Spec2

 

( but Spec2 is such a big learning curve for me – especially given the 
incomplete documentation… 😊)

 

 

 

I am currently struggling with the following issue:

 

I have a SpTablePresenter which shows a collection of domain objects 
(subclassed from Model).

 

The domain object are instances of ‘Asset’ which is a relatively simple class.

 

The table works fine.

 

 

 

Now, I need to be able to update some columns , but I don’t think I want to 
build a separate form for doing classic CRUD operations.

 

(There is no need for create or delete functionality – so an in-situ update 
seems desirable…).

 

 

 

I’ve made a start using  SpStringTableColumn >> beEditable and #onAcceptEdition:

 

 

 

But I can’t see how to work out what row and column has changed,  and how I can 
update the corresponding Asset instance(s).

 

It thought it would be handled using #whenModelChanged: but there are models in 
many places (and at several levels in the Spec hierarchy)…

 

I’ve tried following it all the way down to the adapters and morphs but I can’t 
see how the freshly edited cell interacts with the model or announcements.

 

 

 

(BTW - It doesn’t look like the ‘selected item’ features are appropriate since 
you can do edits in other rows regardless of what row is/isn’t selected.)

 

 

 

Is there a correct and/or elegant way to detect these cell changes in a 
SpTablePresenter and apply them to my domain objects…?

 

 

 

Cheers

 

Mark

 

 

 

 

 

 

 

 

 

From: Mark O'Donoghue <mark.odonoghue.2...@gmail.com 
<mailto:mark.odonoghue.2...@gmail.com> >

Sent: Sunday, 4 July 2021 5:26 PM

To: pharo-users@lists.pharo.org <mailto:pharo-users@lists.pharo.org> 

Subject: Question about Spec2 and SpTablePresenter

 

 

Howdy all

 

 

 

I’ve got stuck trying to manage Tables – over 12 hours now and I’m out of 
ideas!. ☹

 

 

 

Any observations / suggestions  are most welcome…

 

 

 

I’ve been loading small external files of transactions using NeoCSV into Spec2 
tables.

 

I am trying to use Fuel to persist the table contents so that my application 
will re-load the working state from where I finished in the last session.

 

(I’ve opted for Fuel as a simple alternative to having to do the whole object 
relational mapping thing.)

 

 

 

The idea is that transactions (and potentially some manual adjustments) will be 
processed over time.

 

(This is preferable to having to reload all files from the beginning evert time 
I run the application…)

 

 

 

The Spec2 tables have been working well until I tried to persist them.

 

I can’t seem to fully re-load them to a previously saved state.

 

 

 

For example - I can restore the essential contents of my table  in most 
circumstances using:

 

 

 

restoreObjects

 

 

 

                “filePresenter1 is a SpTablePresenter”

 

 

 

                | objects savedEntry |

 

 

 

                objects := CpPersist restoreObjectsFromFileNamed: 
'E:\Me\zzzST-Test\demo.fuel'.

 

               

 

                recentFileList                     := objects at: 1.

 

                currFileFilter                       := objects at: 2.

 

                savedEntry                          := objects at: 3.

 

                                               

 

                self updateFilterButton: currFileFilter.

 

               

 

                filteredFileList := self filterFilesUsing: currFileFilter.

 

               

 

                filePresenter1 items: filteredFileList.

 

               

 

                savedEntry

 

ifNotNil: [filePresenter1 selectItem: savedEntry ].

 

 

 

 

 

However, if any of the table columns are re-sorted , the re-load operation gets 
confused and I can’t get the saved a saved selected item to become selected 
again.

 

 

 

(It seems to be confusing the index numbers of the sorted and unsorted lists – 
even when I match by contents rather than index.)

 

(I also created an equality test to ensure equivalent entries are recognised by 
the #= operation in the list of the underlying model ).

 

 

 

This all works fine - unless I sort a column!

 

 

 

Since this approach was going to be used on several screens I’d really like to 
find a solution.

 

 

 

Cheers

 

Mark

 

Perth, Western Australia

 

 

Reply via email to