[easytag/wip/future-gtk] Convert EtBrowser to a template widget



commit 5fbb109021be9a86d36848193a30ce0c2d7af45a
Author: David King <amigadave amigadave com>
Date:   Sun May 3 13:22:10 2015 +0100

    Convert EtBrowser to a template widget

 data/browser.ui                      | 1035 +++++++++++++---------------------
 data/browser_dialogs.ui              |  266 +++++++++
 data/org.gnome.EasyTAG.gresource.xml |    1 +
 src/browser.c                        |  343 +++++------
 4 files changed, 819 insertions(+), 826 deletions(-)
---
diff --git a/data/browser.ui b/data/browser.ui
index 12fc929..115c0ce 100644
--- a/data/browser.ui
+++ b/data/browser.ui
@@ -1,11 +1,11 @@
 <interface domain="easytag">
-    <requires lib="gtk+" version="3.4"/>
-    <object class="GtkListStore" id="directory_model">
+    <requires lib="gtk+" version="3.10"/>
+    <object class="GtkListStore" id="entry_model">
         <columns>
             <column type="gchararray"/>
         </columns>
     </object>
-    <object class="GtkListStore" id="files_model">
+    <object class="GtkListStore" id="file_model">
         <columns>
             <column type="gchararray"/>
             <column type="gchararray"/>
@@ -30,7 +30,7 @@
             <column type="GdkRGBA"/>
         </columns>
     </object>
-    <object class="GtkTreeStore" id="tree_model">
+    <object class="GtkTreeStore" id="directory_model">
         <columns>
             <column type="gchararray"/>
             <column type="gchararray"/>
@@ -62,411 +62,95 @@
             <column type="gboolean"/>
         </columns>
     </object>
-    <object class="GtkDialog" id="open_directory_dialog">
-        <property name="border-width">12</property>
-        <property name="destroy-with-parent">True</property>
-        <property name="title" translatable="yes">Browse Directory With</property>
-        <child internal-child="vbox">
-            <object class="GtkBox" id="open_directory_vbox">
+    <template class="EtBrowser" parent="GtkBin">
+        <property name="border-width">2</property>
+        <property name="visible">True</property>
+        <child>
+            <object class="GtkGrid" id="browser_grid">
+                <property name="column-spacing">6</property>
+                <property name="row-spacing">6</property>
+                <property name="visible">True</property>
                 <child>
-                    <object class="GtkGrid" id="open_directory_grid">
-                        <property name="column-spacing">12</property>
-                        <property name="row-spacing">6</property>
+                    <object class="GtkComboBox" id="entry_combo">
+                        <property name="has-entry">True</property>
+                        <property name="model">entry_model</property>
+                        <property name="entry-text-column">0</property>
+                        <property name="hexpand">True</property>
+                        <property name="tooltip-text" translatable="yes">Choose a directory to show in the 
browser</property>
                         <property name="visible">True</property>
-                        <child>
-                            <object class="GtkLabel" id="open_directory_label">
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes">Run Program</property>
-                                <property name="visible">True</property>
-                                <attributes>
-                                    <attribute name="weight" value="bold"/>
-                                </attributes>
-                            </object>
-                            <packing>
-                                <property name="left-attach">0</property>
-                                <property name="top-attach">0</property>
-                                <property name="width">2</property>
-                            </packing>
-                        </child>
-                        <child>
-                            <object class="GtkComboBox" id="open_directory_combo">
-                                <property name="has-entry">True</property>
-                                <property name="entry-text-column">0</property>
-                                <property name="margin-left">12</property>
-                                <property name="tooltip-text" translatable="yes">Enter the program to run; 
it will receive the current directory as a parameter</property>
-                                <property name="visible">True</property>
-                            </object>
-                            <packing>
-                                <property name="left-attach">0</property>
-                                <property name="top-attach">1</property>
-                            </packing>
-                        </child>
-                        <child>
-                            <object class="GtkButton" id="open_directory_button">
-                                <property name="label" translatable="yes">_Open</property>
-                                <property name="use-underline">True</property>
-                                <property name="visible">True</property>
-                            </object>
-                            <packing>
-                                <property name="left-attach">1</property>
-                                <property name="top-attach">1</property>
-                            </packing>
-                        </child>
-                    </object>
-                </child>
-                <child internal-child="action_area">
-                    <object class="GtkButtonBox" id="open_directory_button_box">
-                        <child>
-                            <object class="GtkButton" id="open_directory_cancel_button">
-                                <property name="label" translatable="yes">_Cancel</property>
-                                <property name="use-underline">True</property>
-                                <property name="visible">True</property>
-                            </object>
-                        </child>
-                        <child>
-                            <object class="GtkButton" id="open_directory_execute_button">
-                                <property name="can-default">True</property>
-                                <property name="label" translatable="yes">_Execute</property>
-                                <property name="use-underline">True</property>
-                                <property name="visible">True</property>
-                            </object>
-                        </child>
                     </object>
+                    <packing>
+                        <property name="left-attach">0</property>
+                        <property name="top-attach">0</property>
+                    </packing>
                 </child>
-            </object>
-        </child>
-        <action-widgets>
-            <action-widget response="-5">open_directory_execute_button</action-widget>
-            <action-widget response="-6">open_directory_cancel_button</action-widget>
-        </action-widgets>
-    </object>
-    <object class="GtkDialog" id="open_files_dialog">
-        <property name="border-width">12</property>
-        <property name="destroy-with-parent">True</property>
-        <property name="title" translatable="yes">Open Files With</property>
-        <child internal-child="vbox">
-            <object class="GtkBox" id="open_files_vbox">
                 <child>
-                    <object class="GtkGrid" id="open_files_grid">
-                        <property name="column-spacing">12</property>
-                        <property name="row-spacing">6</property>
+                    <object class="GtkButton" id="open_button">
+                        <property name="label" translatable="yes">_Open</property>
+                        <property name="tooltip-text" translatable="yes">Select a directory to 
browse</property>
+                        <property name="use-underline">True</property>
                         <property name="visible">True</property>
-                        <child>
-                            <object class="GtkLabel" id="open_files_label">
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes">Run Program</property>
-                                <property name="visible">True</property>
-                                <attributes>
-                                    <attribute name="weight" value="bold"/>
-                                </attributes>
-                            </object>
-                            <packing>
-                                <property name="left-attach">0</property>
-                                <property name="top-attach">0</property>
-                                <property name="width">2</property>
-                            </packing>
-                        </child>
-                        <child>
-                            <object class="GtkComboBox" id="open_files_combo">
-                                <property name="has-entry">True</property>
-                                <property name="entry-text-column">0</property>
-                                <property name="margin-left">12</property>
-                                <property name="tooltip-text" translatable="yes">Enter the program to run; 
it will receive the current files as a parameter</property>
-                                <property name="visible">True</property>
-                            </object>
-                            <packing>
-                                <property name="left-attach">0</property>
-                                <property name="top-attach">1</property>
-                            </packing>
-                        </child>
-                        <child>
-                            <object class="GtkButton" id="open_files_button">
-                                <property name="label" translatable="yes">_Open</property>
-                                <property name="use-underline">True</property>
-                                <property name="visible">True</property>
-                            </object>
-                            <packing>
-                                <property name="left-attach">1</property>
-                                <property name="top-attach">1</property>
-                            </packing>
-                        </child>
-                    </object>
-                </child>
-                <child internal-child="action_area">
-                    <object class="GtkButtonBox" id="open_files_button_box">
-                        <child>
-                            <object class="GtkButton" id="open_files_cancel_button">
-                                <property name="label" translatable="yes">_Cancel</property>
-                                <property name="use-underline">True</property>
-                                <property name="visible">True</property>
-                            </object>
-                        </child>
-                        <child>
-                            <object class="GtkButton" id="open_files_execute_button">
-                                <property name="can-default">True</property>
-                                <property name="label" translatable="yes">_Execute</property>
-                                <property name="use-underline">True</property>
-                                <property name="visible">True</property>
-                            </object>
-                        </child>
                     </object>
+                    <packing>
+                        <property name="left-attach">1</property>
+                        <property name="top-attach">0</property>
+                    </packing>
                 </child>
-            </object>
-        </child>
-        <action-widgets>
-            <action-widget response="-5">open_files_execute_button</action-widget>
-            <action-widget response="-6">open_files_cancel_button</action-widget>
-        </action-widgets>
-    </object>
-    <object class="GtkDialog" id="rename_directory_dialog">
-        <property name="border-width">12</property>
-        <property name="destroy-with-parent">True</property>
-        <property name="title" translatable="yes">Rename Directory</property>
-        <child internal-child="vbox">
-            <object class="GtkBox" id="vbox">
                 <child>
-                    <object class="GtkGrid" id="rename_grid">
-                        <property name="column-spacing">12</property>
-                        <property name="row-spacing">6</property>
+                    <object class="GtkLabel" id="files_label">
+                        <property name="label" translatable="yes">No files</property>
                         <property name="visible">True</property>
