~ubuntu-branches/ubuntu/karmic/photoprint/karmic

« back to all changes in this revision

Viewing changes to pp_layout_poster.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Milan Zamazal
  • Date: 2007-05-01 16:32:13 UTC
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20070501163213-k0gaendx7grjlmk5
Tags: upstream-0.3.5
ImportĀ upstreamĀ versionĀ 0.3.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#include <string.h>
2
 
 
3
 
#include <gtk/gtkframe.h>
4
 
#include <gtk/gtksizegroup.h>
5
 
#include <gtk/gtklabel.h>
6
 
#include <gtk/gtkfilesel.h>
7
 
#include <gtk/gtkdialog.h>
8
 
#include <gtk/gtkscrolledwindow.h>
9
 
 
10
 
#include "stpui_widgets/stpui_combo.h"
11
 
#include "stpui_widgets/dimension.h"
12
 
#include "support/tiffsave.h"
13
 
#include "layout.h"
14
 
#include "dialogs.h"
15
 
#include "pp_pageextent.h"
16
 
#include "pp_layout_poster_pageview.h"
17
 
#include "pp_layout_poster.h"
18
 
 
19
 
enum {
20
 
        CHANGED_SIGNAL,
21
 
        POPUPMENU_SIGNAL,
22
 
        SELECTIONCHANGED_SIGNAL,
23
 
        LAST_SIGNAL
24
 
};
25
 
 
26
 
static guint pp_layout_poster_signals[LAST_SIGNAL] = { 0 };
27
 
 
28
 
static void pp_layout_poster_class_init (pp_Layout_PosterClass *klass);
29
 
static void pp_layout_poster_init (pp_Layout_Poster *stpuicombo);
30
 
 
31
 
 
32
 
static void reflow(GtkWidget *wid,gpointer *ob)
33
 
{
34
 
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
35
 
        pp_Layout_Poster_PageView *pv=PP_LAYOUT_POSTER_PAGEVIEW(lo->pageview);
36
 
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
37
 
        l->Reflow();
38
 
        pp_layout_poster_pageview_refresh(PP_LAYOUT_POSTER_PAGEVIEW(pv));
39
 
 
40
 
        int pages=l->GetPages();
41
 
        pages/=l->htiles*l->vtiles;
42
 
 
43
 
        gtk_widget_set_sensitive(lo->page,pages>1);
44
 
        gtk_spin_button_set_range(GTK_SPIN_BUTTON(lo->page),1.0,pages);
45
 
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
46
 
}
47
 
 
48
 
 
49
 
static void pe_changed(GtkWidget *wid,gpointer *ob)
50
 
{
51
 
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
52
 
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
53
 
        l->TilesFromSize();
54
 
        pp_layout_poster_refresh(lo);
55
 
        pp_Layout_Poster_PageView *pv=PP_LAYOUT_POSTER_PAGEVIEW(lo->pageview);
56
 
        pp_layout_poster_pageview_refresh(pv);
57
 
        g_signal_emit(G_OBJECT (ob),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
58
 
}
59
 
 
60
 
 
61
 
static void posterwidth_changed(GtkWidget *wid,gpointer *ob)
62
 
{
63
 
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
64
 
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
65
 
 
66
 
        l->posterwidth=int(dimension_get_pt(DIMENSION(lo->posterwidth)));
67
 
        l->TilesFromSize();
68
 
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
69
 
}
70
 
 
71
 
 
72
 
static void posterheight_changed(GtkWidget *wid,gpointer *ob)
73
 
{
74
 
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
75
 
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
76
 
 
77
 
        l->posterheight=int(dimension_get_pt(DIMENSION(lo->posterheight)));
78
 
        l->TilesFromSize();
79
 
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
80
 
}
81
 
 
82
 
 
83
 
static void htiles_changed(GtkWidget *wid,gpointer *ob)
84
 
{
85
 
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
86
 
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
87
 
        
88
 
        l->htiles=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(lo->htiles));
89
 
        l->SizeFromTiles();
90
 
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
91
 
}
92
 
 
93
 
 
94
 
static void vtiles_changed(GtkWidget *wid,gpointer *ob)
95
 
{
96
 
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
97
 
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
98
 
 
99
 
        cerr << "In VTiles_Changed" << endl;
100
 
 
101
 
        l->vtiles=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(lo->vtiles));
102
 
        l->SizeFromTiles();
103
 
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
104
 
}
105
 
 
106
 
 
107
 
static void hoverlap_changed(GtkWidget *wid,gpointer *ob)
108
 
{
109
 
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
110
 
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
111
 
 
112
 
        l->hoverlap=int(dimension_get_pt(DIMENSION(lo->hoverlap)));
113
 
        l->TilesFromSize();
114
 
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
115
 
}
116
 
 
117
 
 
118
 
static void voverlap_changed(GtkWidget *wid,gpointer *ob)
119
 
{
120
 
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
121
 
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
122
 
 
123
 
        l->voverlap=int(dimension_get_pt(DIMENSION(lo->voverlap)));
124
 
        l->TilesFromSize();
125
 
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
126
 
}
127
 
 
128
 
 
129
 
static void page_changed(GtkWidget *wid,gpointer *ob)
130
 
