Show at most 3 search engines in completion

If that's not enough, 'Search With...' appears.
This commit is contained in:
Christian Dywan 2012-03-14 00:24:42 +01:00
parent 2612267e4d
commit d94da1f69d
2 changed files with 87 additions and 46 deletions

View file

@ -369,6 +369,78 @@ midori_location_action_popup_position (MidoriLocationAction* action,
gtk_window_move (GTK_WINDOW (popup), wx, wy); gtk_window_move (GTK_WINDOW (popup), wx, wy);
} }
static int
midori_location_action_add_search_engines (MidoriLocationAction* action,
GtkListStore* store,
gint matches)
{
KatzeItem* item;
gint i = 0;
GtkStyle* style;
gtk_widget_realize (action->treeview);
style = gtk_widget_get_style (action->treeview);
/* FIXME: choose 3 most frequently except for default */
KATZE_ARRAY_FOREACH_ITEM (item, action->search_engines)
{
gchar* uri;
gchar* title;
const gchar* text;
gchar* desc;
GdkPixbuf* icon;
uri = midori_uri_for_search (katze_item_get_uri (item), action->key);
title = g_strdup_printf (_("Search with %s"), katze_item_get_name (item));
text = katze_item_get_text (item);
desc = g_strdup_printf ("%s\n%s", title, text ? text : uri);
icon = midori_search_action_get_icon (item, action->treeview, NULL, FALSE);
gtk_list_store_insert_with_values (store, NULL, matches + i,
URI_COL, uri, TITLE_COL, desc, YALIGN_COL, 0.25,
BACKGROUND_COL, style ? &style->bg[GTK_STATE_NORMAL] : NULL,
STYLE_COL, 1, FAVICON_COL, icon, -1);
g_free (uri);
g_free (title);
g_free (desc);
if (icon != NULL)
g_object_unref (icon);
i++;
if (i > 2 && matches > 0)
{
gtk_list_store_insert_with_values (store, NULL, matches + i,
URI_COL, "about:search", TITLE_COL, _("Search with..."),
YALIGN_COL, 0.25,
BACKGROUND_COL, style ? &style->bg[GTK_STATE_NORMAL] : NULL,
STYLE_COL, 1, FAVICON_COL, NULL, -1);
i++;
break;
}
}
return i;
}
static void
midori_location_action_complete (MidoriLocationAction* action,
GdkEventButton* event,
const gchar* uri)
{
if (!strcmp (uri, "about:search"))
{
GtkListStore* store = GTK_LIST_STORE (action->completion_model);
gtk_list_store_clear (store);
midori_location_action_popup_position (action,
midori_location_action_add_search_engines (action, store, 0));
}
else
{
midori_location_action_popdown_completion (action);
gtk_entry_set_text (GTK_ENTRY (action->entry), uri);
g_signal_emit (action, signals[SUBMIT_URI], 0, uri,
MIDORI_MOD_NEW_TAB (event->state));
}
}
static gboolean static gboolean
midori_location_action_treeview_button_press_cb (GtkWidget* treeview, midori_location_action_treeview_button_press_cb (GtkWidget* treeview,
GdkEventButton* event, GdkEventButton* event,
@ -384,13 +456,8 @@ midori_location_action_treeview_button_press_cb (GtkWidget* treeview,
gtk_tree_model_get_iter (action->completion_model, &iter, path); gtk_tree_model_get_iter (action->completion_model, &iter, path);
gtk_tree_path_free (path); gtk_tree_path_free (path);
midori_location_action_popdown_completion (action);
gtk_tree_model_get (action->completion_model, &iter, URI_COL, &uri, -1); gtk_tree_model_get (action->completion_model, &iter, URI_COL, &uri, -1);
gtk_entry_set_text (GTK_ENTRY (action->entry), uri); midori_location_action_complete (action, event, uri);
g_signal_emit (action, signals[SUBMIT_URI], 0, uri,
MIDORI_MOD_NEW_TAB (event->state));
g_free (uri); g_free (uri);
return TRUE; return TRUE;
@ -411,7 +478,6 @@ midori_location_action_popup_timeout_cb (gpointer data)
static sqlite3_stmt* stmt; static sqlite3_stmt* stmt;
const gchar* sqlcmd; const gchar* sqlcmd;
gint matches, searches; gint matches, searches;
GtkStyle* style;
if (!action->entry || !gtk_widget_has_focus (action->entry) || !action->history) if (!action->entry || !gtk_widget_has_focus (action->entry) || !action->history)
return FALSE; return FALSE;
@ -519,6 +585,8 @@ midori_location_action_popup_timeout_cb (gpointer data)
renderer = gtk_cell_renderer_text_new (); renderer = gtk_cell_renderer_text_new ();
g_object_set_data (G_OBJECT (renderer), "location-action", action); g_object_set_data (G_OBJECT (renderer), "location-action", action);
gtk_cell_renderer_set_fixed_size (renderer, 1, -1); gtk_cell_renderer_set_fixed_size (renderer, 1, -1);
gtk_cell_renderer_text_set_fixed_height_from_font (
GTK_CELL_RENDERER_TEXT (renderer), 2);
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (column), renderer, TRUE); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (column), renderer, TRUE);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (column), renderer, gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (column), renderer,
"cell-background-gdk", BACKGROUND_COL, "cell-background-gdk", BACKGROUND_COL,
@ -537,8 +605,6 @@ midori_location_action_popup_timeout_cb (gpointer data)
gtk_list_store_clear (store); gtk_list_store_clear (store);
matches = searches = 0; matches = searches = 0;
gtk_widget_realize (action->treeview);
style = gtk_widget_get_style (action->treeview);
while (result == SQLITE_ROW) while (result == SQLITE_ROW)
{ {
sqlite3_int64 type = sqlite3_column_int64 (stmt, 0); sqlite3_int64 type = sqlite3_column_int64 (stmt, 0);
@ -577,35 +643,7 @@ midori_location_action_popup_timeout_cb (gpointer data)
} }
if (action->search_engines) if (action->search_engines)
{ searches += midori_location_action_add_search_engines (action, store, matches);
KatzeItem* item;
i = 0;
KATZE_ARRAY_FOREACH_ITEM (item, action->search_engines)
{
gchar* uri;
gchar* title;
const gchar* text;
gchar* desc;
GdkPixbuf* icon;
uri = midori_uri_for_search (katze_item_get_uri (item), action->key);
title = g_strdup_printf (_("Search with %s"), katze_item_get_name (item));
text = katze_item_get_text (item);
desc = g_strdup_printf ("%s\n%s", title, text ? text : uri);
icon = midori_search_action_get_icon (item, action->treeview, NULL, FALSE);
gtk_list_store_insert_with_values (store, NULL, matches + i,
URI_COL, uri, TITLE_COL, desc, YALIGN_COL, 0.25,
BACKGROUND_COL, style ? &style->bg[GTK_STATE_NORMAL] : NULL,
STYLE_COL, 1, FAVICON_COL, icon, -1);
g_free (uri);
g_free (title);
g_free (desc);
if (icon != NULL)
g_object_unref (icon);
i++;
}
searches += i;
}
if (!gtk_widget_get_visible (action->popup)) if (!gtk_widget_get_visible (action->popup))
{ {
@ -918,27 +956,29 @@ midori_location_action_key_press_event_cb (GtkEntry* entry,
GtkTreeModel* model = location_action->completion_model; GtkTreeModel* model = location_action->completion_model;
GtkTreeIter iter; GtkTreeIter iter;
gint selected = location_action->completion_index; gint selected = location_action->completion_index;
midori_location_action_popdown_completion (location_action);
if (selected > -1 && if (selected > -1 &&
gtk_tree_model_iter_nth_child (model, &iter, NULL, selected)) gtk_tree_model_iter_nth_child (model, &iter, NULL, selected))
{ {
gchar* uri; gchar* uri;
gtk_tree_model_get (model, &iter, URI_COL, &uri, -1); gtk_tree_model_get (model, &iter, URI_COL, &uri, -1);
gtk_entry_set_text (entry, uri);
if (is_enter) if (is_enter)
g_signal_emit (action, signals[SUBMIT_URI], 0, uri, midori_location_action_complete (location_action, (GdkEventButton*)event, uri);
MIDORI_MOD_NEW_TAB (event->state)); else
{
midori_location_action_popdown_completion (location_action);
gtk_entry_set_text (entry, uri);
}
g_free (uri); g_free (uri);
return TRUE; return TRUE;
} }
midori_location_action_popdown_completion (location_action);
} }
if (is_enter) if (is_enter && (text = gtk_entry_get_text (entry)) && *text)
if ((text = gtk_entry_get_text (entry)) && *text) g_signal_emit (action, signals[SUBMIT_URI], 0, text,
g_signal_emit (action, signals[SUBMIT_URI], 0, text, MIDORI_MOD_NEW_TAB (event->state));
MIDORI_MOD_NEW_TAB (event->state));
break; break;
case GDK_KEY_Escape: case GDK_KEY_Escape:
{ {

View file

@ -2525,6 +2525,7 @@ midori_view_populate_popup (MidoriView* view,
midori_view_insert_menu_item (menu_shell, 0, midori_view_insert_menu_item (menu_shell, 0,
_("_Search the Web"), GTK_STOCK_FIND, _("_Search the Web"), GTK_STOCK_FIND,
G_CALLBACK (midori_web_view_menu_search_web_activate_cb), widget); G_CALLBACK (midori_web_view_menu_search_web_activate_cb), widget);
/* FIXME: choose 3 most frequently */
g_strstrip (view->selected_text); g_strstrip (view->selected_text);
if (midori_uri_is_valid (view->selected_text)) if (midori_uri_is_valid (view->selected_text))