Reloaded : Filter effect list by keyword + fix add disabled fx

* add text entry control right to fx types select box.
* add filtered and sorted models to effect trees
* on user input the filter effect trees is interactivly filtred (no case sensitive)

* fix fx disabled: add test over GDK_KEY_KEY
This commit is contained in:
Jerome Blanchi aka d.j.a.y
2017-06-02 14:03:42 +02:00
parent 2eda802611
commit 723faea7f4
3 changed files with 71 additions and 72 deletions

View File

@@ -3402,23 +3402,30 @@ void on_filter_effects_activate(GtkWidget *widget, gpointer user_data)
{ {
} }
void on_filter_effects_changed( GtkWidget *w, EffectListData *user_data) void on_filter_effects_changed( GtkWidget *w, effectlist_data *user_data)
{ {
gchar* fx_txt = get_text("filter_effects"); if(user_data != NULL) {
int filterlen = strlen(fx_txt); gchar* fx_txt = get_text("filter_effects");
int filterlen = strlen(fx_txt);
if(filterlen) { if(filterlen) {
vj_msg(VEEJAY_MSG_INFO, "filtering effects '%s'", fx_txt); vj_msg(VEEJAY_MSG_INFO, "filtering effects '%s'", fx_txt);
user_data->filter_string = vj_calloc(sizeof(gchar)*filterlen); // FIXME mem LEAK user_data->filter_string = g_new0(gchar, filterlen+1);
strcpy(user_data->filter_string, fx_txt); if(user_data->filter_string != NULL) {
gtk_tree_model_filter_refilter (user_data->effect_list_stores[0].effect_list_filtered); strcpy(user_data->filter_string, fx_txt);
gtk_tree_model_filter_refilter (user_data->effect_list_stores[1].effect_list_filtered); gtk_tree_model_filter_refilter (user_data->stores[0].filtered);
gtk_tree_model_filter_refilter (user_data->effect_list_stores[2].effect_list_filtered); gtk_tree_model_filter_refilter (user_data->stores[1].filtered);
gtk_tree_model_filter_refilter (user_data->stores[2].filtered);
free(user_data->filter_string); g_free(user_data->filter_string);
user_data->filter_string = NULL; }
} else { user_data->filter_string = NULL;
vj_msg(VEEJAY_MSG_INFO, ""); } else {
vj_msg(VEEJAY_MSG_DEBUG, ""); // FIXME why debug ? check vj-msg.h and "void vj_msg( " from vj-api.c:2340
// filter with "user_data->filter_string = NULL" to remove the filter
gtk_tree_model_filter_refilter (user_data->stores[0].filtered);
gtk_tree_model_filter_refilter (user_data->stores[1].filtered);
gtk_tree_model_filter_refilter (user_data->stores[2].filtered);
}
} }
} }

View File

