17 #include <gtksourceview/gtksourceview.h>
18 #include <gtksourceview/gtksourcebuffer.h>
50 static void mape_edit_view_set_filename(
MapeEditView* view,
51 const gchar* filename)
58 gchar* utf8_file_casefold;
59 gchar* utf8_landscape_txt_casefold;
61 const gchar* lang_name;
62 const gchar* lang_filename;
63 GtkSourceLanguage* lang;
64 GtkSourceStyleScheme*
style;
65 GtkWidget* error_dialog;
67 buf = GTK_SOURCE_BUFFER(
68 gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->
view) )
85 basename = g_path_get_basename(filename);
88 utf8_file = g_filename_to_utf8(
100 utf8_file_casefold = g_utf8_casefold(utf8_file, -1);
101 utf8_landscape_txt_casefold = g_utf8_casefold(
"landscape.txt", -1);
104 if(g_utf8_collate(utf8_file_casefold, utf8_landscape_txt_casefold) == 0)
108 g_free(utf8_file_casefold);
109 g_free(utf8_landscape_txt_casefold);
117 if(new_type != view->
type)
119 view->
type = new_type;
123 lang_name =
"c4landscape";
124 lang_filename =
"Landscape.txt";
127 lang_name =
"c4mapscript";
128 lang_filename =
"Map.c";
132 g_assert_not_reached();
137 lang = gtk_source_language_manager_get_language(
142 style = gtk_source_style_scheme_manager_get_scheme(
147 if(lang == NULL ||
style == NULL)
150 error_dialog = gtk_message_dialog_new(
155 "Syntax Highlighting Not Available"
158 gtk_message_dialog_format_secondary_text(
159 GTK_MESSAGE_DIALOG(error_dialog),
160 "The syntax highlighting file for %s files "
161 "could not be located. Perhaps mape has not "
162 "been properly installed. Syntax "
163 "highlighting is disabled.",
167 gtk_window_set_title(GTK_WINDOW(error_dialog),
"Mape");
169 gtk_dialog_run(GTK_DIALOG(error_dialog) );
170 gtk_widget_destroy(error_dialog);
174 gtk_source_buffer_set_language(buf, lang);
175 gtk_source_buffer_set_style_scheme(buf,
style);
181 mape_edit_view_thread_result_destroy_func(gpointer data)
184 if(result->
pixbuf != NULL) g_object_unref(G_OBJECT(result->
pixbuf));
185 if(result->
error != NULL) g_error_free(result->
error);
190 static void mape_edit_view_cb_changed(GtkTextBuffer* buffer,
196 static void mape_edit_view_cb_update(GtkWidget* widget,
203 static GdkPixbuf* mape_edit_view_render_map(
const gchar* source,
205 const gchar* file_path,
217 const gchar* filename;
223 if(mat_map == NULL || tex_map == NULL)
227 g_quark_from_static_string(
"MAPE_EDIT_VIEW_ERROR"),
229 "Material.ocg is not loaded"
235 if(file_path != NULL)
237 basename = g_path_get_basename(file_path);
240 dirname = g_path_get_dirname(file_path);
241 scriptname = g_build_filename(dirname,
"Script.c", NULL);
251 filename =
"Landscape.txt";
258 g_assert_not_reached();
278 map_width = gdk_pixbuf_get_width(pixbuf);
279 map_height = gdk_pixbuf_get_height(pixbuf);
281 zoom_width = (guint)(map_width * map_zoom + 0.5);
282 zoom_height = (guint)(map_height * map_zoom + 0.5);
283 if(map_width != zoom_width || map_height != zoom_height)
285 zoombuf = gdk_pixbuf_scale_simple(
292 g_object_unref(pixbuf);
302 mape_edit_view_thread_result(gpointer data_)
313 if(result->
pixbuf == NULL)
315 g_assert(result->
error != NULL);
319 result->
error->message
324 now = g_get_monotonic_time();
327 time_text = g_strdup_printf(
328 "Landscape rendered successfully (%.2fs)",
350 static gpointer mape_edit_view_thread_entry(gpointer data_)
354 GError* error = NULL;
359 res_buf = mape_edit_view_render_map(
374 result->
error = error;
381 result->
idle_id = g_idle_add_full(
382 G_PRIORITY_DEFAULT_IDLE,
383 mape_edit_view_thread_result,
385 mape_edit_view_thread_result_destroy_func
398 GtkSourceBuffer* buf;
399 GPtrArray* search_dirs;
400 const gchar*
const* data_dirs;
401 const gchar*
const* dir;
413 view->
view = gtk_source_view_new();
414 buf = GTK_SOURCE_BUFFER(
415 gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->
view) )
418 g_signal_connect_after(
421 G_CALLBACK(mape_edit_view_cb_changed),
427 "button-press-event",
428 G_CALLBACK(mape_edit_view_cb_update),
432 view->
font_desc = pango_font_description_new();
433 pango_font_description_set_family(view->
font_desc,
"monospace");
436 search_dirs = g_ptr_array_new();
440 g_win32_get_package_installation_subdirectory(NULL, NULL,
"mape-syntax")
446 g_build_filename(g_get_home_dir(),
".mape-syntax", NULL)
451 g_strdup(
"./mape-syntax")
456 g_strdup(
"./src/mape/mape-syntax")
459 data_dirs = g_get_system_data_dirs();
460 for(dir = data_dirs; *dir != NULL; ++ dir)
461 g_ptr_array_add(search_dirs, g_build_filename(*dir,
"mape", NULL));
462 g_ptr_array_add(search_dirs, NULL);
465 gtk_source_language_manager_set_search_path(
467 (gchar**)search_dirs->pdata
471 gtk_source_style_scheme_manager_set_search_path(
473 (gchar**)search_dirs->pdata
476 g_ptr_array_foreach(search_dirs, (GFunc)g_free, NULL);
477 g_ptr_array_free(search_dirs, TRUE);
479 mape_edit_view_set_filename(view, NULL);
481 gtk_widget_show(view->
view);
483 view->
window = gtk_scrolled_window_new(NULL, NULL);
485 gtk_scrolled_window_set_policy(
486 GTK_SCROLLED_WINDOW(view->
window),
487 GTK_POLICY_AUTOMATIC,
491 gtk_scrolled_window_set_shadow_type(
492 GTK_SCROLLED_WINDOW(view->
window),
497 GTK_CONTAINER(view->
window),
501 gtk_widget_show(view->
window);
533 gtk_text_buffer_set_text(
534 gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->
view)),
539 gtk_text_buffer_set_modified(
540 gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->
view)),
546 const gchar* filename,
555 result = g_file_get_contents(filename, &contents, &length, error);
556 if(result == FALSE)
return FALSE;
559 result = g_utf8_validate(contents, length, NULL);
577 utf8_file = g_filename_to_utf8(
585 if(utf8_file == NULL)
586 utf8_file = g_strdup(
"<unknown file name>");
590 g_quark_from_static_string(
591 "MAPE_EDIT_VIEW_ERROR"
594 "Could not read file %s: Either the encoding "
595 "is unknown or it is a binary file",
612 mape_edit_view_set_filename(view, filename);
616 gtk_text_buffer_set_text(
617 gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->
view)),
624 gtk_text_buffer_set_modified(
625 gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->
view)),
633 const gchar* filename,
636 GtkTextBuffer* buffer;
643 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->
view) );
644 gtk_text_buffer_get_start_iter(buffer, &begin);
645 gtk_text_buffer_get_end_iter(buffer, &end);
646 source = gtk_text_buffer_get_text(buffer, &begin, &end, TRUE);
659 if(conv == NULL)
return FALSE;
661 result = g_file_set_contents(filename, conv, -1, error);
663 if(result == FALSE)
return FALSE;
665 gtk_text_buffer_set_modified(
666 gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->
view)),
670 mape_edit_view_set_filename(view, filename);
681 return gtk_text_buffer_get_modified(
682 gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->
view))
688 gtk_source_buffer_undo(
690 gtk_text_view_get_buffer(GTK_TEXT_VIEW(edit_view->
view))
697 gtk_source_buffer_redo(
699 gtk_text_view_get_buffer(GTK_TEXT_VIEW(edit_view->
view))
708 GtkSourceBuffer* buffer;
709 GtkWrapMode wrap_mode;
711 view = GTK_SOURCE_VIEW(edit_view->
view);
712 buffer = GTK_SOURCE_BUFFER(
713 gtk_text_view_get_buffer(GTK_TEXT_VIEW(view))
716 gtk_source_view_set_tab_width(
721 gtk_source_view_set_insert_spaces_instead_of_tabs(
726 gtk_source_view_set_auto_indent(
731 wrap_mode = GTK_WRAP_CHAR;
733 wrap_mode = GTK_WRAP_NONE;
734 gtk_text_view_set_wrap_mode(
739 gtk_source_view_set_show_line_numbers(
744 gtk_source_view_set_highlight_current_line(
749 gtk_source_buffer_set_highlight_matching_brackets(
766 GError* error = NULL;
768 GtkTextBuffer* buffer;
776 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(edit_view->
view) );
777 gtk_text_buffer_get_start_iter(buffer, &begin);
778 gtk_text_buffer_get_end_iter(buffer, &end);
782 data->
view = edit_view;
783 data->
source = gtk_text_buffer_get_text(buffer, &begin, &end, TRUE);
808 mape_edit_view_thread_entry,
MapeEditView * mape_edit_view_new(MapePreView *pre_view, MapeStatusbar *statusbar, GError **error)
void mape_edit_view_reload(MapeEditView *edit_view)
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)
MapeMaterialMap * mat_map
gboolean mape_edit_view_save(MapeEditView *view, const gchar *filename, GError **error)
void mape_edit_view_apply_preferences(MapeEditView *edit_view, MapePreferences *preferences)
GtkSourceStyleSchemeManager * style_manager
GtkSourceLanguageManager * lang_manager
MapeStatusbar * statusbar
PangoFontDescription * font_desc
@ MAPE_EDIT_VIEW_ERROR_UNKNOWN_ENCODING
@ MAPE_EDIT_VIEW_ERROR_MISSING_MAPS
GdkPixbuf * mape_mapgen_render(const gchar *filename, const gchar *source, MapeMapgenType type, const gchar *script_path, MapeMaterialMap *material_map, MapeTextureMap *texture_map, guint width, guint height, GError **error)
enum _MapeMapgenType MapeMapgenType
@ MAPE_MAPGEN_LANDSCAPE_TXT
MapeMaterialMap * mat_map
gboolean auto_indentation
gboolean bracket_matching
void mape_pre_view_update(MapePreView *view, GdkPixbuf *pixbuf)
void mape_random_seed(unsigned int seed)
void mape_statusbar_set_compile(MapeStatusbar *bar, const gchar *text)