+ strcat(buffer, "']");
+
+ g_slist_foreach(selected, (GFunc)gtk_tree_row_reference_free, NULL);
+
+ g_TextureBrowser.m_found_shaders.clear(); // delete old list
+ TagBuilder.TagSearch(buffer, g_TextureBrowser.m_found_shaders);
+
+ if(!g_TextureBrowser.m_found_shaders.empty()) // found something
+ {
+ size_t shaders_found = g_TextureBrowser.m_found_shaders.size();
+
+ globalOutputStream() << "Found " << shaders_found << " textures and shaders with " << tags_searched << "\n";
+ ScopeDisableScreenUpdates disableScreenUpdates("Searching...", "Loading Textures");
+
+ std::set<CopiedString>::iterator iter;
+
+ for(iter = g_TextureBrowser.m_found_shaders.begin(); iter != g_TextureBrowser.m_found_shaders.end(); iter++)
+ {
+ std::string path = (*iter).c_str();
+ size_t pos = path.find_last_of("/", path.size());
+ std::string name = path.substr(pos + 1, path.size());
+ path = path.substr(0, pos + 1);
+ TextureDirectory_loadTexture(path.c_str(), name.c_str());
+ }
+
+ g_TextureBrowser.m_searchedTags = true;
+ g_TextureBrowser_currentDirectory = tags_searched;
+
+ g_TextureBrowser.m_nTotalHeight = 0;
+ TextureBrowser_setOriginY(g_TextureBrowser, 0);
+ TextureBrowser_heightChanged(g_TextureBrowser);
+ TextureBrowser_updateTitle();
+ }
+ }
+ g_slist_free(selected);
+}
+
+GtkWidget* TextureBrowser_constructTagToolbar()
+{
+ GtkWidget* toolbar = gtk_toolbar_new();
+ GtkTooltips* toolbar_tips = gtk_tooltips_new();
+
+ GtkWidget* image = gtk_image_new_from_stock(GTK_STOCK_FIND, GTK_ICON_SIZE_SMALL_TOOLBAR);
+ GtkWidget* button = gtk_button_new();
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(TextureBrowser_searchTags), NULL);
+ gtk_tooltips_set_tip(GTK_TOOLTIPS(toolbar_tips), button, "Search with selected tags", "Search with selected tags");
+ gtk_container_add(GTK_CONTAINER(button), image);
+ gtk_container_add(GTK_CONTAINER(toolbar), button);
+ gtk_widget_show_all(button);
+
+ image = gtk_image_new_from_stock(GTK_STOCK_INDEX, GTK_ICON_SIZE_SMALL_TOOLBAR);
+ button = gtk_toggle_button_new();
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_tags_textures), NULL);
+ gtk_tooltips_set_tip(GTK_TOOLTIPS(toolbar_tips), button, "Toggle tag/texture view", "Toggle tag/texture view");
+ gtk_container_add(GTK_CONTAINER(button), image);
+ gtk_container_add(GTK_CONTAINER(toolbar), button);
+ gtk_widget_show_all(button);
+ return toolbar;
+}
+
+
+void TextureBrowser_checkTagFile()
+{
+ const char SHADERTAG_FILE[] = "shadertags.xml";
+ CopiedString default_filename, rc_filename;
+ StringOutputStream stream(256);
+
+ stream << LocalRcPath_get();
+ stream << SHADERTAG_FILE;
+ rc_filename = stream.c_str();
+
+ if(file_exists(rc_filename.c_str()))
+ {
+ g_TextureBrowser.m_tags = TagBuilder.OpenXmlDoc(rc_filename.c_str());
+
+ if(g_TextureBrowser.m_tags)
+ {
+ globalOutputStream() << "Loading tag file " << rc_filename.c_str() << ".\n";
+ }
+ }
+ else
+ {
+ // load default tagfile
+ stream.clear();
+ stream << g_pGameDescription->mGameToolsPath.c_str();
+ stream << SHADERTAG_FILE;
+ default_filename = stream.c_str();
+
+ if(file_exists(default_filename.c_str()))
+ {
+ g_TextureBrowser.m_tags = TagBuilder.OpenXmlDoc(default_filename.c_str(), rc_filename.c_str());
+
+ if(g_TextureBrowser.m_tags)
+ {
+ globalOutputStream() << "Loading default tag file " << default_filename.c_str() << ".\n";
+ }
+ }
+ else
+ {
+ globalErrorStream() << "Unable to find default tag file " << default_filename.c_str() << ". No tag support.\n";
+ }
+ }
+}
+
+GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
+{
+ // The gl_widget and the tag assignment frame should be packed into a GtkVPaned with the slider
+ // position stored in local.pref. gtk_paned_get_position() and gtk_paned_set_position() don't
+ // seem to work in gtk 2.4 and the arrow buttons don't handle GTK_FILL, so here's another thing
+ // for the "once-the-gtk-libs-are-updated-TODO-list" :x
+
+ TextureBrowser_checkTagFile();
+
+ if(g_TextureBrowser.m_tags)
+ {
+ g_TextureBrowser.m_all_tags_list = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING);
+ GtkTreeSortable* sortable = GTK_TREE_SORTABLE(g_TextureBrowser.m_all_tags_list);
+ gtk_tree_sortable_set_sort_column_id(sortable, TAG_COLUMN, GTK_SORT_ASCENDING);
+
+ TagBuilder.GetAllTags(g_TextureBrowser.m_all_tags);
+ TextureBrowser_buildTagList();
+ }
+
+ GlobalShaderSystem().setActiveShadersChangedNotify(ReferenceCaller<TextureBrowser, TextureBrowser_activeShadersChanged>(g_TextureBrowser));
+
+ g_TextureBrowser.m_parent = toplevel;
+
+ GtkWidget* table = gtk_table_new(3, 3, FALSE);
+ GtkWidget* frame_table = NULL;
+ GtkWidget* vbox = gtk_vbox_new(FALSE, 0);
+ gtk_table_attach(GTK_TABLE(table), vbox, 0, 1, 1, 3, GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show(vbox);
+
+ { // menu bar
+ GtkWidget* menu_bar = gtk_menu_bar_new();
+ GtkWidget* menu_view = gtk_menu_new();
+ GtkWidget* view_item = (GtkWidget*)TextureBrowser_constructViewMenu(GTK_MENU(menu_view));
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(view_item), menu_view);
+ gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), view_item);
+
+ GtkWidget* menu_tools = gtk_menu_new();
+ GtkWidget* tools_item = (GtkWidget*)TextureBrowser_constructToolsMenu(GTK_MENU(menu_tools));
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(tools_item), menu_tools);
+ gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), tools_item);
+
+ if(g_TextureBrowser.m_tags)
+ {
+ GtkWidget* menu_tags = gtk_menu_new();
+ GtkWidget* tags_item = (GtkWidget*)TextureBrowser_constructTagsMenu(GTK_MENU(menu_tags));
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(tags_item), menu_tags);
+ gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), tags_item);
+ }
+
+ gtk_table_attach(GTK_TABLE (table), menu_bar, 0, 3, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0);
+ gtk_widget_show(menu_bar);
+ }
+ { // tag tool bar
+ if(g_TextureBrowser.m_tags)
+ {
+ GtkWidget* toolbar = TextureBrowser_constructTagToolbar();
+
+ gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
+ gtk_widget_show(toolbar);
+ }
+ }
+ { // gl_widget scrollbar
+ GtkWidget* w = gtk_vscrollbar_new(GTK_ADJUSTMENT(gtk_adjustment_new (0,0,0,1,1,1)));
+ gtk_table_attach(GTK_TABLE (table), w, 2, 3, 1, 2, GTK_SHRINK, GTK_FILL, 0, 0);
+ gtk_widget_show(w);
+ g_TextureBrowser.m_texture_scroll = w;
+
+ GtkAdjustment *vadjustment = gtk_range_get_adjustment (GTK_RANGE (g_TextureBrowser.m_texture_scroll));
+ g_signal_connect(G_OBJECT(vadjustment), "value_changed", G_CALLBACK(TextureBrowser_verticalScroll), &g_TextureBrowser);
+
+ widget_set_visible(g_TextureBrowser.m_texture_scroll, g_TextureBrowser.m_showTextureScrollbar);
+ }
+ { // TreeView
+ g_TextureBrowser.m_scr_win_tree = gtk_scrolled_window_new(NULL, NULL);
+ gtk_container_set_border_width(GTK_CONTAINER(g_TextureBrowser.m_scr_win_tree), 0);
+
+ // vertical only scrolling for treeview
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(g_TextureBrowser.m_scr_win_tree), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+
+ gtk_box_pack_end(GTK_BOX(vbox), g_TextureBrowser.m_scr_win_tree, TRUE, TRUE, 0);
+ gtk_widget_show(g_TextureBrowser.m_scr_win_tree);
+
+ TextureBrowser_createTreeViewTree();
+
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(g_TextureBrowser.m_scr_win_tree), GTK_WIDGET(g_TextureBrowser.m_treeViewTree));
+ gtk_widget_show(GTK_WIDGET(g_TextureBrowser.m_treeViewTree));
+ }
+ { // TreeView for tags
+ if(g_TextureBrowser.m_tags)
+ {
+ g_TextureBrowser.m_scr_win_tags = gtk_scrolled_window_new(NULL, NULL);
+ gtk_container_set_border_width(GTK_CONTAINER(g_TextureBrowser.m_scr_win_tags), 0);
+
+ // vertical only scrolling for treeview
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(g_TextureBrowser.m_scr_win_tags), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+
+ gtk_box_pack_end(GTK_BOX(vbox), g_TextureBrowser.m_scr_win_tags, TRUE, TRUE, 0);
+
+ TextureBrowser_createTreeViewTags();
+
+ GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(g_TextureBrowser.m_treeViewTags));
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
+
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW (g_TextureBrowser.m_scr_win_tags), GTK_WIDGET (g_TextureBrowser.m_treeViewTags));
+ gtk_widget_show(GTK_WIDGET(g_TextureBrowser.m_treeViewTags));
+ }
+ }
+ { // gl_widget
+ g_TextureBrowser.m_gl_widget = glwidget_new(FALSE);
+ gtk_widget_ref(g_TextureBrowser.m_gl_widget);