{
131
 
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
132
 
        pp_Layout_Poster_PageView *pv=PP_LAYOUT_POSTER_PAGEVIEW(lo->pageview);
133
 
        int pagesperposter=pv->layout->htiles*pv->layout->vtiles;
134
 
 
135
 
        pp_layout_poster_pageview_set_page(pv,pagesperposter*(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(lo->page))-1));
136
 
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
137
 
}
138
 
 
139
 
 
140
 
static void pageview_changed(GtkWidget *wid,gpointer *ob)
141
 
{
142
 
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
143
 
 
144
 
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
145
 
}
146
 
 
147
 
 
148
 
static void pageview_popupmenu(GtkWidget *wid,gpointer *ob)
149
 
{
150
 
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
151
 
        cerr << "Forwarding popupmenu signal..." << endl;
152
 
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[POPUPMENU_SIGNAL], 0);
153
 
}
154
 
 
155
 
 
156
 
void pp_layout_poster_refresh(pp_Layout_Poster *ob)
157
 
{
158
 
        Layout_Poster *l=(Layout_Poster *)ob->state->layout;
159
 
 
160
 
        l->LayoutToDB(ob->state->layoutdb);
161
 
 
162
 
        int pages=l->GetPages();
163
 
        int cpage=l->GetCurrentPage();
164
 
        pages/=l->htiles*l->vtiles;
165
 
        cpage/=l->htiles*l->vtiles;
166
 
 
167
 
        gtk_widget_set_sensitive(ob->page,pages!=1);
168
 
        if(pages>1)
169
 
        {
170
 
                gtk_spin_button_set_range(GTK_SPIN_BUTTON(ob->page),1.0,pages);
171
 
                gtk_spin_button_set_value(GTK_SPIN_BUTTON(ob->page),cpage+1);
172
 
        }
173
 
 
174
 
        g_signal_handlers_block_matched (G_OBJECT(ob->posterwidth),G_SIGNAL_MATCH_DATA,
175
 
                0, 0, NULL, NULL, ob);
176
 
        g_signal_handlers_block_matched (G_OBJECT(ob->posterheight),G_SIGNAL_MATCH_DATA,
177
 
                0, 0, NULL, NULL, ob);
178
 
        g_signal_handlers_block_matched (G_OBJECT(ob->htiles),G_SIGNAL_MATCH_DATA,
179
 
                0, 0, NULL, NULL, ob);
180
 
        g_signal_handlers_block_matched (G_OBJECT(ob->vtiles),G_SIGNAL_MATCH_DATA,
181
 
                0, 0, NULL, NULL, ob);
182
 
        g_signal_handlers_block_matched (G_OBJECT(ob->hoverlap),G_SIGNAL_MATCH_DATA,
183
 
                0, 0, NULL, NULL, ob);
184
 
        g_signal_handlers_block_matched (G_OBJECT(ob->voverlap),G_SIGNAL_MATCH_DATA,
185
 
                0, 0, NULL, NULL, ob);
186
 
 
187
 
        dimension_set_pt(DIMENSION(ob->posterwidth),l->posterwidth);
188
 
        dimension_set_pt(DIMENSION(ob->posterheight),l->posterheight);
189
 
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(ob->htiles),l->htiles);
190
 
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(ob->vtiles),l->vtiles);
191
 
        dimension_set_pt(DIMENSION(ob->hoverlap),l->hoverlap);
192
 
        dimension_set_pt(DIMENSION(ob->voverlap),l->voverlap);
193
 
 
194
 
        g_signal_handlers_unblock_matched (G_OBJECT(ob->posterwidth),G_SIGNAL_MATCH_DATA,
195
 
                0, 0, NULL, NULL, ob);
196
 
        g_signal_handlers_unblock_matched (G_OBJECT(ob->posterheight),G_SIGNAL_MATCH_DATA,
197
 
                0, 0, NULL, NULL, ob);
198
 
        g_signal_handlers_unblock_matched (G_OBJECT(ob->htiles),G_SIGNAL_MATCH_DATA,
199
 
                0, 0, NULL, NULL, ob);
200
 
        g_signal_handlers_unblock_matched (G_OBJECT(ob->vtiles),G_SIGNAL_MATCH_DATA,
201
 
                0, 0, NULL, NULL, ob);
202
 
        g_signal_handlers_unblock_matched (G_OBJECT(ob->hoverlap),G_SIGNAL_MATCH_DATA,
203
 
                0, 0, NULL, NULL, ob);
204
 
        g_signal_handlers_unblock_matched (G_OBJECT(ob->voverlap),G_SIGNAL_MATCH_DATA,
205
 
                0, 0, NULL, NULL, ob);
206
 
 
207
 
        pp_Layout_Poster_PageView *pv=PP_LAYOUT_POSTER_PAGEVIEW(ob->pageview);
208
 
        if(pv)
209
 
                pp_layout_poster_pageview_refresh(pv);
210
 
}
211
 
 
212
 
 
213
 
void pp_layout_poster_set_unit(GtkWidget *wid,enum Units unit)
214
 