-                        <child>
-                            <object class="GtkLabel" id="rename_label">
-                                <property name="halign">start</property>
-                                <property name="visible">True</property>
-                                <attributes>
-                                    <attribute name="weight" value="bold"/>
-                                </attributes>
-                            </object>
-                            <packing>
-                                <property name="left-attach">0</property>
-                                <property name="top-attach">0</property>
-                                <property name="width">2</property>
-                            </packing>
-                        </child>
-                        <child>
-                            <object class="GtkLabel" id="rename_entry_label">
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes" comments="Translators: Used when 
renaming a directory to a literal name (entered in a text field) rather than using a name generated from a 
mask.">Literal name:</property>
-                                <property name="margin-left">12</property>
-                                <property name="visible">True</property>
-                            </object>
-                            <packing>
-                                <property name="left-attach">0</property>
-                                <property name="top-attach">1</property>
-                            </packing>
-                        </child>
-                        <child>
-                            <object class="GtkEntry" id="rename_entry">
-                                <property name="visible">True</property>
-                            </object>
-                            <packing>
-                                <property name="left-attach">1</property>
-                                <property name="top-attach">1</property>
-                            </packing>
-                        </child>
-                        <child>
-                            <object class="GtkCheckButton" id="rename_mask_check">
-                                <property name="label" translatable="yes">Use mask:</property>
-                                <property name="margin-left">12</property>
-                                <property name="tooltip-text" translatable="yes">Whether to use a mask when 
renaming directories</property>
-                                <property name="visible">True</property>
-                            </object>
-                            <packing>
-                                <property name="left-attach">0</property>
-                                <property name="top-attach">2</property>
-                            </packing>
-                        </child>
-                        <child>
-                            <object class="GtkEntry" id="rename_mask_entry">
-                                <property name="tooltip-text" translatable="yes">Select or type in a mask 
using codes (see Legend in Scanner Window) to rename the directory from tag fields</property>
-                                <property name="visible">True</property>
-                            </object>
-                            <packing>
-                                <property name="left-attach">1</property>
-                                <property name="top-attach">2</property>
-                            </packing>
-                        </child>
-                        <child>
-                            <object class="GtkLabel" id="rename_preview_label">
-                                <property name="label" translatable="yes">Rename directory preview</property>
-                                <property name="margin-left">12</property>
-                                <property name="visible">True</property>
-                            </object>
-                            <packing>
-                                <property name="left-attach">0</property>
-                                <property name="top-attach">3</property>
-                                <property name="width">2</property>
-                            </packing>
-                        </child>
-                    </object>
-                </child>
-                <child internal-child="action_area">
-                    <object class="GtkButtonBox" id="button_box">
-                        <child>
-                            <object class="GtkButton" id="cancel_button">
-                                <property name="label" translatable="yes">_Cancel</property>
-                                <property name="use-underline">True</property>
-                                <property name="visible">True</property>
-                            </object>
-                        </child>
-                        <child>
-                            <object class="GtkButton" id="rename_button">
-                                <property name="can-default">True</property>
-                                <property name="label" translatable="yes">_Rename</property>
-                                <property name="use-underline">True</property>
-                                <property name="visible">True</property>
-                            </object>
-                        </child>
                     </object>
+                    <packing>
+                        <property name="left-attach">2</property>
+                        <property name="top-attach">0</property>
+                    </packing>
                 </child>
-            </object>
-        </child>
-        <action-widgets>
-            <action-widget response="-10">rename_button</action-widget>
-            <action-widget response="-6">cancel_button</action-widget>
-        </action-widgets>
-    </object>
-    <object class="GtkGrid" id="browser_grid">
-        <property name="column-spacing">6</property>
-        <property name="row-spacing">6</property>
-        <property name="visible">True</property>
-        <child>
-            <object class="GtkComboBox" id="browser_combo">
-                <property name="has-entry">True</property>
-                <property name="model">directory_model</property>
-                <property name="entry-text-column">0</property>
-                <property name="hexpand">True</property>
-                <property name="tooltip-text" translatable="yes">Choose a directory to show in the 
browser</property>
-                <property name="visible">True</property>
-            </object>
-            <packing>
-                <property name="left-attach">0</property>
-                <property name="top-attach">0</property>
-            </packing>
-        </child>
-        <child>
-            <object class="GtkButton" id="open_button">
-                <property name="label" translatable="yes">_Open</property>
-                <property name="tooltip-text" translatable="yes">Select a directory to browse</property>
-                <property name="use-underline">True</property>
-                <property name="visible">True</property>
-            </object>
-            <packing>
-                <property name="left-attach">1</property>
-                <property name="top-attach">0</property>
-            </packing>
-        </child>
-        <child>
-            <object class="GtkLabel" id="files_label">
-                <property name="label" translatable="yes">No files</property>
-                <property name="visible">True</property>
-            </object>
-            <packing>
-                <property name="left-attach">2</property>
-                <property name="top-attach">0</property>
-            </packing>
-        </child>
-        <child>
-            <object class="GtkPaned" id="browser_paned">
-                <property name="orientation">horizontal</property>
-                <property name="visible">True</property>
                 <child>
-                    <object class="GtkNotebook" id="directory_album_artist_notebook">
-                        <property name="show-border">False</property>
-                        <property name="show-tabs">False</property>
+                    <object class="GtkPaned" id="browser_paned">
+                        <property name="orientation">horizontal</property>
                         <property name="visible">True</property>
                         <child>
-                            <object class="GtkScrolledWindow" id="directory_scrolled">
-                                <property name="expand">True</property>
-                                <property name="min-content-height">225</property>
-                                <property name="min-content-width">225</property>
+                            <object class="GtkNotebook" id="directory_album_artist_notebook">
+                                <property name="show-border">False</property>
+                                <property name="show-tabs">False</property>
                                 <property name="visible">True</property>
                                 <child>
-                                    <object class="GtkTreeView" id="directory_view">
-                                        <property name="model">tree_model</property>
-                                        <property name="headers-visible">False</property>
-                                        <property name="visible">True</property>
-                                        <child>
-                                            <object class="GtkTreeViewColumn" id="directory_column">
-                                                <property name="sizing">autosize</property>
-                                                <child>
-                                                    <object class="GtkCellRendererPixbuf" 
id="directory_icon_renderer"/>
-                                                    <attributes>
-                                                        <attribute name="gicon">4</attribute>
-                                                    </attributes>
-                                                </child>
-                                                <child>
-                                                    <object class="GtkCellRendererText" 
id="directory_text_renderer"/>
-                                                    <attributes>
-                                                        <attribute name="text">0</attribute>
-                                                    </attributes>
-                                                </child>
-                                            </object>
-                                        </child>
-                                    </object>
-                                </child>
-                            </object>
-                        </child>
-                        <child>
-                            <object class="GtkPaned" id="artist_album_paned">
-                                <property name="orientation">vertical</property>
-                                <property name="visible">True</property>
-                                <child>
-                                    <object class="GtkScrolledWindow" id="artist_scrolled">
+                                    <object class="GtkScrolledWindow" id="directory_scrolled">
                                         <property name="expand">True</property>
                                         <property name="min-content-height">225</property>
                                         <property name="min-content-width">225</property>
                                         <property name="visible">True</property>
                                         <child>
-                                            <object class="GtkTreeView" id="artist_view">
-                                                <property name="model">artist_model</property>
+                                            <object class="GtkTreeView" id="directory_view">
+                                                <property name="model">directory_model</property>
+                                                <property name="headers-visible">False</property>
                                                 <property name="visible">True</property>
+                                                <signal name="button-press-event" 
handler="on_directory_tree_button_press_event"/>
+                                                <signal name="key-press-event" 
handler="Browser_Tree_Node_Selected"/>
+                                                <signal name="popup-menu" 
handler="on_directory_tree_popup_menu"/>
+                                                <signal name="row-collapsed" handler="collapse_cb" 
swapped="true"/>
+                                                <signal name="row-expanded" handler="expand_cb" 
swapped="true"/>
                                                 <child>
-                                                    <object class="GtkTreeViewColumn" 
id="artist_view_column">
+                                                    <object class="GtkTreeViewColumn" id="directory_column">
                                                         <property name="sizing">autosize</property>
-                                                        <property name="title" 
translatable="yes">Artist</property>
-                                                        <child>
-                                                            <object class="GtkCellRendererPixbuf" 
id="artist_icon_renderer"/>
-                                                            <attributes>
-                                                                <attribute name="pixbuf">0</attribute>
-                                                            </attributes>
-                                                        </child>
                                                         <child>
-                                                            <object class="GtkCellRendererText" 
id="artist_text_renderer"/>
+                                                            <object class="GtkCellRendererPixbuf" 
id="directory_icon_renderer"/>
                                                             <attributes>
-                                                                <attribute 
name="foreground-rgba">6</attribute>
-                                                                <attribute name="text">1</attribute>
-                                                                <attribute name="weight">5</attribute>
+                                                                <attribute name="gicon">4</attribute>
                                                             </attributes>
                                                         </child>
-                                                    </object>
-                                                </child>
-                                                <child>
-                                                    <object class="GtkTreeViewColumn" 
id="artist_n_albums_column">
-                                                        <property name="sizing">autosize</property>
-                                                        <property name="title" translatable="yes"># 
Albums</property>
                                                         <child>
-                                                            <object class="GtkCellRendererText" 
id="artist_n_albums_text_renderer"/>
+                                                            <object class="GtkCellRendererText" 
id="directory_text_renderer"/>
                                                             <attributes>
-                                                                <attribute 
name="foreground-rgba">6</attribute>
-                                                                <attribute name="text">2</attribute>
-                                                                <attribute name="weight">5</attribute>
+                                                                <attribute name="text">0</attribute>
                                                             </attributes>
                                                         </child>
                                                     </object>
                                                 </child>
