[Xfce4-commits] [apps/xfdashboard] 03/08: Allow storing the score (so called relevance) of an item also in the result set.

noreply at xfce.org noreply at xfce.org
Mon Jan 25 13:21:12 CET 2016


This is an automated email from the git hooks/post-receive script.

nomad pushed a commit to branch master
in repository apps/xfdashboard.

commit e028bd16cae9300aac9a3db44bbf6795ef271e84
Author: Stephan Haller <nomad at froevel.de>
Date:   Mon Jan 25 10:21:33 2016 +0100

    Allow storing the score (so called relevance) of an item also in the result set.
    
    This commit addresses issue GH #106
---
 xfdashboard/applications-search-provider.c |    5 +-
 xfdashboard/search-result-set.c            |  137 +++++++++++++++++++++++++++-
 xfdashboard/search-result-set.h            |    5 +
 3 files changed, 144 insertions(+), 3 deletions(-)

diff --git a/xfdashboard/applications-search-provider.c b/xfdashboard/applications-search-provider.c
index 89de4c4..100aad1 100644
--- a/xfdashboard/applications-search-provider.c
+++ b/xfdashboard/applications-search-provider.c
@@ -969,6 +969,7 @@ static XfdashboardSearchResultSet* _xfdashboard_applications_search_provider_get
 	gchar												**terms, **termsIter;
 	GVariant											*resultItem;
 	XfdashboardDesktopAppInfo							*appInfo;
+	gfloat												score;
 
 	g_return_val_if_fail(XFDASHBOARD_IS_APPLICATIONS_SEARCH_PROVIDER(inProvider), NULL);
 
@@ -1034,9 +1035,11 @@ static XfdashboardSearchResultSet* _xfdashboard_applications_search_provider_get
 			xfdashboard_search_result_set_has_item(inPreviousResultSet, resultItem))
 		{
 			/* Check for a match against search terms */
-			if(_xfdashboard_applications_search_provider_score(self, terms, G_APP_INFO(appInfo))>0.0f)
+			score=_xfdashboard_applications_search_provider_score(self, terms, G_APP_INFO(appInfo));
+			if(score>0.0f)
 			{
 				xfdashboard_search_result_set_add_item(resultSet, g_variant_ref(resultItem));
+				xfdashboard_search_result_set_set_item_score(resultSet, resultItem, score);
 			}
 		}
 
diff --git a/xfdashboard/search-result-set.c b/xfdashboard/search-result-set.c
index 0034a06..5b2cb0f 100644
--- a/xfdashboard/search-result-set.c
+++ b/xfdashboard/search-result-set.c
@@ -49,6 +49,76 @@ struct _XfdashboardSearchResultSetPrivate
 };
 
 /* IMPLEMENTATION: Private variables and methods */
+typedef struct _XfdashboardSearchResultSetItemData		XfdashboardSearchResultSetItemData;
+struct _XfdashboardSearchResultSetItemData
+{
+	gint									refCount;
+
+	/* Item related */
+	gfloat									score;
+};
+
+/* Create, destroy, ref and unref item data for an item */
+static XfdashboardSearchResultSetItemData* _xfdashboard_search_result_set_item_data_new(void)
+{
+	XfdashboardSearchResultSetItemData	*data;
+
+	/* Create statistics data */
+	data=g_new0(XfdashboardSearchResultSetItemData, 1);
+	if(!data) return(NULL);
+
+	/* Set up statistics data */
+	data->refCount=1;
+
+	return(data);
+}
+
+static void _xfdashboard_search_result_set_item_data_free(XfdashboardSearchResultSetItemData *inData)
+{
+	g_return_if_fail(inData);
+
+	/* Release common allocated resources */
+	g_free(inData);
+}
+
+static XfdashboardSearchResultSetItemData* _xfdashboard_search_result_set_item_data_ref(XfdashboardSearchResultSetItemData *inData)
+{
+	g_return_val_if_fail(inData, NULL);
+
+	inData->refCount++;
+	return(inData);
+}
+
+static void _xfdashboard_search_result_set_item_data_unref(XfdashboardSearchResultSetItemData *inData)
+{
+	g_return_if_fail(inData);
+
+	inData->refCount--;
+	if(inData->refCount==0) _xfdashboard_search_result_set_item_data_free(inData);
+}
+
+static XfdashboardSearchResultSetItemData* _xfdashboard_search_result_set_item_data_get(XfdashboardSearchResultSet *self, GVariant *inItem)
+{
+	XfdashboardSearchResultSetPrivate		*priv;
+	XfdashboardSearchResultSetItemData		*itemData;
+
+	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_RESULT_SET(self), NULL);
+	g_return_val_if_fail(inItem, NULL);
+
+	priv=self->priv;
+	itemData=NULL;
+
+	/* Lookup item in result and take reference on item data if found
+	 * before returning it,
+	 */
+	if(g_hash_table_lookup_extended(priv->set, inItem, NULL, (gpointer*)&itemData))
+	{
+		_xfdashboard_search_result_set_item_data_ref(itemData);
+	}
+
+	/* Return item data found for item in result set if any */
+	return(itemData);
+}
 
 /* Internal callback function for calling callback functions for sorting */
 static gint _xfdashboard_search_result_set_sort_internal(gconstpointer inLeft,
@@ -132,7 +202,7 @@ static void xfdashboard_search_result_set_init(XfdashboardSearchResultSet *self)
 	priv->set=g_hash_table_new_full(g_variant_hash,
 									g_variant_equal,
 									(GDestroyNotify)g_variant_unref,
-									NULL);
+									(GDestroyNotify)_xfdashboard_search_result_set_item_data_unref);
 }
 
 /* IMPLEMENTATION: Public API */
