The GO Factory state structure is defined like this:
struct of_state { uns flags; enum of_input_kind input_kind; uns input_type; uns input_subtype; union { struct dist_pass_result dpr; struct prop prop; } value; char * description; void (* action_func)(struct of_state *); void (* cleanup_func)(struct of_state *); struct of_state * prev; struct of_state * next; struct undo_gui * prev_undo_item; struct go * tmp_go[OFR_CNT]; };
The input_kind
specifies what input is wanted from the user. Its value
is one of OFIK_NONE
, OFIK_DPR
, OFIK_PROP
, OFIK_SEL
,
OFIK_TRANSFORM
, and OFIK_TF
. The last three ones are special and
used in the selection and transformation tools; OFIK_NONE
is used only
in some special GO Factory states. The OFIK_DPR
input kind means that
the input is the result of a snap distance pass, and OFIK_PROP
stands for
a property value.
The action_func
function is called before proceeding to the next
GO Factory state (after the state input value has been filled). It is called
inside a transaction on the current context tlo, so the function can use
transaction fails for error reporting. The of_state
function argument is
a pointer to the current state.
The cleanup_func
is called when moving back and undoing the effects
of the state, and after a successful GO creation as well.
It does not have to unlink any created objects; that is done
by undo automatically. It should only free any additionally allocated memory
or release all references that the action function created.
There are some predefined GO Factory states including the most important ones:
struct of_state ofs_start; struct of_state ofs_end;
These two states do not take part in creation of any go directly. But the state
structure is linked in such a way that the prev
pointer of all
the starting states points to the ofs_start
state and the next
pointer of all the last states points to ofs_end
.