{
215
 
        pp_Layout_Poster *ob=PP_LAYOUT_POSTER(wid);
216
 
        pp_pageextent_set_unit(PP_PAGEEXTENT(ob->pageextent),unit);
217
 
        dimension_set_unit(DIMENSION(ob->posterwidth),unit);
218
 
        dimension_set_unit(DIMENSION(ob->posterheight),unit);
219
 
}
220
 
 
221
 
 
222
 
GtkWidget*
223
 
pp_layout_poster_new (PhotoPrint_State *state)
224
 
{
225
 
        pp_Layout_Poster *ob=PP_LAYOUT_POSTER(g_object_new (pp_layout_poster_get_type (), NULL));
226
 
 
227
 
        gtk_container_set_border_width(GTK_CONTAINER(&ob->hbox),10);
228
 
        
229
 
        ob->state=state;
230
 
        
231
 
        GtkWidget *vbox;
232
 
        GtkWidget *vbox2;
233
 
        GtkWidget *hbox;
234
 
        GtkWidget *label;
235
 
        GtkWidget *tmp;
236
 
 
237
 
        ob->sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
238
 
        
239
 
        GtkWidget *frame = gtk_frame_new (NULL);
240
 
        gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
241
 
        gtk_box_pack_start(GTK_BOX (&ob->hbox), frame,TRUE,TRUE,0);
242
 
        gtk_widget_show (frame); 
243
 
        
244
 
        ob->pageview = pp_layout_poster_pageview_new ((Layout_Poster *)ob->state->layout);
245
 
        g_signal_connect(G_OBJECT(ob->pageview),"changed",G_CALLBACK(pageview_changed),ob);
246
 
        g_signal_connect(G_OBJECT(ob->pageview),"popupmenu",G_CALLBACK(pageview_popupmenu),ob);
247
 
        g_signal_connect(G_OBJECT(ob->pageview),"reflow",G_CALLBACK(reflow),ob);
248
 
 
249
 
        gtk_container_add (GTK_CONTAINER (frame), ob->pageview);
250
 
        gtk_widget_show (ob->pageview);
251
 
 
252
 
        GtkWidget *scrollwin=gtk_scrolled_window_new(NULL,NULL);
253
 
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwin),
254
 
                                    GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
255
 
        vbox = gtk_vbox_new (FALSE, 5);
256
 
        gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrollwin), vbox);
257
 
        gtk_box_pack_start(GTK_BOX(&ob->hbox),scrollwin,FALSE,FALSE,0);
258
 
        gtk_widget_show (vbox);
259
 
        gtk_widget_show (scrollwin);
260
 
 
261
 
        enum Units unit=state->GetUnits();
262
 
 
263
 
#define PP_BUILDDIMENSION(spinlabel,var,min,max,unit,callback) \
264
 
        hbox=gtk_hbox_new(FALSE,0); \
265
 
\
266
 
        label=gtk_label_new(spinlabel); \
267
 
        gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,5); \
268
 
        gtk_widget_show(label); \
269
 
\
270
 
        var=dimension_new(min,max,unit); \
271
 
        g_signal_connect(G_OBJECT(var),"value-changed",G_CALLBACK(callback),ob); \
272
 
        gtk_widget_show(var); \
273
 
\
274
 
        gtk_size_group_add_widget(GTK_SIZE_GROUP(ob->sizegroup),var); \
275
 
        gtk_box_pack_start(GTK_BOX(hbox),var,FALSE,FALSE,5); \
276
 
\
277
 
        gtk_box_pack_start(GTK_BOX(vbox2),hbox,FALSE,FALSE,5); \
278
 
        gtk_widget_show(hbox)
279
 
 
280
 
#define PP_BUILDSPIN(spinlabel,var,min,max,step,callback) \
281
 
        hbox=gtk_hbox_new(FALSE,0); \
282
 
\
283
 
        label=gtk_label_new(spinlabel); \
284
 
        gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,5); \
285
 
        gtk_widget_show(label); \
286
 
\
287
 
        var=gtk_spin_button_new_with_range(min,max,step); \
288
 
        g_signal_connect(G_OBJECT(var),"value-changed",G_CALLBACK(callback),ob); \
289
 
        gtk_widget_show(var); \
290
 
\
291
 
        gtk_size_group_add_widget(GTK_SIZE_GROUP(ob->sizegroup),var); \
292
 
        gtk_box_pack_start(GTK_BOX(hbox),var,FALSE,FALSE,5); \
293
 
\
294
 
        gtk_box_pack_start(GTK_BOX(vbox2),hbox,FALSE,FALSE,5); \
295
 
        gtk_widget_show(hbox)
296
 
 
297
 
#define PP_BUILDFRAME(framelabel) \
298
 
        frame=gtk_frame_new(framelabel); \
299
 
        gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,0); \
300
 
        gtk_container_set_border_width(GTK_CONTAINER(frame),5); \
301
 
        gtk_widget_show(frame); \
302
 
\
303
 
        vbox2=gtk_vbox_new(FALSE,0); \
304
 
        gtk_container_add(GTK_CONTAINER(frame),vbox2); \
305
 
        gtk_widget_show(vbox2)
306
 
 
307
 
 
308
 
        // PosterSize
309
 
        PP_BUILDFRAME("Poster Size:");
310
 
        PP_BUILDDIMENSION("Width:",ob->posterwidth,350,10000,unit,posterwidth_changed);
