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/gtkfilechooser.h>
8 #include <gtk/gtkfilechooserdialog.h>
9 #include <gtk/gtkdialog.h>
10 #include <gtk/gtkmenuitem.h>
11 #include <gtk/gtkcheckmenuitem.h>
12 #include <gtk/gtkimage.h>
13 #include <gtk/gtkmain.h>
14 #include <gtk/gtkuimanager.h>
15 
16 #include "stpui_widgets/stpui_combo.h"
17 #include "progressbar.h"
18 #include "support/pathsupport.h"
19 #include "layout.h"
20 #include "dialogs.h"
21 #include "miscwidgets/generaldialogs.h"
22 #include "pixbufthumbnail/egg-pixbuf-thumbnail.h"
23 #include "effects/effects_dialog.h"
24 #include "pp_menu_file.h"
25 #include "pp_menu_edit.h"
26 #include "pp_menu_layout.h"
27 #include "pp_menu_image.h"
28 #include "pp_menu_options.h"
29 #include "pp_menu_shortcuts.h"
30 #include "pp_menu_help.h"
31 
32 #include "config.h"
33 #include "gettext.h"
34 #define _(x) gettext(x)
35 
36 #include "pp_mainwindow.h"
37 
38 enum {
39 	CHANGED_SIGNAL,
40 	LAST_SIGNAL
41 };
42 
43 static guint pp_mainwindow_signals[LAST_SIGNAL] = { 0 };
44 
45 static void pp_mainwindow_class_init (pp_MainWindowClass *klass);
46 static void pp_mainwindow_init (pp_MainWindow *stpuicombo);
47 static void layout_changed(GtkWidget *wid,gpointer *ob);
48 
49 
50 
51 // Functions invoked from the menus:
52 
53 
layout_selection_changed(GtkWidget * wid,gpointer * ob)54 static void layout_selection_changed(GtkWidget *wid,gpointer *ob)
55 {
56 	pp_MainWindow *mw=(pp_MainWindow *)ob;
57 
58 	PP_ROTATION rotation=ImageMenu_GetRotation(mw->uim);
59 	bool allowcropping=ImageMenu_GetCropFlag(mw->uim);
60 	bool removeimage=true;
61 
62 	LayoutIterator it(*mw->state->layout);
63 	Layout_ImageInfo *ii=it.FirstSelected();
64 	if(ii)
65 	{
66 		allowcropping=ii->allowcropping;
67 		rotation=ii->rotation;
68 	}
69 	else
70 		removeimage=false;
71 
72 	while(ii)
73 	{
74 		if(rotation!=ii->rotation)
75 			rotation=PP_ROTATION_NONE;
76 		allowcropping&=ii->allowcropping;
77 		ii=it.NextSelected();
78 	}
79 
80 	ImageMenu_SetCropFlag(mw->uim,allowcropping);
81 	ImageMenu_SetRotation(mw->uim,rotation);
82 }
83 
84 
layout_popupmenu(GtkWidget * wid,gpointer * ob)85 static void layout_popupmenu(GtkWidget *wid,gpointer *ob)
86 {
87 	layout_selection_changed(NULL,ob);
88 	pp_MainWindow *mw=(pp_MainWindow *)ob;
89 	ImageMenu_DoPopup(mw->uim);
90 }
91 
92 
layout_changed(GtkWidget * wid,gpointer * ob)93 static void layout_changed(GtkWidget *wid,gpointer *ob)
94 {
95 	pp_MainWindow *mw=(pp_MainWindow *)ob;
96 
97 	if(mw->layout)
98 		mw->state->layout->RefreshWidget(mw->layout);
99 }
100 
101 
pp_mainwindow_refresh(pp_MainWindow * ob)102 void pp_mainwindow_refresh(pp_MainWindow *ob)
103 {
104 	if(ob->layout)
105 		ob->state->layout->RefreshWidget(ob->layout);
106 
107 	LayoutMenu_SetLayout(ob->uim,ob->state->layout->GetType());
108 }
109 
110 
111 GtkWidget*
pp_mainwindow_new(PhotoPrint_State * state)112 pp_mainwindow_new (PhotoPrint_State *state)
113 {
114 	pp_MainWindow *ob=PP_MAINWINDOW(g_object_new (pp_mainwindow_get_type (), NULL));
115 
116 	gtk_window_set_title (GTK_WINDOW (ob), PACKAGE_STRING);
117 	gtk_window_set_default_size(GTK_WINDOW(ob),state->FindInt("Win_W"),state->FindInt("Win_H"));
118 	gtk_window_move(GTK_WINDOW(ob),state->FindInt("Win_X"),state->FindInt("Win_Y"));
119 	ob->state=state;
120 
121 	ob->vbox=gtk_vbox_new(FALSE,0);
122 	gtk_container_add(GTK_CONTAINER(ob),ob->vbox);
123 	gtk_widget_show(ob->vbox);
124 
125 
126 
127 	GtkWidget *menubar;
128 	GtkAccelGroup *accel_group;
129 	ob->uim = gtk_ui_manager_new ();
130 
131 	BuildFileMenu(ob,ob->uim);
132 	BuildEditMenu(ob,ob->uim);
133 	BuildLayoutMenu(ob,ob->uim);
134 	BuildImageMenu(ob,ob->uim);
135 	BuildOptionsMenu(ob,ob->uim);
136 	BuildShortcutsMenu(ob,ob->uim);
137 	BuildHelpMenu(ob,ob->uim);
138 
139 	accel_group = gtk_ui_manager_get_accel_group (ob->uim);
140 	gtk_window_add_accel_group (GTK_WINDOW (ob), accel_group);
141 
142 	GtkWidget *tmp;
143 	tmp=gtk_ui_manager_get_widget(ob->uim,"/MainMenu/EditMenu/Cut");
144 	gtk_widget_set_sensitive(tmp,false);
145 	tmp=gtk_ui_manager_get_widget(ob->uim,"/MainMenu/EditMenu/Copy");
146 	gtk_widget_set_sensitive(tmp,false);
147 	tmp=gtk_ui_manager_get_widget(ob->uim,"/MainMenu/EditMenu/Paste");
148 	gtk_widget_set_sensitive(tmp,false);
149 
150 	menubar = gtk_ui_manager_get_widget (ob->uim, "/MainMenu");
151 	gtk_box_pack_start(GTK_BOX(ob->vbox),menubar,FALSE,TRUE,0);
152 	gtk_widget_show(menubar);
153 
154 
155 	if((ob->layout=state->layout->CreateWidget()))
156 	{
157 		gtk_box_pack_start(GTK_BOX(ob->vbox),ob->layout,TRUE,TRUE,0);
158 		gtk_widget_show(ob->layout);
159 		g_signal_connect(G_OBJECT(ob->layout),"changed",G_CALLBACK(layout_changed),ob);
160 		g_signal_connect(G_OBJECT(ob->layout),"popupmenu",G_CALLBACK(layout_popupmenu),ob);
161 		g_signal_connect(G_OBJECT(ob->layout),"selection_changed",G_CALLBACK(layout_selection_changed),ob);
162 	}
163 
164 	int caps=ob->state->layout->GetCapabilities();
165 	ImageMenu_SetLayoutCapabilities(ob->uim,caps);
166 	LayoutMenu_SetLayoutCapabilities(ob->uim,caps);
167 
168 	OptionsMenu_SetHighresPreviews(ob->uim,state->FindInt("HighresPreviews"));
169 	OptionsMenu_SetProofMode(ob->uim,CMProofMode(state->profilemanager.FindInt("ProofMode")));
170 
171 	pp_mainwindow_refresh(ob);
172 
173 	return(GTK_WIDGET(ob));
174 }
175 
176 
177 GType
pp_mainwindow_get_type(void)178 pp_mainwindow_get_type (void)
179 {
180 	static GType stpuic_type = 0;
181 
182 	if (!stpuic_type)
183 	{
184 		static const GTypeInfo pp_mainwindow_info =
185 		{
186 			sizeof (pp_MainWindowClass),
187 			NULL, /* base_init */
188 			NULL, /* base_finalize */
189 			(GClassInitFunc) pp_mainwindow_class_init,
190 			NULL, /* class_finalize */
191 			NULL, /* class_data */
192 			sizeof (pp_MainWindow),
193 			0,
194 			(GInstanceInitFunc) pp_mainwindow_init,
195 		};
196 		stpuic_type = g_type_register_static (GTK_TYPE_WINDOW, "pp_MainWindow", &pp_mainwindow_info, (GTypeFlags)0);
197 	}
198 	return stpuic_type;
199 }
200 
201 
202 static void
pp_mainwindow_class_init(pp_MainWindowClass * klass)203 pp_mainwindow_class_init (pp_MainWindowClass *klass)
204 {
205 	pp_mainwindow_signals[CHANGED_SIGNAL] =
206 	g_signal_new ("changed",
207 		G_TYPE_FROM_CLASS (klass),
208 		GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
209 		G_STRUCT_OFFSET (pp_MainWindowClass, changed),
210 		NULL, NULL,
211 		g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
212 }
213 
214 
215 static void
pp_mainwindow_init(pp_MainWindow * ob)216 pp_mainwindow_init (pp_MainWindow *ob)
217 {
218 	ob->state=NULL;
219 	ob->layout=NULL;
220 	ob->prevfile=NULL;
221 }
222 
223 
pp_mainwindow_rebuild(pp_MainWindow * mw)224 void pp_mainwindow_rebuild(pp_MainWindow *mw)
225 {
226 	try
227 	{
228 		ProgressBar p(_("Transferring images..."),true,GTK_WIDGET(mw));
229 		if(mw->state->NewLayout(&p))
230 		{
231 			gtk_widget_destroy(mw->layout);
232 
233 			if((mw->layout=mw->state->layout->CreateWidget()))
234 			{
235 				gtk_box_pack_start(GTK_BOX(mw->vbox),mw->layout,TRUE,TRUE,0);
236 				gtk_widget_show(mw->layout);
237 				g_signal_connect(G_OBJECT(mw->layout),"changed",G_CALLBACK(layout_changed),mw);
238 				g_signal_connect(G_OBJECT(mw->layout),"popupmenu",G_CALLBACK(layout_popupmenu),mw);
239 				g_signal_connect(G_OBJECT(mw->layout),"selection_changed",G_CALLBACK(layout_selection_changed),mw);
240 			}
241 			mw->state->layout->FlushThumbnails();
242 		}
243 		int caps=mw->state->layout->GetCapabilities();
244 		ImageMenu_SetLayoutCapabilities(mw->uim,caps);
245 		LayoutMenu_SetLayoutCapabilities(mw->uim,caps);
246 
247 		OptionsMenu_SetHighresPreviews(mw->uim,mw->state->FindInt("HighresPreviews"));
248 		OptionsMenu_SetProofMode(mw->uim,CMProofMode(mw->state->profilemanager.FindInt("ProofMode")));
249 
250 		pp_mainwindow_refresh(mw);
251 	}
252 	catch(const char *err)
253 	{
254 		ErrorMessage_Dialog(err);
255 	}
256 }
257