+ GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( g_TextureBrowser.m_assigned_tree ) );
+ gtk_tree_selection_set_mode( selection, GTK_SELECTION_MULTIPLE );
+
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes( "", renderer, "text", TAG_COLUMN, NULL );
+ gtk_tree_view_append_column( GTK_TREE_VIEW( g_TextureBrowser.m_assigned_tree ), column );
+ gtk_widget_show( g_TextureBrowser.m_assigned_tree );
+
+ gtk_widget_show( scrolled_win );
+ gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW( scrolled_win ), GTK_WIDGET( g_TextureBrowser.m_assigned_tree ) );
+
+ gtk_table_attach( GTK_TABLE( frame_table ), scrolled_win, 0, 1, 1, 3, GTK_FILL, GTK_FILL, 0, 0 );
+ }
+ { // available tag list
+ GtkWidget* scrolled_win = gtk_scrolled_window_new( NULL, NULL );
+ gtk_container_set_border_width( GTK_CONTAINER( scrolled_win ), 0 );
+ gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scrolled_win ), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS );
+
+ g_TextureBrowser.m_available_store = gtk_list_store_new( N_COLUMNS, G_TYPE_STRING );
+ GtkTreeSortable* sortable = GTK_TREE_SORTABLE( g_TextureBrowser.m_available_store );
+ gtk_tree_sortable_set_sort_column_id( sortable, TAG_COLUMN, GTK_SORT_ASCENDING );
+
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+
+ g_TextureBrowser.m_available_tree = gtk_tree_view_new_with_model( GTK_TREE_MODEL( g_TextureBrowser.m_available_store ) );
+ g_object_unref( G_OBJECT( g_TextureBrowser.m_available_store ) );
+ g_signal_connect( g_TextureBrowser.m_available_tree, "row-activated", (GCallback) TextureBrowser_assignTags, NULL );
+ gtk_tree_view_set_headers_visible( GTK_TREE_VIEW( g_TextureBrowser.m_available_tree ), FALSE );
+
+ GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( g_TextureBrowser.m_available_tree ) );
+ gtk_tree_selection_set_mode( selection, GTK_SELECTION_MULTIPLE );
+
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes( "", renderer, "text", TAG_COLUMN, NULL );
+ gtk_tree_view_append_column( GTK_TREE_VIEW( g_TextureBrowser.m_available_tree ), column );
+ gtk_widget_show( g_TextureBrowser.m_available_tree );
+
+ gtk_widget_show( scrolled_win );
+ gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW( scrolled_win ), GTK_WIDGET( g_TextureBrowser.m_available_tree ) );
+
+ gtk_table_attach( GTK_TABLE( frame_table ), scrolled_win, 2, 3, 1, 3, GTK_FILL, GTK_FILL, 0, 0 );
+ }
+ { // tag arrow buttons
+ GtkWidget* m_btn_left = gtk_button_new();
+ GtkWidget* m_btn_right = gtk_button_new();
+ GtkWidget* m_arrow_left = gtk_arrow_new( GTK_ARROW_LEFT, GTK_SHADOW_OUT );
+ GtkWidget* m_arrow_right = gtk_arrow_new( GTK_ARROW_RIGHT, GTK_SHADOW_OUT );
+ gtk_container_add( GTK_CONTAINER( m_btn_left ), m_arrow_left );
+ gtk_container_add( GTK_CONTAINER( m_btn_right ), m_arrow_right );
+
+ // workaround. the size of the tag frame depends of the requested size of the arrow buttons.
+ gtk_widget_set_size_request( m_arrow_left, -1, 68 );
+ gtk_widget_set_size_request( m_arrow_right, -1, 68 );
+
+ gtk_table_attach( GTK_TABLE( frame_table ), m_btn_left, 1, 2, 1, 2, GTK_SHRINK, GTK_EXPAND, 0, 0 );
+ gtk_table_attach( GTK_TABLE( frame_table ), m_btn_right, 1, 2, 2, 3, GTK_SHRINK, GTK_EXPAND, 0, 0 );
+
+ g_signal_connect( G_OBJECT( m_btn_left ), "clicked", G_CALLBACK( TextureBrowser_assignTags ), NULL );
+ g_signal_connect( G_OBJECT( m_btn_right ), "clicked", G_CALLBACK( TextureBrowser_removeTags ), NULL );
+
+ gtk_widget_show( m_btn_left );
+ gtk_widget_show( m_btn_right );
+ gtk_widget_show( m_arrow_left );
+ gtk_widget_show( m_arrow_right );
+ }
+ { // tag fram labels
+ GtkWidget* m_lbl_assigned = gtk_label_new( "Assigned" );
+ GtkWidget* m_lbl_unassigned = gtk_label_new( "Available" );
+
+ gtk_table_attach( GTK_TABLE( frame_table ), m_lbl_assigned, 0, 1, 0, 1, GTK_EXPAND, GTK_SHRINK, 0, 0 );
+ gtk_table_attach( GTK_TABLE( frame_table ), m_lbl_unassigned, 2, 3, 0, 1, GTK_EXPAND, GTK_SHRINK, 0, 0 );
+
+ gtk_widget_show( m_lbl_assigned );
+ gtk_widget_show( m_lbl_unassigned );
+ }
+ }
+ else { // no tag support, show the texture tree only
+ gtk_box_pack_start( GTK_BOX( vbox ), g_TextureBrowser.m_scr_win_tree, TRUE, TRUE, 0 );