2
* effectselector.c - provides a list of available effects.
4
* Copyright (c) 2007 by Alastair M. Robinson
5
* Distributed under the terms of the GNU General Public License -
6
* see the file named "COPYING" for more details.
16
#include <gtk/gtkentry.h>
17
#include <gtk/gtklist.h>
18
#include <gtk/gtkfilesel.h>
19
#include <gtk/gtktreeselection.h>
20
#include <gtk/gtkscrolledwindow.h>
21
#include <gdk-pixbuf/gdk-pixbuf.h>
22
#include <gdk-pixbuf/gdk-pixdata.h>
24
#include "../support/generaldialogs.h"
27
#include "ppeffect_desaturate.h"
28
#include "ppeffect_temperature.h"
30
#include "effectlist.h"
32
#include "effectselector.h"
34
#include "../config.h"
35
#include "../gettext.h"
36
#define _(x) gettext(x)
37
#define N_(x) gettext_noop(x)
46
static guint effectselector_signals[LAST_SIGNAL] = { 0 };
48
static void effectselector_class_init (EffectSelectorClass *klass);
49
static void effectselector_init (EffectSelector *sel);
52
static EffectListItem *findbyname(EffectSelector *il,const char *name)
54
GList *iter=il->imagelist;
57
EffectListItem *ii=(EffectListItem *)iter->data;
58
if(ii && (ii->name==NULL) && (name==NULL))
60
if(ii && ii->name && strcmp(ii->name,name)==0)
62
iter=g_list_next(iter);
64
cerr << name << " Not found" << endl;
69
static EffectListItem *findbypixbuf(EffectSelector *il,GdkPixbuf *pb)
71
GList *iter=il->imagelist;
74
EffectListItem *ii=(EffectListItem *)iter->data;
75
if(ii && ii->GetIcon()==pb)
77
iter=g_list_next(iter);
79
cerr << " Not found" << endl;
84
static gint is_cmpfunc(const void *p1,const void *p2)
86
EffectListItem *i1=(EffectListItem *)p1;
87
EffectListItem *i2=(EffectListItem *)p2;
88
return(strcmp(i1->name,i2->name));
92
static void clear_list(EffectSelector *il)
94
gtk_list_store_clear(il->liststore);
96
GList *iter=il->imagelist;
99
EffectListItem *ii=(EffectListItem *)iter->data;
100
GList *niter=g_list_next(iter);
101
il->imagelist=g_list_delete_link(il->imagelist,iter);
109
static void populate_list(EffectSelector *il)
113
cerr << "Populating list..." << endl;
114
for(int i=0;i<il->els->EffectCount();++i)
116
EffectListItem *ii=il->els->GetEffect(i);
117
cerr << "Got effect..." << endl;
118
il->imagelist=g_list_append(il->imagelist,ii);
119
cerr << "Added..." << endl;
122
// cerr << "Sorting list..." << endl;
124
// il->imagelist=g_list_sort(il->imagelist,is_cmpfunc);
127
GList *liter=il->imagelist;
130
EffectListItem *ii=(EffectListItem *)liter->data;
132
gtk_list_store_append(il->liststore,&iter1);
133
gtk_list_store_set(il->liststore,&iter1,0,ii->GetIcon(),-1);
135
while(gtk_events_pending())
136
gtk_main_iteration_do(false);
138
liter=g_list_next(liter);
143
static void rebuild_liststore(EffectSelector *c)
149
// Rebuild list view from EffectSelector
150
GList *iter=c->imagelist;
154
gtk_list_store_clear(c->liststore);
158
EffectListItem *ii=(EffectListItem *)iter->data;
159
gtk_list_store_append(c->liststore,&iter1);
160
gtk_list_store_set(c->liststore,&iter1,0,ii->GetIcon(),-1);
161
iter=g_list_next(iter);
167
static void selection_changed(GtkTreeSelection *select,gpointer user_data)
169
EffectSelector *pe=EFFECTSELECTOR(user_data);
170
if(const EffectListItem *ii=effectselector_get_selected(pe))
172
g_signal_emit(G_OBJECT (pe),effectselector_signals[CHANGED_SIGNAL], 0);
178
effectselector_new (EffectListSource *els)
180
EffectSelector *c=EFFECTSELECTOR(g_object_new (effectselector_get_type (), NULL));
182
c->liststore=gtk_list_store_new(1,GDK_TYPE_PIXBUF);
185
GtkWidget *sw = gtk_scrolled_window_new (NULL, NULL);
186
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),GTK_SHADOW_ETCHED_IN);
187
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC);
188
gtk_box_pack_start (GTK_BOX (c), sw, TRUE, TRUE, 0);
191
c->treeview=gtk_tree_view_new_with_model(GTK_TREE_MODEL(c->liststore));
192
GtkCellRenderer *renderer;
193
GtkTreeViewColumn *column;
195
renderer=gtk_cell_renderer_pixbuf_new();
196
column=gtk_tree_view_column_new_with_attributes("Effect",renderer,"pixbuf",0,NULL);
197
gtk_tree_view_append_column(GTK_TREE_VIEW(c->treeview),column);
199
GtkTreeSelection *select;
200
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (c->treeview));
201
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
202
g_signal_connect (G_OBJECT (select), "changed",
203
G_CALLBACK (selection_changed),c);
205
gtk_container_add(GTK_CONTAINER(sw),c->treeview);
206
gtk_widget_show(c->treeview);
208
GtkWidget *hbox=gtk_hbox_new(FALSE,0);
209
gtk_box_pack_start(GTK_BOX(c),hbox,FALSE,FALSE,0);
210
gtk_widget_show(hbox);
214
return(GTK_WIDGET(c));
219
effectselector_get_type (void)
221
static GType stpuic_type = 0;
225
static const GTypeInfo effectselector_info =
227
sizeof (EffectSelectorClass),
228
NULL, /* base_init */
229
NULL, /* base_finalize */
230
(GClassInitFunc) effectselector_class_init,
231
NULL, /* class_finalize */
232
NULL, /* class_data */
233
sizeof (EffectSelector),
235
(GInstanceInitFunc) effectselector_init,
237
stpuic_type = g_type_register_static (GTK_TYPE_VBOX, "EffectSelector", &effectselector_info, GTypeFlags(0));
243
static void *parent_class=NULL;
245
static void effectselector_destroy(GtkObject *object)
247
EffectSelector *il=(EffectSelector *)object;
248
if (GTK_OBJECT_CLASS (parent_class)->destroy)
249
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
256
effectselector_class_init (EffectSelectorClass *cls)
258
GtkObjectClass *object_class=(GtkObjectClass *)cls;
259
// GtkWidgetClass *widget_class=(GtkWidgetClass *)cls;
261
parent_class = gtk_type_class (gtk_widget_get_type ());
263
object_class->destroy = effectselector_destroy;
265
effectselector_signals[CHANGED_SIGNAL] =
266
g_signal_new ("changed",
267
G_TYPE_FROM_CLASS (cls),
268
GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
269
G_STRUCT_OFFSET (EffectSelectorClass, changed),
271
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
276
effectselector_init (EffectSelector *c)
282
gboolean effectselector_refresh(EffectSelector *c)
285
rebuild_liststore(c);
290
EffectListItem *effectselector_get_selected(EffectSelector *pe)
295
GtkTreeSelection *select;
296
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (pe->treeview));
298
if (gtk_tree_selection_get_selected (select,&model, &iter))
302
gtk_tree_model_get (model, &iter, 0, &pb, -1);
305
EffectListItem *ii=findbypixbuf(pe,pb);
314
void effectselector_set_filename(EffectSelector *c,const char *filename)
316
ImageEntry *ii=find_filename(c,filename);
319
ii=add_node(c,filename);
328
c->filename=strdup(filename);
333
if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(c->liststore),&iter))
338
gtk_tree_model_get(GTK_TREE_MODEL(c->liststore),&iter,0,&pb,-1);
341
path=gtk_tree_model_get_path(GTK_TREE_MODEL(c->liststore),&iter);
342
gtk_tree_view_set_cursor(GTK_TREE_VIEW(c->treeview),path,NULL,false);
343
gtk_tree_path_free(path);
346
} while(gtk_tree_model_iter_next(GTK_TREE_MODEL(c->liststore),&iter));