311
 
        PP_BUILDDIMENSION("Height:",ob->posterheight,350,10000,unit,posterheight_changed);
312
 
        PP_BUILDSPIN("Tiles wide:",ob->htiles,1,10,1,htiles_changed);
313
 
        PP_BUILDSPIN("Tiles high:",ob->vtiles,1,10,1,vtiles_changed);
314
 
 
315
 
        PP_BUILDFRAME("Overlap:");
316
 
        PP_BUILDDIMENSION("H:",ob->hoverlap,0,72,unit,hoverlap_changed);
317
 
        PP_BUILDDIMENSION("V:",ob->voverlap,0,72,unit,voverlap_changed);
318
 
 
319
 
 
320
 
        // PageExtent
321
 
 
322
 
        ob->pageextent=pp_pageextent_new((Layout_Poster *)ob->state->layout,ob->state,ob->sizegroup);
323
 
        g_signal_connect(G_OBJECT(ob->pageextent),"changed",G_CALLBACK(pe_changed),ob);
324
 
        gtk_box_pack_start(GTK_BOX(vbox),ob->pageextent,FALSE,FALSE,0);
325
 
        gtk_widget_show(ob->pageextent);
326
 
 
327
 
 
328
 
        // Spacer box
329
 
 
330
 
        tmp=gtk_vbox_new(FALSE,0);
331
 
        gtk_box_pack_start(GTK_BOX(vbox),tmp,TRUE,TRUE,0);
332
 
        gtk_widget_show(tmp);
333
 
 
334
 
 
335
 
        // Page number
336
 
 
337
 
        hbox=gtk_hbox_new(FALSE,5);
338
 
        label=gtk_label_new("Page:");
339
 
        gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,0);
340
 
        gtk_widget_show(label);
341
 
 
342
 
        ob->page=gtk_spin_button_new_with_range(1.0,2.0,1.0);
343
 
        g_signal_connect(G_OBJECT(ob->page),"value-changed",G_CALLBACK(page_changed),ob);
344
 
        gtk_widget_show(ob->page);
345
 
 
346
 
        gtk_box_pack_start(GTK_BOX(hbox),ob->page,FALSE,FALSE,0);
347
 
 
348
 
 
349
 
        gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0);
350
 
        gtk_widget_show(hbox);
351
 
 
352
 
        g_object_unref(G_OBJECT(ob->sizegroup));
353
 
        ob->sizegroup=NULL;
354
 
 
355
 
        pp_layout_poster_refresh(ob);
356
 
        pp_pageextent_refresh(PP_PAGEEXTENT(ob->pageextent));
357
 
 
358
 
        return(GTK_WIDGET(ob));
359
 
}
360
 
 
361
 
 
362
 
GType
363
 
pp_layout_poster_get_type (void)
364
 
{
365
 
        static GType stpuic_type = 0;
366
 
 
367
 
        if (!stpuic_type)
368
 
        {
369
 
                static const GTypeInfo pp_layout_poster_info =
370
 
                {
371
 
                        sizeof (pp_Layout_PosterClass),
372
 
                        NULL, /* base_init */
373
 
                        NULL, /* base_finalize */
374
 
                        (GClassInitFunc) pp_layout_poster_class_init,
375
 
                        NULL, /* class_finalize */
376
 
                        NULL, /* class_data */
377
 
                        sizeof (pp_Layout_Poster),
378
 
                        0,
379
 
                        (GInstanceInitFunc) pp_layout_poster_init,
380
 
                };
381
 
                stpuic_type = g_type_register_static (GTK_TYPE_HBOX, "pp_Layout_Poster", &pp_layout_poster_info, (GTypeFlags)0);
382
 
        }
383
 
        return stpuic_type;
384
 
}
385
 
 
386
 
 
387
 
static void
388
 
pp_layout_poster_class_init (pp_Layout_PosterClass *klass)
389
 
