[easytag/wip/musicbrainz-support-merge: 5/75] Implemented Invert Selection and Toggle Red Lines
- From: David King <davidk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [easytag/wip/musicbrainz-support-merge: 5/75] Implemented Invert Selection and Toggle Red Lines
- Date: Sat, 30 Aug 2014 07:46:25 +0000 (UTC)
commit 509345f1f9f27ac35c4357d843631558f765e8a2
Author: Abhinav <abhijangda hotmail com>
Date: Wed May 21 22:49:43 2014 +0530
Implemented Invert Selection and Toggle Red Lines
Added buttons for Invert Selection and Toggle Red Lines in
musicbrainz_dialog.ui. Added callback functions for above buttons in
musicbrainz_dialog.c. Used GtkFilterTreeModel for Toggle Red Lines in
mbentityview.c. Added functions for Toggle Red Lines & Invert Selection
in mbentityview.c.
data/musicbrainz_dialog.ui | 44 ++++++++++------
src/mbentityview.c | 119 +++++++++++++++++++++++++++++++++++++++----
src/mbentityview.h | 4 ++
src/musicbrainz_dialog.c | 13 ++++-
4 files changed, 150 insertions(+), 30 deletions(-)
---
diff --git a/data/musicbrainz_dialog.ui b/data/musicbrainz_dialog.ui
index 09288f1..38547a2 100755
--- a/data/musicbrainz_dialog.ui
+++ b/data/musicbrainz_dialog.ui
@@ -6,56 +6,56 @@
<property name="can_focus">False</property>
<property name="stock">gtk-find</property>
</object>
- <object class="GtkImage" id="image10">
+ <object class="GtkImage" id="image8">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-find</property>
</object>
- <object class="GtkImage" id="image11">
+ <object class="GtkImage" id="image9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-stop</property>
</object>
- <object class="GtkImage" id="image12">
+ <object class="GtkImage" id="img_invert_selection">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="stock">gtk-find</property>
+ <property name="stock">easytag-invert-selection</property>
</object>
- <object class="GtkImage" id="image13">
+ <object class="GtkImage" id="img_red_lines">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="stock">gtk-stop</property>
+ <property name="stock">easytag-red-lines</property>
</object>
- <object class="GtkImage" id="image14">
+ <object class="GtkImage" id="img_unselect_all">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="stock">gtk-missing-image</property>
- <property name="icon-size">5</property>
+ <property name="stock">easytag-unselect-all</property>
</object>
- <object class="GtkImage" id="image8">
+ <object class="GtkImage" id="image10">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-find</property>
</object>
- <object class="GtkImage" id="image9">
+ <object class="GtkImage" id="image11">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-stop</property>
</object>
- <object class="GtkImage" id="img_invert_selection">
+ <object class="GtkImage" id="image12">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="stock">easytag-invert-selection</property>
+ <property name="stock">gtk-find</property>
</object>
- <object class="GtkImage" id="img_red_lines">
+ <object class="GtkImage" id="image13">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="stock">easytag-red-lines</property>
+ <property name="stock">gtk-stop</property>
</object>
- <object class="GtkImage" id="img_unselect_all">
+ <object class="GtkImage" id="image14">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="stock">easytag-unselect-all</property>
+ <property name="stock">gtk-missing-image</property>
+ <property name="icon-size">5</property>
</object>
<object class="GtkDialog" id="mbDialog">
<property name="can_focus">False</property>
@@ -288,6 +288,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Start Manual Search
</property>
<property name="image">findimage</property>
</object>
<packing>
@@ -301,6 +302,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Stop Manual
Search</property>
<property name="image">stopimage</property>
</object>
<packing>
@@ -544,6 +546,7 @@
<property name="width_request">131</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Type the text to search
in the results</property>
<property name="has_entry">True</property>
<property name="entry_text_column">0</property>
<property name="id_column">1</property>
@@ -564,6 +567,7 @@
<object class="GtkToolButton" id="toolbtnUp">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Up</property>
<property name="label" translatable="yes">toolbutton3</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-go-up</property>
@@ -577,6 +581,7 @@
<object class="GtkToolButton" id="toolbtnDown">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Down</property>
<property name="label" translatable="yes">toolbutton3</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-go-down</property>
@@ -600,6 +605,7 @@
<object class="GtkToolButton" id="toolbtnInvertSelection">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Invert Selections</property>
<property name="label" translatable="yes">toolbutton5</property>
<property name="use_underline">True</property>
<property name="icon_widget">img_invert_selection</property>
@@ -613,6 +619,7 @@
<object class="GtkToolButton" id="toolbtnSelectAll">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Select All</property>
<property name="label" translatable="yes">toolbutton6</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-select-all</property>
@@ -626,6 +633,7 @@
<object class="GtkToolButton" id="toolbtnUnselectAll">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Unselect All</property>
<property name="label" translatable="yes">toolbutton7</property>
<property name="use_underline">True</property>
<property name="icon_widget">img_unselect_all</property>
@@ -639,6 +647,7 @@
<object class="GtkToggleToolButton" id="toolbtnToggleRedLines">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Toggle Red Lines</property>
<property name="label" translatable="yes">toolbutton8</property>
<property name="use_underline">True</property>
<property name="icon_widget">img_red_lines</property>
@@ -652,6 +661,7 @@
<object class="GtkToolButton" id="toolbtnRefresh">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Refresh</property>
<property name="label" translatable="yes">toolbutton9</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-refresh</property>
diff --git a/src/mbentityview.c b/src/mbentityview.c
index 1bf9cba..bad0815 100644
--- a/src/mbentityview.c
+++ b/src/mbentityview.c
@@ -67,6 +67,9 @@ typedef struct
GNode *mb_tree_root;
GNode *mb_tree_current_node;
GtkWidget *active_toggle_button;
+ GtkTreeModel *filter;
+ gboolean search_or_red;
+ gboolean toggle_red_lines;
} EtMbEntityViewPrivate;
typedef struct
@@ -95,11 +98,56 @@ toggle_button_clicked (GtkWidget *btn, gpointer user_data);
static void
tree_view_row_activated (GtkTreeView *tree_view, GtkTreePath *path,
GtkTreeViewColumn *column, gpointer user_data);
-
+static gboolean
+tree_filter_visible_func (GtkTreeModel *model, GtkTreeIter *iter,
+ gpointer data);
/*************
* Functions *
*************/
+static gboolean
+tree_filter_visible_func (GtkTreeModel *model, GtkTreeIter *iter,
+ gpointer data)
+{
+ EtMbEntityViewPrivate *priv;
+
+ priv = (EtMbEntityViewPrivate *)data;
+
+ if (!priv->search_or_red)
+ {
+ gchar *value;
+
+ if (gtk_tree_model_get_n_columns (model) == MB_ARTIST_COLUMNS_N + 1)
+ {
+ gtk_tree_model_get (model, iter, MB_ARTIST_COLUMNS_N, &value, -1);
+ }
+ else if (gtk_tree_model_get_n_columns (model) == MB_ALBUM_COLUMNS_N + 1)
+ {
+ gtk_tree_model_get (model, iter, MB_ALBUM_COLUMNS_N, &value, -1);
+ }
+ else if (gtk_tree_model_get_n_columns (model) == MB_TRACK_COLUMNS_N + 1)
+ {
+ gtk_tree_model_get (model, iter, MB_TRACK_COLUMNS_N, &value, -1);
+ }
+ else
+ {
+ return TRUE;
+ }
+
+ if (g_strcmp0 (value, "black") == 0)
+ {
+ g_free (value);
+ return TRUE;
+ }
+
+ g_free (value);
+
+ return priv->toggle_red_lines;
+ }
+
+ return TRUE;
+}
+
/*
* et_mb_entity_view_get_type
*
@@ -193,8 +241,8 @@ add_iter_to_list_store (GtkListStore *list_store, GNode *node)
{
case MB_ENTITY_TYPE_ARTIST:
mb5_artist_get_name ((Mb5Artist)entity, name, sizeof (name));
- printf ("name %s\n", name);
- gtk_list_store_append (list_store, &iter);
+ gtk_list_store_insert_with_values (list_store, &iter, -1,
+ MB_ARTIST_COLUMNS_N, "black", -1);
gtk_list_store_set (list_store, &iter,
MB_ARTIST_COLUMNS_NAME, name, -1);
@@ -209,13 +257,11 @@ add_iter_to_list_store (GtkListStore *list_store, GNode *node)
if (((EtMbEntity *)node->data)->is_red_line)
{
- printf ("IS RED\n");
gtk_list_store_set (list_store, &iter,
MB_ARTIST_COLUMNS_N, "red", -1);
}
else
{
- printf ("IS BLACK\n");
gtk_list_store_set (list_store, &iter,
MB_ARTIST_COLUMNS_N, "black", -1);
}
@@ -225,7 +271,8 @@ add_iter_to_list_store (GtkListStore *list_store, GNode *node)
case MB_ENTITY_TYPE_ALBUM:
mb5_release_get_title ((Mb5Release)entity, name,
sizeof (name));
- gtk_list_store_append (list_store, &iter);
+ gtk_list_store_insert_with_values (list_store, &iter, -1,
+ MB_ALBUM_COLUMNS_N, "black", -1);
gtk_list_store_set (list_store, &iter,
MB_ALBUM_COLUMNS_NAME, name, -1);
@@ -420,10 +467,17 @@ show_data_in_entity_view (EtMbEntityView *entity_view)
"text", total_cols, NULL);
priv->list_store = GTK_TREE_MODEL (gtk_list_store_newv (total_cols + 1, types));
+ priv->filter = GTK_TREE_MODEL (gtk_tree_model_filter_new (priv->list_store,
+ NULL));
+ gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (priv->filter),
+ tree_filter_visible_func, priv,
+ NULL);
g_free (types);
- gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), priv->list_store);
- g_object_unref (priv->list_store);
+ gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), priv->filter);
+ //TODO: see if this is required
+ //g_object_unref (priv->list_store);
+ g_object_unref (priv->filter);
add_iter_to_list_store (GTK_LIST_STORE (priv->list_store),
g_node_first_child (priv->mb_tree_current_node));
}
@@ -594,11 +648,14 @@ tree_view_row_activated (GtkTreeView *tree_view, GtkTreePath *path,
EtMbEntityViewPrivate *priv;
GNode *child;
int depth;
+ GtkTreeIter filter_iter;
GtkTreeIter iter;
entity_view = ET_MB_ENTITY_VIEW (user_data);
priv = ET_MB_ENTITY_VIEW_GET_PRIVATE (entity_view);
- gtk_tree_model_get_iter (priv->list_store, &iter, path);
+ gtk_tree_model_get_iter (priv->filter, &filter_iter, path);
+ gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (priv->filter), &iter,
+ &filter_iter);
depth = 0;
while (gtk_tree_model_iter_previous (priv->list_store, &iter))
@@ -606,7 +663,6 @@ tree_view_row_activated (GtkTreeView *tree_view, GtkTreePath *path,
depth++;
}
- printf ("depth %d\n", depth);
child = g_node_nth_child (priv->mb_tree_current_node,
depth);
@@ -619,7 +675,8 @@ tree_view_row_activated (GtkTreeView *tree_view, GtkTreePath *path,
thread_data = g_malloc (sizeof (SearchInLevelThreadData));
thread_data->entity_view = ET_MB_ENTITY_VIEW (user_data);
thread_data->child = child;
- gtk_tree_model_get_iter (priv->list_store, &thread_data->iter, path);
+ gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (priv->filter),
&thread_data->iter,
+ &filter_iter);
gtk_statusbar_push (GTK_STATUSBAR (gtk_builder_get_object (builder, "statusbar")),
0, "Starting MusicBrainz Search");
async_result = g_simple_async_result_new (NULL,
@@ -660,6 +717,7 @@ et_mb_entity_view_init (EtMbEntityView *entity_view)
priv->mb_tree_root = NULL;
priv->mb_tree_current_node = NULL;
priv->active_toggle_button = NULL;
+ priv->toggle_red_lines = TRUE;
g_signal_connect (G_OBJECT (priv->tree_view), "row-activated",
G_CALLBACK (tree_view_row_activated), entity_view);
@@ -746,3 +804,42 @@ et_mb_entity_view_unselect_all (EtMbEntityView *entity_view)
priv = ET_MB_ENTITY_VIEW_GET_PRIVATE (entity_view);
gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view)));
}
+
+void
+et_mb_entity_view_toggle_red_lines (EtMbEntityView *entity_view)
+{
+ EtMbEntityViewPrivate *priv;
+
+ priv = ET_MB_ENTITY_VIEW_GET_PRIVATE (entity_view);
+ priv->search_or_red = FALSE;
+ priv->toggle_red_lines = !priv->toggle_red_lines;
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
+}
+
+void
+et_mb_entity_view_invert_selection (EtMbEntityView *entity_view)
+{
+ EtMbEntityViewPrivate *priv;
+ GtkTreeIter filter_iter;
+ GtkTreeSelection *selection;
+
+ priv = ET_MB_ENTITY_VIEW_GET_PRIVATE (entity_view);
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
+ if (!gtk_tree_model_get_iter_first (priv->filter, &filter_iter))
+ {
+ return FALSE;
+ }
+
+ do
+ {
+ if (!gtk_tree_selection_iter_is_selected (selection, &filter_iter))
+ {
+ gtk_tree_selection_select_iter (selection, &filter_iter);
+ }
+ else
+ {
+ gtk_tree_selection_unselect_iter (selection, &filter_iter);
+ }
+ }
+ while (gtk_tree_model_iter_next (priv->filter, &filter_iter));
+}
diff --git a/src/mbentityview.h b/src/mbentityview.h
index c6abb04..845748b 100644
--- a/src/mbentityview.h
+++ b/src/mbentityview.h
@@ -106,4 +106,8 @@ void
et_mb_entity_view_select_all (EtMbEntityView *entity_view);
void
et_mb_entity_view_unselect_all (EtMbEntityView *entity_view);
+void
+et_mb_entity_view_toggle_red_lines (EtMbEntityView *entity_view);
+void
+et_mb_entity_view_invert_selection (EtMbEntityView *entity_view);
#endif /* __MB_ENTITY_VIEW_H__ */
diff --git a/src/musicbrainz_dialog.c b/src/musicbrainz_dialog.c
index 0b9d3ae..73f4c7c 100644
--- a/src/musicbrainz_dialog.c
+++ b/src/musicbrainz_dialog.c
@@ -60,12 +60,18 @@ static void
manual_search_callback (GObject *source, GAsyncResult *res,
gpointer user_data)
{
+ GtkComboBoxText *combo_box;
+
et_mb_entity_view_set_tree_root (ET_MB_ENTITY_VIEW (entityView),
mb_tree_root);
gtk_statusbar_push (GTK_STATUSBAR (gtk_builder_get_object (builder, "statusbar")),
0, "Searching Completed");
g_object_unref (res);
g_free (user_data);
+
+ combo_box = GTK_COMBO_BOX_TEXT (gtk_builder_get_object (builder, "cbManualSearch"));
+ gtk_combo_box_text_append_text (combo_box,
+ gtk_combo_box_text_get_active_text (combo_box));
}
static void
@@ -181,7 +187,7 @@ btn_manual_find_clicked (GtkWidget *btn, gpointer user_data)
static void
tool_btn_toggle_red_lines_clicked (GtkWidget *btn, gpointer user_data)
{
-
+ et_mb_entity_view_toggle_red_lines (ET_MB_ENTITY_VIEW (entityView));
}
static void
@@ -199,7 +205,7 @@ tool_btn_down_clicked (GtkWidget *btn, gpointer user_data)
static void
tool_btn_invert_selection_clicked (GtkWidget *btn, gpointer user_data)
{
-
+ et_mb_entity_view_invert_selection (ET_MB_ENTITY_VIEW (entityView));
}
static void
@@ -269,6 +275,9 @@ et_open_musicbrainz_dialog ()
g_signal_connect (gtk_builder_get_object (builder, "toolbtnToggleRedLines"),
"clicked", G_CALLBACK (tool_btn_toggle_red_lines_clicked),
NULL);
+ g_signal_connect (gtk_builder_get_object (builder, "toolbtnInvertSelection"),
+ "clicked", G_CALLBACK (tool_btn_invert_selection_clicked),
+ NULL);
/* Fill Values in cb_manual_search_in */
cb_manual_search_in = GTK_WIDGET (gtk_builder_get_object (builder,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]