/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
/* vim: set sw=2 ts=2 sts=2 et: */
/*
* Copyright © 2012 Igalia S.L.
*
* 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, 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.
*
* 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.
*
*/
#include "config.h"
#include "ephy-overview.h"
#include "ephy-embed-private.h"
#include "ephy-embed-shell.h"
#include "ephy-frecent-store.h"
#include <gtk/gtk.h>
#define EPHY_OVERVIEW_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_OVERVIEW, EphyOverviewPrivate))
struct _EphyOverviewPrivate
{
GtkWidget *frecent_view;
};
G_DEFINE_TYPE (EphyOverview, ephy_overview, GTK_TYPE_GRID)
static gboolean
frecent_view_item_deleted (GtkWidget *widget,
gchar *path,
gpointer data)
{
EphyFrecentStore *store;
GtkTreeIter iter;
GtkTreePath *tree_path;
store = EPHY_FRECENT_STORE (gd_main_view_get_model (GD_MAIN_VIEW (widget)));
tree_path = gtk_tree_path_new_from_string (path);
gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, tree_path);
ephy_frecent_store_set_hidden (store, &iter);
gtk_tree_path_free (tree_path);
return TRUE;
}
static void
main_view_item_activated (GtkWidget *widget,
gchar *id,
GtkTreePath *path,
EphyOverview *overview)
{
GtkTreeModel *model;
GtkTreeIter iter;
char *url;
model = gd_main_view_get_model (GD_MAIN_VIEW (widget));
gtk_tree_model_get_iter (model, &iter, path);
gtk_tree_model_get (model, &iter,
EPHY_OVERVIEW_STORE_URI, &url,
-1);
g_signal_emit_by_name (overview, "open-link", url);
g_free (url);
}
static gboolean
iconview_motion_notify (GtkWidget *widget,
GdkEvent *event,
EphyOverview *overview)
{
GdkCursor *cursor;
GtkIconView *iconview = GTK_ICON_VIEW (widget);
GdkEventMotion *ev = (GdkEventMotion *)event;
if (gtk_icon_view_get_item_at_pos (iconview, ev->x, ev->y, NULL, NULL)) {
cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), GDK_HAND2);
gdk_window_set_cursor (gtk_widget_get_window (widget), cursor);
g_object_unref (cursor);
} else
gdk_window_set_cursor (gtk_widget_get_window (widget), NULL);
return FALSE;
}
static void
ephy_overview_constructed (GObject *object)
{
EphyOverviewStore *store;
EphyOverview *self = EPHY_OVERVIEW (object);
GtkWidget *iconview;
if (G_OBJECT_CLASS (ephy_overview_parent_class)->constructed)
G_OBJECT_CLASS (ephy_overview_parent_class)->constructed (object);
self->priv->frecent_view = GTK_WIDGET (gd_main_view_new (GD_MAIN_VIEW_ICON));
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (self->priv->frecent_view),
GTK_SHADOW_IN);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (self->priv->frecent_view),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
iconview = gtk_bin_get_child (GTK_BIN (self->priv->frecent_view));
gtk_icon_view_set_columns (GTK_ICON_VIEW (iconview), 5);
g_signal_connect (iconview, "motion-notify-event",
G_CALLBACK (iconview_motion_notify),
self);
g_object_set (self->priv->frecent_view,
"halign", GTK_ALIGN_FILL,
"valign", GTK_ALIGN_FILL, NULL);
g_object_set (iconview,
"halign", GTK_ALIGN_CENTER,
"valign", GTK_ALIGN_CENTER, NULL);
g_signal_connect (self->priv->frecent_view, "item-activated",
G_CALLBACK (main_view_item_activated), object);
g_signal_connect (self->priv->frecent_view, "item-deleted",
G_CALLBACK (frecent_view_item_deleted), NULL);
store = EPHY_OVERVIEW_STORE (ephy_embed_shell_get_frecent_store (ephy_embed_shell_get_default ()));
gd_main_view_set_model (GD_MAIN_VIEW (self->priv->frecent_view),
GTK_TREE_MODEL (store));
gtk_grid_attach (GTK_GRID (self), self->priv->frecent_view,
0, 0, 1, 1);
gtk_widget_show_all (GTK_WIDGET (self));
}
static void
ephy_overview_class_init (EphyOverviewClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructed = ephy_overview_constructed;
g_signal_new ("open-link",
EPHY_TYPE_OVERVIEW,
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
g_cclosure_marshal_generic,
G_TYPE_NONE,
1,
G_TYPE_STRING);
g_type_class_add_private (object_class, sizeof (EphyOverviewPrivate));
}
static void
ephy_overview_init (EphyOverview *self)
{
self->priv = EPHY_OVERVIEW_GET_PRIVATE (self);
gtk_orientable_set_orientation (GTK_ORIENTABLE (self),
GTK_ORIENTATION_VERTICAL);
}
GtkWidget *
ephy_overview_new (void)
{
return g_object_new (EPHY_TYPE_OVERVIEW,
NULL);
}