{
390
 
        pp_layout_poster_signals[CHANGED_SIGNAL] =
391
 
        g_signal_new ("changed",
392
 
                G_TYPE_FROM_CLASS (klass),
393
 
                GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
394
 
                G_STRUCT_OFFSET (pp_Layout_PosterClass, changed),
395
 
                NULL, NULL,
396
 
                g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
397
 
        pp_layout_poster_signals[POPUPMENU_SIGNAL] =
398
 
        g_signal_new ("popupmenu",
399
 
                G_TYPE_FROM_CLASS (klass),
400
 
                GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
401
 
                G_STRUCT_OFFSET (pp_Layout_PosterClass, changed),
402
 
                NULL, NULL,
403
 
                g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
404
 
        pp_layout_poster_signals[SELECTIONCHANGED_SIGNAL] =
405
 
        g_signal_new ("selection_changed",
406
 
                G_TYPE_FROM_CLASS (klass),
407
 
                GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
408
 
                G_STRUCT_OFFSET (pp_Layout_PosterClass, changed),
409
 
                NULL, NULL,
410
 
                g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
411
 
}
412
 
 
413
 
 
414
 
static void
415
 
pp_layout_poster_init (pp_Layout_Poster *ob)
416
 
{
417
 
        ob->state=NULL;
418
 
        ob->pageview=NULL;
419
 
}
 
1
#include <string.h>
 
2
 
 
3
#include <gtk/gtkframe.h>
 
4
#include <gtk/gtksizegroup.h>
 
5
#include <gtk/gtklabel.h>
 
6
#include <gtk/gtkfilesel.h>
 
7
#include <gtk/gtkdialog.h>
 
8
#include <gtk/gtkscrolledwindow.h>
 
9
 
 
10
#include "stpui_widgets/stpui_combo.h"
 
11
#include "stpui_widgets/dimension.h"
 
12
#include "support/tiffsave.h"
 
13
#include "layout.h"
 
14
#include "dialogs.h"
 
15
#include "pp_pageextent.h"
 
16
#include "pp_layout_poster_pageview.h"
 
17
#include "pp_layout_poster.h"
 
18
 
 
19
#include "config.h"
 
20
#include "gettext.h"
 
21
#define _(x) gettext(x)
 
22
 
 
23
enum {
 
24
        CHANGED_SIGNAL,
 
25
        POPUPMENU_SIGNAL,
 
26
        SELECTIONCHANGED_SIGNAL,
 
27
        LAST_SIGNAL
 
28
};
 
29
 
 
30
static guint pp_layout_poster_signals[LAST_SIGNAL] = { 0 };
 
31
 
 
32
static void pp_layout_poster_class_init (pp_Layout_PosterClass *klass);
 
33
static void pp_layout_poster_init (pp_Layout_Poster *stpuicombo);
 
34
 
 
35
 
 
36
static void reflow(GtkWidget *wid,gpointer *ob)
 
37
{
 
38
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
 
39
        pp_Layout_Poster_PageView *pv=PP_LAYOUT_POSTER_PAGEVIEW(lo->pageview);
 
40
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
 
41
        l->Reflow();
 
42
        pp_layout_poster_pageview_refresh(PP_LAYOUT_POSTER_PAGEVIEW(pv));
 
43
 
 
44
        int pages=l->GetPages();
 
45
        pages/=l->htiles*l->vtiles;
 
46
 
 
47
        gtk_widget_set_sensitive(lo->page,pages>1);
 
48
        gtk_spin_button_set_range(GTK_SPIN_BUTTON(lo->page),1.0,pages);
 
49
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
 
50
}
 
51
 
 
52
 
 
53
static void pe_changed(GtkWidget *wid,gpointer *ob)
 
54
{
 
55
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
 
56
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
 
57
        l->TilesFromSize();
 
58
        pp_layout_poster_refresh(lo);
 
59
        pp_Layout_Poster_PageView *pv=PP_LAYOUT_POSTER_PAGEVIEW(lo->pageview);
 
60
        pp_layout_poster_pageview_refresh(pv);
 
61
        g_signal_emit(G_OBJECT (ob),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
 
62
}
 
63
 
 
64
 
 
65
static void posterwidth_changed(GtkWidget *wid,gpointer *ob)
 
66
{
 
67
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
 
68
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
 
69
 
 
70
        l->posterwidth=int(dimension_get_pt(DIMENSION(lo->posterwidth)));
 
71
        l->TilesFromSize();
 
72
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
 
73
}
 
74
 
 
75
 
 
76
static void posterheight_changed(GtkWidget *wid,gpointer *ob)
 
77
{
 
78
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
 
79
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
 
80
 
 
81
        l->posterheight=int(dimension_get_pt(DIMENSION(lo->posterheight)));
 
82
        l->TilesFromSize();
 
83
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
 
84
}
 
85
 
 
86
 
 
87
static void htiles_changed(GtkWidget *wid,gpointer *ob)
 
88
{
 
89
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
 
90
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
 
91
        
 
92
        l->htiles=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(lo->htiles));
 
93
        l->SizeFromTiles();
 
94
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
 
95
}
 
96
 
 
97
 
 
98
static void vtiles_changed(GtkWidget *wid,gpointer *ob)
 
99
{
 
100
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
 
101
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
 
102
 
 
103
        cerr << "In VTiles_Changed" << endl;
 
104
 
 
105
        l->vtiles=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(lo->vtiles));
 
106
        l->SizeFromTiles();
 
107
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
 
108
}
 
109
 
 
110
 
 
111
static void hoverlap_changed(GtkWidget *wid,gpointer *ob)
 
112
{
 
113
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
 
114
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
 
115
 
 
116
        l->hoverlap=int(dimension_get_pt(DIMENSION(lo->hoverlap)));
 
117
        l->TilesFromSize();
 
118
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
 
119
}
 
120
 
 
121
 
 
122
static void voverlap_changed(GtkWidget *wid,gpointer *ob)
 
123
{
 
124
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
 
125
        Layout_Poster *l=(Layout_Poster*)lo->state->layout;
 
126
 
 
127
        l->voverlap=int(dimension_get_pt(DIMENSION(lo->voverlap)));
 
128
        l->TilesFromSize();
 
129
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
 
130
}
 
131
 
 
132
 
 
133
static void page_changed(GtkWidget *wid,gpointer *ob)
 
134
{
 
135
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
 
136
        pp_Layout_Poster_PageView *pv=PP_LAYOUT_POSTER_PAGEVIEW(lo->pageview);
 
137
        int pagesperposter=pv->layout->htiles*pv->layout->vtiles;
 
138
 
 
139
        pp_layout_poster_pageview_set_page(pv,pagesperposter*(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(lo->page))-1));
 
140
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
 
141
}
 
142
 
 
143
 
 
144
static void pageview_changed(GtkWidget *wid,gpointer *ob)
 
145
{
 
146
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
 
147
 
 
148
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[CHANGED_SIGNAL], 0);
 
149
}
 
