4
#include <gtk/gtkmain.h>
5
#include <gtk/gtksignal.h>
6
#include <gtk/gtkdnd.h>
7
#include <gtk/gtkmenu.h>
9
#include "support/layoutrectangle.h"
10
#include "stpui_widgets/stpui_combo.h"
11
#include "support/progressbar.h"
13
#include "pp_layout_carousel_pageview.h"
15
#define PAGEVIEW_DEFAULT_WIDTH 250
16
#define PAGEVIEW_DEFAULT_HEIGHT 320
22
SELECTIONCHANGED_SIGNAL,
27
static guint pp_layout_carousel_pageview_signals[LAST_SIGNAL] = { 0 };
29
static void pp_layout_carousel_pageview_class_init (pp_Layout_Carousel_PageViewClass *klass);
30
static void pp_layout_carousel_pageview_init (pp_Layout_Carousel_PageView *pageview);
31
static void pp_layout_carousel_pageview_realize (GtkWidget *widget);
32
static void pp_layout_carousel_pageview_size_request (GtkWidget *widget,
33
GtkRequisition *requisition);
34
static void pp_layout_carousel_pageview_size_allocate (GtkWidget *widget,
35
GtkAllocation *allocation);
36
static gboolean pp_layout_carousel_pageview_expose (GtkWidget *widget,
37
GdkEventExpose *event);
38
static gboolean pp_layout_carousel_pageview_button_press (GtkWidget *widget,
39
GdkEventButton *event);
40
static gboolean pp_layout_carousel_pageview_button_release (GtkWidget *widget,
41
GdkEventButton *event);
42
static gboolean pp_layout_carousel_pageview_motion_notify (GtkWidget *widget,
43
GdkEventMotion *event);
46
#define TARGET_URI_LIST 1
49
static GtkTargetEntry dnd_file_drop_types[] = {
50
{ "text/uri-list", 0, TARGET_URI_LIST }
52
static gint dnd_file_drop_types_count = 1;
54
static void get_dnd_data(GtkWidget *widget, GdkDragContext *context,
56
GtkSelectionData *selection_data, guint info,
57
guint time, gpointer data)
59
gchar *urilist=g_strdup((const gchar *)selection_data->data);
61
pp_Layout_Carousel_PageView *pv=PP_LAYOUT_CAROUSEL_PAGEVIEW(widget);
62
ProgressBar progress("Adding images...",false);
65
if(strncmp(urilist,"file:",5))
67
g_print("Warning: only local files (file://) are currently supported\n");
68
while(*urilist && *urilist!='\n' && *urilist!='\r')
70
while(*urilist=='\n' || *urilist=='\r')
76
while(*urilist && *urilist!='\n' && *urilist!='\r')
80
while(*urilist=='\n' || *urilist=='\r')
82
gchar *filename=g_filename_from_uri(uri,NULL,NULL);
83
lastpage=pv->layout->AddImage(filename);
84
pp_layout_carousel_pageview_refresh(pv);
85
g_signal_emit_by_name (GTK_OBJECT (pv), "changed");
86
progress.DoProgress(0,0);
90
pp_layout_carousel_pageview_set_page(pv,lastpage);
91
g_signal_emit_by_name (GTK_OBJECT (pv), "changed");
97
static GtkWidgetClass *parent_class = NULL;
100
pp_layout_carousel_pageview_get_type ()
102
static GType pageview_type = 0;
106
static const GTypeInfo pageview_info =
108
sizeof (pp_Layout_Carousel_PageViewClass),
111
(GClassInitFunc) pp_layout_carousel_pageview_class_init,
114
sizeof (pp_Layout_Carousel_PageView),
116
(GInstanceInitFunc) pp_layout_carousel_pageview_init,
119
pageview_type = g_type_register_static (GTK_TYPE_WIDGET, "pp_Layout_Carousel_PageView", &pageview_info, GTypeFlags(0));
122
return pageview_type;
127
pp_layout_carousel_pageview_class_init (pp_Layout_Carousel_PageViewClass *cl)
129
GtkObjectClass *object_class;
130
GtkWidgetClass *widget_class;
132
object_class = (GtkObjectClass*) cl;
133
widget_class = (GtkWidgetClass*) cl;
135
parent_class = GTK_WIDGET_CLASS(gtk_type_class (gtk_widget_get_type ()));
137
widget_class->realize = pp_layout_carousel_pageview_realize;
138
widget_class->expose_event = pp_layout_carousel_pageview_expose;
139
widget_class->size_request = pp_layout_carousel_pageview_size_request;
140
widget_class->size_allocate = pp_layout_carousel_pageview_size_allocate;
141
widget_class->button_press_event = pp_layout_carousel_pageview_button_press;
142
widget_class->button_release_event = pp_layout_carousel_pageview_button_release;
143
widget_class->motion_notify_event = pp_layout_carousel_pageview_motion_notify;
145
pp_layout_carousel_pageview_signals[CHANGED_SIGNAL] =
146
g_signal_new ("changed",
147
G_TYPE_FROM_CLASS (cl),
148
GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
149
G_STRUCT_OFFSET (pp_Layout_Carousel_PageViewClass, changed),
151
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
152
pp_layout_carousel_pageview_signals[REFLOW_SIGNAL] =
153
g_signal_new ("reflow",
154
G_TYPE_FROM_CLASS (cl),
155
GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
156
G_STRUCT_OFFSET (pp_Layout_Carousel_PageViewClass, reflow),
158
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
159
pp_layout_carousel_pageview_signals[SELECTIONCHANGED_SIGNAL] =
160
g_signal_new ("selection_changed",
161
G_TYPE_FROM_CLASS (cl),
162
GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
163
G_STRUCT_OFFSET (pp_Layout_Carousel_PageViewClass, selection_changed),
165
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
166
pp_layout_carousel_pageview_signals[REFLOW_SIGNAL] =
167
g_signal_new ("popupmenu",
168
G_TYPE_FROM_CLASS (cl),
169
GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
170
G_STRUCT_OFFSET (pp_Layout_Carousel_PageViewClass, popupmenu),
172
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
177
pp_layout_carousel_pageview_init (pp_Layout_Carousel_PageView *pageview)
179
pageview->button = 0;
181
pageview->selected=NULL;
186
pp_layout_carousel_pageview_new (Layout_Carousel *layout)
188
pp_Layout_Carousel_PageView *pageview;
190
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW(g_object_new (pp_layout_carousel_pageview_get_type (), NULL));
192
gtk_drag_dest_set(GTK_WIDGET(pageview),
193
GtkDestDefaults(GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP),
194
dnd_file_drop_types, dnd_file_drop_types_count,
195
GdkDragAction(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK));
196
g_signal_connect(G_OBJECT(pageview), "drag_data_received",
197
G_CALLBACK(get_dnd_data), NULL);
199
pageview->layout=layout;
201
return GTK_WIDGET (pageview);
206
pp_layout_carousel_pageview_realize (GtkWidget *widget)
208
pp_Layout_Carousel_PageView *pageview;
209
GdkWindowAttr attributes;
210
gint attributes_mask;
212
g_return_if_fail (widget != NULL);
213
g_return_if_fail (PP_IS_PAGEVIEW (widget));
215
GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
216
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
218
attributes.x = widget->allocation.x;
219
attributes.y = widget->allocation.y;
220
attributes.width = widget->allocation.width;
221
attributes.height = widget->allocation.height;
222
attributes.wclass = GDK_INPUT_OUTPUT;
223
attributes.window_type = GDK_WINDOW_CHILD;
224
attributes.event_mask = gtk_widget_get_events (widget) |
225
GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK |
226
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK |
227
GDK_POINTER_MOTION_HINT_MASK;
228
attributes.visual = gtk_widget_get_visual (widget);
229
attributes.colormap = gtk_widget_get_colormap (widget);
231
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
232
widget->window = gdk_window_new (widget->parent->window, &attributes, attributes_mask);
234
widget->style = gtk_style_attach (widget->style, widget->window);
236
gdk_window_set_user_data (widget->window, widget);
238
gtk_style_set_background (widget->style, widget->window, GTK_STATE_ACTIVE);
243
pp_layout_carousel_pageview_size_request (GtkWidget *widget,
244
GtkRequisition *requisition)
246
requisition->width = PAGEVIEW_DEFAULT_WIDTH;
247
requisition->height = PAGEVIEW_DEFAULT_HEIGHT;
252
pp_layout_carousel_pageview_size_allocate (GtkWidget *widget,
253
GtkAllocation *allocation)
255
pp_Layout_Carousel_PageView *pageview;
257
g_return_if_fail (widget != NULL);
258
g_return_if_fail (PP_IS_PAGEVIEW (widget));
259
g_return_if_fail (allocation != NULL);
261
widget->allocation = *allocation;
262
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
264
if (GTK_WIDGET_REALIZED (widget))
267
gdk_window_move_resize (widget->window,
268
allocation->x, allocation->y,
269
allocation->width, allocation->height);
276
pp_layout_carousel_pageview_expose( GtkWidget *widget,
277
GdkEventExpose *event )
279
pp_Layout_Carousel_PageView *pageview;
281
g_return_val_if_fail (widget != NULL, FALSE);
282
g_return_val_if_fail (PP_IS_PAGEVIEW (widget), FALSE);
283
g_return_val_if_fail (event != NULL, FALSE);
285
if (event->count > 0)
288
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
291
pageview->height=widget->allocation.height;
292
pageview->width=(pageview->layout->pagewidth*pageview->height)/pageview->layout->pageheight;
293
if(pageview->width>widget->allocation.width)
295
pageview->width=widget->allocation.width;
296
pageview->height=(pageview->layout->pageheight*pageview->width)/pageview->layout->pagewidth;
298
pageview->top=(widget->allocation.height-pageview->height)/2;
299
pageview->left=(widget->allocation.width-pageview->width)/2;
301
gdk_draw_rectangle (widget->window,
302
widget->style->light_gc[widget->state],TRUE,
303
pageview->left,pageview->top,
304
pageview->width,pageview->height);
306
pageview->scale=pageview->width;
307
pageview->scale/=pageview->layout->pagewidth;
309
pageview->layout->GetImageableArea();
311
LayoutRectangle sr(pageview->layout->leftmargin,pageview->layout->topmargin,
312
pageview->layout->imageablewidth,pageview->layout->imageableheight);
313
sr.Scale(pageview->scale);
315
pageview->layout->DrawPreview(widget,pageview->left+sr.x,pageview->top+sr.y,sr.w,sr.h);
317
gdk_draw_rectangle (widget->window,
318
widget->style->mid_gc[widget->state],FALSE,
319
pageview->left+sr.x,pageview->top+sr.y,sr.w,sr.h);
321
Layout_ImageInfo *ii=pageview->layout->FirstSelected();
324
if(ii->page==pageview->layout->GetCurrentPage())
326
LayoutRectangle *s=ii->GetBounds();
327
s->Scale(pageview->scale);
329
gdk_draw_rectangle (widget->window,
330
widget->style->dark_gc[widget->state],FALSE,
331
pageview->left+s->x,pageview->top+s->y,s->w,s->h);
332
gdk_draw_rectangle (widget->window,
333
widget->style->dark_gc[widget->state],FALSE,
334
pageview->left+s->x-1,pageview->top+s->y-1,s->w+2,s->h+2);
337
ii=pageview->layout->NextSelected();
346
pp_layout_carousel_pageview_button_press( GtkWidget *widget,
347
GdkEventButton *event )
349
pp_Layout_Carousel_PageView *pageview;
351
g_return_val_if_fail (widget != NULL, FALSE);
352
g_return_val_if_fail (PP_IS_PAGEVIEW (widget), FALSE);
353
g_return_val_if_fail (event != NULL, FALSE);
355
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
357
int x=int(event->x-pageview->left);
358
int y=int(event->y-pageview->top);
359
bool shift=(event->state&GDK_SHIFT_MASK)!=0;
360
bool ctrl=(event->state&GDK_CONTROL_MASK)!=0;
362
if(x>0 && y>0 && x<pageview->width && y<pageview->height && pageview->scale>0.0)
364
double sx=x/pageview->scale;
365
double sy=y/pageview->scale;
366
Layout_ImageInfo *prevselected=pageview->selected;
367
pageview->selected=pageview->layout->ImageAtCoord(int(sx),int(sy));
368
switch(event->button)
373
if(pageview->selected && pageview->selected->allowcropping)
375
pageview->dragging=true;
378
pageview->init_hpan=pageview->selected->crop_hpan;
379
pageview->init_vpan=pageview->selected->crop_vpan;
380
gtk_grab_add(widget);
381
cerr << "Commencing drag..." << endl;
384
pageview->dragging=false;
385
pageview->layout->SelectNone();
387
if(pageview->selected)
390
pageview->selected->ToggleSelected();
395
Layout_ImageInfo *ii=pageview->layout->FirstImage();
396
bool selecting=false;
399
if((ii==prevselected) || (ii==pageview->selected))
402
ii->SetSelected(true);
406
ii->SetSelected(true);
407
ii=pageview->layout->NextImage();
411
pageview->selected->SetSelected(true);
414
pageview->selected->SetSelected(true);
416
pp_layout_carousel_pageview_refresh(pageview);
417
g_signal_emit_by_name (GTK_OBJECT (pageview), "selection_changed");
422
if(pageview->selected)
424
if(!pageview->selected->GetSelected())
425
pageview->layout->SelectNone();
428
pageview->layout->SelectNone();
430
if(pageview->selected)
432
pageview->selected->SetSelected(true);
433
pp_layout_carousel_pageview_refresh(pageview);
434
g_signal_emit_by_name (GTK_OBJECT (pageview), "selection_changed");
435
g_signal_emit_by_name (GTK_OBJECT (pageview), "popupmenu");
447
pp_layout_carousel_pageview_motion_notify( GtkWidget *widget,
448
GdkEventMotion *event )
450
pp_Layout_Carousel_PageView *pageview;
451
g_return_val_if_fail (widget != NULL, FALSE);
452
g_return_val_if_fail (PP_IS_PAGEVIEW (widget), FALSE);
453
g_return_val_if_fail (event != NULL, FALSE);
455
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
457
Layout_ImageInfo *ii=pageview->selected;
459
if (pageview->dragging && ii)
462
GdkModifierType mods;
463
gdk_window_get_pointer (widget->window, &x, &y, &mods);
465
int dx=(x-pageview->init_x);
466
int dy=(y-pageview->init_y);
468
int hp=pageview->init_hpan-dx;
469
int vp=pageview->init_vpan-dy;
471
if(hp>LAYOUT_RECTANGLE_PANNING_MAX) hp=LAYOUT_RECTANGLE_PANNING_MAX;
473
if(vp>LAYOUT_RECTANGLE_PANNING_MAX) vp=LAYOUT_RECTANGLE_PANNING_MAX;
475
ii->crop_hpan=LayoutRectangle_Alignment(hp);
476
ii->crop_vpan=LayoutRectangle_Alignment(vp);
478
pageview->layout->FlushPreview();
479
cerr << "Dragging: " << hp << ", " << vp << endl;
481
gtk_widget_queue_draw (GTK_WIDGET (pageview));
488
pp_layout_carousel_pageview_button_release( GtkWidget *widget,
489
GdkEventButton *event )
491
pp_Layout_Carousel_PageView *pageview;
492
g_return_val_if_fail (widget != NULL, FALSE);
493
g_return_val_if_fail (PP_IS_PAGEVIEW (widget), FALSE);
494
g_return_val_if_fail (event != NULL, FALSE);
496
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
498
switch(event->button)
500
case 1: if (event->button==1)
501
pageview->dragging=false;
502
gtk_grab_remove(widget);
503
cerr << "Ending drag..." << endl;
508
// g_signal_emit_by_name (GTK_OBJECT (pageview->adjustment), "value_changed");
513
void pp_layout_carousel_pageview_refresh(pp_Layout_Carousel_PageView *pv)
515
gtk_widget_queue_draw (GTK_WIDGET (pv));
519
void pp_layout_carousel_pageview_set_page(pp_Layout_Carousel_PageView *pv,int page)
521
pv->layout->SetCurrentPage(page);
522
pp_layout_carousel_pageview_refresh(pv);
4
#include <gtk/gtkmain.h>
5
#include <gtk/gtksignal.h>
6
#include <gtk/gtkdnd.h>
7
#include <gtk/gtkmenu.h>
9
#include "support/layoutrectangle.h"
10
#include "stpui_widgets/stpui_combo.h"
11
#include "support/progressbar.h"
13
#include "pp_layout_carousel_pageview.h"
15
#define PAGEVIEW_DEFAULT_WIDTH 250
16
#define PAGEVIEW_DEFAULT_HEIGHT 320
22
SELECTIONCHANGED_SIGNAL,
27
static guint pp_layout_carousel_pageview_signals[LAST_SIGNAL] = { 0 };
29
static void pp_layout_carousel_pageview_class_init (pp_Layout_Carousel_PageViewClass *klass);
30
static void pp_layout_carousel_pageview_init (pp_Layout_Carousel_PageView *pageview);
31
static void pp_layout_carousel_pageview_realize (GtkWidget *widget);
32
static void pp_layout_carousel_pageview_size_request (GtkWidget *widget,
33
GtkRequisition *requisition);
34
static void pp_layout_carousel_pageview_size_allocate (GtkWidget *widget,
35
GtkAllocation *allocation);
36
static gboolean pp_layout_carousel_pageview_expose (GtkWidget *widget,
37
GdkEventExpose *event);
38
static gboolean pp_layout_carousel_pageview_button_press (GtkWidget *widget,
39
GdkEventButton *event);
40
static gboolean pp_layout_carousel_pageview_button_release (GtkWidget *widget,
41
GdkEventButton *event);
42
static gboolean pp_layout_carousel_pageview_motion_notify (GtkWidget *widget,
43
GdkEventMotion *event);
46
#define TARGET_URI_LIST 1
49
static GtkTargetEntry dnd_file_drop_types[] = {
50
{ "text/uri-list", 0, TARGET_URI_LIST }
52
static gint dnd_file_drop_types_count = 1;
54
static void get_dnd_data(GtkWidget *widget, GdkDragContext *context,
56
GtkSelectionData *selection_data, guint info,
57
guint time, gpointer data)
59
gchar *urilist=g_strdup((const gchar *)selection_data->data);
61
pp_Layout_Carousel_PageView *pv=PP_LAYOUT_CAROUSEL_PAGEVIEW(widget);
62
ProgressBar progress("Adding images...",false);
65
if(strncmp(urilist,"file:",5))
67
g_print("Warning: only local files (file://) are currently supported\n");
68
while(*urilist && *urilist!='\n' && *urilist!='\r')
70
while(*urilist=='\n' || *urilist=='\r')
76
while(*urilist && *urilist!='\n' && *urilist!='\r')
80
while(*urilist=='\n' || *urilist=='\r')
82
gchar *filename=g_filename_from_uri(uri,NULL,NULL);
83
lastpage=pv->layout->AddImage(filename);
84
pp_layout_carousel_pageview_refresh(pv);
85
g_signal_emit_by_name (GTK_OBJECT (pv), "changed");
86
progress.DoProgress(0,0);
90
pp_layout_carousel_pageview_set_page(pv,lastpage);
91
g_signal_emit_by_name (GTK_OBJECT (pv), "changed");
97
static GtkWidgetClass *parent_class = NULL;
100
pp_layout_carousel_pageview_get_type ()
102
static GType pageview_type = 0;
106
static const GTypeInfo pageview_info =
108
sizeof (pp_Layout_Carousel_PageViewClass),
111
(GClassInitFunc) pp_layout_carousel_pageview_class_init,
114
sizeof (pp_Layout_Carousel_PageView),
116
(GInstanceInitFunc) pp_layout_carousel_pageview_init,
119
pageview_type = g_type_register_static (GTK_TYPE_WIDGET, "pp_Layout_Carousel_PageView", &pageview_info, GTypeFlags(0));
122
return pageview_type;
127
pp_layout_carousel_pageview_class_init (pp_Layout_Carousel_PageViewClass *cl)
129
GtkObjectClass *object_class;
130
GtkWidgetClass *widget_class;
132
object_class = (GtkObjectClass*) cl;
133
widget_class = (GtkWidgetClass*) cl;
135
parent_class = GTK_WIDGET_CLASS(gtk_type_class (gtk_widget_get_type ()));
137
widget_class->realize = pp_layout_carousel_pageview_realize;
138
widget_class->expose_event = pp_layout_carousel_pageview_expose;
139
widget_class->size_request = pp_layout_carousel_pageview_size_request;
140
widget_class->size_allocate = pp_layout_carousel_pageview_size_allocate;
141
widget_class->button_press_event = pp_layout_carousel_pageview_button_press;
142
widget_class->button_release_event = pp_layout_carousel_pageview_button_release;
143
widget_class->motion_notify_event = pp_layout_carousel_pageview_motion_notify;
145
pp_layout_carousel_pageview_signals[CHANGED_SIGNAL] =
146
g_signal_new ("changed",
147
G_TYPE_FROM_CLASS (cl),
148
GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
149
G_STRUCT_OFFSET (pp_Layout_Carousel_PageViewClass, changed),
151
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
152
pp_layout_carousel_pageview_signals[REFLOW_SIGNAL] =
153
g_signal_new ("reflow",
154
G_TYPE_FROM_CLASS (cl),
155
GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
156
G_STRUCT_OFFSET (pp_Layout_Carousel_PageViewClass, reflow),
158
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
159
pp_layout_carousel_pageview_signals[SELECTIONCHANGED_SIGNAL] =
160
g_signal_new ("selection_changed",
161
G_TYPE_FROM_CLASS (cl),
162
GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
163
G_STRUCT_OFFSET (pp_Layout_Carousel_PageViewClass, selection_changed),
165
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
166
pp_layout_carousel_pageview_signals[REFLOW_SIGNAL] =
167
g_signal_new ("popupmenu",
168
G_TYPE_FROM_CLASS (cl),
169
GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
170
G_STRUCT_OFFSET (pp_Layout_Carousel_PageViewClass, popupmenu),
172
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
177
pp_layout_carousel_pageview_init (pp_Layout_Carousel_PageView *pageview)
179
pageview->button = 0;
181
pageview->selected=NULL;
186
pp_layout_carousel_pageview_new (Layout_Carousel *layout)
188
pp_Layout_Carousel_PageView *pageview;
190
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW(g_object_new (pp_layout_carousel_pageview_get_type (), NULL));
192
gtk_drag_dest_set(GTK_WIDGET(pageview),
193
GtkDestDefaults(GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP),
194
dnd_file_drop_types, dnd_file_drop_types_count,
195
GdkDragAction(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK));
196
g_signal_connect(G_OBJECT(pageview), "drag_data_received",
197
G_CALLBACK(get_dnd_data), NULL);
199
pageview->layout=layout;
201
return GTK_WIDGET (pageview);
206
pp_layout_carousel_pageview_realize (GtkWidget *widget)
208
pp_Layout_Carousel_PageView *pageview;
209
GdkWindowAttr attributes;
210
gint attributes_mask;
212
g_return_if_fail (widget != NULL);
213
g_return_if_fail (PP_IS_PAGEVIEW (widget));
215
GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
216
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
218
attributes.x = widget->allocation.x;
219
attributes.y = widget->allocation.y;
220
attributes.width = widget->allocation.width;
221
attributes.height = widget->allocation.height;
222
attributes.wclass = GDK_INPUT_OUTPUT;
223
attributes.window_type = GDK_WINDOW_CHILD;
224
attributes.event_mask = gtk_widget_get_events (widget) |
225
GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK |
226
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK |
227
GDK_POINTER_MOTION_HINT_MASK;
228
attributes.visual = gtk_widget_get_visual (widget);
229
attributes.colormap = gtk_widget_get_colormap (widget);
231
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
232
widget->window = gdk_window_new (widget->parent->window, &attributes, attributes_mask);
234
widget->style = gtk_style_attach (widget->style, widget->window);
236
gdk_window_set_user_data (widget->window, widget);
238
gtk_style_set_background (widget->style, widget->window, GTK_STATE_ACTIVE);
243
pp_layout_carousel_pageview_size_request (GtkWidget *widget,
244
GtkRequisition *requisition)
246
requisition->width = PAGEVIEW_DEFAULT_WIDTH;
247
requisition->height = PAGEVIEW_DEFAULT_HEIGHT;
252
pp_layout_carousel_pageview_size_allocate (GtkWidget *widget,
253
GtkAllocation *allocation)
255
pp_Layout_Carousel_PageView *pageview;
257
g_return_if_fail (widget != NULL);
258
g_return_if_fail (PP_IS_PAGEVIEW (widget));
259
g_return_if_fail (allocation != NULL);
261
widget->allocation = *allocation;
262
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
264
if (GTK_WIDGET_REALIZED (widget))
267
gdk_window_move_resize (widget->window,
268
allocation->x, allocation->y,
269
allocation->width, allocation->height);
276
pp_layout_carousel_pageview_expose( GtkWidget *widget,
277
GdkEventExpose *event )
279
pp_Layout_Carousel_PageView *pageview;
281
g_return_val_if_fail (widget != NULL, FALSE);
282
g_return_val_if_fail (PP_IS_PAGEVIEW (widget), FALSE);
283
g_return_val_if_fail (event != NULL, FALSE);
285
if (event->count > 0)
288
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
291
pageview->height=widget->allocation.height;
292
pageview->width=(pageview->layout->pagewidth*pageview->height)/pageview->layout->pageheight;
293
if(pageview->width>widget->allocation.width)
295
pageview->width=widget->allocation.width;
296
pageview->height=(pageview->layout->pageheight*pageview->width)/pageview->layout->pagewidth;
298
pageview->top=(widget->allocation.height-pageview->height)/2;
299
pageview->left=(widget->allocation.width-pageview->width)/2;
301
pageview->scale=pageview->width;
302
pageview->scale/=pageview->layout->pagewidth;
304
pageview->layout->DrawPreview(widget,pageview->left,pageview->top,pageview->width,pageview->height);
306
Layout_ImageInfo *ii=pageview->layout->FirstSelected();
309
if(ii->page==pageview->layout->GetCurrentPage())
311
LayoutRectangle *s=ii->GetBounds();
312
s->Scale(pageview->scale);
314
gdk_draw_rectangle (widget->window,
315
widget->style->dark_gc[widget->state],FALSE,
316
pageview->left+s->x,pageview->top+s->y,s->w,s->h);
317
gdk_draw_rectangle (widget->window,
318
widget->style->dark_gc[widget->state],FALSE,
319
pageview->left+s->x-1,pageview->top+s->y-1,s->w+2,s->h+2);
322
ii=pageview->layout->NextSelected();
331
pp_layout_carousel_pageview_button_press( GtkWidget *widget,
332
GdkEventButton *event )
334
pp_Layout_Carousel_PageView *pageview;
336
g_return_val_if_fail (widget != NULL, FALSE);
337
g_return_val_if_fail (PP_IS_PAGEVIEW (widget), FALSE);
338
g_return_val_if_fail (event != NULL, FALSE);
340
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
342
int x=int(event->x-pageview->left);
343
int y=int(event->y-pageview->top);
344
bool shift=(event->state&GDK_SHIFT_MASK)!=0;
345
bool ctrl=(event->state&GDK_CONTROL_MASK)!=0;
347
if(x>0 && y>0 && x<pageview->width && y<pageview->height && pageview->scale>0.0)
349
double sx=x/pageview->scale;
350
double sy=y/pageview->scale;
351
Layout_ImageInfo *prevselected=pageview->selected;
352
pageview->selected=pageview->layout->ImageAtCoord(int(sx),int(sy));
353
switch(event->button)
358
if(pageview->selected && pageview->selected->allowcropping)
360
pageview->dragging=true;
363
pageview->init_hpan=pageview->selected->crop_hpan;
364
pageview->init_vpan=pageview->selected->crop_vpan;
365
gtk_grab_add(widget);
366
cerr << "Commencing drag..." << endl;
369
pageview->dragging=false;
370
pageview->layout->SelectNone();
372
if(pageview->selected)
375
pageview->selected->ToggleSelected();
380
Layout_ImageInfo *ii=pageview->layout->FirstImage();
381
bool selecting=false;
384
if((ii==prevselected) || (ii==pageview->selected))
387
ii->SetSelected(true);
391
ii->SetSelected(true);
392
ii=pageview->layout->NextImage();
396
pageview->selected->SetSelected(true);
399
pageview->selected->SetSelected(true);
401
pp_layout_carousel_pageview_refresh(pageview);
402
g_signal_emit_by_name (GTK_OBJECT (pageview), "selection_changed");
407
if(pageview->selected)
409
if(!pageview->selected->GetSelected())
410
pageview->layout->SelectNone();
413
pageview->layout->SelectNone();
415
if(pageview->selected)
417
pageview->selected->SetSelected(true);
418
pp_layout_carousel_pageview_refresh(pageview);
419
g_signal_emit_by_name (GTK_OBJECT (pageview), "selection_changed");
420
g_signal_emit_by_name (GTK_OBJECT (pageview), "popupmenu");
432
pp_layout_carousel_pageview_motion_notify( GtkWidget *widget,
433
GdkEventMotion *event )
435
pp_Layout_Carousel_PageView *pageview;
436
g_return_val_if_fail (widget != NULL, FALSE);
437
g_return_val_if_fail (PP_IS_PAGEVIEW (widget), FALSE);
438
g_return_val_if_fail (event != NULL, FALSE);
440
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
442
Layout_ImageInfo *ii=pageview->selected;
444
if (pageview->dragging && ii)
447
GdkModifierType mods;
448
gdk_window_get_pointer (widget->window, &x, &y, &mods);
450
int dx=(x-pageview->init_x);
451
int dy=(y-pageview->init_y);
453
int hp=pageview->init_hpan-dx;
454
int vp=pageview->init_vpan-dy;
456
if(hp>LAYOUT_RECTANGLE_PANNING_MAX) hp=LAYOUT_RECTANGLE_PANNING_MAX;
458
if(vp>LAYOUT_RECTANGLE_PANNING_MAX) vp=LAYOUT_RECTANGLE_PANNING_MAX;
460
ii->crop_hpan=LayoutRectangle_Alignment(hp);
461
ii->crop_vpan=LayoutRectangle_Alignment(vp);
463
pageview->layout->FlushPreview();
464
cerr << "Dragging: " << hp << ", " << vp << endl;
466
gtk_widget_queue_draw (GTK_WIDGET (pageview));
473
pp_layout_carousel_pageview_button_release( GtkWidget *widget,
474
GdkEventButton *event )
476
pp_Layout_Carousel_PageView *pageview;
477
g_return_val_if_fail (widget != NULL, FALSE);
478
g_return_val_if_fail (PP_IS_PAGEVIEW (widget), FALSE);
479
g_return_val_if_fail (event != NULL, FALSE);
481
pageview = PP_LAYOUT_CAROUSEL_PAGEVIEW (widget);
483
switch(event->button)
485
case 1: if (event->button==1)
486
pageview->dragging=false;
487
gtk_grab_remove(widget);
488
cerr << "Ending drag..." << endl;
493
// g_signal_emit_by_name (GTK_OBJECT (pageview->adjustment), "value_changed");
498
void pp_layout_carousel_pageview_refresh(pp_Layout_Carousel_PageView *pv)
500
gtk_widget_queue_draw (GTK_WIDGET (pv));
504
void pp_layout_carousel_pageview_set_page(pp_Layout_Carousel_PageView *pv,int page)
506
pv->layout->SetCurrentPage(page);
507
pp_layout_carousel_pageview_refresh(pv);