-                                                <child>
-                                                    <object class="GtkTreeViewColumn" 
id="artist_n_files_column">
-                                                        <property name="sizing">autosize</property>
-                                                        <property name="title" translatable="yes"># 
Files</property>
-                                                        <child>
-                                                            <object class="GtkCellRendererText" 
id="artist_n_files_text_renderer"/>
-                                                            <attributes>
-                                                                <attribute 
name="foreground-rgba">6</attribute>
-                                                                <attribute name="text">3</attribute>
-                                                                <attribute name="weight">5</attribute>
-                                                            </attributes>
-                                                        </child>
+                                                <child internal-child="selection">
+                                                    <object class="GtkTreeSelection" 
id="directory_selection">
+                                                        <signal name="changed" 
handler="Browser_Tree_Node_Selected" swapped="true"/>
                                                     </object>
                                                 </child>
                                             </object>
@@ -474,330 +158,405 @@
                                     </object>
                                 </child>
                                 <child>
-                                    <object class="GtkScrolledWindow" id="album_scrolled">
-                                        <property name="expand">True</property>
-                                        <property name="min-content-height">225</property>
-                                        <property name="min-content-width">225</property>
+                                    <object class="GtkPaned" id="artist_album_paned">
+                                        <property name="orientation">vertical</property>
                                         <property name="visible">True</property>
                                         <child>
-                                            <object class="GtkTreeView" id="album_view">
-                                                <property name="model">album_model</property>
+                                            <object class="GtkScrolledWindow" id="artist_scrolled">
+                                                <property name="expand">True</property>
+                                                <property name="min-content-height">225</property>
+                                                <property name="min-content-width">225</property>
                                                 <property name="visible">True</property>
                                                 <child>
-                                                    <object class="GtkTreeViewColumn" id="album_view_column">
-                                                        <property name="sizing">autosize</property>
-                                                        <property name="title" 
translatable="yes">Album</property>
+                                                    <object class="GtkTreeView" id="artist_view">
+                                                        <property name="model">artist_model</property>
+                                                        <property name="visible">True</property>
+                                                        <signal name="button-press-event" 
handler="on_artist_tree_button_press_event"/>
+                                                        <signal name="popup-menu" 
handler="on_artist_tree_popup_menu"/>
                                                         <child>
-                                                            <object class="GtkCellRendererPixbuf" 
id="album_icon_renderer"/>
-                                                            <attributes>
-                                                                <attribute name="gicon">0</attribute>
-                                                            </attributes>
+                                                            <object class="GtkTreeViewColumn" 
id="artist_view_column">
+                                                                <property name="sizing">autosize</property>
+                                                                <property name="title" 
translatable="yes">Artist</property>
+                                                                <child>
+                                                                    <object class="GtkCellRendererPixbuf" 
id="artist_icon_renderer"/>
+                                                                    <attributes>
+                                                                        <attribute 
name="pixbuf">0</attribute>
+                                                                    </attributes>
+                                                                </child>
+                                                                <child>
+                                                                    <object class="GtkCellRendererText" 
id="artist_text_renderer"/>
+                                                                    <attributes>
+                                                                        <attribute 
name="foreground-rgba">6</attribute>
+                                                                        <attribute name="text">1</attribute>
+                                                                        <attribute 
name="weight">5</attribute>
+                                                                    </attributes>
+                                                                </child>
+                                                            </object>
                                                         </child>
                                                         <child>
-                                                            <object class="GtkCellRendererText" 
id="album_text_renderer"/>
-                                                            <attributes>
-                                                                <attribute 
name="foreground-rgba">5</attribute>
-                                                                <attribute name="text">1</attribute>
-                                                                <attribute name="weight">4</attribute>
-                                                            </attributes>
+                                                            <object class="GtkTreeViewColumn" 
id="artist_n_albums_column">
+                                                                <property name="sizing">autosize</property>
+                                                                <property name="title" translatable="yes"># 
Albums</property>
+                                                                <child>
+                                                                    <object class="GtkCellRendererText" 
id="artist_n_albums_text_renderer"/>
+                                                                    <attributes>
+                                                                        <attribute 
name="foreground-rgba">6</attribute>
+                                                                        <attribute name="text">2</attribute>
+                                                                        <attribute 
name="weight">5</attribute>
+                                                                    </attributes>
+                                                                </child>
+                                                            </object>
+                                                        </child>
+                                                        <child>
+                                                            <object class="GtkTreeViewColumn" 
id="artist_n_files_column">
+                                                                <property name="sizing">autosize</property>
+                                                                <property name="title" translatable="yes"># 
Files</property>
+                                                                <child>
+                                                                    <object class="GtkCellRendererText" 
id="artist_n_files_text_renderer"/>
+                                                                    <attributes>
+                                                                        <attribute 
name="foreground-rgba">6</attribute>
+                                                                        <attribute name="text">3</attribute>
+                                                                        <attribute 
name="weight">5</attribute>
+                                                                    </attributes>
+                                                                </child>
+                                                            </object>
                                                         </child>
                                                     </object>
                                                 </child>
+                                            </object>
+                                        </child>
+                                        <child>
+                                            <object class="GtkScrolledWindow" id="album_scrolled">
+                                                <property name="expand">True</property>
+                                                <property name="min-content-height">225</property>
+                                                <property name="min-content-width">225</property>
+                                                <property name="visible">True</property>
                                                 <child>
-                                                    <object class="GtkTreeViewColumn" 
id="album_n_files_column">
-                                                        <property name="sizing">autosize</property>
-                                                        <property name="title" translatable="yes"># 
Files</property>
+                                                    <object class="GtkTreeView" id="album_view">
+                                                        <property name="model">album_model</property>
+                                                        <property name="visible">True</property>
+                                                        <signal name="button-press-event" 
handler="on_album_tree_button_press_event"/>
+                                                        <signal name="popup-menu" 
handler="on_album_tree_popup_menu"/>
                                                         <child>
-                                                            <object class="GtkCellRendererText" 
id="album_n_files_text_renderer"/>
-                                                            <attributes>
-                                                                <attribute 
name="foreground-rgba">5</attribute>
-                                                                <attribute name="text">2</attribute>
-                                                                <attribute name="weight">4</attribute>
-                                                            </attributes>
+                                                            <object class="GtkTreeViewColumn" 
id="album_view_column">
+                                                                <property name="sizing">autosize</property>
+                                                                <property name="title" 
translatable="yes">Album</property>
+                                                                <child>
+                                                                    <object class="GtkCellRendererPixbuf" 
id="album_icon_renderer"/>
+                                                                    <attributes>
+                                                                        <attribute name="gicon">0</attribute>
+                                                                    </attributes>
+                                                                </child>
+                                                                <child>
+                                                                    <object class="GtkCellRendererText" 
id="album_text_renderer"/>
+                                                                    <attributes>
+                                                                        <attribute 
name="foreground-rgba">5</attribute>
+                                                                        <attribute name="text">1</attribute>
+                                                                        <attribute 
name="weight">4</attribute>
+                                                                    </attributes>
+                                                                </child>
+                                                            </object>
+                                                        </child>
+                                                        <child>
+                                                            <object class="GtkTreeViewColumn" 
id="album_n_files_column">
+                                                                <property name="sizing">autosize</property>
+                                                                <property name="title" translatable="yes"># 
Files</property>
+                                                                <child>
+                                                                    <object class="GtkCellRendererText" 
id="album_n_files_text_renderer"/>
+                                                                    <attributes>
+                                                                        <attribute 
name="foreground-rgba">5</attribute>
+                                                                        <attribute name="text">2</attribute>
+                                                                        <attribute 
name="weight">4</attribute>
+                                                                    </attributes>
+                                                                </child>
+                                                            </object>
                                                         </child>
                                                     </object>
                                                 </child>
                                             </object>
+                                            <packing>
+                                                <property name="resize">True</property>
+                                                <property name="shrink">False</property>
+                                            </packing>
                                         </child>
                                     </object>
-                                    <packing>
-                                        <property name="resize">True</property>
-                                        <property name="shrink">False</property>
-                                    </packing>
                                 </child>
                             </object>
+                            <packing>
+                                <property name="resize">True</property>
+                                <property name="shrink">False</property>
+                            </packing>
                         </child>
-                    </object>
-                    <packing>
-                        <property name="resize">True</property>
-                        <property name="shrink">False</property>
-                    </packing>
-                </child>
-                <child>
-                    <object class="GtkScrolledWindow" id="files_scrolled">
-                        <property name="expand">True</property>
-                        <property name="min-content-height">225</property>
-                        <property name="min-content-width">225</property>
-                        <property name="visible">True</property>
                         <child>
-                            <object class="GtkTreeView" id="files_view">
-                                <property name="model">files_model</property>
+                            <object class="GtkScrolledWindow" id="files_scrolled">
+                                <property name="expand">True</property>
+                                <property name="min-content-height">225</property>
+                                <property name="min-content-width">225</property>
                                 <property name="visible">True</property>
                                 <child>
-                                    <object class="GtkTreeViewColumn" id="filename_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Filename</property>
+                                    <object class="GtkTreeView" id="file_view">
+                                        <property name="model">file_model</property>
+                                        <property name="visible">True</property>
+                                        <signal name="button-press-event" 
handler="on_file_tree_button_press_event"/>
+                                        <signal name="key-press-event" handler="Browser_List_Key_Press"/>
+                                        <signal name="popup-menu" handler="on_file_tree_popup_menu"/>
                                         <child>