150
 
 
151
 
 
152
static void pageview_popupmenu(GtkWidget *wid,gpointer *ob)
 
153
{
 
154
        pp_Layout_Poster *lo=(pp_Layout_Poster *)ob;
 
155
        cerr << "Forwarding popupmenu signal..." << endl;
 
156
        g_signal_emit(G_OBJECT (lo),pp_layout_poster_signals[POPUPMENU_SIGNAL], 0);
 
157
}
 
158
 
 
159
 
 
160
void pp_layout_poster_refresh(pp_Layout_Poster *ob)
 
161
{
 
162
        Layout_Poster *l=(Layout_Poster *)ob->state->layout;
 
163
 
 
164
        l->LayoutToDB(ob->state->layoutdb);
 
165
 
 
166
        int pages=l->GetPages();
 
167
        int cpage=l->GetCurrentPage();
 
168
        pages/=l->htiles*l->vtiles;
 
169
        cpage/=l->htiles*l->vtiles;
 
170
 
 
171
        gtk_widget_set_sensitive(ob->page,pages!=1);
 
172
        if(pages>1)
 
173
        {
 
174
                gtk_spin_button_set_range(GTK_SPIN_BUTTON(ob->page),1.0,pages);
 
175
                gtk_spin_button_set_value(GTK_SPIN_BUTTON(ob->page),cpage+1);
 
176
        }
 
177
 
 
178
        g_signal_handlers_block_matched (G_OBJECT(ob->posterwidth),G_SIGNAL_MATCH_DATA,
 
179
                0, 0, NULL, NULL, ob);
 
180
        g_signal_handlers_block_matched (G_OBJECT(ob->posterheight),G_SIGNAL_MATCH_DATA,
 
181
                0, 0, NULL, NULL, ob);
 
182
        g_signal_handlers_block_matched (G_OBJECT(ob->htiles),G_SIGNAL_MATCH_DATA,
 
183
                0, 0, NULL, NULL, ob);
 
184
        g_signal_handlers_block_matched (G_OBJECT(ob->vtiles),G_SIGNAL_MATCH_DATA,
 
185
                0, 0, NULL, NULL, ob);
 
186
        g_signal_handlers_block_matched (G_OBJECT(ob->hoverlap),G_SIGNAL_MATCH_DATA,
 
187
                0, 0, NULL, NULL, ob);
 
188
        g_signal_handlers_block_matched (G_OBJECT(ob->voverlap),G_SIGNAL_MATCH_DATA,
 
189
                0, 0, NULL, NULL, ob);
 
190
 
 
191
        dimension_set_pt(DIMENSION(ob->posterwidth),l->posterwidth);
 
192
        dimension_set_pt(DIMENSION(ob->posterheight),l->posterheight);
 
193
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(ob->htiles),l->htiles);
 
194
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(ob->vtiles),l->vtiles);
 
195
        dimension_set_pt(DIMENSION(ob->hoverlap),l->hoverlap);
 
196
        dimension_set_pt(DIMENSION(ob->voverlap),l->voverlap);
 
197
 
 
198
        g_signal_handlers_unblock_matched (G_OBJECT(ob->posterwidth),G_SIGNAL_MATCH_DATA,
 
199
                0, 0, NULL, NULL, ob);
 
200
        g_signal_handlers_unblock_matched (G_OBJECT(ob->posterheight),G_SIGNAL_MATCH_DATA,
 
201
                0, 0, NULL, NULL, ob);
 
202
        g_signal_handlers_unblock_matched (G_OBJECT(ob->htiles),G_SIGNAL_MATCH_DATA,
 
203
                0, 0, NULL, NULL, ob);
 
204
        g_signal_handlers_unblock_matched (G_OBJECT(ob->vtiles),G_SIGNAL_MATCH_DATA,
 
205
                0, 0, NULL, NULL, ob);
 
206
        g_signal_handlers_unblock_matched (G_OBJECT(ob->hoverlap),G_SIGNAL_MATCH_DATA,
 
207
                0, 0, NULL, NULL, ob);
 
208
        g_signal_handlers_unblock_matched (G_OBJECT(ob->voverlap),G_SIGNAL_MATCH_DATA,
 
209
                0, 0, NULL, NULL, ob);
 
210
 
 
211
        pp_Layout_Poster_PageView *pv=PP_LAYOUT_POSTER_PAGEVIEW(ob->pageview);
 
212
        if(pv)
 
213
                pp_layout_poster_pageview_refresh(pv);
 
214
}
 
215
 
 
216
 
 
217
void pp_layout_poster_set_unit(GtkWidget *wid,enum Units unit)
 
218
{
 
219
        pp_Layout_Poster *ob=PP_LAYOUT_POSTER(wid);
 
220
        pp_pageextent_set_unit(PP_PAGEEXTENT(ob->pageextent),unit);
 
221
        dimension_set_unit(DIMENSION(ob->posterwidth),unit);
 
222
        dimension_set_unit(DIMENSION(ob->posterheight),unit);
 
223
}
 
