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