[epiphany/wip/bookmarks: 266/315] bookmarks: Add 'bookmark page' button to the location entry
- From: Iulian Radu <iulianradu src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany/wip/bookmarks: 266/315] bookmarks: Add 'bookmark page' button to the location entry
- Date: Tue, 27 Sep 2016 17:36:35 +0000 (UTC)
commit b6112df3d4064af8b517a155eaab38276b905e82
Author: Iulian Radu <iulian radu67 gmail com>
Date: Tue Aug 2 19:36:20 2016 +0300
bookmarks: Add 'bookmark page' button to the location entry
lib/widgets/ephy-location-entry.c | 423 ++----------------------
lib/widgets/ephy-location-entry.h | 7 +-
src/Makefile.am | 2 +
src/ephy-bookmark-properties-grid.c | 36 ++-
src/ephy-bookmarks-manager.c | 30 ++
src/ephy-bookmarks-manager.h | 2 +
src/ephy-bookmarks-popover.c | 11 -
src/ephy-header-bar.c | 46 +++-
src/ephy-location-controller.c | 55 ----
src/ephy-window.c | 53 ++--
src/epiphany.gresource.xml | 2 +
src/resources/gtk/bookmark-properties-grid.ui | 18 +-
src/resources/gtk/bookmarks-popover.ui | 2 +
src/resources/icons/ephy-bookmark-empty.svg | 124 +++++++
src/resources/icons/ephy-bookmark-full.svg | 124 +++++++
15 files changed, 436 insertions(+), 499 deletions(-)
---
diff --git a/lib/widgets/ephy-location-entry.c b/lib/widgets/ephy-location-entry.c
index ed4123d..9ab767f 100644
--- a/lib/widgets/ephy-location-entry.c
+++ b/lib/widgets/ephy-location-entry.c
@@ -55,7 +55,6 @@
struct _EphyLocationEntry {
GtkEntry parent_instance;
- GdkPixbuf *favicon;
GtkTreeModel *model;
GSList *search_terms;
@@ -83,21 +82,10 @@ struct _EphyLocationEntry {
guint original_address : 1;
guint apply_colors : 1;
guint needs_reset : 1;
- guint show_favicon : 1;
-
- GtkTargetList *drag_targets;
- GdkDragAction drag_actions;
EphySecurityLevel security_level;
};
-static const GtkTargetEntry url_drag_types [] =
-{
- { (char *)EPHY_DND_URL_TYPE, 0, 0 },
- { (char *)EPHY_DND_URI_LIST_TYPE, 0, 1 },
- { (char *)EPHY_DND_TEXT_TYPE, 0, 2 }
-};
-
static gboolean ephy_location_entry_reset_internal (EphyLocationEntry *, gboolean);
static void extracell_data_func (GtkCellLayout *cell_layout,
@@ -109,14 +97,13 @@ static void extracell_data_func (GtkCellLayout *cell_layout,
enum {
PROP_0,
PROP_ADDRESS,
- PROP_FAVICON,
PROP_SECURITY_LEVEL,
- PROP_SHOW_FAVICON,
LAST_PROP
};
enum signalsEnum {
USER_CHANGED,
+ BOOKMARK_CLICKED,
GET_LOCATION,
GET_TITLE,
LAST_SIGNAL
@@ -139,41 +126,6 @@ update_address_state (EphyLocationEntry *entry)
g_str_hash (text) == entry->hash;
}
-static void
-update_favicon (EphyLocationEntry *lentry)
-{
- GtkEntry *entry = GTK_ENTRY (lentry);
-
- /* Only show the favicon if the entry's text is the
- * address of the current page.
- */
- if (lentry->show_favicon && lentry->favicon != NULL && lentry->original_address) {
- gtk_entry_set_icon_from_pixbuf (entry,
- GTK_ENTRY_ICON_PRIMARY,
- lentry->favicon);
- } else if (lentry->show_favicon) {
- const char *icon_name;
-
- /* Here we could consider using fallback favicon that matches
- * the page MIME type, though text/html should be good enough
- * most of the time. See #337140
- */
- if (gtk_entry_get_text_length (entry) > 0)
- icon_name = "text-x-generic-symbolic";
- else
- icon_name = "edit-find-symbolic";
-
- gtk_entry_set_icon_from_icon_name (entry,
- GTK_ENTRY_ICON_PRIMARY,
- icon_name);
- } else {
- gtk_entry_set_icon_from_icon_name (entry,
- GTK_ENTRY_ICON_PRIMARY,
- NULL);
- }
-}
-
-
static const char *
ephy_location_entry_title_widget_get_address (EphyTitleWidget *widget)
{
@@ -219,16 +171,8 @@ ephy_location_entry_title_widget_set_address (EphyTitleWidget *widget,
effective_text = g_strdup_printf ("about:%s",
address + strlen (EPHY_ABOUT_SCHEME) + 1);
text = address;
- gtk_entry_set_icon_drag_source (GTK_ENTRY (entry),
- GTK_ENTRY_ICON_PRIMARY,
- entry->drag_targets,
- entry->drag_actions);
} else {
text = "";
- gtk_entry_set_icon_drag_source (GTK_ENTRY (entry),
- GTK_ENTRY_ICON_PRIMARY,
- NULL,
- GDK_ACTION_DEFAULT);
}
/* First record the new hash, then update the entry text */
@@ -242,7 +186,6 @@ ephy_location_entry_title_widget_set_address (EphyTitleWidget *widget,
/* We need to call update_address_state() here, as the 'changed' signal
* may not get called if the user has typed in the exact correct url */
update_address_state (entry);
- update_favicon (entry);
/* Now restore the selection.
* Note that it's not owned by the entry anymore!
@@ -276,7 +219,7 @@ ephy_location_entry_title_widget_set_security_level (EphyTitleWidget *widget,
icon_name = ephy_security_level_to_icon_name (security_level);
gtk_entry_set_icon_from_icon_name (GTK_ENTRY (widget),
- GTK_ENTRY_ICON_SECONDARY,
+ GTK_ENTRY_ICON_PRIMARY,
icon_name);
entry->security_level = security_level;
@@ -295,18 +238,10 @@ ephy_location_entry_set_property (GObject *object,
ephy_title_widget_set_address (EPHY_TITLE_WIDGET (entry),
g_value_get_string (value));
break;
- case PROP_FAVICON:
- ephy_location_entry_set_favicon (entry,
- g_value_get_object (value));
- break;
case PROP_SECURITY_LEVEL:
ephy_title_widget_set_security_level (EPHY_TITLE_WIDGET (entry),
g_value_get_enum (value));
break;
- case PROP_SHOW_FAVICON:
- ephy_location_entry_set_show_favicon (entry,
- g_value_get_boolean (value));
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -339,14 +274,6 @@ ephy_location_entry_finalize (GObject *object)
g_free (entry->saved_text);
- if (entry->drag_targets != NULL) {
- gtk_target_list_unref (entry->drag_targets);
- }
-
- if (entry->favicon != NULL) {
- g_object_unref (entry->favicon);
- }
-
G_OBJECT_CLASS (ephy_location_entry_parent_class)->finalize (object);
}
@@ -421,27 +348,6 @@ ephy_location_entry_class_init (EphyLocationEntryClass *klass)
entry_class->copy_clipboard = ephy_location_entry_copy_clipboard;
entry_class->cut_clipboard = ephy_location_entry_cut_clipboard;
- /**
- * EphyLocationEntry:favicon:
- *
- * The icon corresponding to the current location.
- */
- g_object_class_install_property (object_class,
- PROP_FAVICON,
- g_param_spec_object ("favicon",
- "Favicon",
- "The icon corresponding to the current location",
- GDK_TYPE_PIXBUF,
- G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (object_class,
- PROP_SHOW_FAVICON,
- g_param_spec_boolean ("show-favicon",
- "Show Favicon",
- "Whether to show the favicon",
- TRUE,
- G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
-
g_object_class_override_property (object_class, PROP_ADDRESS, "address");
g_object_class_override_property (object_class, PROP_SECURITY_LEVEL, "security-level");
@@ -460,6 +366,20 @@ ephy_location_entry_class_init (EphyLocationEntryClass *klass)
G_TYPE_NONE);
/**
+ * EphyLocationEntry::bookmark-clicked:
+ * @entry: the object on which the signal is emitted
+ *
+ * Emitted when the user clicks the bookmark icon inside the
+ * #EphyLocationEntry.
+ *
+ */
+ signals[BOOKMARK_CLICKED] = g_signal_new ("bookmark-clicked", G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE,
+ 0);
+
+ /**
* EphyLocationEntry::get-location:
* @entry: the object on which the signal is emitted
* Returns: the current page address as a string
@@ -625,26 +545,6 @@ action_activated_after_cb (GtkEntryCompletion *completion,
}
}
-static gboolean
-entry_drag_motion_cb (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time)
-{
- return FALSE;
-}
-
-static gboolean
-entry_drag_drop_cb (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- guint time)
-{
- return FALSE;
-}
-
static void
entry_clear_activate_cb (GtkMenuItem *item,
EphyLocationEntry *entry)
@@ -768,217 +668,6 @@ entry_populate_popup_cb (GtkEntry *entry,
gtk_menu_shell_insert (GTK_MENU_SHELL (menu), separator, 2);
}
-static void
-each_url_get_data_binder (EphyDragEachSelectedItemDataGet iteratee,
- gpointer iterator_context,
- gpointer return_data)
-{
- EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (iterator_context);
- char *title = NULL, *address = NULL;
-
- g_signal_emit (entry, signals[GET_LOCATION], 0, &address);
- g_signal_emit (entry, signals[GET_TITLE], 0, &title);
- g_return_if_fail (address != NULL && title != NULL);
-
- iteratee (address, title, return_data);
-
- g_free (address);
- g_free (title);
-}
-
-static void
-sanitize_location (char **url)
-{
- char *str;
-
- /* Do not show internal ephy-about: protocol to users */
- if (g_str_has_prefix (*url, EPHY_ABOUT_SCHEME)) {
- str = g_strdup_printf ("about:%s", *url + strlen (EPHY_ABOUT_SCHEME) + 1);
- g_free (*url);
- *url = str;
- }
-}
-
-#define DRAG_ICON_LAYOUT_PADDING 5
-#define DRAG_ICON_ICON_PADDING 10
-#define DRAG_ICON_MAX_WIDTH_CHARS 32
-
-static cairo_surface_t *
-favicon_create_drag_surface (EphyLocationEntry *entry,
- GtkWidget *widget)
-{
- char *title = NULL, *address = NULL;
- GString *text;
- GtkStyleContext *style;
- const PangoFontDescription *font_desc;
- cairo_surface_t *surface;
- PangoContext *context;
- PangoLayout *layout;
- PangoFontMetrics *metrics;
- int surface_height, surface_width;
- int layout_width, layout_height;
- int icon_width = 0, icon_height = 0, favicon_offset_x = 0;
- int char_width;
- cairo_t *cr;
- GtkStateFlags state;
- GdkRGBA color;
- GdkPixbuf *favicon;
-
- g_signal_emit (entry, signals[GET_LOCATION], 0, &address);
- sanitize_location (&address);
- g_signal_emit (entry, signals[GET_TITLE], 0, &title);
- if (address == NULL || title == NULL) return NULL;
-
- /* Compute text */
- title = g_strstrip (title);
-
- text = g_string_sized_new (strlen (address) + strlen (title) + 2);
- if (title[0] != '\0') {
- g_string_append (text, title);
- g_string_append (text, "\n");
- }
-
- if (address[0] != '\0') {
- g_string_append (text, address);
- }
-
- if (entry->favicon != NULL)
- favicon = g_object_ref (entry->favicon);
- else
- favicon = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
- "text-x-generic-symbolic",
- 16,
- 0, NULL);
- if (favicon != NULL) {
- icon_width = gdk_pixbuf_get_width (favicon);
- icon_height = gdk_pixbuf_get_height (favicon);
- }
-
- context = gtk_widget_get_pango_context (widget);
- layout = pango_layout_new (context);
-
- style = gtk_widget_get_style_context (GTK_WIDGET (entry));
- state = gtk_style_context_get_state (style);
-
- gtk_style_context_save (style);
- gtk_style_context_set_state (style, GTK_STATE_FLAG_NORMAL);
- gtk_style_context_get (style, GTK_STATE_FLAG_NORMAL,
- "font", &font_desc, NULL);
- gtk_style_context_restore (style);
-
- metrics = pango_context_get_metrics (context,
- font_desc,
- pango_context_get_language (context));
-
- char_width = pango_font_metrics_get_approximate_digit_width (metrics);
- pango_font_metrics_unref (metrics);
-
- pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END);
- pango_layout_set_width (layout, char_width * DRAG_ICON_MAX_WIDTH_CHARS);
- pango_layout_set_text (layout, text->str, text->len);
-
- pango_layout_get_pixel_size (layout, &layout_width, &layout_height);
-
- if (favicon != NULL) {
- favicon_offset_x = icon_width + (2 * DRAG_ICON_ICON_PADDING);
- }
-
- surface_width = layout_width + favicon_offset_x +
- (DRAG_ICON_LAYOUT_PADDING * 3);
- surface_height = MAX (layout_height, icon_height) +
- (DRAG_ICON_LAYOUT_PADDING * 2);
-
- surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
- CAIRO_CONTENT_COLOR,
- surface_width + 2,
- surface_height + 2);
- cr = cairo_create (surface);
-
- cairo_rectangle (cr, 1, 1, surface_width, surface_height);
- cairo_set_line_width (cr, 1.0);
-
- cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
- cairo_stroke_preserve (cr);
-
- gtk_style_context_get_background_color (style, state, &color);
- gdk_cairo_set_source_rgba (cr, &color);
- cairo_fill (cr);
-
- if (favicon != NULL) {
- double x;
- double y;
-
- x = 1 + DRAG_ICON_LAYOUT_PADDING + DRAG_ICON_ICON_PADDING;
- y = (surface_height - icon_height) / 2;
- gdk_cairo_set_source_pixbuf (cr, favicon, x, y);
- cairo_rectangle (cr, x, y, icon_width, icon_height);
- cairo_fill (cr);
- }
-
- cairo_move_to (cr,
- 1 + DRAG_ICON_LAYOUT_PADDING + favicon_offset_x,
- 1 + DRAG_ICON_LAYOUT_PADDING);
- gtk_style_context_get_color (style, state, &color);
- gdk_cairo_set_source_rgba (cr, &color);
- pango_cairo_show_layout (cr, layout);
-
- cairo_destroy (cr);
- g_object_unref (layout);
-
- g_free (address);
- g_free (title);
- g_string_free (text, TRUE);
- g_clear_object (&favicon);
-
- return surface;
-}
-
-static void
-favicon_drag_begin_cb (GtkWidget *widget,
- GdkDragContext *context,
- EphyLocationEntry *lentry)
-{
- cairo_surface_t *surface;
- GtkEntry *entry;
- gint index;
-
- entry = GTK_ENTRY (widget);
-
- index = gtk_entry_get_current_icon_drag_source (entry);
- if (index != GTK_ENTRY_ICON_PRIMARY)
- return;
-
- surface = favicon_create_drag_surface (lentry, widget);
-
- if (surface != NULL) {
- gtk_drag_set_icon_surface (context, surface);
- cairo_surface_destroy (surface);
- }
-}
-
-static void
-favicon_drag_data_get_cb (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint info,
- guint32 time,
- EphyLocationEntry *lentry)
-{
- gint index;
- GtkEntry *entry;
-
- g_assert (widget != NULL);
- g_return_if_fail (context != NULL);
-
- entry = GTK_ENTRY (widget);
-
- index = gtk_entry_get_current_icon_drag_source (entry);
- if (index == GTK_ENTRY_ICON_PRIMARY) {
- ephy_dnd_drag_data_get (widget, context, selection_data,
- time, lentry, each_url_get_data_binder);
- }
-}
-
static gboolean
icon_button_press_event_cb (GtkWidget *entry,
GtkEntryIconPosition position,
@@ -991,18 +680,12 @@ icon_button_press_event_cb (GtkWidget *entry,
event->button == 1 &&
state == 0 /* left */) {
if (position == GTK_ENTRY_ICON_PRIMARY) {
- GtkWidget *toplevel;
-
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (entry));
- gtk_window_set_focus (GTK_WINDOW (toplevel), entry);
-
- gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1);
- } else {
GdkRectangle lock_position;
- gtk_entry_get_icon_area (GTK_ENTRY (entry), GTK_ENTRY_ICON_SECONDARY, &lock_position);
+ gtk_entry_get_icon_area (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, &lock_position);
g_signal_emit_by_name (entry, "lock-clicked", &lock_position);
+ } else {
+ g_signal_emit (entry, signals[BOOKMARK_CLICKED], 0);
}
-
return TRUE;
}
@@ -1016,42 +699,24 @@ ephy_location_entry_construct_contents (EphyLocationEntry *lentry)
LOG ("EphyLocationEntry constructing contents %p", lentry);
- /* Favicon */
- lentry->drag_targets = gtk_target_list_new (url_drag_types,
- G_N_ELEMENTS (url_drag_types));
- lentry->drag_actions = GDK_ACTION_ASK | GDK_ACTION_COPY | GDK_ACTION_LINK;
-
- gtk_entry_set_icon_drag_source (GTK_ENTRY (entry),
- GTK_ENTRY_ICON_PRIMARY,
- lentry->drag_targets,
- lentry->drag_actions);
+ gtk_icon_theme_add_resource_path (gtk_icon_theme_get_default (),
+ "/org/gnome/epiphany/icons/");
- gtk_entry_set_icon_tooltip_text (GTK_ENTRY (entry),
- GTK_ENTRY_ICON_PRIMARY,
- _("Drag and drop this icon to create a link to this page"));
-
- gtk_drag_dest_set (entry,
- GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
- url_drag_types,
- G_N_ELEMENTS (url_drag_types),
- GDK_ACTION_MOVE | GDK_ACTION_COPY);
+ gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry),
+ GTK_ENTRY_ICON_SECONDARY,
+ "ephy-bookmark-empty");
g_object_connect (entry,
"signal::icon-press", G_CALLBACK (icon_button_press_event_cb), lentry,
"signal::populate-popup", G_CALLBACK (entry_populate_popup_cb), lentry,
"signal::key-press-event", G_CALLBACK (entry_key_press_cb), lentry,
"signal::changed", G_CALLBACK (editable_changed_cb), lentry,
- "signal::drag-motion", G_CALLBACK (entry_drag_motion_cb), lentry,
- "signal::drag-drop", G_CALLBACK (entry_drag_drop_cb), lentry,
- "signal::drag-data-get", G_CALLBACK (favicon_drag_data_get_cb), lentry,
NULL);
g_signal_connect_after (entry, "key-press-event",
G_CALLBACK (entry_key_press_after_cb), lentry);
g_signal_connect_after (entry, "activate",
G_CALLBACK (entry_activate_after_cb), lentry);
- g_signal_connect_after (entry, "drag-begin",
- G_CALLBACK (favicon_drag_begin_cb), lentry);
}
static void
@@ -1062,7 +727,6 @@ ephy_location_entry_init (EphyLocationEntry *le)
le->user_changed = FALSE;
le->block_update = FALSE;
le->saved_text = NULL;
- le->show_favicon = TRUE;
le->dns_prefetch_handler = 0;
ephy_location_entry_construct_contents (le);
@@ -1477,36 +1141,21 @@ ephy_location_entry_activate (EphyLocationEntry *entry)
widget);
}
-/**
- * ephy_location_entry_set_favicon:
- * @entry: an #EphyLocationEntry widget
- * @pixbuf: a #GdkPixbuf to be set as the icon of the entry
- *
- * Sets the icon in the internal #EphyIconEntry of @entry
- *
- **/
-void
-ephy_location_entry_set_favicon (EphyLocationEntry *entry,
- GdkPixbuf *pixbuf)
-{
- if (entry->favicon != NULL) {
- g_object_unref (entry->favicon);
- }
-
- entry->favicon = pixbuf ? g_object_ref (pixbuf) : NULL;
-
- update_favicon (entry);
-}
-
void
-ephy_location_entry_set_show_favicon (EphyLocationEntry *entry,
- gboolean show_favicon)
+ephy_location_entry_set_bookmarked_status (EphyLocationEntry *entry,
+ gboolean is_bookmarked)
{
g_return_if_fail (EPHY_IS_LOCATION_ENTRY (entry));
- entry->show_favicon = show_favicon != FALSE;
-
- update_favicon (entry);
+ if (is_bookmarked) {
+ gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry),
+ GTK_ENTRY_ICON_SECONDARY,
+ "ephy-bookmark-full");
+ } else {
+ gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry),
+ GTK_ENTRY_ICON_SECONDARY,
+ "ephy-bookmark-empty");
+ }
}
/**
@@ -1522,7 +1171,7 @@ ephy_location_entry_set_lock_tooltip (EphyLocationEntry *entry,
const char *tooltip)
{
gtk_entry_set_icon_tooltip_text (GTK_ENTRY (entry),
- GTK_ENTRY_ICON_SECONDARY,
+ GTK_ENTRY_ICON_PRIMARY,
tooltip);
}
diff --git a/lib/widgets/ephy-location-entry.h b/lib/widgets/ephy-location-entry.h
index c45996f..7d5d2a4 100644
--- a/lib/widgets/ephy-location-entry.h
+++ b/lib/widgets/ephy-location-entry.h
@@ -60,11 +60,8 @@ void ephy_location_entry_undo_reset (EphyLocationEntry *entr
void ephy_location_entry_activate (EphyLocationEntry *entry);
-void ephy_location_entry_set_favicon (EphyLocationEntry *entry,
- GdkPixbuf *pixbuf);
-
-void ephy_location_entry_set_show_favicon (EphyLocationEntry *entry,
- gboolean show_favicon);
+void ephy_location_entry_set_bookmarked_status (EphyLocationEntry *entry,
+ gboolean is_bookmarked);
void ephy_location_entry_set_lock_tooltip (EphyLocationEntry *entry,
const char *tooltip);
diff --git a/src/Makefile.am b/src/Makefile.am
index 649bc40..54254be 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -142,6 +142,8 @@ RESOURCE_FILES = \
resources/prism.css \
resources/prism.js \
resources/shortcuts-dialog.ui \
+ resources/icons/ephy-bookmark-empty.svg \
+ resources/icons/ephy-bookmark-full.svg \
resources/gtk/bookmark-properties-grid.ui \
resources/gtk/bookmark-row.ui \
resources/gtk/bookmarks-popover.ui \
diff --git a/src/ephy-bookmark-properties-grid.c b/src/ephy-bookmark-properties-grid.c
index f202bff..ba76b77 100644
--- a/src/ephy-bookmark-properties-grid.c
+++ b/src/ephy-bookmark-properties-grid.c
@@ -207,6 +207,7 @@ ephy_bookmarks_properties_grid_actions_add_tag (GSimpleAction *action,
gtk_entry_set_text (GTK_ENTRY (self->add_tag_entry), "");
gtk_widget_set_sensitive (GTK_WIDGET (self->add_tag_button), FALSE);
+ gtk_widget_grab_focus (GTK_WIDGET (self->add_tag_entry));
}
static void
@@ -220,7 +221,10 @@ ephy_bookmarks_properties_grid_actions_remove_bookmark (GSimpleAction *action,
g_signal_emit_by_name (self->bookmark, "removed");
- gtk_widget_destroy (gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (self))));
+ if (self->type == EPHY_BOOKMARK_PROPERTIES_GRID_TYPE_POPOVER)
+ gtk_widget_destroy (gtk_widget_get_parent (GTK_WIDGET (self)));
+ else
+ gtk_widget_destroy (gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (self))));
}
static void
@@ -295,6 +299,15 @@ ephy_bookmark_properties_grid_constructed (GObject *object)
GSequenceIter *iter;
char *address;
+ /* Set appearance based on type */
+ if (self->type == EPHY_BOOKMARK_PROPERTIES_GRID_TYPE_DIALOG) {
+ gtk_container_remove (GTK_CONTAINER (self), self->popover_bookmark_label);
+ gtk_container_remove (GTK_CONTAINER (self), self->popover_tags_label);
+ } else if (self->type == EPHY_BOOKMARK_PROPERTIES_GRID_TYPE_POPOVER) {
+ gtk_grid_remove_column (GTK_GRID (self), 0);
+ gtk_container_remove (GTK_CONTAINER (self), self->address_entry);
+ }
+
/* Set text for name entry */
gtk_entry_set_text (GTK_ENTRY (self->name_entry),
ephy_bookmark_get_title (self->bookmark));
@@ -304,13 +317,15 @@ ephy_bookmark_properties_grid_constructed (GObject *object)
G_BINDING_DEFAULT);
/* Set text for address entry */
- address = get_address (ephy_bookmark_get_url (self->bookmark));
- gtk_entry_set_text (GTK_ENTRY (self->address_entry), address);
- g_free (address);
+ if (self->type == EPHY_BOOKMARK_PROPERTIES_GRID_TYPE_DIALOG) {
+ address = get_address (ephy_bookmark_get_url (self->bookmark));
+ gtk_entry_set_text (GTK_ENTRY (self->address_entry), address);
+ g_free (address);
- g_object_bind_property (GTK_ENTRY (self->address_entry), "text",
- self->bookmark, "url",
- G_BINDING_DEFAULT);
+ g_object_bind_property (GTK_ENTRY (self->address_entry), "text",
+ self->bookmark, "url",
+ G_BINDING_DEFAULT);
+ }
/* Create tag widgets */
tags = ephy_bookmarks_manager_get_tags (manager);
@@ -400,13 +415,6 @@ ephy_bookmark_properties_grid_init (EphyBookmarkPropertiesGrid *self)
gtk_widget_init_template (GTK_WIDGET (self));
- if (self->type == EPHY_BOOKMARK_PROPERTIES_GRID_TYPE_DIALOG) {
- gtk_container_remove (GTK_CONTAINER (self), self->popover_bookmark_label);
- gtk_container_remove (GTK_CONTAINER (self), self->popover_tags_label);
- } else if (self->type == EPHY_BOOKMARK_PROPERTIES_GRID_TYPE_DIALOG) {
- gtk_grid_remove_column (GTK_GRID (self), 0);
- }
-
gtk_flow_box_set_sort_func (GTK_FLOW_BOX (self->tags_box),
(GtkFlowBoxSortFunc)flow_box_sort_func,
NULL, NULL);
diff --git a/src/ephy-bookmarks-manager.c b/src/ephy-bookmarks-manager.c
index 4988290..51489d1 100644
--- a/src/ephy-bookmarks-manager.c
+++ b/src/ephy-bookmarks-manager.c
@@ -253,6 +253,36 @@ ephy_bookmarks_manager_remove_bookmark (EphyBookmarksManager *self,
NULL);
}
+static int
+bookmark_with_url_compare (gpointer *ebookmark, gconstpointer url)
+{
+ EphyBookmark *bookmark = EPHY_BOOKMARK (ebookmark);
+ const char *bookmark_url;
+
+ bookmark_url = ephy_bookmark_get_url (bookmark);
+
+ return g_strcmp0 (bookmark_url, url);
+}
+
+EphyBookmark *
+ephy_bookmarks_manager_get_bookmark_by_url (EphyBookmarksManager *self,
+ const char *url)
+{
+ GList *bookmark_node;
+
+ g_return_val_if_fail (EPHY_IS_BOOKMARKS_MANAGER (self), FALSE);
+ g_return_val_if_fail (url != NULL, FALSE);
+
+ bookmark_node = g_list_find_custom (self->bookmarks,
+ url,
+ (GCompareFunc)bookmark_with_url_compare);
+
+ if (!bookmark_node)
+ return NULL;
+
+ return bookmark_node->data;
+}
+
void
ephy_bookmarks_manager_add_tag (EphyBookmarksManager *self, const char *tag)
{
diff --git a/src/ephy-bookmarks-manager.h b/src/ephy-bookmarks-manager.h
index 2bb6b89..4129b66 100644
--- a/src/ephy-bookmarks-manager.h
+++ b/src/ephy-bookmarks-manager.h
@@ -32,6 +32,8 @@ void ephy_bookmarks_manager_add_bookmark (EphyBookmarksManager
EphyBookmark *bookmark);
void ephy_bookmarks_manager_remove_bookmark (EphyBookmarksManager *self,
EphyBookmark *bookmark);
+EphyBookmark *ephy_bookmarks_manager_get_bookmark_by_url (EphyBookmarksManager *self,
+ const char *url);
void ephy_bookmarks_manager_add_tag (EphyBookmarksManager *self,
const char *tag);
diff --git a/src/ephy-bookmarks-popover.c b/src/ephy-bookmarks-popover.c
index 7c26d46..b86b308 100644
--- a/src/ephy-bookmarks-popover.c
+++ b/src/ephy-bookmarks-popover.c
@@ -267,9 +267,7 @@ ephy_bookmarks_popover_init (EphyBookmarksPopover *self)
GSequenceIter *iter;
GList *bookmarks;
GList *l;
- EphyBookmark *dummy_bookmark;
GSimpleActionGroup *group;
- int i;
gtk_widget_init_template (GTK_WIDGET (self));
@@ -280,15 +278,6 @@ ephy_bookmarks_popover_init (EphyBookmarksPopover *self)
G_ACTION_GROUP (group));
g_object_unref (group);
- for (i = 0; i < 1; i++) {
- dummy_bookmark = ephy_bookmark_new (g_strdup_printf ("https://www.duckduckgo.com/%d", i),
- g_strdup_printf ("DuckDuckGo %d", i),
- g_sequence_new (g_free));
- ephy_bookmarks_manager_add_tag (manager, g_strdup_printf ("Tag %d", i));
- ephy_bookmarks_manager_add_tag (manager, g_strdup_printf ("Favorite %d", i));
- ephy_bookmarks_manager_add_bookmark (manager, dummy_bookmark);
- }
-
gtk_list_box_bind_model (GTK_LIST_BOX (self->bookmarks_list_box),
G_LIST_MODEL (manager),
create_bookmark_row,
diff --git a/src/ephy-header-bar.c b/src/ephy-header-bar.c
index ef38c65..c02fcf2 100644
--- a/src/ephy-header-bar.c
+++ b/src/ephy-header-bar.c
@@ -23,6 +23,7 @@
#include "ephy-action-helper.h"
#include "ephy-bookmarks-popover.h"
+#include "ephy-bookmark-properties-grid.h"
#include "ephy-downloads-popover.h"
#include "ephy-downloads-progress-icon.h"
#include "ephy-embed.h"
@@ -38,6 +39,7 @@
#include "ephy-shell.h"
#include "ephy-title-box.h"
#include "ephy-title-widget.h"
+#include "ephy-type-builtins.h"
#include <glib/gi18n.h>
#include <webkit2/webkit2.h>
@@ -547,6 +549,40 @@ ephy_header_bar_change_combined_stop_reload_state (GSimpleAction *action,
}
static void
+add_bookmark_button_clicked_cb (EphyLocationEntry *entry,
+ gpointer *user_data)
+{
+ EphyBookmarksManager *manager = ephy_shell_get_bookmarks_manager (ephy_shell_get_default ());
+ EphyHeaderBar *header_bar = EPHY_HEADER_BAR (user_data);
+ EphyEmbed *embed;
+ GtkWidget *popover;
+ GdkRectangle rectangle;
+ EphyBookmark *bookmark;
+ const char *location;
+
+ embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (header_bar->window));
+
+ location = ephy_web_view_get_address (ephy_embed_get_web_view (embed));
+ bookmark = ephy_bookmarks_manager_get_bookmark_by_url (manager, location);
+ if (!bookmark) {
+ bookmark = ephy_bookmark_new (g_strdup (location),
+ g_strdup (ephy_embed_get_title (embed)),
+ g_sequence_new (g_free));
+ ephy_bookmarks_manager_add_bookmark (manager, bookmark);
+ ephy_location_entry_set_bookmarked_status (entry, TRUE);
+ }
+
+ popover = gtk_popover_new (GTK_WIDGET (entry));
+ gtk_entry_get_icon_area (GTK_ENTRY (entry),
+ GTK_ENTRY_ICON_SECONDARY,
+ &rectangle);
+ gtk_popover_set_pointing_to (GTK_POPOVER (popover), &rectangle);
+ gtk_container_add (GTK_CONTAINER (popover),
+ ephy_bookmark_properties_grid_new (bookmark,
EPHY_BOOKMARK_PROPERTIES_GRID_TYPE_POPOVER));
+ gtk_widget_show (popover);
+}
+
+static void
ephy_header_bar_constructed (GObject *object)
{
EphyHeaderBar *header_bar = EPHY_HEADER_BAR (object);
@@ -640,6 +676,14 @@ ephy_header_bar_constructed (GObject *object)
gtk_header_bar_set_custom_title (GTK_HEADER_BAR (header_bar), GTK_WIDGET (header_bar->title_widget));
gtk_widget_show (GTK_WIDGET (header_bar->title_widget));
+ if (EPHY_IS_LOCATION_ENTRY (header_bar->title_widget)) {
+ g_signal_connect_object (header_bar->title_widget,
+ "bookmark-clicked",
+ G_CALLBACK (add_bookmark_button_clicked_cb),
+ header_bar,
+ 0);
+ }
+
/* Page Menu */
button = gtk_menu_button_new ();
header_bar->page_menu_button = button;
@@ -661,7 +705,7 @@ ephy_header_bar_constructed (GObject *object)
gtk_button_set_image (GTK_BUTTON (button),
gtk_image_new_from_icon_name ("user-bookmarks-symbolic", GTK_ICON_SIZE_BUTTON));
gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
- gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), GTK_WIDGET (ephy_bookmarks_popover_new
(toolbar->window)));
+ gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), GTK_WIDGET (ephy_bookmarks_popover_new
(header_bar->window)));
gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), button);
diff --git a/src/ephy-location-controller.c b/src/ephy-location-controller.c
index 585c949..66eeb8c 100644
--- a/src/ephy-location-controller.c
+++ b/src/ephy-location-controller.c
@@ -51,9 +51,7 @@ struct _EphyLocationController {
char *address;
EphyNode *smart_bmks;
EphyBookmarks *bookmarks;
- GdkPixbuf *icon;
guint editable : 1;
- guint show_icon : 1;
gboolean sync_address_is_blocked;
};
@@ -68,8 +66,6 @@ enum {
PROP_0,
PROP_ADDRESS,
PROP_EDITABLE,
- PROP_ICON,
- PROP_SHOW_ICON,
PROP_WINDOW,
PROP_TITLE_WIDGET,
LAST_PROP
@@ -412,14 +408,6 @@ ephy_location_controller_constructed (GObject *object)
controller->title_widget, "editable",
G_BINDING_SYNC_CREATE);
- g_object_bind_property (controller, "icon",
- controller->title_widget, "favicon",
- G_BINDING_SYNC_CREATE);
-
- g_object_bind_property (controller, "show-icon",
- controller->title_widget, "show-favicon",
- G_BINDING_SYNC_CREATE);
-
g_signal_connect_object (widget, "drag-data-received",
G_CALLBACK (entry_drag_data_received_cb),
controller, 0);
@@ -453,15 +441,6 @@ ephy_location_controller_set_property (GObject *object,
case PROP_EDITABLE:
controller->editable = g_value_get_boolean (value);
break;
- case PROP_ICON:
- if (controller->icon != NULL) {
- g_object_unref (controller->icon);
- }
- controller->icon = GDK_PIXBUF (g_value_dup_object (value));
- break;
- case PROP_SHOW_ICON:
- controller->show_icon = g_value_get_boolean (value);
- break;
case PROP_WINDOW:
controller->window = EPHY_WINDOW (g_value_get_object (value));
break;
@@ -488,12 +467,6 @@ ephy_location_controller_get_property (GObject *object,
case PROP_EDITABLE:
g_value_set_boolean (value, controller->editable);
break;
- case PROP_ICON:
- g_value_set_object (value, controller->icon);
- break;
- case PROP_SHOW_ICON:
- g_value_set_boolean (value, controller->show_icon);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -561,30 +534,6 @@ ephy_location_controller_class_init (EphyLocationControllerClass *class)
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
/**
- * EphyLocationController:icon:
- *
- * The icon corresponding to the current location.
- */
- obj_properties[PROP_ICON] =
- g_param_spec_object ("icon",
- "Icon",
- "The icon corresponding to the current location",
- GDK_TYPE_PIXBUF,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-
- /**
- * EphyLocationController:show-icon:
- *
- * If we should show the page icon.
- */
- obj_properties[PROP_SHOW_ICON] =
- g_param_spec_boolean ("show-icon",
- "Show Icon",
- "Whether to show the favicon",
- TRUE,
- G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-
- /**
* EphyLocationController:window:
*
* The parent window.
@@ -732,10 +681,6 @@ ephy_location_controller_finalize (GObject *object)
{
EphyLocationController *controller = EPHY_LOCATION_CONTROLLER (object);
- if (controller->icon != NULL) {
- g_object_unref (controller->icon);
- }
-
g_list_free (controller->actions);
g_free (controller->address);
diff --git a/src/ephy-window.c b/src/ephy-window.c
index 205fe90..3e6e09a 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -24,6 +24,7 @@
#include "ephy-action-helper.h"
#include "ephy-bookmarks-ui.h"
+#include "ephy-bookmarks-manager.h"
#include "ephy-debug.h"
#include "ephy-embed-container.h"
#include "ephy-embed-prefs.h"
@@ -1003,6 +1004,7 @@ sync_tab_address (EphyWebView *view,
location = calculate_location (typed_address, address);
ephy_window_set_location (window, location);
+
g_free (location);
}
@@ -1095,21 +1097,6 @@ sync_tab_document_type (EphyWebView *view,
}
static void
-sync_tab_icon (EphyWebView *view,
- GParamSpec *pspec,
- EphyWindow *window)
-{
- GdkPixbuf *icon;
-
- if (window->closing)
- return;
-
- icon = ephy_web_view_get_icon (view);
-
- g_object_set (window->location_controller, "icon", icon, NULL);
-}
-
-static void
_ephy_window_set_navigation_flags (EphyWindow *window,
EphyWebViewNavigationFlags flags)
{
@@ -1150,6 +1137,30 @@ sync_tab_is_blank (EphyWebView *view,
}
static void
+sync_tab_bookmarked_status (EphyWebView *view,
+ GParamSpec *pspec,
+ EphyWindow *window)
+{
+ EphyBookmarksManager *manager = ephy_shell_get_bookmarks_manager (ephy_shell_get_default ());
+ GtkWidget *widget;
+ EphyBookmark *bookmark;
+ const char *address;
+
+ widget = GTK_WIDGET (ephy_header_bar_get_title_widget (EPHY_HEADER_BAR (window->header_bar)));
+
+ if (!EPHY_IS_LOCATION_ENTRY (widget))
+ return;
+
+ address = ephy_web_view_get_address (view);
+
+ if (address) {
+ bookmark = ephy_bookmarks_manager_get_bookmark_by_url (manager, address);
+ ephy_location_entry_set_bookmarked_status (EPHY_LOCATION_ENTRY (widget),
+ bookmark != NULL);
+ }
+}
+
+static void
sync_tab_popup_windows (EphyWebView *view,
GParamSpec *pspec,
EphyWindow *window)
@@ -2074,8 +2085,8 @@ ephy_window_connect_active_embed (EphyWindow *window)
sync_tab_is_blank (view, NULL, window);
sync_tab_navigation (view, NULL, window);
sync_tab_title (embed, NULL, window);
+ sync_tab_bookmarked_status (view, NULL, window);
sync_tab_address (view, NULL, window);
- sync_tab_icon (view, NULL, window);
sync_tab_popup_windows (view, NULL, window);
sync_tab_popups_allowed (view, NULL, window);
@@ -2091,6 +2102,7 @@ ephy_window_connect_active_embed (EphyWindow *window)
g_signal_connect_object (web_view, "decide-policy",
G_CALLBACK (decide_policy_cb),
window, 0);
+
g_signal_connect_object (view, "notify::hidden-popup-count",
G_CALLBACK (sync_tab_popup_windows),
window, 0);
@@ -2101,10 +2113,10 @@ ephy_window_connect_active_embed (EphyWindow *window)
G_CALLBACK (sync_tab_title),
window, 0);
g_signal_connect_object (view, "notify::address",
- G_CALLBACK (sync_tab_address),
+ G_CALLBACK (sync_tab_bookmarked_status),
window, 0);
- g_signal_connect_object (view, "notify::icon",
- G_CALLBACK (sync_tab_icon),
+ g_signal_connect_object (view, "notify::address",
+ G_CALLBACK (sync_tab_address),
window, 0);
g_signal_connect_object (view, "notify::security-level",
G_CALLBACK (sync_tab_security),
@@ -2183,9 +2195,6 @@ ephy_window_disconnect_active_embed (EphyWindow *window)
g_signal_handlers_disconnect_by_func (view,
G_CALLBACK (sync_tab_address),
window);
- g_signal_handlers_disconnect_by_func (view,
- G_CALLBACK (sync_tab_icon),
- window);
g_signal_handlers_disconnect_by_func
(view, G_CALLBACK (ephy_window_dom_mouse_click_cb), window);
diff --git a/src/epiphany.gresource.xml b/src/epiphany.gresource.xml
index 317697e..f7912d1 100644
--- a/src/epiphany.gresource.xml
+++ b/src/epiphany.gresource.xml
@@ -12,6 +12,8 @@
<file preprocess="xml-stripblanks" compressed="true">history-dialog.ui</file>
<file preprocess="xml-stripblanks" compressed="true">passwords-dialog.ui</file>
<file preprocess="xml-stripblanks" compressed="true">shortcuts-dialog.ui</file>
+ <file preprocess="xml-stripblanks" compressed="true">icons/ephy-bookmark-empty.svg</file>
+ <file preprocess="xml-stripblanks" compressed="true">icons/ephy-bookmark-full.svg</file>
<file preprocess="xml-stripblanks" compressed="true">gtk/bookmark-properties-grid.ui</file>
<file preprocess="xml-stripblanks" compressed="true">gtk/bookmark-row.ui</file>
<file preprocess="xml-stripblanks" compressed="true">gtk/bookmarks-popover.ui</file>
diff --git a/src/resources/gtk/bookmark-properties-grid.ui b/src/resources/gtk/bookmark-properties-grid.ui
index 4a9cdf5..d3c640a 100644
--- a/src/resources/gtk/bookmark-properties-grid.ui
+++ b/src/resources/gtk/bookmark-properties-grid.ui
@@ -10,7 +10,10 @@
<child>
<object class="GtkLabel" id="popover_bookmark_label">
<property name="label" translatable="yes">Bookmark</property>
- <property name="visible">false</property>
+ <property name="visible">true</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
</object>
<packing>
<property name="left-attach">0</property>
@@ -35,6 +38,9 @@
</child>
<child>
<object class="GtkEntry" id="name_entry">
+ <property name="max-length">40</property>
+ <property name="max-width-chars">40</property>
+ <property name="width-chars">40</property>
<property name="visible">true</property>
</object>
<packing>
@@ -71,7 +77,10 @@
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label" translatable="yes">Tags</property>
- <property name="visible">false</property>
+ <property name="visible">true</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
<style>
<class name="dim-label"/>
</style>
@@ -99,7 +108,7 @@
<child>
<object class="GtkScrolledWindow">
<property name="valign">start</property>
- <property name="min-content-height">40</property>
+ <property name="min-content-height">38</property>
<property name="max-content-height">132</property>
<property name="hscrollbar-policy">never</property>
<property name="visible">true</property>
@@ -110,7 +119,7 @@
<property name="selection-mode">none</property>
<property name="homogeneous">true</property>
<property name="valign">start</property>
- <property name="min-children-per-line">2</property>
+ <property name="min-children-per-line">3</property>
<property name="max-children-per-line">3</property>
<property name="visible">true</property>
</object>
@@ -158,6 +167,7 @@
<property name="action-name">grid.remove-bookmark</property>
<property name="use-underline">true</property>
<property name="halign">end</property>
+ <property name="valign">end</property>
<property name="visible">true</property>
<style>
<class name="destructive-action"/>
diff --git a/src/resources/gtk/bookmarks-popover.ui b/src/resources/gtk/bookmarks-popover.ui
index b36a5f5..3e744a5 100644
--- a/src/resources/gtk/bookmarks-popover.ui
+++ b/src/resources/gtk/bookmarks-popover.ui
@@ -21,6 +21,8 @@
<property name="visible">true</property>
<child>
<object class="GtkStackSwitcher">
+ <property name="hexpand">true</property>
+ <property name="halign">center</property>
<property name="stack">stack</property>
<property name="visible">true</property>
</object>
diff --git a/src/resources/icons/ephy-bookmark-empty.svg b/src/resources/icons/ephy-bookmark-empty.svg
new file mode 100644
index 0000000..8a9393c
--- /dev/null
+++ b/src/resources/icons/ephy-bookmark-empty.svg
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16.003492"
+ height="16"
+ viewBox="0 0 16.003493 16"
+ id="svg7221"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="ephy-bookmark-empty.svg">
+ <defs
+ id="defs7223" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="22.832423"
+ inkscape:cy="16.612781"
+ inkscape:document-units="px"
+ inkscape:current-layer="g7894"
+ showgrid="false"
+ units="px"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="1366"
+ inkscape:window-height="704"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid7856" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7226">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-366.99825,-524.3622)">
+ <g
+ id="g7884">
+ <g
+ id="g7890">
+ <g
+ id="g7894"
+ inkscape:label="tag">
+ <rect
+
style="opacity:1;fill:#eaeaea;fill-opacity:0;stroke:#910f0f;stroke-width:0;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7821"
+ width="15.99999"
+ height="15.99999"
+ x="366.99826"
+ y="524.36218" />
+ <g
+ style="display:inline"
+ transform="translate(138.99845,-471.63782)"
+ inkscape:label="non-starred"
+ id="g14631">
+ <g
+ id="g14633"
+ inkscape:label="folder-remote">
+ <rect
+
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
+ id="rect14635"
+ width="16"
+ height="16"
+ x="227.9998"
+ y="996" />
+ </g>
+ <path
+ inkscape:transform-center-y="-0.62095852"
+ inkscape:transform-center-x="-0.0087922894"
+ transform="matrix(0.96977421,-0.00778823,0.00807134,0.935758,-276.43773,838.84297)"
+ d="m 530.9488,186.70897 c -0.77941,0.55189 -3.15759,-1.90601 -4.11253,-1.9179
-0.95532,-0.0119 -3.39494,2.38585 -4.16096,1.8149 -0.76573,-0.57072 0.83698,-3.59203 0.55319,-4.50391
-0.2839,-0.91223 -3.31818,-2.49151 -3.01189,-3.39647 0.30617,-0.90461 3.67487,-0.31399 4.45442,-0.86567
0.77986,-0.5519 1.3442,-3.92569 2.29952,-3.91404 0.95494,0.0116 1.43421,3.39798 2.19979,3.9689
0.76588,0.57114 4.14893,0.0653 4.43307,0.97746 0.28402,0.9118 -2.78848,2.41405 -3.09488,3.31858
-0.30652,0.90489 1.21999,3.96605 0.44027,4.51815 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0.2104596"
+ inkscape:flatsided="false"
+ sodipodi:arg2="1.5829876"
+ sodipodi:arg1="0.95492637"
+ sodipodi:r2="3.8276224"
+ sodipodi:r1="7.0383992"
+ sodipodi:cy="180.96373"
+ sodipodi:cx="526.88293"
+ sodipodi:sides="5"
+ id="path14637"
+
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#919191;stroke-width:1.04970646;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+ sodipodi:type="star" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/src/resources/icons/ephy-bookmark-full.svg b/src/resources/icons/ephy-bookmark-full.svg
new file mode 100644
index 0000000..cde4232
--- /dev/null
+++ b/src/resources/icons/ephy-bookmark-full.svg
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16.003492"
+ height="16"
+ viewBox="0 0 16.003493 16"
+ id="svg7221"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="ephy-bookmark-full.svg">
+ <defs
+ id="defs7223" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="22.832423"
+ inkscape:cy="16.612781"
+ inkscape:document-units="px"
+ inkscape:current-layer="g7894"
+ showgrid="false"
+ units="px"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="1366"
+ inkscape:window-height="704"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-nodes="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid7856" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7226">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-366.99825,-524.3622)">
+ <g
+ id="g7884">
+ <g
+ id="g7890">
+ <g
+ id="g7894"
+ inkscape:label="tag">
+ <rect
+
style="opacity:1;fill:#eaeaea;fill-opacity:0;stroke:#910f0f;stroke-width:0;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7821"
+ width="15.99999"
+ height="15.99999"
+ x="366.99826"
+ y="524.36218" />
+ <g
+ style="display:inline"
+ transform="translate(138.99845,-471.63782)"
+ inkscape:label="non-starred"
+ id="g23070">
+ <g
+ id="g23072"
+ inkscape:label="folder-remote">
+ <rect
+
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
+ id="rect23074"
+ width="16"
+ height="16"
+ x="227.9998"
+ y="996" />
+ </g>
+ <path
+ inkscape:transform-center-y="-0.62095852"
+ inkscape:transform-center-x="-0.0087922894"
+ transform="matrix(0.96977421,-0.00778823,0.00807134,0.935758,-276.43773,838.84297)"
+ d="m 530.9488,186.70897 c -0.77941,0.55189 -3.15759,-1.90601 -4.11253,-1.9179
-0.95532,-0.0119 -3.39494,2.38585 -4.16096,1.8149 -0.76573,-0.57072 0.83698,-3.59203 0.55319,-4.50391
-0.2839,-0.91223 -3.31818,-2.49151 -3.01189,-3.39647 0.30617,-0.90461 3.67487,-0.31399 4.45442,-0.86567
0.77986,-0.5519 1.3442,-3.92569 2.29952,-3.91404 0.95494,0.0116 1.43421,3.39798 2.19979,3.9689
0.76588,0.57114 4.14893,0.0653 4.43307,0.97746 0.28402,0.9118 -2.78848,2.41405 -3.09488,3.31858
-0.30652,0.90489 1.21999,3.96605 0.44027,4.51815 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0.2104596"
+ inkscape:flatsided="false"
+ sodipodi:arg2="1.5829876"
+ sodipodi:arg1="0.95492637"
+ sodipodi:r2="3.8276224"
+ sodipodi:r1="7.0383992"
+ sodipodi:cy="180.96373"
+ sodipodi:cx="526.88293"
+ sodipodi:sides="5"
+ id="path23076"
+
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#fce94f;stroke:#c4a000;stroke-width:1.04970646;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+ sodipodi:type="star" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]