1 // rfx-builder.h
2 // LiVES
3 // (c) G. Finch 2004 - 2020 <salsaman+lives@gmail.com>
4 // released under the GNU GPL 3 or later
5 // see file ../COPYING or www.gnu.org for licensing details
6 
7 #ifndef HAS_LIVES_RFX_BUILDER_H
8 #define HAS_LIVES_RFX_BUILDER_H
9 
10 #define EXEC_RFX_BUILDER "build-lives-rfx-plugin"
11 
12 /// must match whatever is in RFX_BUILDER
13 #define RFX_VERSION "1.8.3"
14 
15 /// this definition must match with smogrify
16 #define EXEC_RFX_BUILDER_MULTI "build-lives-rfx-plugin-multi"
17 
18 /// default script extension when saving
19 #define RFXBUILDER_SCRIPT_SUFFIX "script"
20 
21 /// length in chars of G_MAXFLOAT (for display only)
22 #define MAXFLOATLEN 11
23 
24 /// length in chars of G_MAXINT (for display only)
25 #define MAXINTLEN strlen(lives_strdup_printf("%d", LIVES_MAXINT))
26 
27 // advanced menu entries
28 void on_new_rfx_activate(LiVESMenuItem *, livespointer status);
29 void on_edit_rfx_activate(LiVESMenuItem *, livespointer status);
30 void on_copy_rfx_activate(LiVESMenuItem *, livespointer);
31 void on_rename_rfx_activate(LiVESMenuItem *, livespointer);
32 void on_delete_rfx_activate(LiVESMenuItem *, livespointer status);
33 void on_rebuild_rfx_activate(LiVESMenuItem *, livespointer);
34 void on_promote_rfx_activate(LiVESMenuItem *, livespointer);
35 void on_import_rfx_activate(LiVESMenuItem *, livespointer status);
36 void on_export_rfx_activate(LiVESMenuItem *, livespointer status);
37 
38 // the builder window
39 
40 /// maximum requirements
41 #define RFXBUILD_MAX_REQ 128
42 
43 /// maximum parameters
44 #define RFXBUILD_MAX_PARAMS 32
45 
46 /// maximum parameter window hints
47 #define RFXBUILD_MAX_PARAMW_HINTS 512
48 
49 /// max table rows :
50 /// this should be set to the largest of the previous maxima
51 #define RFXBUILD_MAX_TROWS 512
52 
53 #define PREF_RFXDIALOG_W ((int)(720.*widget_opts.scale))
54 #define PREF_RFXDIALOG_H ((int)(650.*widget_opts.scale))
55 
56 #define RFX_LOADED (mainw->helper_procthreads[PT_LAZY_RFX] ?		\
57 		    lives_proc_thread_check(mainw->helper_procthreads[PT_LAZY_RFX]) : FALSE)
58 
59 /// maximum decimal places allowed (should correspond to precision of a "float")
60 #define RFXBUILD_MAX_DP 16
61 typedef struct {
62   int when;
63   char *code;
64 } rfx_trigger_t;
65 
66 typedef enum {
67   RFX_BUILD_TYPE_EFFECT1,
68   RFX_BUILD_TYPE_EFFECT2,
69   RFX_BUILD_TYPE_EFFECT0,
70   RFX_BUILD_TYPE_TOOL,
71   RFX_BUILD_TYPE_UTILITY
72 } lives_rfx_build_type_t;
73 
74 typedef enum {
75   RFX_TABLE_TYPE_REQUIREMENTS,
76   RFX_TABLE_TYPE_PARAMS,
77   RFX_TABLE_TYPE_TRIGGERS,
78   RFX_TABLE_TYPE_PARAM_WINDOW
79 } lives_rfx_table_type_t;
80 
81 typedef enum {
82   RFX_CODE_TYPE_PRE,
83   RFX_CODE_TYPE_LOOP,
84   RFX_CODE_TYPE_POST,
85   RFX_CODE_TYPE_STRDEF,
86   RFX_CODE_TYPE_STRING_LIST
87 } lives_rfx_code_type_t;
88 
89 typedef enum {
90   RFX_BUILDER_MODE_NEW = 0,
91   RFX_BUILDER_MODE_EDIT,
92   RFX_BUILDER_MODE_COPY
93 } lives_rfx_builder_mode_t;
94 
95 typedef struct {
96   lives_rfx_build_type_t type;
97 
98   LiVESWidget *dialog;
99   LiVESWidget *name_entry;
100   LiVESWidget *spinbutton_version;
101   LiVESWidget *author_entry;
102   LiVESWidget *url_entry;
103   LiVESWidget *menu_text_entry;
104   LiVESWidget *action_desc_hbox;
105   LiVESWidget *action_desc_entry;
106   LiVESWidget *action_desc_hsep;
107   LiVESWidget *spinbutton_min_frames;
108   LiVESWidget *type_effect1_radiobutton;
109   LiVESWidget *type_effect2_radiobutton;
110   LiVESWidget *type_effect0_radiobutton;
111   LiVESWidget *type_tool_radiobutton;
112   LiVESWidget *type_utility_radiobutton;
113   LiVESWidget *langc_combo;
114   LiVESWidget *table;
115   LiVESWidget *requirements_button;
116   LiVESWidget *properties_button;
117   LiVESWidget *params_button;
118   LiVESWidget *param_window_button;
119   LiVESWidget *pre_button;
120   LiVESWidget *loop_button;
121   LiVESWidget *post_button;
122   LiVESWidget *trigger_button;
123   LiVESWidget *prop_slow;
124   LiVESWidget *prop_batchg;
125   LiVESWidget *hbox_batchg;
126   LiVESWidget *min_frames_label;
127 
128   lives_rfx_table_type_t table_type;
129 
130   int table_rows;
131 
132   lives_rfx_code_type_t codetype;
133 
134   LiVESWidget *entry[RFXBUILD_MAX_TROWS];
135   LiVESWidget *entry2[RFXBUILD_MAX_TROWS];
136   LiVESWidget *entry3[RFXBUILD_MAX_TROWS];
137   LiVESWidget *param_dialog;
138   LiVESWidget *param_name_entry;
139   LiVESWidget *param_label_entry;
140   LiVESWidget *param_type_combo;
141   LiVESWidget *param_dp_label;
142   LiVESWidget *param_def_label;
143   LiVESWidget *param_min_label;
144   LiVESWidget *param_max_label;
145   LiVESWidget *param_step_label;
146   LiVESWidget *param_wrap_hbox;
147   LiVESWidget *param_wrap_checkbutton;
148   LiVESWidget *param_strlist_hbox;
149   LiVESWidget *param_def_combo;
150   LiVESWidget *paramw_rest_entry;
151   LiVESWidget *paramw_kw_combo;
152   LiVESWidget *paramw_sp_combo;
153   LiVESWidget *paramw_spsub_combo;
154   LiVESWidget *paramw_rest_label;
155   LiVESWidget *hbox_bg;
156   LiVESWidget *param_strdef_button;
157   LiVESWidget *param_strdef_hbox;
158   LiVESWidget *trigger_when_entry;
159   LiVESWidget *spinbutton_param_dp;
160   LiVESWidget *spinbutton_param_group;
161   LiVESWidget *spinbutton_param_def;
162   LiVESWidget *spinbutton_param_min;
163   LiVESWidget *spinbutton_param_max;
164   LiVESWidget *spinbutton_param_step;
165   LiVESWidget *code_textview;
166   LiVESWidget *new_entry_button;
167   LiVESWidget *edit_entry_button;
168   LiVESWidget *remove_entry_button;
169   LiVESWidget *move_up_button;
170   LiVESWidget *move_down_button;
171 
172   uint32_t props;
173 
174   char *pre_code;
175   char *loop_code;
176   char *post_code;
177 
178   int edit_param;
179 
180   char *reqs[RFXBUILD_MAX_REQ];
181   int num_reqs;
182   int onum_reqs;
183 
184   lives_param_t *params;   ///< store our parameters
185   lives_param_t *copy_params;   ///< store our parameters while editing
186   int num_params; ///< upper limit is RFXBUILD_MAX_PARAMS-1
187   int onum_params;
188 
189   char *paramw_hints[RFXBUILD_MAX_PARAMS];
190   int num_paramw_hints;  ///< upper limit is RFXBUILD_MAX_PARAMW_HINTS-1
191   int onum_paramw_hints;
192 
193   rfx_trigger_t *triggers;
194   rfx_trigger_t *copy_triggers; ///< store triggers while editing
195   int num_triggers;   ///< upper limit is RFXBUILD_MAX_PARAMS, 0 == init
196   int onum_triggers;
197 
198   boolean has_init_trigger;
199 
200   char *field_delim;
201 
202   lives_rfx_builder_mode_t mode;
203 
204   int table_swap_row1;
205   int table_swap_row2;
206 
207   char *script_name;
208   char *oname;
209 
210   ulong min_spin_f;
211   ulong max_spin_f;
212   ulong def_spin_f;
213   ulong step_spin_f;
214 
215   char *rfx_version;
216   int plugin_version;
217 } rfx_build_window_t;
218 
219 // fileselectors
220 void on_export_rfx_ok(LiVESButton *, char *script_name);
221 void on_import_rfx_ok(LiVESButton *, livespointer status);
222 
223 /// add dynamic menu entries
224 void add_rfx_effects(lives_rfx_status_t status);
225 void add_rfx_effects2(lives_rfx_status_t status);
226 void update_rfx_menus(void);
227 
228 // utility functions
229 char *prompt_for_script_name(const char *sname, lives_rfx_status_t status);
230 boolean check_builder_programs(void);
231 LiVESList *get_script_list(lives_rfx_status_t status);
232 
233 boolean perform_rfxbuilder_checks(rfx_build_window_t *);
234 boolean perform_param_checks(rfx_build_window_t *, int index, int rows);
235 
236 // read/write script files
237 boolean rfxbuilder_to_script(rfx_build_window_t *);
238 boolean script_to_rfxbuilder(rfx_build_window_t *, const char *script_file);
239 
240 LiVESList *get_script_section(const char *section, const char *script_file, boolean strip);
241 
242 #endif // HAS_LIVES_RFX_BUILDER_H
243