224
 
 
225
 
 
226
GtkWidget*
 
227
pp_layout_poster_new (PhotoPrint_State *state)
 
228
{
 
229
        pp_Layout_Poster *ob=PP_LAYOUT_POSTER(g_object_new (pp_layout_poster_get_type (), NULL));
 
230
 
 
231
        gtk_container_set_border_width(GTK_CONTAINER(&ob->hbox),10);
 
232
        
 
233
        ob->state=state;
 
234
        
 
235
        GtkWidget *vbox;
 
236
        GtkWidget *vbox2;
 
237
        GtkWidget *hbox;
 
238
        GtkWidget *label;
 
239
        GtkWidget *tmp;
 
240
 
 
241
        ob->sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 
242
        
 
243
        GtkWidget *frame = gtk_frame_new (NULL);
 
244
        gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
 
245
        gtk_box_pack_start(GTK_BOX (&ob->hbox), frame,TRUE,TRUE,0);
 
246
        gtk_widget_show (frame); 
 
247
        
 
248
        ob->pageview = pp_layout_poster_pageview_new ((Layout_Poster *)ob->state->layout);
 
249
        g_signal_connect(G_OBJECT(ob->pageview),"changed",G_CALLBACK(pageview_changed),ob);
 
250
        g_signal_connect(G_OBJECT(ob->pageview),"popupmenu",G_CALLBACK(pageview_popupmenu),ob);
 
251
        g_signal_connect(G_OBJECT(ob->pageview),"reflow",G_CALLBACK(reflow),ob);
 
252
 
 
253
        gtk_container_add (GTK_CONTAINER (frame), ob->pageview);
 
254
        gtk_widget_show (ob->pageview);
 
255
 
 
256
        GtkWidget *scrollwin=gtk_scrolled_window_new(NULL,NULL);
 
257
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwin),
 
258
                                    GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
 
259
        vbox = gtk_vbox_new (FALSE, 5);
 
260
        gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrollwin), vbox);
 
261
        gtk_box_pack_start(GTK_BOX(&ob->hbox),scrollwin,FALSE,FALSE,0);
 
262
        gtk_widget_show (vbox);
 
263
        gtk_widget_show (scrollwin);
 
264
 
 
265
        enum Units unit=state->GetUnits();
 
266
 
 
267
#define PP_BUILDDIMENSION(spinlabel,var,min,max,unit,callback) \
 
268
        hbox=gtk_hbox_new(FALSE,0); \
 
269
\
 
270
        label=gtk_label_new(spinlabel); \
 
271
        gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,5); \
 
272
        gtk_widget_show(label); \
 
273
\
 
274
        var=dimension_new(min,max,unit); \
 
275
        g_signal_connect(G_OBJECT(var),"value-changed",G_CALLBACK(callback),ob); \
 
276
        gtk_widget_show(var); \
 
277
\
 
278
        gtk_size_group_add_widget(GTK_SIZE_GROUP(ob->sizegroup),var); \
 
279
        gtk_box_pack_start(GTK_BOX(hbox),var,FALSE,FALSE,5); \
 
280
\
 
281
        gtk_box_pack_start(GTK_BOX(vbox2),hbox,FALSE,FALSE,5); \
 
282
        gtk_widget_show(hbox)
 
283
 
 
284
#define PP_BUILDSPIN(spinlabel,var,min,max,step,callback) \
 
285
        hbox=gtk_hbox_new(FALSE,0); \
 
286
\
 
287
        label=gtk_label_new(spinlabel); \
 
288
        gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,5); \
 
289
        gtk_widget_show(label); \
 
290
\
 
291
        var=gtk_spin_button_new_with_range(min,max,step); \
 
292
        g_signal_connect(G_OBJECT(var),"value-changed",G_CALLBACK(callback),ob); \
 
293
        gtk_widget_show(var); \
 
294
\
 
295
        gtk_size_group_add_widget(GTK_SIZE_GROUP(ob->sizegroup),var); \
 
296
        gtk_box_pack_start(GTK_BOX(hbox),var,FALSE,FALSE,5); \
 
297
\
 
298
        gtk_box_pack_start(GTK_BOX(vbox2),hbox,FALSE,FALSE,5); \
 
299
        gtk_widget_show(hbox)
 
300
 
 
301
#define PP_BUILDFRAME(framelabel) \
 
302
        frame=gtk_frame_new(framelabel); \
 
303
        gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,0); \
 
304
        gtk_container_set_border_width(GTK_CONTAINER(frame),5); \
 
305
        gtk_widget_show(frame); \
 
306
\
 
307
        vbox2=gtk_vbox_new(FALSE,0); \
 
308
        gtk_container_add(GTK_CONTAINER(frame),vbox2); \
 
309
        gtk_widget_show(vbox2)
 
310
 
 
311
 
 
312
        // PosterSize
 
313
        PP_BUILDFRAME(_("Poster Size:"));
 
314
        PP_BUILDDIMENSION(_("Width:"),ob->posterwidth,350,10000,unit,posterwidth_changed);
 