-                                            <object class="GtkCellRendererText" id="filename_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">0</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="filename_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Filename</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" 
id="filename_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">0</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="title_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Title</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="title_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">1</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="title_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Title</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" id="title_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">1</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="artist_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Artist</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="artist_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">2</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="artist_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Artist</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" 
id="artist_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">2</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="album_artist_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Album Artist</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="album_artist_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">3</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="album_artist_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Album 
Artist</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" 
id="album_artist_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">3</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="album_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Album</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="album_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">4</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="album_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Album</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" id="album_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">4</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="year_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Year</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="year_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">5</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="year_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Year</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" id="year_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">5</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="disc_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Disc</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="disc_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">6</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="disc_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Disc</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" id="disc_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">6</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="track_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Track</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="track_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">7</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="track_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Track</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" id="track_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">7</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="genre_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Genre</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="genre_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">8</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="genre_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Genre</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" id="genre_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">8</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="comment_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Comment</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="comment_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">9</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="comment_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Comment</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" 
id="comment_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">9</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="composer_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Composer</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="composer_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">10</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="composer_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Composer</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" 
id="composer_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">10</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="orig_artist_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Original Artist</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="orig_artist_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">11</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="orig_artist_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Original 
Artist</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" 
id="orig_artist_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">11</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="copyright_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Copyright</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="copyright_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">12</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="copyright_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" 
translatable="yes">Copyright</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" 
id="copyright_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">12</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="url_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">URL</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="url_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">13</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="url_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">URL</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" id="url_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">13</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child>
-                                    <object class="GtkTreeViewColumn" id="encoded_by_column">
-                                        <property name="clickable">True</property>
-                                        <property name="resizable">True</property>
-                                        <property name="title" translatable="yes">Encoded By</property>
                                         <child>
-                                            <object class="GtkCellRendererText" id="encoded_by_renderer"/>
-                                            <attributes>
-                                                <attribute name="background-rgba">19</attribute>
-                                                <attribute name="foreground-rgba">20</attribute>
-                                                <attribute name="text">14</attribute>
-                                                <attribute name="weight">18</attribute>
-                                            </attributes>
+                                            <object class="GtkTreeViewColumn" id="encoded_by_column">
+                                                <property name="clickable">True</property>
+                                                <property name="resizable">True</property>
+                                                <property name="title" translatable="yes">Encoded 
By</property>
+                                                <child>
+                                                    <object class="GtkCellRendererText" 
id="encoded_by_renderer"/>
+                                                    <attributes>
+                                                        <attribute name="background-rgba">19</attribute>
+                                                        <attribute name="foreground-rgba">20</attribute>
+                                                        <attribute name="text">14</attribute>
+                                                        <attribute name="weight">18</attribute>
+                                                    </attributes>
+                                                </child>
+                                            </object>
+                                        </child>
+                                        <child internal-child="selection">
+                                            <object class="GtkTreeSelection" id="files_selection">
+                                                <property name="mode">multiple</property>
+                                            </object>
                                         </child>
-                                    </object>
-                                </child>
-                                <child internal-child="selection">
-                                    <object class="GtkTreeSelection" id="files_selection">
-                                        <property name="mode">multiple</property>
                                     </object>
                                 </child>
                             </object>
                         </child>
                     </object>
+                    <packing>
+                        <property name="left-attach">0</property>
+                        <property name="top-attach">1</property>
+                        <property name="width">3</property>
+                    </packing>
                 </child>
             </object>
-            <packing>
-                <property name="left-attach">0</property>
-                <property name="top-attach">1</property>
-                <property name="width">3</property>
-            </packing>
         </child>
-    </object>
+    </template>
 </interface>
diff --git a/data/browser_dialogs.ui b/data/browser_dialogs.ui
new file mode 100644
index 0000000..0c5adb8
--- /dev/null
+++ b/data/browser_dialogs.ui
@@ -0,0 +1,266 @@
+<interface domain="easytag">
+    <object class="GtkDialog" id="open_directory_dialog">
+        <property name="border-width">12</property>
+        <property name="destroy-with-parent">True</property>
+        <property name="title" translatable="yes">Browse Directory With</property>
+        <child internal-child="vbox">
+            <object class="GtkBox" id="open_directory_vbox">
+                <child>
+                    <object class="GtkGrid" id="open_directory_grid">
+                        <property name="column-spacing">12</property>
+                        <property name="row-spacing">6</property>
+                        <property name="visible">True</property>
+                        <child>
+                            <object class="GtkLabel" id="open_directory_label">
+                                <property name="halign">start</property>
+                                <property name="label" translatable="yes">Run Program</property>
+                                <property name="visible">True</property>
+                                <attributes>
+                                    <attribute name="weight" value="bold"/>
+                                </attributes>
+                            </object>
+                            <packing>
+                                <property name="left-attach">0</property>
+                                <property name="top-attach">0</property>
+                                <property name="width">2</property>
+                            </packing>
+                        </child>
+                        <child>
+                            <object class="GtkComboBox" id="open_directory_combo">
+                                <property name="has-entry">True</property>
+                                <property name="entry-text-column">0</property>
+                                <property name="margin-left">12</property>
+                                <property name="tooltip-text" translatable="yes">Enter the program to run; 
it will receive the current directory as a parameter</property>
+                                <property name="visible">True</property>
+                            </object>
+                            <packing>
+                                <property name="left-attach">0</property>
+                                <property name="top-attach">1</property>
+                            </packing>
+                        </child>
+                        <child>
+                            <object class="GtkButton" id="open_directory_button">
+                                <property name="label" translatable="yes">_Open</property>
+                                <property name="use-underline">True</property>
+                                <property name="visible">True</property>
+                            </object>
+                            <packing>
+                                <property name="left-attach">1</property>
+                                <property name="top-attach">1</property>
+                            </packing>
+                        </child>
+                    </object>
+                </child>
+                <child internal-child="action_area">
+                    <object class="GtkButtonBox" id="open_directory_button_box">
+                        <child>
+                            <object class="GtkButton" id="open_directory_cancel_button">
+                                <property name="label" translatable="yes">_Cancel</property>
+                                <property name="use-underline">True</property>
+                                <property name="visible">True</property>
+                            </object>
+                        </child>
+                        <child>
+                            <object class="GtkButton" id="open_directory_execute_button">
+                                <property name="can-default">True</property>
+                                <property name="label" translatable="yes">_Execute</property>
+                                <property name="use-underline">True</property>
+                                <property name="visible">True</property>
+                            </object>
+                        </child>
+                    </object>
+                </child>
+            </object>
+        </child>
+        <action-widgets>
+            <action-widget response="-5">open_directory_execute_button</action-widget>
+            <action-widget response="-6">open_directory_cancel_button</action-widget>
+        </action-widgets>
+    </object>
+    <object class="GtkDialog" id="open_files_dialog">
+        <property name="border-width">12</property>
+        <property name="destroy-with-parent">True</property>
+        <property name="title" translatable="yes">Open Files With</property>
+        <child internal-child="vbox">
+            <object class="GtkBox" id="open_files_vbox">
+                <child>
+                    <object class="GtkGrid" id="open_files_grid">
+                        <property name="column-spacing">12</property>
+                        <property name="row-spacing">6</property>
+                        <property name="visible">True</property>
+                        <child>
+                            <object class="GtkLabel" id="open_files_label">
+                                <property name="halign">start</property>
+                                <property name="label" translatable="yes">Run Program</property>
+                                <property name="visible">True</property>
+                                <attributes>
+                                    <attribute name="weight" value="bold"/>
+                                </attributes>
+                            </object>
+                            <packing>
+                                <property name="left-attach">0</property>
+                                <property name="top-attach">0</property>
+                                <property name="width">2</property>
+                            </packing>
+                        </child>
+                        <child>
+                            <object class="GtkComboBox" id="open_files_combo">
+                                <property name="has-entry">True</property>
+                                <property name="entry-text-column">0</property>
+                                <property name="margin-left">12</property>
+                                <property name="tooltip-text" translatable="yes">Enter the program to run; 
it will receive the current files as a parameter</property>
+                                <property name="visible">True</property>
+                            </object>
+                            <packing>
+                                <property name="left-attach">0</property>
+                                <property name="top-attach">1</property>
+                            </packing>
+                        </child>
+                        <child>
+                            <object class="GtkButton" id="open_files_button">
+                                <property name="label" translatable="yes">_Open</property>
+                                <property name="use-underline">True</property>
+                                <property name="visible">True</property>
+                            </object>
+                            <packing>
+                                <property name="left-attach">1</property>
+                                <property name="top-attach">1</property>
+                            </packing>
+                        </child>
+                    </object>
+                </child>
+                <child internal-child="action_area">
+                    <object class="GtkButtonBox" id="open_files_button_box">
+                        <child>
+                            <object class="GtkButton" id="open_files_cancel_button">
+                                <property name="label" translatable="yes">_Cancel</property>
+                                <property name="use-underline">True</property>
+                                <property name="visible">True</property>
+                            </object>
+                        </child>
+                        <child>
+                            <object class="GtkButton" id="open_files_execute_button">
+                                <property name="can-default">True</property>
+                                <property name="label" translatable="yes">_Execute</property>
+                                <property name="use-underline">True</property>
+                                <property name="visible">True</property>
+                            </object>
+                        </child>
+                    </object>
+                </child>
+            </object>
+        </child>
+        <action-widgets>
+            <action-widget response="-5">open_files_execute_button</action-widget>
+            <action-widget response="-6">open_files_cancel_button</action-widget>
+        </action-widgets>
+    </object>
+    <object class="GtkDialog" id="rename_directory_dialog">
+        <property name="border-width">12</property>
+        <property name="destroy-with-parent">True</property>
+        <property name="title" translatable="yes">Rename Directory</property>
+        <child internal-child="vbox">
+            <object class="GtkBox" id="vbox">
+                <child>
+                    <object class="GtkGrid" id="rename_grid">
+                        <property name="column-spacing">12</property>
+                        <property name="row-spacing">6</property>
+                        <property name="visible">True</property>
+                        <child>
+                            <object class="GtkLabel" id="rename_label">
+                                <property name="halign">start</property>
+                                <property name="visible">True</property>
+                                <attributes>
+                                    <attribute name="weight" value="bold"/>
+                                </attributes>
+                            </object>
+                            <packing>
+                                <property name="left-attach">0</property>
+                                <property name="top-attach">0</property>
+                                <property name="width">2</property>
+                            </packing>
+                        </child>
+                        <child>
+                            <object class="GtkLabel" id="rename_entry_label">
+                                <property name="halign">start</property>
+                                <property name="label" translatable="yes" comments="Translators: Used when 
renaming a directory to a literal name (entered in a text field) rather than using a name generated from a 
mask.">Literal name:</property>
+                                <property name="margin-left">12</property>
+                                <property name="visible">True</property>
+                            </object>
+                            <packing>
+                                <property name="left-attach">0</property>
+                                <property name="top-attach">1</property>
+                            </packing>
+                        </child>
+                        <child>
+                            <object class="GtkEntry" id="rename_entry">
+                                <property name="visible">True</property>
+                            </object>
+                            <packing>
+                                <property name="left-attach">1</property>
+                                <property name="top-attach">1</property>
+                            </packing>
+                        </child>
+                        <child>
+                            <object class="GtkCheckButton" id="rename_mask_check">
+                                <property name="label" translatable="yes">Use mask:</property>
+                                <property name="margin-left">12</property>
+                                <property name="tooltip-text" translatable="yes">Whether to use a mask when 
renaming directories</property>
+                                <property name="visible">True</property>
+                            </object>
+                            <packing>
+                                <property name="left-attach">0</property>
+                                <property name="top-attach">2</property>
+                            </packing>
+                        </child>
+                        <child>
+                            <object class="GtkEntry" id="rename_mask_entry">
+                                <property name="tooltip-text" translatable="yes">Select or type in a mask 
using codes (see Legend in Scanner Window) to rename the directory from tag fields</property>
+                                <property name="visible">True</property>
+                            </object>
+                            <packing>
+                                <property name="left-attach">1</property>
+                                <property name="top-attach">2</property>
+                            </packing>
+                        </child>
+                        <child>
+                            <object class="GtkLabel" id="rename_preview_label">
+                                <property name="label" translatable="yes">Rename directory preview</property>
+                                <property name="margin-left">12</property>
+                                <property name="visible">True</property>
+                            </object>
+                            <packing>
+                                <property name="left-attach">0</property>
+                                <property name="top-attach">3</property>
+                                <property name="width">2</property>
+                            </packing>
+                        </child>
+                    </object>
+                </child>
+                <child internal-child="action_area">
+                    <object class="GtkButtonBox" id="button_box">
+                        <child>
+                            <object class="GtkButton" id="cancel_button">
+                                <property name="label" translatable="yes">_Cancel</property>
+                                <property name="use-underline">True</property>
+                                <property name="visible">True</property>
+                            </object>
+                        </child>
+                        <child>
+                            <object class="GtkButton" id="rename_button">
+                                <property name="can-default">True</property>
+                                <property name="label" translatable="yes">_Rename</property>
+                                <property name="use-underline">True</property>
+                                <property name="visible">True</property>
+                            </object>
+                        </child>
+                    </object>
+                </child>
+            </object>
+        </child>
+        <action-widgets>
+            <action-widget response="-10">rename_button</action-widget>
+            <action-widget response="-6">cancel_button</action-widget>
+        </action-widgets>
+    </object>
+</interface>
diff --git a/data/org.gnome.EasyTAG.gresource.xml b/data/org.gnome.EasyTAG.gresource.xml
index 4f2a829..21418a4 100644
--- a/data/org.gnome.EasyTAG.gresource.xml
+++ b/data/org.gnome.EasyTAG.gresource.xml
@@ -2,6 +2,7 @@
 <gresources>
     <gresource prefix='/org/gnome/EasyTAG'>
         <file preprocess='xml-stripblanks'>browser.ui</file>
