17 #include <gtksourceview/gtksourcebuffer.h>
31 static gboolean mape_window_file_load(
MapeWindow* wnd,
32 const gchar* filename)
35 GtkWidget* error_dialog;
43 error_dialog = gtk_message_dialog_new(
45 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
52 gtk_dialog_run(GTK_DIALOG(error_dialog) );
54 gtk_widget_destroy(error_dialog);
61 title = g_strdup_printf(
"%s - Mape", filename);
62 gtk_window_set_title(GTK_WINDOW(wnd->
window), title);
69 static gboolean mape_window_file_save(
MapeWindow* wnd,
70 const gchar* filename)
73 GtkWidget* error_dialog;
81 error_dialog = gtk_message_dialog_new(
83 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
90 gtk_dialog_run(GTK_DIALOG(error_dialog) );
92 gtk_widget_destroy(error_dialog);
100 gtk_window_set_title(GTK_WINDOW(wnd->
window), title);
107 static GtkWidget* mape_window_create_file_chooser(
MapeWindow* wnd,
108 GtkFileChooserAction action)
111 GtkFileFilter* filter_all;
112 GtkFileFilter* filter_landscape;
113 GtkFileFilter* filter_map;
115 filter_all = gtk_file_filter_new();
116 gtk_file_filter_set_name(filter_all,
"All files");
117 gtk_file_filter_add_pattern(filter_all,
"*");
119 filter_landscape = gtk_file_filter_new();
120 gtk_file_filter_set_name(filter_landscape,
"Dynamic Map Descriptions");
121 gtk_file_filter_add_pattern(filter_landscape,
"[Ll]andscape.txt");
122 gtk_file_filter_add_pattern(filter_landscape,
"[Mm]ap.c");
124 dialog = gtk_file_chooser_dialog_new(
125 action == GTK_FILE_CHOOSER_ACTION_OPEN ?
126 "Open landscape file..." :
"Save landscape file...",
131 action == GTK_FILE_CHOOSER_ACTION_OPEN ?
132 GTK_STOCK_OPEN : GTK_STOCK_SAVE,
137 gtk_file_chooser_add_filter(
138 GTK_FILE_CHOOSER(dialog),
142 gtk_file_chooser_add_filter(
143 GTK_FILE_CHOOSER(dialog),
147 gtk_file_chooser_set_do_overwrite_confirmation(
148 GTK_FILE_CHOOSER(dialog),
155 static void mape_window_cb_file_save_as(GtkWidget* widget,
161 GtkWidget* save_dialog;
164 save_dialog = mape_window_create_file_chooser(
166 GTK_FILE_CHOOSER_ACTION_SAVE
171 gtk_file_chooser_set_filename(
172 GTK_FILE_CHOOSER(save_dialog),
178 gtk_file_chooser_set_current_folder(
179 GTK_FILE_CHOOSER(save_dialog),
184 response = gtk_dialog_run(GTK_DIALOG(save_dialog) );
185 if(response == GTK_RESPONSE_OK)
187 filename = gtk_file_chooser_get_filename(
188 GTK_FILE_CHOOSER(save_dialog)
192 wnd->
last_path = gtk_file_chooser_get_current_folder(
193 GTK_FILE_CHOOSER(save_dialog)
196 mape_window_file_save(wnd, filename);
201 gtk_widget_destroy(save_dialog);
204 static void mape_window_cb_file_save(GtkWidget* widget,
212 mape_window_cb_file_save_as(widget, user_data);
220 static gboolean mape_window_confirm_close(
MapeWindow* wnd)
222 GtkWidget* confirm_dialog;
229 confirm_dialog = gtk_message_dialog_new(
231 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
234 "Save the changes to document before closing?"
237 gtk_message_dialog_format_secondary_text(
238 GTK_MESSAGE_DIALOG(confirm_dialog),
239 "Unsaved changes will be permanently lost."
242 gtk_dialog_add_buttons(
243 GTK_DIALOG(confirm_dialog),
244 "Close _without saving",
253 response = gtk_dialog_run(GTK_DIALOG(confirm_dialog) );
254 gtk_widget_destroy(confirm_dialog);
258 case GTK_RESPONSE_DELETE_EVENT:
259 case GTK_RESPONSE_CANCEL:
262 case GTK_RESPONSE_REJECT:
265 case GTK_RESPONSE_ACCEPT:
267 mape_window_cb_file_save(wnd->
window, wnd);
270 g_assert_not_reached();
275 static void mape_window_cb_realize(GtkWidget* widget,
281 gtk_paned_set_position(GTK_PANED(wnd->
mid_paned), 200);
284 static void mape_window_cb_file_new(GtkWidget* widget,
290 if(mape_window_confirm_close(wnd) == TRUE)
293 gtk_window_set_title(GTK_WINDOW(wnd->
window),
"Mape");
297 static void mape_window_cb_file_open(GtkWidget* widget,
302 GtkWidget* open_dialog;
306 if(mape_window_confirm_close(wnd) == FALSE)
309 open_dialog = mape_window_create_file_chooser(
311 GTK_FILE_CHOOSER_ACTION_OPEN
316 gtk_file_chooser_set_current_folder(
317 GTK_FILE_CHOOSER(open_dialog),
322 response = gtk_dialog_run(GTK_DIALOG(open_dialog) );
323 if(response == GTK_RESPONSE_OK)
325 filename = gtk_file_chooser_get_filename(
326 GTK_FILE_CHOOSER(open_dialog)
330 wnd->
last_path = gtk_file_chooser_get_current_folder(
331 GTK_FILE_CHOOSER(open_dialog)
334 mape_window_file_load(wnd, filename);
339 gtk_widget_destroy(open_dialog);
342 static void mape_window_cb_file_quit(GtkWidget* widget,
348 if(mape_window_confirm_close(wnd) == TRUE)
349 gtk_widget_destroy(wnd->
window);
352 static gboolean mape_window_cb_delete_event(GtkWidget* widget,
359 if(mape_window_confirm_close(wnd) == TRUE)
365 static void mape_window_cb_edit_undo(GtkAction* action,
374 static void mape_window_cb_edit_redo(GtkAction* action,
383 static void mape_window_cb_edit_can_undo(GObject*
object,
390 gtk_action_set_sensitive(
392 gtk_source_buffer_can_undo(GTK_SOURCE_BUFFER(
object))
396 static void mape_window_cb_edit_can_redo(GObject*
object,
403 gtk_action_set_sensitive(
405 gtk_source_buffer_can_redo(GTK_SOURCE_BUFFER(
object))
409 static void mape_window_cb_edit_preferences(GtkAction* action,
423 result = gtk_dialog_run(GTK_DIALOG(dialog->
dialog) );
424 if(result == GTK_RESPONSE_OK)
439 static void mape_window_cb_help_about(GtkAction* action,
443 GtkWidget* about_dialog;
445 const gchar* authors[] = {
447 " Armin Burgmeier <armin@arbur.net>",
450 " Tyron Madlener <tm@tyron.at>",
451 " Günther Brammer <gbrammer@gmx.de>",
455 const gchar* artists[] = {
456 "Stefan \"KaZoiTeZ\" Ryll",
461 about_dialog = gtk_about_dialog_new();
463 gtk_about_dialog_set_program_name(
464 GTK_ABOUT_DIALOG(about_dialog),
468 gtk_about_dialog_set_version(
469 GTK_ABOUT_DIALOG(about_dialog),
473 gtk_about_dialog_set_copyright(
474 GTK_ABOUT_DIALOG(about_dialog),
475 "Copyright \xc2\xa9 2005-2013 Armin Burgmeier"
478 gtk_about_dialog_set_comments(
479 GTK_ABOUT_DIALOG(about_dialog),
480 "A Clonk Landscape.txt editor"
483 gtk_about_dialog_set_authors(
484 GTK_ABOUT_DIALOG(about_dialog),
488 gtk_about_dialog_set_artists(
489 GTK_ABOUT_DIALOG(about_dialog),
493 gtk_about_dialog_set_license(
494 GTK_ABOUT_DIALOG(about_dialog),
495 "Permission to use, copy, modify, and/or distribute this "
496 "software for any purpose with or without fee is hereby "
497 "granted, provided that the above copyright notice and this "
498 "permission notice appear in all copies.\n\n"
500 "THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS "
501 "ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL "
502 "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO "
503 "EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, "
504 "INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES "
505 "WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, "
506 "WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER "
507 "TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE "
508 "USE OR PERFORMANCE OF THIS SOFTWARE."
511 gtk_about_dialog_set_wrap_license(GTK_ABOUT_DIALOG(about_dialog), TRUE);
513 gtk_dialog_run(GTK_DIALOG(about_dialog) );
514 gtk_widget_destroy(about_dialog);
524 gchar* material_path;
526 gchar* landscape_path;
533 config_path = g_build_filename(g_get_home_dir(),
".mape", NULL);
537 current_dir = g_get_current_dir();
538 landscape_path = NULL;
540 for(i = 1; i < argc; ++ i)
542 basename = g_path_get_basename(argv[i]);
543 if(g_strcasecmp(basename,
"Material.ocg") == 0)
545 if(!g_path_is_absolute(argv[i]))
547 material_path = g_build_filename(
555 material_path = g_strdup(argv[i]);
564 g_free(material_path);
568 g_free(landscape_path);
570 if(!g_path_is_absolute(argv[i]))
572 landscape_path = g_build_filename(
580 landscape_path = g_strdup(argv[i]);
591 wnd->
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
612 goto edit_view_error;
623 goto disk_view_error;
629 gtk_toolbar_set_style(GTK_TOOLBAR(wnd->
toolbar), GTK_TOOLBAR_ICONS);
667 wnd->
topbox = gtk_vbox_new(FALSE, 0);
708 gtk_widget_show(wnd->
topbox);
711 GTK_CONTAINER(wnd->
window),
715 gtk_window_add_accel_group(
723 G_CALLBACK(mape_window_cb_realize),
730 G_CALLBACK(mape_window_cb_delete_event),
739 G_CALLBACK(mape_window_cb_file_new),
746 G_CALLBACK(mape_window_cb_file_open),
753 G_CALLBACK(mape_window_cb_file_save),
760 G_CALLBACK(mape_window_cb_file_save_as),
767 G_CALLBACK(mape_window_cb_file_quit),
774 G_CALLBACK(mape_window_cb_edit_undo),
781 G_CALLBACK(mape_window_cb_edit_redo),
787 gtk_text_view_get_buffer(
792 G_CALLBACK(mape_window_cb_edit_can_undo),
798 gtk_text_view_get_buffer(
803 G_CALLBACK(mape_window_cb_edit_can_redo),
810 G_CALLBACK(mape_window_cb_edit_preferences),
817 G_CALLBACK(mape_window_cb_help_about),
844 gtk_window_set_title(GTK_WINDOW(wnd->
window),
"Mape");
845 gtk_window_set_default_size(GTK_WINDOW(wnd->
window), 640, 480);
848 if(landscape_path != NULL)
850 mape_window_file_load(wnd, landscape_path);
851 g_free(landscape_path);
854 gtk_widget_show(wnd->
window);
868 g_free(landscape_path);
874 gtk_widget_destroy(wnd->
window);
const gchar * mape_config_file_entry_get_value(MapeConfigFileEntry *entry)
void mape_config_file_set_entry(MapeConfigFile *file, const gchar *key, const gchar *value)
MapeConfigFileEntry * mape_config_file_get_entry_by_key(MapeConfigFile *file, const gchar *key)
void mape_config_file_destroy(MapeConfigFile *file)
MapeConfigFile * mape_config_file_new(const gchar *filename)
gboolean mape_config_file_serialise(MapeConfigFile *file, GError **error)
gboolean mape_disk_view_extend_to_path(MapeDiskView *disk_view, const gchar *filepath, GError **error)
void mape_disk_view_destroy(MapeDiskView *disk_view)
MapeDiskView * mape_disk_view_new(MapeFileIconSet *icon_set, MapeMatTexView *mat_tex, MapeEditView *edit_view, MapeConfigFile *config, GError **error)
MapeEditView * mape_edit_view_new(MapePreView *pre_view, MapeStatusbar *statusbar, GError **error)
void mape_edit_view_undo(MapeEditView *edit_view)
gboolean mape_edit_view_get_modified(MapeEditView *view)
void mape_edit_view_redo(MapeEditView *edit_view)
void mape_edit_view_destroy(MapeEditView *view)
gboolean mape_edit_view_open(MapeEditView *view, const gchar *filename, GError **error)
void mape_edit_view_clear(MapeEditView *view)
gboolean mape_edit_view_save(MapeEditView *view, const gchar *filename, GError **error)
void mape_edit_view_apply_preferences(MapeEditView *edit_view, MapePreferences *preferences)
void mape_file_icon_set_destroy(MapeFileIconSet *set)
MapeFileIconSet * mape_file_icon_set_new(GtkWidget *widget)
MapeMatTexView * mape_mat_tex_view_new(MapeFileIconSet *icon_set, GError **error)
void mape_mat_tex_view_destroy(MapeMatTexView *view)
void mape_preferences_from_config(MapePreferences *preferences, MapeConfigFile *config)
void mape_preferences_to_config(MapePreferences *preferences, MapeConfigFile *config)
MapePreferences mape_preferences_dialog_get(MapePreferencesDialog *dialog)
MapePreferencesDialog * mape_preferences_dialog_new(GtkWindow *parent, MapePreferences *prefs)
void mape_preferences_dialog_destroy(MapePreferencesDialog *dialog)
void mape_pre_view_apply_preferences(MapePreView *view, MapePreferences *preferences)
MapePreView * mape_pre_view_new(MapeMatTexView *mat_tex, GError **error)
void mape_pre_view_destroy(MapePreView *view)
MapeStatusbar * mape_statusbar_new(void)
void mape_statusbar_destroy(MapeStatusbar *bar)
const char * c4_version_get()
MapeWindow * mape_window_new(int argc, char *argv[], GError **error)
void mape_window_destroy(MapeWindow *wnd)
MapeFileIconSet * icon_set
MapeMatTexView * mat_tex_view
MapePreferences preferences
MapeStatusbar * statusbar