315
        PP_BUILDDIMENSION(_("Height:"),ob->posterheight,350,10000,unit,posterheight_changed);
 
316
        PP_BUILDSPIN(_("Tiles wide:"),ob->htiles,1,10,1,htiles_changed);
 
317
        PP_BUILDSPIN(_("Tiles high:"),ob->vtiles,1,10,1,vtiles_changed);
 
318
 
 
319
        PP_BUILDFRAME(_("Overlap:"));
 
320
        PP_BUILDDIMENSION(_("H:"),ob->hoverlap,0,72,unit,hoverlap_changed);
 
321
        PP_BUILDDIMENSION(_("V:"),ob->voverlap,0,72,unit,voverlap_changed);
 
322
 
 
323
 
 
324
        // PageExtent
 
325
 
 
326
        ob->pageextent=pp_pageextent_new((Layout_Poster *)ob->state->layout,ob->state,ob->sizegroup);
 
327
        g_signal_connect(G_OBJECT(ob->pageextent),"changed",G_CALLBACK(pe_changed),ob);
 
328
        gtk_box_pack_start(GTK_BOX(vbox),ob->pageextent,FALSE,FALSE,0);
 
329
        gtk_widget_show(ob->pageextent);
 
330
 
 
331
 
 
332
        // Spacer box
 
333
 
 
334
        tmp=gtk_vbox_new(FALSE,0);
 
335
        gtk_box_pack_start(GTK_BOX(vbox),tmp,TRUE,TRUE,0);
 
336
        gtk_widget_show(tmp);
 
337
 
 
338
 
 
339
        // Page number
 
340
 
 
341
        hbox=gtk_hbox_new(FALSE,5);
 
342
        label=gtk_label_new(_("Page:"));
 
343
        gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,0);
 
344
        gtk_widget_show(label);
 
345
 
 
346
        ob->page=gtk_spin_button_new_with_range(1.0,2.0,1.0);
 
347
        g_signal_connect(G_OBJECT(ob->page),"value-changed",G_CALLBACK(page_changed),ob);
 
348
        gtk_widget_show(ob->page);
 
349
 
 
350
        gtk_box_pack_start(GTK_BOX(hbox),ob->page,FALSE,FALSE,0);
 
351
 
 
352
 
 
353
        gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0);
 
354
        gtk_widget_show(hbox);
 
355
 
 
356
        g_object_unref(G_OBJECT(ob->sizegroup));
 
357
        ob->sizegroup=NULL;
 
358
 
 
359
        pp_layout_poster_refresh(ob);
 
360
        pp_pageextent_refresh(PP_PAGEEXTENT(ob->pageextent));
 
361
 
 
362
        return(GTK_WIDGET(ob));
 
363
}
 
364
 
 
365
 
 
366
GType
 
367
pp_layout_poster_get_type (void)
 
368
{
 
369
        static GType stpuic_type = 0;
 
370
 
 
371
        if (!stpuic_type)
 
372
        {
 
373
                static const GTypeInfo pp_layout_poster_info =
 
374
                {
 
375
                        sizeof (pp_Layout_PosterClass),
 
376
                        NULL, /* base_init */
 
377
                        NULL, /* base_finalize */
 
378
                        (GClassInitFunc) pp_layout_poster_class_init,
 
379
                        NULL, /* class_finalize */
 
380
                        NULL, /* class_data */
 
381
                        sizeof (pp_Layout_Poster),
 
382
                        0,
 
383
                        (GInstanceInitFunc) pp_layout_poster_init,
 
384
                };
 
385
                stpuic_type = g_type_register_static (GTK_TYPE_HBOX, "pp_Layout_Poster", &pp_layout_poster_info, (GTypeFlags)0);
 
386
        }
 
387
        return stpuic_type;
 
388
}
 
389
 
 
390
 
 
391
static void
 
392
pp_layout_poster_class_init (pp_Layout_PosterClass *klass)
 
393
{
 
394
        pp_layout_poster_signals[CHANGED_SIGNAL] =
 
395
        g_signal_new ("changed",
 
396
                G_TYPE_FROM_CLASS (klass),
 
397
                GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
 
398
                G_STRUCT_OFFSET (pp_Layout_PosterClass, changed),
 
399
                NULL, NULL,
 
400
                g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
 
401
        pp_layout_poster_signals[POPUPMENU_SIGNAL] =
 
402
        g_signal_new ("popupmenu",
 
403
                G_TYPE_FROM_CLASS (klass),
 
404
                GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
 
405
                G_STRUCT_OFFSET (pp_Layout_PosterClass, changed),
 
406
                NULL, NULL,
 
407
                g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
 
408
        pp_layout_poster_signals[SELECTIONCHANGED_SIGNAL] =
 
409
        g_signal_new ("selection_changed",
 
410
                G_TYPE_FROM_CLASS (klass),
 
411
                GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
 
412
                G_STRUCT_OFFSET (pp_Layout_PosterClass, changed),
 
413
                NULL, NULL,
 
414
                g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
 
415
}
 
416
 
 
417
 
 
418
static void
 
419
pp_layout_poster_init (pp_Layout_Poster *ob)
 
420
{
 
421
        ob->state=NULL;
 
422
        ob->pageview=NULL;
 
423
}