19 #include <gdk/gdkkeysyms.h>
28 static gboolean mape_disk_view_find_iter(
MapeDiskView* disk_view,
36 result = gtk_tree_model_iter_children(
52 if(g_strcasecmp(filename, file) == 0)
59 result = gtk_tree_model_iter_next(disk_view->
tree_store, child);
65 static gchar* mape_disk_view_get_file_path(
MapeDiskView* disk_view,
87 result = gtk_tree_model_iter_parent(
105 temp_path = g_build_filename(component, cur_path, NULL);
108 temp_path = g_build_filename(
"/", component, cur_path, NULL);
110 g_free(component); g_free(cur_path);
111 cur_path = temp_path;
119 static gboolean mape_disk_view_load_materials(
MapeDiskView* disk_view,
120 GtkTreeIter* material_iter,
123 GtkTreeIter parent_iter;
124 GtkTreeIter new_parent;
134 gboolean overload_materials;
135 gboolean overload_textures;
146 has_parent = gtk_tree_model_iter_parent(
152 if(has_parent == TRUE)
162 g_assert(parent_group != NULL);
177 if(group == NULL)
return FALSE;
196 g_object_unref(texture_map);
203 overloaded_group = NULL;
204 if(overload_materials || overload_textures)
207 has_parent = gtk_tree_model_iter_parent(
215 has_parent = gtk_tree_model_iter_parent(
221 if(has_parent == FALSE)
224 parent_iter = new_parent;
245 if(overloaded_group == NULL)
247 g_object_unref(texture_map);
256 mat_path = mape_disk_view_get_file_path(disk_view, material_iter);
274 g_object_unref(texture_map);
278 if(overloaded_group != NULL)
279 mape_group_destroy(overloaded_group);
287 static gboolean mape_disk_view_load(
MapeDiskView* disk_view,
288 GtkTreeIter* parent_iter,
291 GtkTreeIter child_iter;
292 GtkTreeIter group_iter;
293 GtkTreeIter temp_iter;
305 if(parent_iter != NULL)
316 if(parent_group != NULL)
320 deplevel = gtk_tree_model_iter_parent(
336 g_assert(parent_group != NULL);
349 if(parent_group != NULL)
360 filename = g_convert(
370 filename = g_filename_from_utf8(
389 if(child_group == NULL)
397 (gpointer)child_group,
428 utf8_file = g_convert(
438 utf8_file = g_filename_to_utf8(
448 filename = utf8_file;
454 gtk_tree_store_append(
461 if(g_strcasecmp(filename,
"Material.ocg") != 0)
463 gtk_tree_store_append(
470 fileext = strrchr(filename,
'.');
475 if(g_strcasecmp(fileext,
".ocd") == 0)
477 else if(g_strcasecmp(fileext,
".ocf") == 0)
479 else if(g_strcasecmp(fileext,
".ocg") == 0)
481 else if(g_strcasecmp(fileext,
".ocs") == 0)
505 gtk_tree_model_ref_node(
518 static gboolean mape_disk_view_cb_key_press_event(GtkWidget* widget,
528 if(event->keyval != GDK_KEY_Left && event->keyval != GDK_KEY_Right)
531 gtk_tree_view_get_cursor(
532 GTK_TREE_VIEW(disk_view->
view),
537 if(path == NULL)
return FALSE;
539 switch(event->keyval)
542 result = gtk_tree_view_row_expanded(
543 GTK_TREE_VIEW(disk_view->
view),
549 gtk_tree_view_collapse_row(
550 GTK_TREE_VIEW(disk_view->
view),
556 if(gtk_tree_path_get_depth(path) > 1)
558 result = gtk_tree_path_up(path);
559 g_assert(result == TRUE);
561 gtk_tree_view_set_cursor(
562 GTK_TREE_VIEW(disk_view->
view),
572 result = gtk_tree_view_row_expanded(
573 GTK_TREE_VIEW(disk_view->
view),
579 gtk_tree_path_down(path);
581 gtk_tree_view_set_cursor(
582 GTK_TREE_VIEW(disk_view->
view),
590 gtk_tree_view_expand_row(
591 GTK_TREE_VIEW(disk_view->
view),
599 g_assert_not_reached();
603 gtk_tree_path_free(path);
607 static gboolean mape_disk_view_cb_button_press_event(GtkWidget* widget,
608 GdkEventButton* event,
616 GError* error = NULL;
617 GtkWidget* error_dialog;
621 if(event->type == GDK_2BUTTON_PRESS)
623 gtk_tree_view_get_cursor(
624 GTK_TREE_VIEW(disk_view->
view),
629 if(path == NULL)
return FALSE;
631 gtk_tree_model_get_iter(
646 if(g_strcasecmp(filename,
"Material.ocg") == 0)
648 result = mape_disk_view_load_materials(
656 error_dialog = gtk_message_dialog_new(
666 gtk_dialog_run(GTK_DIALOG(error_dialog) );
667 gtk_widget_destroy(error_dialog);
672 result = gtk_tree_view_row_expanded(
673 GTK_TREE_VIEW(disk_view->
view),
679 gtk_tree_view_collapse_row(
680 GTK_TREE_VIEW(disk_view->
view),
686 gtk_tree_view_expand_row(
687 GTK_TREE_VIEW(disk_view->
view),
695 gtk_tree_path_free(path);
702 static void mape_disk_view_cb_row_expanded(GtkTreeView* treeview,
710 GtkTreeIter temp_iter;
712 GError* error = NULL;
713 GtkWidget* error_dialog;
716 result = gtk_tree_model_get_iter(
722 g_assert(result == TRUE);
736 gtk_tree_model_iter_n_children(
742 result = gtk_tree_model_iter_children(
748 g_assert(result == TRUE);
750 result = gtk_tree_store_remove(
755 g_assert(result == FALSE);
758 if(mape_disk_view_load(disk_view, &iter, &error) == FALSE)
760 error_dialog = gtk_message_dialog_new(
770 gtk_dialog_run(GTK_DIALOG(error_dialog) );
771 gtk_widget_destroy(error_dialog);
778 gtk_tree_view_expand_row(
779 GTK_TREE_VIEW(disk_view->
view),
786 static void mape_disk_view_close_groups(
MapeDiskView* disk_view,
791 gboolean has_child, has_next;
801 has_child = gtk_tree_model_iter_children(
807 has_next = gtk_tree_model_iter_next(
812 if(has_child == TRUE)
813 mape_disk_view_close_groups(disk_view, &child);
816 g_object_unref(group);
819 mape_disk_view_close_groups(disk_view, iter);
858 view->
col_file = gtk_tree_view_column_new();
868 gtk_tree_view_column_pack_start(
874 gtk_tree_view_column_pack_start(
880 gtk_tree_view_column_set_attributes(
887 gtk_tree_view_column_set_attributes(
894 gtk_tree_view_column_set_spacing(
899 view->
view = gtk_tree_view_new_with_model(
903 gtk_widget_add_events(
905 GDK_BUTTON_PRESS_MASK |
909 gtk_tree_view_append_column(GTK_TREE_VIEW(view->
view), view->
col_file);
911 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view->
view), FALSE);
912 gtk_tree_sortable_set_sort_column_id(
919 G_OBJECT(view->
view),
921 G_CALLBACK(mape_disk_view_cb_row_expanded),
926 G_OBJECT(view->
view),
927 "button-press-event",
928 G_CALLBACK(mape_disk_view_cb_button_press_event),
933 G_OBJECT(view->
view),
935 G_CALLBACK(mape_disk_view_cb_key_press_event),
939 if(mape_disk_view_load(view, NULL, error) == FALSE)
942 gtk_widget_destroy(view->
view);
949 gtk_widget_show(view->
view);
951 view->
window = gtk_scrolled_window_new(NULL, NULL);
953 GTK_CONTAINER(view->
window),
957 gtk_scrolled_window_set_policy(
958 GTK_SCROLLED_WINDOW(view->
window),
959 GTK_POLICY_AUTOMATIC,
963 gtk_scrolled_window_set_shadow_type(
964 GTK_SCROLLED_WINDOW(view->
window),
968 gtk_widget_set_size_request(view->
window, 150, -1);
969 gtk_widget_show(view->
window);
978 if(gtk_tree_model_get_iter_first(disk_view->
tree_store, &iter))
979 mape_disk_view_close_groups(disk_view, &iter);
985 g_object_unref(G_OBJECT(disk_view->
tree_store) );
990 const gchar* filepath,
993 gchar** path_components;
994 gchar** cur_component;
1000 gboolean got_parent;
1002 path_components = g_strsplit_set(filepath,
"/\\", 0);
1007 for(cur_component = path_components;
1008 *cur_component != NULL;
1011 file = *cur_component;
1012 if(*file ==
'\0')
continue;
1013 if(strcmp(file,
".") == 0)
continue;
1015 if(strcmp(file,
"..") == 0)
1017 if(got_parent == FALSE)
1021 g_quark_from_static_string(
1022 "MAPE_DISK_VIEW_ERROR"
1029 g_strfreev(path_components);
1036 got_parent = gtk_tree_model_iter_parent(
1045 if(got_parent == FALSE)
1047 result = mape_disk_view_find_iter(
1056 result = mape_disk_view_find_iter(
1069 g_quark_from_static_string(
1070 "MAPE_DISK_VIEW_ERROR"
1073 "%s: No such file or directory",
1077 g_strfreev(path_components);
1081 if(g_ascii_strcasecmp(file,
"Material.ocg") == 0)
1084 result = mape_disk_view_load_materials(
1090 g_strfreev(path_components);
1097 path = gtk_tree_model_get_path(
1102 gtk_tree_view_expand_row(
1103 GTK_TREE_VIEW(disk_view->
view),
1109 gtk_tree_model_get_iter(
1116 gtk_tree_path_free(path);
1122 g_strfreev(path_components);
void mape_config_file_set_entry(MapeConfigFile *file, const gchar *key, const gchar *value)
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)
GtkTreeModel * tree_store
@ MAPE_DISK_VIEW_COLUMN_COUNT
@ MAPE_DISK_VIEW_COLUMN_FILE
@ MAPE_DISK_VIEW_COLUMN_ICON
@ MAPE_DISK_VIEW_COLUMN_GROUP
GtkTreeViewColumn * col_file
GtkCellRenderer * renderer_icon
@ MAPE_DISK_VIEW_ERROR_NOENT
MapeFileIconSet * icon_set
GtkCellRenderer * renderer_file
void mape_edit_view_reload(MapeEditView *edit_view)
MapeFileIcon * mape_file_icon_set_lookup(MapeFileIconSet *set, MapeFileIconType type)
GdkPixbuf * mape_file_icon_get(MapeFileIcon *icon)
@ MAPE_FILE_ICON_C4OBJECT
@ MAPE_FILE_ICON_C4SCENARIO
@ MAPE_FILE_ICON_C4FOLDER
enum MapeFileIconType_ MapeFileIconType
MapeGroup * mape_group_open_child(MapeGroup *group, const gchar *entry, GError **error)
gchar * mape_group_get_next_entry(MapeGroup *group)
MapeGroup * mape_group_new(void)
gboolean mape_group_is_drive_container(MapeGroup *group)
gboolean mape_group_is_child_folder(MapeGroup *group, const gchar *child)
gboolean mape_group_open(MapeGroup *group, const gchar *path, GError **error)
gboolean mape_group_has_entry(MapeGroup *group, const gchar *entry)
void mape_mapgen_set_root_group(MapeGroup *group)
gboolean mape_mat_tex_view_reload(MapeMatTexView *view, MapeTextureMap *new_tex_map, MapeGroup *base_group, gboolean overload_materials, gboolean overload_textures, MapeGroup *overload_from, GError **error)
gboolean mape_texture_map_get_overload_textures(MapeTextureMap *texture_map)
MapeTextureMap * mape_texture_map_new(void)
gboolean mape_texture_map_get_overload_materials(MapeTextureMap *texture_map)
gboolean mape_texture_map_load_map(MapeTextureMap *texture_map, MapeGroup *group, GError **error)