mirror of
https://github.com/game-stop/veejay.git
synced 2025-12-21 15:20:02 +01:00
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:
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)\
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user