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