+        <file preprocess='xml-stripblanks'>browser_dialogs.ui</file>
         <file preprocess='xml-stripblanks'>cddb_dialog.ui</file>
         <file preprocess='xml-stripblanks'>file_area.ui</file>
         <file preprocess='xml-stripblanks'>image_properties_dialog.ui</file>
diff --git a/src/browser.c b/src/browser.c
index ecf9cdb..2b810fc 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -1,23 +1,22 @@
-/*
- *  EasyTAG - Tag editor for MP3 and Ogg Vorbis files
- *  Copyright (C) 2000-2003  Jerome Couderc <easytag gmail com>
+/* EasyTAG - tag editor for audio files
+ * Copyright (C) 2014  David King <amigadave amigadave com>
+ * Copyright (C) 2000-2003  Jerome Couderc <easytag gmail com>
  *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
  *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
  *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 
-
 /* Some parts of this browser are taken from:
  * XMMS - Cross-platform multimedia player
  * Copyright (C) 1998-1999  Peter Alm, Mikael Alm, Olle Hallnas,
@@ -51,13 +50,13 @@
 
 typedef struct
 {
-    GtkWidget *label;
-    GtkWidget *button;
+    GtkWidget *files_label;
+    GtkWidget *open_button;
 
     GtkWidget *entry_combo;
     GtkListStore *entry_model;
 
-    GtkWidget *notebook;
+    GtkWidget *directory_album_artist_notebook;
 
     GtkListStore *file_model;
     GtkWidget *file_view;
@@ -65,18 +64,18 @@ typedef struct
     guint file_selected_handler;
     EtSortMode file_sort_mode;
 
-    GtkWidget *album_list;
+    GtkWidget *album_view;
     GtkWidget *album_menu;
     GtkListStore *album_model;
     guint album_selected_handler;
 
-    GtkWidget *artist_list;
+    GtkWidget *artist_view;
     GtkWidget *artist_menu;
     GtkListStore *artist_model;
     guint artist_selected_handler;
 
-    GtkWidget *tree; /* Tree of directories. */
-    GtkWidget *tree_menu;
+    GtkWidget *directory_view; /* Tree of directories. */
+    GtkWidget *directory_view_menu;
     GtkTreeStore *directory_model;
 
     GtkListStore *run_program_model;
@@ -322,9 +321,9 @@ et_browser_run_player_for_album_list (EtBrowser *self)
 
     priv = et_browser_get_instance_private (self);
 
-    g_return_if_fail (priv->album_list != NULL);
+    g_return_if_fail (priv->album_view != NULL);
 
-    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->album_list));
+    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->album_view));
 
     if (!gtk_tree_selection_get_selected (selection, NULL, &iter))
         return;
@@ -363,9 +362,9 @@ et_browser_run_player_for_artist_list (EtBrowser *self)
 
     priv = et_browser_get_instance_private (self);
 
-    g_return_if_fail (priv->artist_list != NULL);
+    g_return_if_fail (priv->artist_view != NULL);
 
-    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->artist_list));
+    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->artist_view));
     if (!gtk_tree_selection_get_selected (selection, NULL, &iter))
         return;
 
@@ -406,7 +405,7 @@ et_browser_run_player_for_selection (EtBrowser *self)
 
     priv = et_browser_get_instance_private (self);
 
-    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->file_view));
+    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->file_view));
     selfilelist = gtk_tree_selection_get_selected_rows(selection, NULL);
 
     for (l = selfilelist; l != NULL; l = g_list_next (l))
@@ -444,9 +443,9 @@ Browser_Tree_Get_Path_Of_Selected_Node (EtBrowser *self)
 
     priv = et_browser_get_instance_private (self);
 
-    g_return_val_if_fail (priv->tree != NULL, NULL);
+    g_return_val_if_fail (priv->directory_view != NULL, NULL);
 
-    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->tree));
+    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->directory_view));
     if (selection
     && gtk_tree_selection_get_selected(selection, NULL, &selectedIter))
     {
@@ -485,9 +484,9 @@ et_browser_set_current_path (EtBrowser *self, const gchar *path)
 #endif /* G_OS_WIN32 */
 
     if (strcmp(G_DIR_SEPARATOR_S,priv->current_path) == 0)
-        gtk_widget_set_sensitive (priv->button, FALSE);
+        gtk_widget_set_sensitive (priv->open_button, FALSE);
     else
-        gtk_widget_set_sensitive (priv->button, TRUE);
+        gtk_widget_set_sensitive (priv->open_button, TRUE);
 }
 
 
