On 2017-08-21 18:09, Brian Milby via use-livecode wrote:
What about something like
  import into [objectRef] from array [arrayRef]
    OR
  update [objectRef] from array [arrayRef]
where the array would be in the format of the export and the object would
be an existing object.

There are a few options - we have import/export array for widget, which naturally extends to any object type; so I'd be inclined to start there.

That being said, in the first instance, it would be best to focus on just the core properties - rather than the hierarchical structure which perhaps means a variant of 'the properties' might be better (and more obvious).

In any case, there's a fair bit of internal work to do before it can be exposed at the syntax level, so this doesn't have to be decided now.

I've been looking at the code and think that it would be straightforward to take the save/load code and change it over to creating an array. Some of the complexity would go away since key existence could be checked directly instead of flags for example (on import mainly). All of the code specific to versions < 9 would not be needed. It would start with the MCObject and be needed everywhere else. The existing import/export code would then need
to call appropriate handlers to take care of the object info if the key
existed ([$object] as a suggestion).

There's some work already done along these lines - I'll dig out the branch in due course. It was an attempt to abstract the internal structure a bit (using the currently-unused 'Record Type' which has long been languishing in libfoundation) - but work stopped on it when we reached a dead end with the dVCS 'stack dir' idea - based on ideas Monte developed in lcVCS.

It might be a bit overkill for what we actually need though - as widget's already have a general form - and so its only the engine controls in C++ which need to be augmented with the ability; so once done, it isn't going to need more controls needing it.

If the full specification of the object is in the export array, then the import could re-create an exact duplicate. There would need to be a check
on the ID and altID to ensure a duplicate isn't being created (with
appropriate/sensible handling of collisions). The import would be fully backwards compatible since if the object key is not present, then it would
just work like it did before.

Yes - we should export the id, and if the id does not exist then honor its setting in import. If it does exist, we can either ignore, or throw an error; forcing the code to delete the id from the array before importing and have the engine assign one.

The suggestions about support for inline arrays would actually make this
interesting too.  A single statement could be used to update multiple
values/properties/settings of an object at once. I'm sure there are pretty big gotchas on that though since it would likely avoid proper messages from
being dispatched (or the update could dispatch messages as updates
performed or collect the messages that should be sent and dispatch them
sequentially after all updates were completed to avoid duplicates).  I
haven't gotten that far in research yet, so not sure.

Yes - there is a nice synergy here - particularly if we go for a property based mechanism (for existing controls at least) - although I'm still not 100% sure what would 'look best' here.

I don't think there are any unpleasant 'gotchas' here with regards messages. The engine tends not to send any messages when properties are set (there are a couple of exceptions); and it certainly doesn't if it is loading / saving - so, particularly for import/export there isn't a problem. *Maybe* if we went down the update via a modified properties property then we might need to consider it (although, I can only think of the menuHistory and friends properties which do send a changed message off the top of my head as a result of a property setting by script).

One thing though, it is always nice to have equivalences in terms of one feature being implemented via another means either for speed or for ergonomic reasons. If we were to go down the road and do this partly for the 'being able to set object state in a loadStack' type arrangement then we probably do want to vet the engine objects to make sure all internal properties can be reflected one-to-one in actual public properties; and nominate that set as being the 'core' properties (as I mentioned before).

The reason to do this is that it would give an equivalence between:

  import object from array ...

and

  create tArray["type"]
  set the prop1 to tArray[prop1]
  set the prop2 to tArray[prop2]
  ...

From memory, one of the issues (which Monte patched the properties property to deal with) was that the order you set properties in matters; ideally it wouldn't - as long as you only set the core properties. (i.e. rect and not the individual parts or pairings there-of).

Having a set of properties for each object (should it be possible) which act like that is beneficial for general use too - it means that you don't get hard to trace bugs in code due to mis-ordering mutations of internally interelated properties.

Warmest Regards,

Mark.

--
Mark Waddingham ~ m...@livecode.com ~ http://www.livecode.com/
LiveCode: Everyone can create apps

_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to