3
#include <gtk/gtkstock.h>
4
#include <gtk/gtkradioaction.h>
5
#include <gtk/gtkcheckmenuitem.h>
6
#include <gtk/gtkmain.h>
8
#include "pp_menu_layout.h"
9
#include "pp_mainwindow.h"
11
#include "support/generaldialogs.h"
12
#include "support/progressbar.h"
16
#define _(x) gettext(x)
17
#define N_(x) gettext_noop(x)
21
enum LAYOUTRADIOOPTIONS {LAYOUT_NUP,LAYOUT_SINGLE,LAYOUT_POSTER,LAYOUT_CAROUSEL};
24
static void layoutmenu_clearlayout(GtkAction *act,gpointer *ob)
26
pp_MainWindow *mw=(pp_MainWindow *)ob;
27
mw->state->layout->Clear();
28
pp_mainwindow_refresh(mw);
32
static void layoutmenu_single(gpointer *ob)
34
pp_MainWindow *mw=(pp_MainWindow *)ob;
35
mw->state->layoutdb.SetString("LayoutType","Single");
38
mw->state->layout->LayoutToDB(mw->state->layoutdb);
40
pp_mainwindow_rebuild(mw);
44
static void layoutmenu_nup(gpointer *ob)
46
pp_MainWindow *mw=(pp_MainWindow *)ob;
47
mw->state->layoutdb.SetString("LayoutType","NUp");
50
mw->state->layout->LayoutToDB(mw->state->layoutdb);
52
pp_mainwindow_rebuild(mw);
56
static void layoutmenu_carousel(gpointer *ob)
58
pp_MainWindow *mw=(pp_MainWindow *)ob;
59
mw->state->layoutdb.SetString("LayoutType","Carousel");
62
mw->state->layout->LayoutToDB(mw->state->layoutdb);
64
pp_mainwindow_rebuild(mw);
68
static void layoutmenu_poster(gpointer *ob)
70
pp_MainWindow *mw=(pp_MainWindow *)ob;
71
mw->state->layoutdb.SetString("LayoutType","Poster");
74
mw->state->layout->LayoutToDB(mw->state->layoutdb);
76
pp_mainwindow_rebuild(mw);
80
static void layoutmenu_radio_dispatch(GtkAction *act,GtkRadioAction *ra,gpointer *ob)
82
switch(gtk_radio_action_get_current_value(ra))
88
layoutmenu_single(ob);
91
layoutmenu_carousel(ob);
94
layoutmenu_poster(ob);
100
static void layoutmenu_setbackground(GtkAction *act,gpointer *ob)
102
pp_MainWindow *mw=(pp_MainWindow *)ob;
103
static char *prevfile=NULL;
104
// Need to get existing filename...
106
char *bg=Background_Dialog(&mw->window,*mw->state,prevfile);
109
cerr << "Selected " << bg << endl;
111
mw->state->layout->SetBackground(bg);
115
pp_mainwindow_refresh(mw);
121
static GtkActionEntry layoutmenu_entries[] = {
122
{ "LayoutMenu", NULL, N_("_Layout") },
124
{ "ClearLayout", NULL, N_("_Clear Layout"), "<control>K", N_("Remove all images from the layout"), G_CALLBACK(layoutmenu_clearlayout) },
125
{ "Set Background", NULL, N_("Set _Background"), "<control>B", N_("Set a background image for the current layout"), G_CALLBACK(layoutmenu_setbackground) },
129
static GtkRadioActionEntry layoutmenu_radio_entries[] = {
130
{ "AutoLayout", NULL, N_("_Auto Layout"), NULL, N_("Automatically place images in a grid"), LAYOUT_NUP },
131
{ "Poster", NULL, N_("_Poster"), NULL, N_("Print an image in multiple pages, to be assembled into a poster"), LAYOUT_POSTER },
132
{ "Carousel", NULL, N_("_Carousel"), NULL, N_("Fade images into a circular 'carousel' - ideal for CD labels."), LAYOUT_CAROUSEL },
133
{ "ManualSize", NULL, N_("_Manual Size"), NULL, N_("Print images on a single sheet, at a specified scale."), LAYOUT_SINGLE }
137
static const char *layoutmenu_ui_description =
139
" <menubar name='MainMenu'>"
140
" <menu action='LayoutMenu'>"
141
" <menuitem action='ClearLayout'/>"
142
" <menuitem action='Set Background'/>"
144
" <menuitem action='AutoLayout'/>"
145
" <menuitem action='Poster'/>"
146
" <menuitem action='Carousel'/>"
147
" <menuitem action='ManualSize'/>"
153
void BuildLayoutMenu(void *userdata,GtkUIManager *ui_manager)
156
GtkActionGroup *action_group;
157
action_group = gtk_action_group_new ("LayoutMenuActions");
158
gtk_action_group_set_translation_domain(action_group,PACKAGE);
159
gtk_action_group_add_actions (action_group, layoutmenu_entries, G_N_ELEMENTS (layoutmenu_entries), userdata);
160
gtk_action_group_add_radio_actions (action_group, layoutmenu_radio_entries, G_N_ELEMENTS (layoutmenu_radio_entries), 0, G_CALLBACK(layoutmenu_radio_dispatch), userdata);
161
gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
163
if (!gtk_ui_manager_add_ui_from_string (ui_manager, layoutmenu_ui_description, -1, &error))
164
throw error->message;
168
void LayoutMenu_SetLayout(GtkUIManager *ui_manager,const char *layouttype)
170
enum LAYOUTRADIOOPTIONS item=LAYOUT_NUP;
171
if(strcmp(layouttype,"Single")==0)
173
if(strcmp(layouttype,"NUp")==0)
175
if(strcmp(layouttype,"Poster")==0)
177
if(strcmp(layouttype,"Carousel")==0)
178
item=LAYOUT_CAROUSEL;
180
cerr << "Setting layout radio option to... " << item << endl;
183
GtkAction *act=gtk_ui_manager_get_action(ui_manager,"/MainMenu/LayoutMenu/AutoLayout");
185
gtk_radio_action_set_current_value(GTK_RADIO_ACTION(act),item);
188
const char *menupaths[]=
190
"/MainMenu/LayoutMenu/AutoLayout",
191
"/MainMenu/LayoutMenu/ManualSize",
192
"/MainMenu/LayoutMenu/Poster",
193
"/MainMenu/LayoutMenu/Carousel"
198
for(unsigned int i=0;i<(sizeof(menupaths)/sizeof(const char *));++i)
200
w=gtk_ui_manager_get_widget(ui_manager,menupaths[i]);
203
cerr << menupaths[i] << " -> " << (i==item) << endl;
204
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w),i==item);