Pliant talk forum

Pliant talk forum

Feature request: UI extensions

Ability to turn any ui_function to behave like "hook"
Message posted by maybe Boris Reitman on 2008/08/03 12:55:50
Say I have a ui_function that presents a form with 
a several fields and two final action buttons: "OK" "Cancel"
What I want is to run certain external hooks registered by the caller 
when user presses them:

  ui_function show_form
    field "username: " (ovar Str username) ; eol
    field "password: " (ovar Str password)
    button "ok"
      dispatch "ok"
      ...
    button "cancel"
      dispatch "cancel"
      ...
  
usage:

  ui_function large_form
    hook
      show_from
    event "ok"
      ...
    event "cancel"
      ...

In other words I want to extend the "button" mechanism to a more general one
that works for any ui_function.
Message posted by maybe Hubert Tonneau on 2008/08/03 15:22:35
From my point of view, the correct way to implement your 'show_form' is to use
meta programming: it will received two delayed actions:

show_form
  void
ok
  ...
cancel
  ...

Now, if you don't want to do meta programming everywhere,
since your request is basically a request for messages passing model,
you can still define a meta function 'cock' and a standard function 'fire'.
'cock' will record the delayed action in the server session dictionary,
just like 'button' does, and 'fire' will find and execute it.
One danger is name clashing.
The other bigger one is to loose readability because message passing brings
complex execution path that are easy to write but hard to read.

ui_function show_form
  field "username: " (ovar Str username) ; eol
  field "password: " (ovar Str password)
  button "ok"
    fire "ok"
    ...
  button "cancel"
    fire "cancel"
    ...

ui_function large_form
  cock "ok"
    ...
  cock "cancel
    ...
  show_form
Message posted by maybe Boris Reitman on 2008/08/03 15:52:06
Name clashing also occures in section naming, so 
it's a bigger problem that must be tackled elsewhere.
I just add a unique prefix to section names, which is usually a key of some db 
object, and I pass the prefix into the ui_functions so they add to 
their internally generated sections.