Author: jasper
Date: 2006-08-11 15:25:11 +0000 (Fri, 11 Aug 2006)
New Revision: 22712
Modified:
xfce4-panel/trunk/panel/Makefile.am
xfce4-panel/trunk/panel/panel-dialogs.c
Log:
Awesome patch by Benedikt: Add search (filter) box to add item dialog. Uses
frap-icon-entry.
Modified: xfce4-panel/trunk/panel/Makefile.am
===================================================================
--- xfce4-panel/trunk/panel/Makefile.am 2006-08-11 10:36:47 UTC (rev 22711)
+++ xfce4-panel/trunk/panel/Makefile.am 2006-08-11 15:25:11 UTC (rev 22712)
@@ -1,6 +1,8 @@
bin_PROGRAMS = xfce4-panel
xfce4_panel_SOURCES = \
+ frap-icon-entry.c \
+ frap-icon-entry.h \
main.c \
panel-app.c \
panel-app.h \
Modified: xfce4-panel/trunk/panel/panel-dialogs.c
===================================================================
--- xfce4-panel/trunk/panel/panel-dialogs.c 2006-08-11 10:36:47 UTC (rev
22711)
+++ xfce4-panel/trunk/panel/panel-dialogs.c 2006-08-11 15:25:11 UTC (rev
22712)
@@ -3,6 +3,7 @@
/* $Id$
*
* Copyright © 2005 Jasper Huijsmans <[EMAIL PROTECTED]>
+ * Copyright © 2006 Benedikt Meurer <[EMAIL PROTECTED]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
@@ -33,6 +34,7 @@
#include <libxfce4panel/xfce-panel-macros.h>
#include <libxfce4panel/xfce-panel-item-iface.h>
+#include "frap-icon-entry.h"
#include "panel-properties.h"
#include "panel-private.h"
#include "panel-item-manager.h"
@@ -55,6 +57,7 @@
GtkWidget *active;
GPtrArray *items;
+ GtkWidget *search_entry;
GtkWidget *tree;
GtkWidget *items_box;
@@ -209,7 +212,7 @@
{
GtkTreeModel *store;
- store = gtk_tree_view_get_model (GTK_TREE_VIEW (tv));
+ store = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER
(gtk_tree_view_get_model (GTK_TREE_VIEW (tv))));
gtk_list_store_clear (GTK_LIST_STORE (store));
}
@@ -330,6 +333,55 @@
}
}
+static gboolean
+item_visible_func (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ XfcePanelItemInfo *info;
+ const gchar *text;
+ GtkWidget *entry = GTK_WIDGET (user_data);
+ gboolean visible;
+ gchar *text_casefolded;
+ gchar *info_casefolded;
+ gchar *normalized;
+
+ text = gtk_entry_get_text (GTK_ENTRY (entry));
+ if (G_UNLIKELY (*text == '\0'))
+ return TRUE;
+
+ gtk_tree_model_get (model, iter, 0, &info, -1);
+ if (G_UNLIKELY (info == NULL))
+ return TRUE;
+
+ normalized = g_utf8_normalize (text, -1, G_NORMALIZE_ALL);
+ text_casefolded = g_utf8_casefold (normalized, -1);
+ g_free (normalized);
+
+ normalized = g_utf8_normalize (info->display_name, -1, G_NORMALIZE_ALL);
+ info_casefolded = g_utf8_casefold (normalized, -1);
+ g_free (normalized);
+
+ visible = (strstr (info_casefolded, text_casefolded) != NULL);
+
+ g_free (info_casefolded);
+
+ if (!visible && info->comment)
+ {
+ normalized = g_utf8_normalize (info->comment, -1, G_NORMALIZE_ALL);
+ info_casefolded = g_utf8_casefold (normalized, -1);
+ g_free (normalized);
+
+ visible = (strstr (info_casefolded, text_casefolded) != NULL);
+
+ g_free (info_casefolded);
+ }
+
+ g_free (text_casefolded);
+
+ return visible;
+}
+
static void
add_item_treeview (PanelItemsDialog *pid)
{
@@ -337,6 +389,7 @@
GtkCellRenderer *cell;
GtkTreeViewColumn *col;
GtkListStore *store;
+ GtkTreeModel *filter;
GtkTreeModel *model;
GtkTreePath *path;
GtkTreeIter iter;
@@ -355,7 +408,11 @@
store = gtk_list_store_new (1, G_TYPE_POINTER);
model = GTK_TREE_MODEL (store);
- pid->tree = tv = gtk_tree_view_new_with_model (model);
+ filter = gtk_tree_model_filter_new (model, NULL);
+ gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
item_visible_func, pid->search_entry, NULL);
+ g_signal_connect_swapped (G_OBJECT (pid->search_entry), "changed",
G_CALLBACK (gtk_tree_model_filter_refilter), filter);
+
+ pid->tree = tv = gtk_tree_view_new_with_model (filter);
gtk_widget_show (tv);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tv), TRUE);
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tv), FALSE);
@@ -363,6 +420,7 @@
g_signal_connect (tv, "destroy", G_CALLBACK (treeview_destroyed), NULL);
+ g_object_unref (G_OBJECT (filter));
g_object_unref (G_OBJECT (store));
/* dnd */
@@ -553,27 +611,37 @@
img = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO,
GTK_ICON_SIZE_LARGE_TOOLBAR);
- gtk_misc_set_alignment (GTK_MISC (img), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (img), 0.0f, 0.5f);
gtk_widget_show (img);
gtk_box_pack_start (GTK_BOX (hbox), img, FALSE, FALSE, 0);
label = gtk_label_new (_("Drag items from the list to a panel or remove "
"them by dragging them back to the list."));
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0f, 0.5f);
gtk_widget_show (label);
gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
-
+
/* treeview */
+ hbox = gtk_hbox_new (FALSE, BORDER);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+
label = gtk_label_new (NULL);
- gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 1.0f);
gtk_widget_show (label);
- gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
markup = g_strdup_printf ("<b>%s</b>", _("Available Items"));
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
+ /* the list filter entry (FIXME: Add tooltip? Jasper?) */
+ pid->search_entry = frap_icon_entry_new ();
+ frap_icon_entry_set_stock_id (FRAP_ICON_ENTRY (pid->search_entry),
GTK_STOCK_FIND);
+ gtk_widget_show (pid->search_entry);
+ gtk_box_pack_end (GTK_BOX (hbox), pid->search_entry, FALSE, FALSE, 0);
+
add_item_treeview (pid);
/* make panels insensitive and set up dnd */
@@ -587,6 +655,8 @@
gtk_widget_show (dlg);
panel_app_register_dialog (dlg);
+
+ gtk_window_present (GTK_WINDOW (dlg));
}
/*
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits