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