@@ -528,10 +527,10 @@ et_browser_reload_directory (EtBrowser *self)
 
     priv = et_browser_get_instance_private (self);
 
-    if (priv->tree && priv->current_path != NULL)
+    if (priv->directory_view && priv->current_path != NULL)
     {
         // Unselect files, to automatically reload the file of the directory
-        GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->tree));
+        GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->directory_view));
         if (selection)
         {
             gtk_tree_selection_unselect_all(selection);
@@ -623,7 +622,7 @@ et_browser_go_parent (EtBrowser *self)
 }
 
 /*
- * Set a text into the priv->label
+ * Set a text into the priv->files_label
  */
 void
 et_browser_label_set_text (EtBrowser *self, const gchar *text)
@@ -635,7 +634,7 @@ et_browser_label_set_text (EtBrowser *self, const gchar *text)
 
     priv = et_browser_get_instance_private (self);
 
-    gtk_label_set_text (GTK_LABEL (priv->label), text);
+    gtk_label_set_text (GTK_LABEL (priv->files_label), text);
 }
 
 /*
@@ -748,14 +747,15 @@ et_browser_collapse (EtBrowser *self)
 
     priv = et_browser_get_instance_private (self);
 
-    g_return_if_fail (priv->tree != NULL);
+    g_return_if_fail (priv->directory_view != NULL);
 
-    gtk_tree_view_collapse_all(GTK_TREE_VIEW(priv->tree));
+    gtk_tree_view_collapse_all (GTK_TREE_VIEW (priv->directory_view));
 
 #ifndef G_OS_WIN32
     /* But keep the main directory opened */
     rootPath = gtk_tree_path_new_first();
-    gtk_tree_view_expand_to_path(GTK_TREE_VIEW(priv->tree), rootPath);
+    gtk_tree_view_expand_to_path (GTK_TREE_VIEW (priv->directory_view),
+                                  rootPath);
     gtk_tree_path_free(rootPath);
 #endif /* !G_OS_WIN32 */
 }
@@ -821,7 +821,8 @@ Browser_Tree_Node_Selected (EtBrowser *self, GtkTreeSelection *selection)
     /* Open the node */
     if (g_settings_get_boolean (MainSettings, "browse-expand-children"))
     {
-        gtk_tree_view_expand_row(GTK_TREE_VIEW(priv->tree), selectedPath, FALSE);
+        gtk_tree_view_expand_row (GTK_TREE_VIEW (priv->directory_view),
+                                  selectedPath, FALSE);
     }
     gtk_tree_path_free(selectedPath);
 
@@ -829,7 +830,7 @@ Browser_Tree_Node_Selected (EtBrowser *self, GtkTreeSelection *selection)
     if (ReadingDirectory == TRUE)
         return TRUE;
 
-    //Browser_Tree_Set_Node_Visible(priv->tree, selectedPath);
+    /* Browser_Tree_Set_Node_Visible (priv->directory_view, selectedPath); */
     gtk_tree_model_get(GTK_TREE_MODEL(priv->directory_model), &selectedIter,
                        TREE_COLUMN_FULL_PATH, &pathName, -1);
     if (!pathName)
@@ -924,12 +925,12 @@ Browser_Tree_Node_Selected (EtBrowser *self, GtkTreeSelection *selection)
                                                        &selectedIter) == FALSE
                                                        && !g_file_query_exists (file, NULL))
                     {
-                        gtk_tree_view_collapse_row (GTK_TREE_VIEW (priv->tree),
+                        gtk_tree_view_collapse_row (GTK_TREE_VIEW (priv->directory_view),
                                                     selectedPath);
                         if (g_settings_get_boolean (MainSettings,
                                                     "browse-expand-children"))
                         {
-                            gtk_tree_view_expand_row (GTK_TREE_VIEW (priv->tree),
+                            gtk_tree_view_expand_row (GTK_TREE_VIEW (priv->directory_view),
                                                       selectedPath, FALSE);
                         }
                         gtk_tree_path_free (selectedPath);
@@ -1015,7 +1016,7 @@ et_browser_select_dir (EtBrowser *self, const gchar *current_path)
 
     priv = et_browser_get_instance_private (self);
 
-    g_return_if_fail (priv->tree != NULL);
+    g_return_if_fail (priv->directory_view != NULL);
 
     /* Load current_path */
     if(!current_path || !*current_path)
@@ -1049,7 +1050,8 @@ et_browser_select_dir (EtBrowser *self, const gchar *current_path)
 #endif /* !G_OS_WIN32 */
     if (rootPath)
     {
-        gtk_tree_view_expand_to_path(GTK_TREE_VIEW(priv->tree), rootPath);
+        gtk_tree_view_expand_to_path (GTK_TREE_VIEW (priv->directory_view),
+                                      rootPath);
         gtk_tree_path_free(rootPath);
     }
 
@@ -1139,7 +1141,8 @@ et_browser_select_dir (EtBrowser *self, const gchar *current_path)
         rootPath = gtk_tree_model_get_path(GTK_TREE_MODEL(priv->directory_model), &parentNode);
         if (rootPath)
         {
-            gtk_tree_view_expand_to_path(GTK_TREE_VIEW(priv->tree), rootPath);
+            gtk_tree_view_expand_to_path (GTK_TREE_VIEW (priv->directory_view),
+                                          rootPath);
             gtk_tree_path_free(rootPath);
         }
         index++;
@@ -1148,10 +1151,12 @@ et_browser_select_dir (EtBrowser *self, const gchar *current_path)
     rootPath = gtk_tree_model_get_path(GTK_TREE_MODEL(priv->directory_model), &parentNode);
     if (rootPath)
     {
-        gtk_tree_view_expand_to_path(GTK_TREE_VIEW(priv->tree), rootPath);
-        // Select the node to load the corresponding directory
-        gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->tree)), rootPath);
-        Browser_Tree_Set_Node_Visible(priv->tree, rootPath);
+        gtk_tree_view_expand_to_path (GTK_TREE_VIEW (priv->directory_view),
+                                      rootPath);
+        /* Select the node to load the corresponding directory. */
+        gtk_tree_selection_select_path (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->directory_view)),
+                                        rootPath);
+        Browser_Tree_Set_Node_Visible (priv->directory_view, rootPath);
         gtk_tree_path_free(rootPath);
     }
 
@@ -1506,7 +1511,7 @@ et_browser_refresh_file_in_list (EtBrowser *self,
     // 2/3. Try with the selected file in list (works only if we select the same file)
     if (row_found == FALSE)
     {
-        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->file_view));
+        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->file_view));
         selectedRow = gtk_tree_selection_get_selected_rows(selection, NULL);
         if (selectedRow && selectedRow->data != NULL)
         {
@@ -2302,7 +2307,7 @@ et_browser_clear_artist_model (EtBrowser *self)
 
     priv = et_browser_get_instance_private (self);
 
-    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->artist_list));
+    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->artist_view));
 
     g_signal_handler_block (selection, priv->artist_selected_handler);
 
@@ -2326,13 +2331,13 @@ Browser_Artist_List_Load_Files (EtBrowser *self, ET_File *etfile_to_select)
 
     priv = et_browser_get_instance_private (self);
 
-    g_return_if_fail (priv->artist_list != NULL);
+    g_return_if_fail (priv->artist_view != NULL);
 
     if (etfile_to_select)
         artist_to_select = ((File_Tag *)etfile_to_select->FileTag->data)->artist;
 
     et_browser_clear_artist_model (self);
-    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->artist_list));
+    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->artist_view));
 
     for (l = ETCore->ETArtistAlbumFileList; l != NULL; l = g_list_next (l))
     {
@@ -2375,7 +2380,7 @@ Browser_Artist_List_Load_Files (EtBrowser *self, ET_File *etfile_to_select)
             gtk_tree_selection_select_iter(selection, &iter);
             g_signal_handler_unblock (selection, priv->artist_selected_handler);
 
-            gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(priv->artist_list), path, NULL, FALSE, 0, 0);
+            gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(priv->artist_view), path, NULL, FALSE, 0, 0);
             gtk_tree_path_free(path);
 
             Browser_Album_List_Load_Files (self, AlbumList, etfile_to_select);
@@ -2424,7 +2429,7 @@ Browser_Artist_List_Row_Selected (EtBrowser *self, GtkTreeSelection* selection)
 }
 
 /*
- * Set the color of the row of priv->artist_list
+ * Set the color of the row of priv->artist_view
  */
 static void
 Browser_Artist_List_Set_Row_Appearance (EtBrowser *self, GtkTreeIter *iter)
@@ -2510,7 +2515,7 @@ et_browser_clear_album_model (EtBrowser *self)
     /* Empty model, disable Browser_Album_List_Row_Selected () during clear
      * because it is called and crashed. */
 
-    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->album_list));
+    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->album_view));
 
     g_signal_handler_block (selection, priv->album_selected_handler);
 
@@ -2537,13 +2542,13 @@ Browser_Album_List_Load_Files (EtBrowser *self,
 
     priv = et_browser_get_instance_private (self);
 
-    g_return_if_fail (priv->album_list != NULL);
+    g_return_if_fail (priv->album_view != NULL);
 
     if (etfile_to_select)
         album_to_select = ((File_Tag *)etfile_to_select->FileTag->data)->album;
 
     et_browser_clear_album_model (self);
-    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->album_list));
+    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->album_view));
 
     // Create a first row to select all albums of the artist
     for (l = albumlist; l != NULL; l = g_list_next (l))