@@ -155,6 +225,7 @@ guint xfdashboard_search_result_set_get_size(XfdashboardSearchResultSet *self)
 void xfdashboard_search_result_set_add_item(XfdashboardSearchResultSet *self, GVariant *inItem)
 {
 	XfdashboardSearchResultSetPrivate		*priv;
+	XfdashboardSearchResultSetItemData		*itemData;
 
 	g_return_if_fail(XFDASHBOARD_IS_SEARCH_RESULT_SET(self));
 	g_return_if_fail(inItem);
@@ -162,7 +233,14 @@ void xfdashboard_search_result_set_add_item(XfdashboardSearchResultSet *self, GV
 	priv=self->priv;
 
 	/* Add or replace item in hash table */
-	g_hash_table_insert(priv->set, g_variant_ref_sink(inItem), GINT_TO_POINTER(1));
+	if(!g_hash_table_lookup_extended(priv->set, inItem, NULL, (gpointer*)&itemData))
+	{
+		/* Create data for item to add */
+		itemData=_xfdashboard_search_result_set_item_data_new();
+
+		/* Add new item to result set */
+		g_hash_table_insert(priv->set, g_variant_ref_sink(inItem), itemData);
+	}
 }
 
 /* Check if a result item exists already in result set */
@@ -212,6 +290,7 @@ GList* xfdashboard_search_result_set_get_all(XfdashboardSearchResultSet *self)
 	/* Return result */
 	return(list);
 }
+
 /* Get list of all items existing in both result sets.
  * Returned list should be freed with g_list_free_full(result, g_variant_unref)
  */
@@ -338,3 +417,57 @@ void xfdashboard_search_result_set_set_sort_func_full(XfdashboardSearchResultSet
 		priv->sortUserDataDestroyFunc=inUserDataDestroyFunc;
 	}
 }
+
+/* Get/set score for a result item in result set */
+gfloat xfdashboard_search_result_set_get_item_score(XfdashboardSearchResultSet *self, GVariant *inItem)
+{
+	gfloat									score;
+	XfdashboardSearchResultSetItemData		*itemData;
+
+	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_RESULT_SET(self), 0.0f);
+	g_return_val_if_fail(inItem, 0.0f);
+
+	score=0.0f;
+
+	/* Check if requested item exists and get its score from item data */
+	itemData=_xfdashboard_search_result_set_item_data_get(self, inItem);
+	if(itemData)
+	{
+		score=itemData->score;
+
+		/* Release allocated resources */
+		_xfdashboard_search_result_set_item_data_unref(itemData);
+	}
+
+	/* Return score of item */
+	return(score);
+}
+
+gboolean xfdashboard_search_result_set_set_item_score(XfdashboardSearchResultSet *self, GVariant *inItem, gfloat inScore)
+{
+	XfdashboardSearchResultSetItemData		*itemData;
+	gboolean								success;
+
+	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_RESULT_SET(self), FALSE);
+	g_return_val_if_fail(inItem, FALSE);
+	g_return_val_if_fail(inScore>=0.0f && inScore<=1.0f, FALSE);
+
+	success=FALSE;
+
+	/* Check if requested item exists and set score at its item data */
+	itemData=_xfdashboard_search_result_set_item_data_get(self, inItem);
+	if(itemData)
+	{
+		/* Set score */
+		itemData->score=inScore;
+
+		/* Release allocated resources */
+		_xfdashboard_search_result_set_item_data_unref(itemData);
+
+		/* Set flag that item exists in result set and data could be set */
+		success=TRUE;
+	}
+
+	/* Return success state for item */
+	return(success);
+}
diff --git a/xfdashboard/search-result-set.h b/xfdashboard/search-result-set.h
index eae7658..016c0ec 100644
--- a/xfdashboard/search-result-set.h
+++ b/xfdashboard/search-result-set.h
@@ -80,6 +80,11 @@ void xfdashboard_search_result_set_set_sort_func_full(XfdashboardSearchResultSet
 														XfdashboardSearchResultSetCompareFunc inCallbackFunc,
 														gpointer inUserData,
 														GDestroyNotify inUserDataDestroyFunc);
+
+/* Result set item related functions */
+gfloat xfdashboard_search_result_set_get_item_score(XfdashboardSearchResultSet *self, GVariant *inItem);
+gboolean xfdashboard_search_result_set_set_item_score(XfdashboardSearchResultSet *self, GVariant *inItem, gfloat inScore);
+
 G_END_DECLS
 
 #endif	/* __XFDASHBOARD_SEARCH_RESULT_SET__ */

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list