@@ -21,36 +21,6 @@
#define VJCALLBACK_H #define VJCALLBACK_H
typedef struct
{
GtkListStore *effect_list;
GtkTreeModelSort *effect_list_sorted;
GtkTreeModelFilter *effect_list_filtered;
} EffectListStore;
typedef struct
{
EffectListStore effect_list_stores[3];
gchar *filter_string;
} EffectListData;
/*
struct _PhotosPreviewModel
{
GtkTreeModelFilter parent_instance;
PhotosBaseManager *item_mngr;
};
struct _PhotosPreviewModelClass
{
GtkTreeModelFilterClass parent_class;
};
G_DEFINE_TYPE (PhotosPreviewModel, photos_preview_model, GTK_TYPE_TREE_MODEL_FILTER);*/
#define SLIDER_CHANGED( arg_num, value ) \ #define SLIDER_CHANGED( arg_num, value ) \
{\ {\
if(!info->status_lock && !info->parameter_lock)\ if(!info->status_lock && !info->parameter_lock)\

View File

@@ -127,6 +127,7 @@ static struct
{"Mouse left click: Select slot (sample in slot),\nMouse double click: Play sample in slot,\nShift + Mouse left: Set slot as mixing current mixing channel"}, {"Mouse left click: Select slot (sample in slot),\nMouse double click: Play sample in slot,\nShift + Mouse left: Set slot as mixing current mixing channel"},
{"Select a SRT sequence to edit"}, {"Select a SRT sequence to edit"},
{"Double click: add effect to chain list,\nShift + Double click: add disabled effect to chain list"}, {"Double click: add effect to chain list,\nShift + Double click: add disabled effect to chain list"},
{"Filter the effects list by any string"},
{NULL}, {NULL},
}; };
@@ -136,7 +137,8 @@ enum
TOOLTIP_QUICKSELECT = 1, TOOLTIP_QUICKSELECT = 1,
TOOLTIP_SAMPLESLOT = 2, TOOLTIP_SAMPLESLOT = 2,
TOOLTIP_SRTSELECT = 3, TOOLTIP_SRTSELECT = 3,
TOOLTIP_FXSELECT = 4 TOOLTIP_FXSELECT = 4,
TOOLTIP_FXFILTER = 5
}; };
#define FX_PARAMETER_DEFAULT_NAME "<none>" #define FX_PARAMETER_DEFAULT_NAME "<none>"
@@ -554,6 +556,19 @@ typedef struct
const char *text; const char *text;
} widget_name_t; } widget_name_t;
typedef struct
{
GtkListStore *list;
GtkTreeModelSort *sorted;
GtkTreeModelFilter *filtered;
} effectlist_models;
typedef struct
{
effectlist_models stores[3];
gchar *filter_string;
} effectlist_data;
static widget_name_t *slider_names_ = NULL; static widget_name_t *slider_names_ = NULL;
static widget_name_t *param_names_ = NULL; static widget_name_t *param_names_ = NULL;
static widget_name_t *param_incs_ = NULL; static widget_name_t *param_incs_ = NULL;
@@ -4216,13 +4231,13 @@ gboolean view_fx_selection_func (GtkTreeSelection *selection,
return TRUE; /* allow selection state to change */ return TRUE; /* allow selection state to change */
} }
static int effectlist_key_down_shift = 0; //MASK! static int effectlist_key_down_shift = 0; //TODO BitMASK!
static int effectlist_key_down_ctrl = 0; static int effectlist_key_down_ctrl = 0;
gboolean on_effectlist_row_key_pressed (GtkWidget *widget, GdkEventKey *event, gpointer user_data) gboolean on_effectlist_row_key_pressed (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
{ {
effectlist_key_down_shift = !(event->state & GDK_SHIFT_MASK ); effectlist_key_down_shift = (event->type & GDK_KEY_PRESS) && !(event->state & GDK_SHIFT_MASK ); // add effect to current sample (green)
//effectlist_key_down_ctrl = !(event->state & GDK_CONTROL_MASK ); //effectlist_key_down_ctrl = !(event->state & GDK_CONTROL_MASK ); //TODO add effect to selected sample (blue)
return FALSE; return FALSE;
} }
@@ -4323,11 +4338,14 @@ gint sort_vims_func(GtkTreeModel *model,
return ret; return ret;
} }
EffectListData effectlistdata;
effectlist_data fxlist_data;
//EffectListData* get_effectlistdata
static gboolean effect_row_visible (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) static gboolean effect_row_visible (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
{ {
EffectListData *fxlistdata = (EffectListData*) user_data; effectlist_data *fxlistdata = (effectlist_data*) user_data;
gboolean value=TRUE; gboolean value=TRUE;
if(fxlistdata != NULL && fxlistdata->filter_string != NULL) { if(fxlistdata != NULL && fxlistdata->filter_string != NULL) {
if(strlen(fxlistdata->filter_string)) { if(strlen(fxlistdata->filter_string)) {
@@ -4337,7 +4355,6 @@ static gboolean effect_row_visible (GtkTreeModel *model, GtkTreeIter *iter, gpoi
if((idstr != NULL) && strcasestr(idstr, fxlistdata->filter_string) != NULL) { if((idstr != NULL) && strcasestr(idstr, fxlistdata->filter_string) != NULL) {
value = TRUE; value = TRUE;
} }
g_free (idstr); g_free (idstr);
} }
} }
@@ -4361,26 +4378,26 @@ void setup_effectlist_info()
for(i = 0; i < 3; i ++ ) for(i = 0; i < 3; i ++ )
{ {
effectlistdata.effect_list_stores[i].effect_list = gtk_list_store_new( 1, G_TYPE_STRING ); fxlist_data.stores[i].list = gtk_list_store_new( 1, G_TYPE_STRING );
effectlistdata.effect_list_stores[i].effect_list_filtered = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (effectlistdata.effect_list_stores[i].effect_list), NULL)); fxlist_data.stores[i].filtered = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (fxlist_data.stores[i].list), NULL));
effectlistdata.effect_list_stores[i].effect_list_sorted = GTK_TREE_MODEL_SORT (gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (effectlistdata.effect_list_stores[i].effect_list_filtered))); fxlist_data.stores[i].sorted = GTK_TREE_MODEL_SORT (gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (fxlist_data.stores[i].filtered)));
effectlistdata.filter_string = NULL; fxlist_data.filter_string = NULL;
gtk_tree_model_filter_set_visible_func (effectlistdata.effect_list_stores[i].effect_list_filtered, gtk_tree_model_filter_set_visible_func (fxlist_data.stores[i].filtered,
effect_row_visible, effect_row_visible,
&effectlistdata, NULL); &fxlist_data, NULL);
GtkTreeSortable *sortable = GTK_TREE_SORTABLE(effectlistdata.effect_list_stores[i].effect_list); GtkTreeSortable *sortable = GTK_TREE_SORTABLE(fxlist_data.stores[i].list);
gtk_tree_sortable_set_sort_func( gtk_tree_sortable_set_sort_func(sortable, FX_STRING,
sortable, FX_STRING, sort_iter_compare_func, sort_iter_compare_func,
GINT_TO_POINTER(FX_STRING),NULL); GINT_TO_POINTER(FX_STRING),NULL);
gtk_tree_sortable_set_sort_column_id(sortable, FX_STRING, GTK_SORT_ASCENDING); gtk_tree_sortable_set_sort_column_id(sortable, FX_STRING, GTK_SORT_ASCENDING);
gtk_tree_view_set_headers_visible( GTK_TREE_VIEW(trees[i]), FALSE ); gtk_tree_view_set_headers_visible( GTK_TREE_VIEW(trees[i]), FALSE );
gtk_tree_view_set_model( GTK_TREE_VIEW(trees[i]),GTK_TREE_MODEL( effectlistdata.effect_list_stores[i].effect_list_sorted)); gtk_tree_view_set_model( GTK_TREE_VIEW(trees[i]),GTK_TREE_MODEL( fxlist_data.stores[i].sorted));
g_object_unref( G_OBJECT( effectlistdata.effect_list_stores[i].effect_list )); g_object_unref( G_OBJECT( fxlist_data.stores[i].list ));
} }
setup_tree_text_column( "tree_effectlist", FX_STRING, "Effect",0 ); setup_tree_text_column( "tree_effectlist", FX_STRING, "Effect",0 );
@@ -4397,7 +4414,12 @@ void setup_effectlist_info()
g_signal_connect( G_OBJECT(trees[i]), "key_press_event", G_CALLBACK( on_effectlist_row_key_pressed ), NULL ); g_signal_connect( G_OBJECT(trees[i]), "key_press_event", G_CALLBACK( on_effectlist_row_key_pressed ), NULL );
} }
g_signal_connect( G_OBJECT(glade_xml_get_widget_( info->main_window, "filter_effects")), "changed", G_CALLBACK( on_filter_effects_changed ), &effectlistdata ); GtkWidget *entry_filterfx = glade_xml_get_widget_( info->main_window, "filter_effects");
set_tooltip_by_widget (entry_filterfx, tooltips[TOOLTIP_FXFILTER].text);
g_signal_connect(G_OBJECT(entry_filterfx),
"changed",
G_CALLBACK( on_filter_effects_changed ),
&fxlist_data );
} }
@@ -4638,9 +4660,9 @@ void load_effectlist_info()
reset_tree( "tree_effectmixlist" ); reset_tree( "tree_effectmixlist" );
reset_tree( "tree_alphalist" ); reset_tree( "tree_alphalist" );
store = effectlistdata.effect_list_stores[0].effect_list; store = fxlist_data.stores[0].list;
store2 = effectlistdata.effect_list_stores[1].effect_list; store2 = fxlist_data.stores[1].list;
store3 = effectlistdata.effect_list_stores[2].effect_list; store3 = fxlist_data.stores[2].list;
while( offset < fxlen ) while( offset < fxlen )
{ {
@@ -4703,9 +4725,9 @@ void load_effectlist_info()
g_free(name); g_free(name);
} }
gtk_tree_view_set_model( GTK_TREE_VIEW(tree), GTK_TREE_MODEL(effectlistdata.effect_list_stores[0].effect_list_sorted)); gtk_tree_view_set_model( GTK_TREE_VIEW(tree), GTK_TREE_MODEL(fxlist_data.stores[0].sorted));
gtk_tree_view_set_model( GTK_TREE_VIEW(tree2), GTK_TREE_MODEL(effectlistdata.effect_list_stores[1].effect_list_sorted)); gtk_tree_view_set_model( GTK_TREE_VIEW(tree2), GTK_TREE_MODEL(fxlist_data.stores[1].sorted));
gtk_tree_view_set_model( GTK_TREE_VIEW(tree3), GTK_TREE_MODEL(effectlistdata.effect_list_stores[2].effect_list_sorted));// GTK_TREE_MODEL(store3)); gtk_tree_view_set_model( GTK_TREE_VIEW(tree3), GTK_TREE_MODEL(fxlist_data.stores[2].sorted));
free(fxtext); free(fxtext);
} }