@@ -2602,7 +2607,7 @@ Browser_Album_List_Load_Files (EtBrowser *self,
             gtk_tree_selection_select_iter(selection, &iter);
             g_signal_handler_unblock (selection, priv->album_selected_handler);
 
-            gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(priv->album_list), path, NULL, FALSE, 0, 0);
+            gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(priv->album_view), path, NULL, FALSE, 0, 0);
             gtk_tree_path_free(path);
 
             et_displayed_file_list_set (etfilelist);
@@ -2666,7 +2671,7 @@ Browser_Album_List_Row_Selected (EtBrowser *self, GtkTreeSelection *selection)
 }
 
 /*
- * Set the color of the row of priv->album_list
+ * Set the color of the row of priv->album_view
  */
 static void
 Browser_Album_List_Set_Row_Appearance (EtBrowser *self, GtkTreeIter *iter)
@@ -2730,7 +2735,8 @@ et_browser_set_display_mode (EtBrowser *self,
             et_displayed_file_list_set (ETCore->ETFileList);
 
             /* Display Tree Browser. */
-            gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), 0);
+            gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->directory_album_artist_notebook),
+                                           0);
             et_browser_load_file_list (self, ETCore->ETFileDisplayedList,
                                        etfile);
 
@@ -2749,7 +2755,8 @@ et_browser_set_display_mode (EtBrowser *self,
             break;
         case ET_BROWSER_MODE_ARTIST:
             /* Display Artist + Album lists. */
-            gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), 1);
+            gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->directory_album_artist_notebook),
+                                           1);
             if (ETCore->ETArtistAlbumFileList)
             {
                 et_artist_album_file_list_free (ETCore->ETArtistAlbumFileList);
@@ -2775,12 +2782,12 @@ et_browser_set_sensitive (EtBrowser *self, gboolean sensitive)
     priv = et_browser_get_instance_private (self);
 
     gtk_widget_set_sensitive (GTK_WIDGET (priv->entry_combo), sensitive);
-    gtk_widget_set_sensitive (GTK_WIDGET (priv->tree), sensitive);
+    gtk_widget_set_sensitive (GTK_WIDGET (priv->directory_view), sensitive);
     gtk_widget_set_sensitive (GTK_WIDGET (priv->file_view), sensitive);
-    gtk_widget_set_sensitive (GTK_WIDGET (priv->artist_list), sensitive);
-    gtk_widget_set_sensitive (GTK_WIDGET (priv->album_list), sensitive);
-    gtk_widget_set_sensitive (GTK_WIDGET (priv->button), sensitive);
-    gtk_widget_set_sensitive (GTK_WIDGET (priv->label), sensitive);
+    gtk_widget_set_sensitive (GTK_WIDGET (priv->artist_view), sensitive);
+    gtk_widget_set_sensitive (GTK_WIDGET (priv->album_view), sensitive);
+    gtk_widget_set_sensitive (GTK_WIDGET (priv->open_button), sensitive);
+    gtk_widget_set_sensitive (GTK_WIDGET (priv->files_label), sensitive);
 }
 
 static void
@@ -2861,7 +2868,7 @@ on_directory_tree_popup_menu (GtkWidget *treeview,
 
     priv = et_browser_get_instance_private (self);
 
-    do_popup_menu (self, NULL, GTK_TREE_VIEW (treeview), priv->tree_menu);
+    do_popup_menu (self, NULL, GTK_TREE_VIEW (treeview), priv->directory_view_menu);
 
     return GDK_EVENT_STOP;
 }
@@ -2895,7 +2902,7 @@ on_album_tree_button_press_event (GtkWidget *widget,
             select_row_for_button_press_event (GTK_TREE_VIEW (widget), event);
         }
 
-        do_popup_menu (self, event, GTK_TREE_VIEW (priv->album_list),
+        do_popup_menu (self, event, GTK_TREE_VIEW (priv->album_view),
                        priv->album_menu);
 
         return GDK_EVENT_STOP;
@@ -2920,7 +2927,7 @@ on_artist_tree_button_press_event (GtkWidget *widget,
             select_row_for_button_press_event (GTK_TREE_VIEW (widget), event);
         }
 
-        do_popup_menu (self, event, GTK_TREE_VIEW (priv->artist_list),
+        do_popup_menu (self, event, GTK_TREE_VIEW (priv->artist_view),
                        priv->artist_menu);
 
         return GDK_EVENT_STOP;
@@ -2945,8 +2952,8 @@ on_directory_tree_button_press_event (GtkWidget *widget,
             select_row_for_button_press_event (GTK_TREE_VIEW (widget), event);
         }
 
-        do_popup_menu (self, event, GTK_TREE_VIEW (priv->tree),
-                       priv->tree_menu);
+        do_popup_menu (self, event, GTK_TREE_VIEW (priv->directory_view),
+                       priv->directory_view_menu);
 
         return GDK_EVENT_STOP;
     }
@@ -3160,7 +3167,7 @@ et_browser_reload (EtBrowser *self)
     }
 
     /* Select again the memorized path without loading files */
-    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree));
+    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->directory_view));
 
     if (selection)
     {
@@ -3844,88 +3851,29 @@ static void
 create_browser (EtBrowser *self)
 {
     EtBrowserPrivate *priv;
-    GtkWidget *grid;
     gsize i;
     GtkBuilder *builder;
     GError *error = NULL;
     GMenuModel *menu_model;
-    const gchar * const ids[] = { "filename_column", "title_column",
-                                  "artist_column", "album_artist_column",
-                                  "album_column", "year_column", "disc_column",
-                                  "track_column", "genre_column",
-                                  "comment_column", "composer_column",
-                                  "orig_artist_column", "copyright_column",
-                                  "url_column", "encoded_by_column" };
 
     priv = et_browser_get_instance_private (self);
 
-    gtk_container_set_border_width (GTK_CONTAINER (self), 2);
-
-    /* The entry box for displaying path. */
-    builder = gtk_builder_new ();
-    gtk_builder_add_from_resource (builder, "/org/gnome/EasyTAG/browser.ui",
-                                   &error);
-
-    if (error != NULL)
-    {
-        g_error ("Unable to get browser from resource: %s",
-                 error->message);
-    }
-
-    grid = GTK_WIDGET (gtk_builder_get_object (builder, "browser_grid"));
-    gtk_container_add (GTK_CONTAINER (self), grid);
-
-    priv->entry_model = GTK_LIST_STORE (gtk_builder_get_object (builder,
-                                                                "directory_model"));
-
-    priv->entry_combo = GTK_WIDGET (gtk_builder_get_object (builder,
-                                                            "browser_combo"));
     /* History list */
     Load_Path_Entry_List (priv->entry_model, MISC_COMBO_TEXT);
 
     g_signal_connect_swapped (gtk_bin_get_child (GTK_BIN (priv->entry_combo)),
                               "activate", G_CALLBACK (Browser_Entry_Activated),
                               self);
-
     /* The button to select a directory to browse. */
-    priv->button = GTK_WIDGET (gtk_builder_get_object (builder,
-                                                       "open_button"));
-    g_signal_connect_swapped (priv->button, "clicked",
+    g_signal_connect_swapped (priv->open_button, "clicked",
                               G_CALLBACK (File_Selection_Window_For_Directory),
                               gtk_bin_get_child (GTK_BIN (priv->entry_combo)));
 
-    /* The label for displaying number of files in path (without subdirs). */
-    /* Translators: No files, as in "0 files". */
-    priv->label = GTK_WIDGET (gtk_builder_get_object (builder, "files_label"));
-
-    /* Browser notebook: one tab for the priv->tree, one tab for the
-     * priv->artist_list and the priv->album_list. */
-    priv->notebook = GTK_WIDGET (gtk_builder_get_object (builder,
-                                                         "directory_album_artist_notebook"));
-
-    /* The ScrollWindow and the Directory-Tree. */
-    priv->directory_model = GTK_TREE_STORE (gtk_builder_get_object (builder,
-                                                                    "tree_model"));
-
     /* The tree view */
-    priv->tree = GTK_WIDGET (gtk_builder_get_object (builder,
-                                                     "directory_view"));
-
     Browser_Tree_Initialize (self);
 
-    /* Signals */
-    g_signal_connect_swapped (priv->tree, "row-expanded",
-                              G_CALLBACK (expand_cb), self);
-    g_signal_connect_swapped (priv->tree, "row-collapsed",
-                              G_CALLBACK (collapse_cb), self);
-    g_signal_connect_swapped (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree)),
-                              "changed",
-                              G_CALLBACK (Browser_Tree_Node_Selected), self);
-
-    g_signal_connect (priv->tree, "key-press-event",
-                      G_CALLBACK (Browser_Tree_Key_Press), NULL);
-
     /* Create popup menu on browser tree view. */
+    builder = gtk_builder_new ();
     gtk_builder_add_from_resource (builder, "/org/gnome/EasyTAG/menus.ui",
                                    &error);
 
@@ -3937,22 +3885,11 @@ create_browser (EtBrowser *self)
 
     menu_model = G_MENU_MODEL (gtk_builder_get_object (builder,
                                                        "directory-menu"));
-    priv->tree_menu = gtk_menu_new_from_model (menu_model);
-    gtk_menu_attach_to_widget (GTK_MENU (priv->tree_menu), priv->tree, NULL);
-    g_signal_connect (priv->tree, "button-press-event",
-                      G_CALLBACK (on_directory_tree_button_press_event), self);
-    g_signal_connect (priv->tree, "popup-menu",
-                      G_CALLBACK (on_directory_tree_popup_menu), self);
+    priv->directory_view_menu = gtk_menu_new_from_model (menu_model);
+    gtk_menu_attach_to_widget (GTK_MENU (priv->directory_view_menu), priv->directory_view, NULL);
 
     /* The ScrollWindows with the Artist and Album Lists. */
-    priv->artist_model = GTK_LIST_STORE (gtk_builder_get_object (builder,
-                                                                 "artist_model"));
-
-    priv->artist_list = GTK_WIDGET (gtk_builder_get_object (builder,
-                                                            "artist_view"));
-    gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->artist_list)),
-                                                              GTK_SELECTION_SINGLE);
-    priv->artist_selected_handler = g_signal_connect_swapped (gtk_tree_view_get_selection (GTK_TREE_VIEW 
(priv->artist_list)),
+    priv->artist_selected_handler = g_signal_connect_swapped (gtk_tree_view_get_selection (GTK_TREE_VIEW 
(priv->artist_view)),
                                                               "changed",
                                                               G_CALLBACK (Browser_Artist_List_Row_Selected),
                                                               self);
@@ -3961,24 +3898,14 @@ create_browser (EtBrowser *self)
     menu_model = G_MENU_MODEL (gtk_builder_get_object (builder,
                                                        "directory-artist-menu"));
     priv->artist_menu = gtk_menu_new_from_model (menu_model);
-    gtk_menu_attach_to_widget (GTK_MENU (priv->artist_menu), priv->artist_list,
+    gtk_menu_attach_to_widget (GTK_MENU (priv->artist_menu), priv->artist_view,
                                NULL);
-    g_signal_connect (priv->artist_list, "button-press-event",
-                      G_CALLBACK (on_artist_tree_button_press_event), self);
-    g_signal_connect (priv->artist_list, "popup-menu",
-                      G_CALLBACK (on_artist_tree_popup_menu), self);
-
-    priv->album_model = GTK_LIST_STORE (gtk_builder_get_object (builder,
-                                                                "album_model"));
-    priv->album_list = GTK_WIDGET (gtk_builder_get_object (builder,
-                                                           "album_view"));
-    gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (priv->album_list),
+
+    gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (priv->album_view),
                                           album_list_separator_func, NULL,
                                           NULL);
-    gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->album_list)),
-                                 GTK_SELECTION_SINGLE);
 
