1 #include <iostream>
2
3 #include <gtk/gtkstock.h>
4 #include <gtk/gtkradioaction.h>
5 #include <gtk/gtkcheckmenuitem.h>
6 #include <gtk/gtkmain.h>
7
8 #include "pp_menu_layout.h"
9 #include "pp_mainwindow.h"
10 #include "dialogs.h"
11 #include "miscwidgets/generaldialogs.h"
12 #include "progressbar.h"
13 #include "support/debug.h"
14
15 #include "config.h"
16 #include "gettext.h"
17 #define _(x) gettext(x)
18 #define N_(x) gettext_noop(x)
19
20 using namespace std;
21
22 enum LAYOUTRADIOOPTIONS {LAYOUT_NUP,LAYOUT_SINGLE,LAYOUT_POSTER,LAYOUT_CAROUSEL};
23
24
layoutmenu_clearlayout(GtkAction * act,gpointer * ob)25 static void layoutmenu_clearlayout(GtkAction *act,gpointer *ob)
26 {
27 pp_MainWindow *mw=(pp_MainWindow *)ob;
28 mw->state->layout->Clear();
29 pp_mainwindow_refresh(mw);
30 }
31
32
layoutmenu_single(gpointer * ob)33 static void layoutmenu_single(gpointer *ob)
34 {
35 pp_MainWindow *mw=(pp_MainWindow *)ob;
36 if(strcmp(mw->state->layoutdb.FindString("LayoutType"),"Single")==0)
37 return;
38 mw->state->layoutdb.SetString("LayoutType","Single");
39
40 if(mw->layout)
41 mw->state->layout->LayoutToDB(mw->state->layoutdb);
42
43 pp_mainwindow_rebuild(mw);
44 }
45
46
layoutmenu_nup(gpointer * ob)47 static void layoutmenu_nup(gpointer *ob)
48 {
49 pp_MainWindow *mw=(pp_MainWindow *)ob;
50 if(strcmp(mw->state->layoutdb.FindString("LayoutType"),"NUp")==0)
51 return;
52 mw->state->layoutdb.SetString("LayoutType","NUp");
53
54 if(mw->layout)
55 mw->state->layout->LayoutToDB(mw->state->layoutdb);
56
57 pp_mainwindow_rebuild(mw);
58 }
59
60
layoutmenu_carousel(gpointer * ob)61 static void layoutmenu_carousel(gpointer *ob)
62 {
63 pp_MainWindow *mw=(pp_MainWindow *)ob;
64 if(strcmp(mw->state->layoutdb.FindString("LayoutType"),"Carousel")==0)
65 return;
66 mw->state->layoutdb.SetString("LayoutType","Carousel");
67
68 if(mw->layout)
69 mw->state->layout->LayoutToDB(mw->state->layoutdb);
70
71 pp_mainwindow_rebuild(mw);
72 }
73
74
layoutmenu_poster(gpointer * ob)75 static void layoutmenu_poster(gpointer *ob)
76 {
77 pp_MainWindow *mw=(pp_MainWindow *)ob;
78 if(strcmp(mw->state->layoutdb.FindString("LayoutType"),"Poster")==0)
79 return;
80 mw->state->layoutdb.SetString("LayoutType","Poster");
81
82 if(mw->layout)
83 mw->state->layout->LayoutToDB(mw->state->layoutdb);
84
85 pp_mainwindow_rebuild(mw);
86 }
87
88
layoutmenu_radio_dispatch(GtkAction * act,GtkRadioAction * ra,gpointer * ob)89 static void layoutmenu_radio_dispatch(GtkAction *act,GtkRadioAction *ra,gpointer *ob)
90 {
91 switch(gtk_radio_action_get_current_value(ra))
92 {
93 case LAYOUT_NUP:
94 layoutmenu_nup(ob);
95 break;
96 case LAYOUT_SINGLE:
97 layoutmenu_single(ob);
98 break;
99 case LAYOUT_CAROUSEL:
100 layoutmenu_carousel(ob);
101 break;
102 case LAYOUT_POSTER:
103 layoutmenu_poster(ob);
104 break;
105 }
106 }
107
108
layoutmenu_setbackground(GtkAction * act,gpointer * ob)109 static void layoutmenu_setbackground(GtkAction *act,gpointer *ob)
110 {
111 pp_MainWindow *mw=(pp_MainWindow *)ob;
112 static char *prevfile=NULL;
113 // Need to get existing filename...
114
115 char *bg=Background_Dialog(&mw->window,*mw->state,prevfile);
116
117 if(bg)
118 Debug[TRACE] << "Selected " << bg << endl;
119
120 mw->state->layout->SetBackground(bg);
121 // if(prevfile)
122 // free(prevfile);
123 prevfile=bg;
124 pp_mainwindow_refresh(mw);
125 }
126
127
128
129
130 static GtkActionEntry layoutmenu_entries[] = {
131 { "LayoutMenu", NULL, N_("_Layout") },
132
133 { "ClearLayout", NULL, N_("_Clear Layout"), "<control>K", N_("Remove all images from the layout"), G_CALLBACK(layoutmenu_clearlayout) },
134 { "SetBackground", NULL, N_("Set _Background"), "<control>B", N_("Set a background image for the current layout"), G_CALLBACK(layoutmenu_setbackground) },
135 };
136
137
138 static GtkRadioActionEntry layoutmenu_radio_entries[] = {
139 { "AutoLayout", NULL, N_("_Auto Layout"), NULL, N_("Automatically place images in a grid"), LAYOUT_NUP },
140 { "Poster", NULL, N_("_Poster"), NULL, N_("Print an image in multiple pages, to be assembled into a poster"), LAYOUT_POSTER },
141 { "Carousel", NULL, N_("_Carousel"), NULL, N_("Fade images into a circular 'carousel' - ideal for CD labels."), LAYOUT_CAROUSEL },
142 { "ManualSize", NULL, N_("_Manual Size"), NULL, N_("Print images on a single sheet, at a specified scale."), LAYOUT_SINGLE }
143 };
144
145
146 static const char *layoutmenu_ui_description =
147 "<ui>"
148 " <menubar name='MainMenu'>"
149 " <menu action='LayoutMenu'>"
150 " <menuitem action='ClearLayout'/>"
151 " <menuitem action='SetBackground'/>"
152 " <separator/>"
153 " <menuitem action='AutoLayout'/>"
154 " <menuitem action='Poster'/>"
155 " <menuitem action='Carousel'/>"
156 " <menuitem action='ManualSize'/>"
157 " </menu>"
158 " </menubar>"
159 "</ui>";
160
161
BuildLayoutMenu(void * userdata,GtkUIManager * ui_manager)162 void BuildLayoutMenu(void *userdata,GtkUIManager *ui_manager)
163 {
164 GError *error=NULL;
165 GtkActionGroup *action_group;
166 action_group = gtk_action_group_new ("LayoutMenuActions");
167 gtk_action_group_set_translation_domain(action_group,PACKAGE);
168 gtk_action_group_add_actions (action_group, layoutmenu_entries, G_N_ELEMENTS (layoutmenu_entries), userdata);
169 gtk_action_group_add_radio_actions (action_group, layoutmenu_radio_entries, G_N_ELEMENTS (layoutmenu_radio_entries), 0, G_CALLBACK(layoutmenu_radio_dispatch), userdata);
170 gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
171
172 if (!gtk_ui_manager_add_ui_from_string (ui_manager, layoutmenu_ui_description, -1, &error))
173 throw error->message;
174 }
175
176
LayoutMenu_SetLayout(GtkUIManager * ui_manager,const char * layouttype)177 void LayoutMenu_SetLayout(GtkUIManager *ui_manager,const char *layouttype)
178 {
179 enum LAYOUTRADIOOPTIONS item=LAYOUT_NUP;
180 if(strcmp(layouttype,"Single")==0)
181 item=LAYOUT_SINGLE;
182 if(strcmp(layouttype,"NUp")==0)
183 item=LAYOUT_NUP;
184 if(strcmp(layouttype,"Poster")==0)
185 item=LAYOUT_POSTER;
186 if(strcmp(layouttype,"Carousel")==0)
187 item=LAYOUT_CAROUSEL;
188
189 #if 0
190 GtkAction *act=gtk_ui_manager_get_action(ui_manager,"/MainMenu/LayoutMenu/AutoLayout");
191 if(act)
192 gtk_radio_action_set_current_value(GTK_RADIO_ACTION(act),item);
193
194 #else
195 const char *menupaths[]=
196 {
197 "/MainMenu/LayoutMenu/AutoLayout",
198 "/MainMenu/LayoutMenu/ManualSize",
199 "/MainMenu/LayoutMenu/Poster",
200 "/MainMenu/LayoutMenu/Carousel"
201 };
202
203 GtkWidget *w;
204
205 for(unsigned int i=0;i<(sizeof(menupaths)/sizeof(const char *));++i)
206 {
207 w=gtk_ui_manager_get_widget(ui_manager,menupaths[i]);
208 if(w)
209 {
210 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w),(enum LAYOUTRADIOOPTIONS)i==item);
211 }
212 }
213 #endif
214 }
215
216
LayoutMenu_SetLayoutCapabilities(GtkUIManager * ui_manager,int features)217 void LayoutMenu_SetLayoutCapabilities(GtkUIManager *ui_manager,int features)
218 {
219 struct menucapentry
220 {
221 const char *path;
222 int flag;
223 };
224
225 menucapentry tags[]={
226 {"/MainMenu/LayoutMenu/SetBackground",PPLAYOUT_BACKGROUND},
227 {NULL,0}
228 };
229
230 menucapentry *p=&tags[0];
231 while(p->flag)
232 {
233 GtkWidget *w=gtk_ui_manager_get_widget(ui_manager,p->path);
234 if(w)
235 gtk_widget_set_sensitive(w,(features&p->flag)!=0);
236 ++p;
237 }
238 }
239