-    priv->album_selected_handler = g_signal_connect_swapped (gtk_tree_view_get_selection (GTK_TREE_VIEW 
(priv->album_list)),
+    priv->album_selected_handler = g_signal_connect_swapped (gtk_tree_view_get_selection (GTK_TREE_VIEW 
(priv->album_view)),
                                                              "changed",
                                                              G_CALLBACK (Browser_Album_List_Row_Selected),
                                                              self);
@@ -3987,24 +3914,16 @@ create_browser (EtBrowser *self)
     menu_model = G_MENU_MODEL (gtk_builder_get_object (builder,
                                                        "directory-album-menu"));
     priv->album_menu = gtk_menu_new_from_model (menu_model);
-    gtk_menu_attach_to_widget (GTK_MENU (priv->album_menu), priv->album_list,
+    gtk_menu_attach_to_widget (GTK_MENU (priv->album_menu), priv->album_view,
                                NULL);
-    g_signal_connect (priv->album_list, "button-press-event",
-                      G_CALLBACK (on_album_tree_button_press_event), self);
-    g_signal_connect (priv->album_list, "popup-menu",
-                      G_CALLBACK (on_album_tree_popup_menu), self);
 
     /* The file list */
-    priv->file_model = GTK_LIST_STORE (gtk_builder_get_object (builder,
-                                                               "files_model"));
-    priv->file_view = GTK_WIDGET (gtk_builder_get_object (builder,
-                                                          "files_view"));
-
     /* Add columns to tree view. See ET_FILE_LIST_COLUMN. */
     for (i = 0; i <= LIST_FILE_ENCODED_BY; i++)
     {
         const guint ascending_sort = 2 * i;
-        GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN (gtk_builder_get_object (builder, ids[i]));
+        GtkTreeViewColumn *column = gtk_tree_view_get_column (GTK_TREE_VIEW (priv->file_view),
+                                                              i);
 
         g_object_set_data (G_OBJECT (column), "browser", self);
         g_signal_connect (column, "clicked",
@@ -4014,8 +3933,6 @@ create_browser (EtBrowser *self)
 
     g_signal_connect_swapped (MainSettings, "changed::sort-mode",
                               G_CALLBACK (on_sort_mode_changed), self);
-    gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->file_view)),
-                                 GTK_SELECTION_MULTIPLE);
     // To sort list
     gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (priv->file_model), 0,
                                       Browser_List_Sort_Func, NULL, NULL);
@@ -4027,18 +3944,12 @@ create_browser (EtBrowser *self)
                                                             "changed",
                                                             G_CALLBACK (Browser_List_Row_Selected),
                                                             self);
-    g_signal_connect (priv->file_view, "key-press-event",
-                      G_CALLBACK (Browser_List_Key_Press), NULL);
 
     /* Create popup menu on file list. */
     menu_model = G_MENU_MODEL (gtk_builder_get_object (builder, "file-menu"));
     priv->file_menu = gtk_menu_new_from_model (menu_model);
     gtk_menu_attach_to_widget (GTK_MENU (priv->file_menu), priv->file_view,
                                NULL);
-    g_signal_connect (priv->file_view, "button-press-event",
-                      G_CALLBACK (on_file_tree_button_press_event), self);
-    g_signal_connect (priv->file_view, "popup-menu",
-                      G_CALLBACK (on_file_tree_popup_menu), self);
 
     g_object_unref (builder);
 
@@ -4046,7 +3957,6 @@ create_browser (EtBrowser *self)
     priv->run_program_model = gtk_list_store_new(MISC_COMBO_COUNT, G_TYPE_STRING);
 
     /* TODO: Give the browser area a sensible default size. */
-    gtk_widget_show_all (GTK_WIDGET (self));
 
     /* Set home variable as current path */
     et_browser_set_current_path (self, g_get_home_dir ());
@@ -4179,7 +4089,7 @@ et_browser_show_rename_directory_dialog (EtBrowser *self)
 
     builder = gtk_builder_new ();
     gtk_builder_add_from_resource (builder,
-                                   "/org/gnome/EasyTAG/browser.ui",
+                                   "/org/gnome/EasyTAG/browser_dialogs.ui",
                                    &error);
 
     if (error != NULL)
@@ -4599,7 +4509,7 @@ et_browser_show_open_directory_with_dialog (EtBrowser *self)
 
     builder = gtk_builder_new ();
     gtk_builder_add_from_resource (builder,
-                                   "/org/gnome/EasyTAG/browser.ui",
+                                   "/org/gnome/EasyTAG/browser_dialogs.ui",
                                    &error);
 
     if (error != NULL)
@@ -4826,7 +4736,7 @@ et_browser_show_open_files_with_dialog (EtBrowser *self)
 
     builder = gtk_builder_new ();
     gtk_builder_add_from_resource (builder,
-                                   "/org/gnome/EasyTAG/browser.ui",
+                                   "/org/gnome/EasyTAG/browser_dialogs.ui",
                                    &error);
 
     if (error != NULL)
@@ -5078,14 +4988,71 @@ et_browser_finalize (GObject *object)
 static void
 et_browser_init (EtBrowser *self)
 {
+    gtk_widget_init_template (GTK_WIDGET (self));
     create_browser (self);
 }
 
-static void
-et_browser_class_init (EtBrowserClass *klass)
+static void et_browser_class_init (EtBrowserClass *klass)
 {
+    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
     G_OBJECT_CLASS (klass)->finalize = et_browser_finalize;
-    GTK_WIDGET_CLASS (klass)->destroy = et_browser_destroy;
+    widget_class->destroy = et_browser_destroy;
+
+    gtk_widget_class_set_template_from_resource (widget_class,
+                                                 "/org/gnome/EasyTAG/browser.ui");
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  files_label);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  open_button);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  entry_model);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  entry_combo);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  directory_album_artist_notebook);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  file_model);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  file_view);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  album_model);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  album_view);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  artist_model);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  artist_view);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  directory_model);
+    gtk_widget_class_bind_template_child_private (widget_class, EtBrowser,
+                                                  directory_view);
+    gtk_widget_class_bind_template_callback (widget_class, collapse_cb);
+    gtk_widget_class_bind_template_callback (widget_class, expand_cb);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             on_album_tree_button_press_event);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             on_artist_tree_button_press_event);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             on_directory_tree_button_press_event);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             on_file_tree_button_press_event);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             on_album_tree_popup_menu);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             on_artist_tree_popup_menu);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             on_directory_tree_popup_menu);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             on_file_tree_popup_menu);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             Browser_Entry_Activated);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             Browser_List_Key_Press);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             Browser_Tree_Key_Press);
+    gtk_widget_class_bind_template_callback (widget_class,
+                                             Browser_Tree_Node_Selected);
 }
 
 /*



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]