[bijiben] Archive view: initial (useless) view
- From: Pierre-Yves Luyten <pyluyten src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [bijiben] Archive view: initial (useless) view
- Date: Thu, 21 Nov 2013 21:42:43 +0000 (UTC)
commit 536d13e95196bb684a0f4b9e74d44b8b88451055
Author: Pierre-Yves Luyten <py luyten fr>
Date: Thu Nov 21 22:01:48 2013 +0100
Archive view: initial (useless) view
Trash bin can be viewed but no operation can be done.
This is just an initial feature.
po/POTFILES.in | 1 +
src/Makefile.am | 2 +
src/bjb-app-menu.c | 19 ++-
src/bjb-controller.c | 132 ++++++++++++---
src/bjb-controller.h | 6 +
src/bjb-main-toolbar.c | 155 ++++++++++++++++--
src/bjb-selection-toolbar.c | 182 +++++++++++++++-----
src/bjb-trash-bar.c | 213 ++++++++++++++++++++++++
src/bjb-trash-bar.h | 73 ++++++++
src/bjb-window-base.c | 17 ++-
src/bjb-window-base.h | 3 +-
src/libbiji/biji-manager.c | 146 +++++++++++++----
src/libbiji/biji-manager.h | 25 +++-
src/libbiji/biji-marshalers.list | 3 +-
src/libbiji/biji-tracker.c | 5 +-
src/libbiji/biji-tracker.h | 1 +
src/libbiji/provider/biji-import-provider.c | 4 +-
src/libbiji/provider/biji-local-provider.c | 123 +++++++++++---
src/libbiji/provider/biji-own-cloud-provider.c | 16 ++-
src/libbiji/provider/biji-provider.c | 48 +++++-
src/libbiji/provider/biji-provider.h | 38 ++++-
src/resources/app-menu.ui | 4 +
22 files changed, 1044 insertions(+), 172 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 02aa792..d338b12 100755
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -16,6 +16,7 @@ src/bjb-rename-note.c
src/bjb-selection-toolbar.c
src/bjb-settings.c
src/bjb-settings-dialog.c
+src/bjb-trash-bar.c
src/bjb-window-base.c
src/libbiji/biji-date-time.c
src/libbiji/provider/biji-local-provider.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 72fa3d2..8148e7f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -87,6 +87,8 @@ bijiben_SOURCES = \
bjb-settings-dialog.h \
bjb-share.c \
bjb-share.h \
+ bjb-trash-bar.c \
+ bjb-trash-bar.h \
bjb-window-base.c \
bjb-window-base.h
diff --git a/src/bjb-app-menu.c b/src/bjb-app-menu.c
index 23f41f6..e3838a7 100644
--- a/src/bjb-app-menu.c
+++ b/src/bjb-app-menu.c
@@ -40,7 +40,7 @@ void show_about_dialog(GtkApplication *app)
"William Jon McCann <jmccann redhat com>",
NULL
};
-
+
gtk_show_about_dialog( g_list_nth_data (windows, 0),
"program-name", _("Notes"),
"comments", _("Simple notebook for GNOME"),
@@ -104,6 +104,20 @@ external_activated (GSimpleAction *action,
static void
+trash_activated (GSimpleAction *action,
+ GVariant *param,
+ gpointer user_data)
+{
+ GList *l;
+
+ l = gtk_application_get_windows (GTK_APPLICATION (user_data));
+ bjb_controller_set_group (
+ bjb_window_base_get_controller (BJB_WINDOW_BASE (l->data)),
+ BIJI_ARCHIVED_ITEMS);
+}
+
+
+static void
preferences_activated (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
@@ -150,6 +164,7 @@ quit_activated (GSimpleAction *action,
static GActionEntry app_entries[] = {
{ "new", new_activated, NULL, NULL, NULL },
{ "external", external_activated, NULL, NULL, NULL },
+ { "trash", trash_activated, NULL, NULL, NULL },
{ "preferences", preferences_activated, NULL, NULL, NULL },
{ "about", about_activated, NULL, NULL, NULL },
{ "help", help_activated, NULL, NULL, NULL },
@@ -165,7 +180,7 @@ void bjb_app_menu_set(GApplication *application)
app_entries,
G_N_ELEMENTS (app_entries),
application);
-
+
builder = gtk_builder_new ();
gtk_builder_add_from_resource (builder, "/org/gnome/bijiben/app-menu.ui", NULL);
diff --git a/src/bjb-controller.c b/src/bjb-controller.c
index a3a4ea3..b60ded5 100644
--- a/src/bjb-controller.c
+++ b/src/bjb-controller.c
@@ -24,6 +24,7 @@
#include <libgd/gd.h>
+#include "bjb-bijiben.h"
#include "bjb-controller.h"
#include "bjb-main-view.h"
#include "bjb-window-base.h"
@@ -41,10 +42,12 @@
struct _BjbControllerPrivate
{
- BijiManager *manager ;
- gchar *needle ;
- BijiNotebook *notebook;
- GtkTreeModel *model ;
+ /* needle, notebook and group define what the controller shows */
+ BijiManager *manager;
+ gchar *needle;
+ BijiNotebook *notebook;
+ BijiItemsGroup group;
+ GtkTreeModel *model;
BjbWindowBase *window;
@@ -110,6 +113,7 @@ bjb_controller_init (BjbController *self)
priv->n_items_to_show = BJB_ITEMS_SLICE;
priv->needle = NULL;
priv->notebook = NULL;
+ priv->group = BIJI_LIVING_ITEMS;
priv->connected = FALSE;
}
@@ -388,12 +392,16 @@ void
bjb_controller_update_view (BjbController *self)
{
GList *items, *l;
+ BjbWindowViewType type;
+
/* Do not update if nothing to show */
- if (bjb_window_base_get_view_type (self->priv->window) != BJB_WINDOW_BASE_MAIN_VIEW)
+ type = bjb_window_base_get_view_type (self->priv->window);
+ if (! (type == BJB_WINDOW_BASE_MAIN_VIEW
+ || type == BJB_WINDOW_BASE_ARCHIVE_VIEW))
return;
- items = self->priv->items_to_show ;
+ items = self->priv->items_to_show;
free_items_store (self);
sort_items (&items);
@@ -418,11 +426,19 @@ notify_displayed_items_changed (BjbController *self)
static void
update (BjbController *self)
{
+ BjbWindowViewType type;
+
/* If the user already edits a note, he does not want the view
* to go back */
- if (bjb_window_base_get_view_type (self->priv->window) !=
- BJB_WINDOW_BASE_NOTE_VIEW)
- bjb_window_base_switch_to (self->priv->window, BJB_WINDOW_BASE_MAIN_VIEW);
+ if (bjb_window_base_get_view_type (self->priv->window) != BJB_WINDOW_BASE_NOTE_VIEW)
+ {
+ if (self->priv->group == BIJI_LIVING_ITEMS)
+ type = BJB_WINDOW_BASE_MAIN_VIEW;
+ else
+ type = BJB_WINDOW_BASE_ARCHIVE_VIEW;
+
+ bjb_window_base_switch_to (self->priv->window, type);
+ }
bjb_controller_update_view (self);
@@ -443,12 +459,25 @@ update_controller_callback (GList *result,
priv = self->priv;
priv->remaining_items = FALSE;
+
+
if (!result)
{
bjb_window_base_switch_to (priv->window, BJB_WINDOW_BASE_NO_RESULT);
return;
}
+ switch (self->priv->group)
+ {
+ case BIJI_ARCHIVED_ITEMS:
+ bjb_window_base_switch_to (priv->window, BJB_WINDOW_BASE_ARCHIVE_VIEW);
+ break;
+
+ default:
+ break;
+ }
+
+
sort_items (&result);
i = 0;
@@ -474,12 +503,16 @@ update_controller_callback (GList *result,
update (self);
}
+
+
+
+
void
bjb_controller_apply_needle (BjbController *self)
{
+ GList *result;
BjbControllerPrivate *priv = self->priv;
gchar *needle;
- GList *all_notes;
needle = priv->needle;
g_clear_pointer (&priv->items_to_show, g_list_free);
@@ -487,22 +520,19 @@ bjb_controller_apply_needle (BjbController *self)
/* Show all notes */
if (needle == NULL || g_strcmp0 (needle,"") == 0)
{
- all_notes = biji_manager_get_items (self->priv->manager);
+ result = biji_manager_get_items (self->priv->manager, self->priv->group);
- /* If there are no note, report this */
- if (all_notes == NULL)
- {
+ if (result == NULL)
bjb_window_base_switch_to (self->priv->window, BJB_WINDOW_BASE_NO_NOTE);
- return;
- }
- /* Otherwise do show existing notes */
- update_controller_callback (all_notes, self);
+ else
+ update_controller_callback (result, self);
+
return;
}
/* There is a research, apply lookup */
- biji_get_items_matching_async (self->priv->manager, needle, update_controller_callback, self);
+ biji_get_items_matching_async (self->priv->manager, self->priv->group, needle, update_controller_callback,
self);
}
static void
@@ -516,18 +546,30 @@ on_needle_changed (BjbController *self)
/* Depending on the change at data level,
* the view has to be totaly refreshed or just amended */
static void
-on_manager_changed (BijiManager *manager,
- BijiManagerChangeFlag flag,
- gpointer *biji_item,
- BjbController *self)
+on_manager_changed (BijiManager *manager,
+ BijiItemsGroup group,
+ BijiManagerChangeFlag flag,
+ gpointer *biji_item,
+ BjbController *self)
{
BjbControllerPrivate *priv = self->priv;
BijiItem *item = BIJI_ITEM (biji_item);
GtkTreeIter iter;
GtkTreeIter *p_iter = &iter;
+
+
+
+ if (group != self->priv->group)
+ {
+ g_debug ("Controller received signal for group %i while %i",
+ group, self->priv->group);
+ return;
+ }
+
g_mutex_lock (&priv->mutex);
+
switch (flag)
{
/* If this is a *new* item, per def prepend */
@@ -595,7 +637,7 @@ static void
bjb_controller_connect (BjbController *self)
{
BjbControllerPrivate *priv = self->priv;
-
+
if (!priv->connected)
{
priv->manager_change = g_signal_connect (self->priv->manager, "changed",
@@ -702,7 +744,7 @@ bjb_controller_new (BijiManager *manager,
"manager", manager,
"window", window,
"needle", needle,
- NULL);
+ NULL);
}
void
@@ -752,7 +794,7 @@ bjb_controller_get_notebook (BjbController *self)
void
bjb_controller_set_notebook (BjbController *self,
- BijiNotebook *coll)
+ BijiNotebook *coll)
{
/* Going back from a notebook */
if (!coll)
@@ -780,6 +822,44 @@ bjb_controller_set_notebook (BjbController *self,
}
+
+BijiItemsGroup
+bjb_controller_get_group (BjbController *self)
+{
+ return self->priv->group;
+}
+
+
+
+void
+bjb_controller_set_group (BjbController *self,
+ BijiItemsGroup group)
+{
+ if (self->priv->group == group)
+ return;
+
+ g_clear_pointer (&self->priv->items_to_show, g_list_free);
+ self->priv->group = group;
+
+ /* Living group : refresh the ui */
+ if (group == BIJI_LIVING_ITEMS)
+ {
+ if (self->priv->notebook != NULL)
+ bjb_controller_set_notebook (self, self->priv->notebook);
+
+ else
+ bjb_controller_apply_needle (self);
+ //bjb_window_base_switch_to (self->priv->window, group);
+ return;
+ }
+
+
+ /* Archives : ping the manager */
+ biji_manager_load_archives (self->priv->manager);
+}
+
+
+
void
bjb_controller_show_more (BjbController *self)
{
diff --git a/src/bjb-controller.h b/src/bjb-controller.h
index e8c2d3d..142c5cb 100644
--- a/src/bjb-controller.h
+++ b/src/bjb-controller.h
@@ -77,6 +77,12 @@ BijiNotebook * bjb_controller_get_notebook (BjbController *self);
void bjb_controller_set_notebook (BjbController *self, BijiNotebook *coll);
+BijiItemsGroup bjb_controller_get_group (BjbController *controller);
+
+
+void bjb_controller_set_group (BjbController *self,
+ BijiItemsGroup group);
+
void bjb_controller_show_more (BjbController *controller);
G_END_DECLS
diff --git a/src/bjb-main-toolbar.c b/src/bjb-main-toolbar.c
index 05eaad0..8617a30 100644
--- a/src/bjb-main-toolbar.c
+++ b/src/bjb-main-toolbar.c
@@ -33,6 +33,9 @@ typedef enum
BJB_TOOLBAR_STD_LIST,
BJB_TOOLBAR_STD_ICON,
BJB_TOOLBAR_SELECT,
+ BJB_TOOLBAR_TRASH_LIST,
+ BJB_TOOLBAR_TRASH_ICON,
+ BJB_TOOLBAR_TRASH_SELECT,
BJB_TOOLBAR_NOTE_VIEW,
BJB_TOOLBAR_NUM
} BjbToolbarType;
@@ -372,7 +375,18 @@ connect_main_view_handlers (BjbMainToolbar *self)
static void
on_back_button_clicked (BjbMainToolbar *self)
{
- bjb_controller_set_notebook (self->priv->controller, NULL);
+ BijiItemsGroup group;
+
+ group = bjb_controller_get_group (self->priv->controller);
+
+ /* Back to main view from trash bin */
+ if (group == BIJI_ARCHIVED_ITEMS)
+ bjb_controller_set_group (self->priv->controller, BIJI_LIVING_ITEMS);
+
+
+ /* Back to main view */
+ else
+ bjb_controller_set_notebook (self->priv->controller, NULL);
}
static void
@@ -444,13 +458,66 @@ populate_bar_for_standard(BjbMainToolbar *self)
connect_main_view_handlers (self);
}
+
+
static void
-populate_bar_for_icon_view(BjbMainToolbar *self)
+populate_bar_for_trash (BjbMainToolbar *self)
{
- BjbMainToolbarPrivate *priv = self->priv;
+ BjbMainToolbarPrivate *priv;
+ gboolean rtl;
+ GtkWidget *select_image;
+ GtkSizeGroup *size;
+
+ priv = self->priv;
+
+ rtl = (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL);
+ gtk_header_bar_set_title (GTK_HEADER_BAR (self), _("Trash"));
+ gtk_header_bar_set_subtitle (GTK_HEADER_BAR (self), NULL);
+
+
+ priv->back = gtk_button_new_from_icon_name (rtl ? "go-previous-rtl-symbolic" : "go-previous-symbolic",
+ GTK_ICON_SIZE_MENU);
+ gtk_widget_set_valign (priv->back, GTK_ALIGN_CENTER);
+ gtk_header_bar_pack_start (GTK_HEADER_BAR (self), priv->back);
+
+ g_signal_connect_swapped (priv->back, "clicked",
+ G_CALLBACK (on_back_button_clicked), self);
+
+ /* Go to selection mode */
+ priv->select = gtk_button_new ();
+ select_image = gtk_image_new_from_icon_name ("object-select-symbolic", GTK_ICON_SIZE_MENU);
+ gtk_button_set_image (GTK_BUTTON (priv->select), select_image);
+ gtk_widget_set_valign (priv->select, GTK_ALIGN_CENTER);
+ gtk_style_context_add_class (gtk_widget_get_style_context (priv->select),
+ "image-button");
+ gtk_header_bar_pack_end (GTK_HEADER_BAR (self), priv->select);
+ gtk_widget_set_tooltip_text (priv->select, _("Selection mode"));
+
+ g_signal_connect (priv->select,"clicked",
+ G_CALLBACK(on_selection_mode_clicked),self);
+
+ /* Align buttons */
+ size = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
+ gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->select);
+ gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->back);
+ g_object_unref (size);
+
+ /* Show close button */
+ gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (self), TRUE);
+
+ /* Watch for main view changing */
+ connect_main_view_handlers (self);
+}
+
+
+
+static void
+add_list_button (BjbMainToolbar *self)
+{
+ BjbMainToolbarPrivate *priv;
GtkWidget *list_image;
- /* Switch to list */
+ priv = self->priv;
priv->grid = NULL;
priv->list = gtk_button_new ();
list_image = gtk_image_new_from_icon_name ("view-list-symbolic", GTK_ICON_SIZE_MENU);
@@ -461,20 +528,20 @@ populate_bar_for_icon_view(BjbMainToolbar *self)
gtk_header_bar_pack_end (GTK_HEADER_BAR (self), priv->list);
gtk_widget_set_tooltip_text (priv->list,
_("View notes and notebooks in a list"));
-
g_signal_connect (priv->list, "clicked",
G_CALLBACK(on_view_mode_clicked),self);
-
- populate_bar_for_standard(self);
}
+
+
static void
-populate_bar_for_list_view(BjbMainToolbar *self)
+add_grid_button (BjbMainToolbar *self)
{
- BjbMainToolbarPrivate *priv = self->priv;
+ BjbMainToolbarPrivate *priv;
GtkWidget *grid_image;
- /* Switch to icon view */
+
+ priv = self->priv;
priv->list = NULL;
priv->grid = gtk_button_new ();
grid_image = gtk_image_new_from_icon_name ("view-grid-symbolic", GTK_ICON_SIZE_MENU);
@@ -488,10 +555,39 @@ populate_bar_for_list_view(BjbMainToolbar *self)
g_signal_connect (priv->grid, "clicked",
G_CALLBACK(on_view_mode_clicked),self);
+}
+
+static void
+populate_bar_for_icon_view(BjbMainToolbar *self)
+{
+ add_list_button (self);
populate_bar_for_standard(self);
}
+static void
+populate_bar_for_list_view(BjbMainToolbar *self)
+{
+ add_grid_button (self);
+ populate_bar_for_standard(self);
+}
+
+
+static void
+populate_bar_for_trash_icon_view (BjbMainToolbar *self)
+{
+ add_list_button (self);
+ populate_bar_for_trash (self);
+}
+
+
+static void
+populate_bar_for_trash_list_view (BjbMainToolbar *self)
+{
+ add_grid_button (self);
+ populate_bar_for_trash (self);
+}
+
static void
disconnect_note_handlers (BjbMainToolbarPrivate *priv)
@@ -594,7 +690,7 @@ action_view_tags_callback (GtkWidget *item, gpointer user_data)
}
static void
-delete_item_callback (GtkWidget *item, gpointer user_data)
+trash_item_callback (GtkWidget *item, gpointer user_data)
{
BjbMainToolbar *self = BJB_MAIN_TOOLBAR (user_data);
@@ -669,10 +765,10 @@ bjb_note_menu_new (BjbMainToolbar *self)
}
/* Delete Note */
- item = gtk_menu_item_new_with_label(_("Delete this Note"));
+ item = gtk_menu_item_new_with_label(_("Move to Trash"));
gtk_menu_shell_append(GTK_MENU_SHELL(result),item);
g_signal_connect(item,"activate",
- G_CALLBACK(delete_item_callback),self);
+ G_CALLBACK(trash_item_callback),self);
gtk_widget_show_all (result);
return result;
@@ -705,7 +801,7 @@ populate_bar_for_note_view (BjbMainToolbar *self)
GTK_ICON_SIZE_MENU);
gtk_widget_set_valign (priv->back, GTK_ALIGN_CENTER);
gtk_header_bar_pack_start (bar, priv->back);
-
+
g_signal_connect_swapped (priv->back, "clicked",
G_CALLBACK (just_switch_to_main_view), self);
gtk_widget_add_accelerator (priv->back, "activate", self->priv->accel,
@@ -797,6 +893,7 @@ populate_bar_switch (BjbMainToolbar *self)
switch (priv->type)
{
case BJB_TOOLBAR_SELECT:
+ case BJB_TOOLBAR_TRASH_SELECT:
populate_bar_for_selection (self);
break;
@@ -818,6 +915,17 @@ populate_bar_switch (BjbMainToolbar *self)
self->priv);
break;
+
+ case BJB_TOOLBAR_TRASH_ICON:
+ //add_search_button (self); TODO (handle callback)
+ populate_bar_for_trash_icon_view (self);
+ break;
+
+ case BJB_TOOLBAR_TRASH_LIST:
+ //add_search_button (self); TODO (handle callback)
+ populate_bar_for_trash_list_view (self);
+ break;
+
case BJB_TOOLBAR_NOTE_VIEW:
populate_bar_for_note_view (self);
break;
@@ -861,6 +969,23 @@ populate_main_toolbar(BjbMainToolbar *self)
break;
+
+ case BJB_WINDOW_BASE_ARCHIVE_VIEW:
+
+ if (bjb_main_view_get_selection_mode (priv->parent) == TRUE)
+ to_be = BJB_TOOLBAR_TRASH_SELECT;
+
+ else if (bjb_main_view_get_view_type (priv->parent) == GD_MAIN_VIEW_ICON)
+ to_be = BJB_TOOLBAR_TRASH_ICON;
+
+ else if (bjb_main_view_get_view_type (priv->parent) == GD_MAIN_VIEW_LIST)
+ to_be = BJB_TOOLBAR_TRASH_LIST;
+
+
+ break;
+
+
+
/* Not really a toolbar,
* still used for Spinner */
default:
@@ -876,7 +1001,7 @@ populate_main_toolbar(BjbMainToolbar *self)
priv->type = to_be;
bjb_main_toolbar_clear (self);
-
+
if (priv->search_handler != 0)
{
diff --git a/src/bjb-selection-toolbar.c b/src/bjb-selection-toolbar.c
index 0dfa8bf..016864b 100644
--- a/src/bjb-selection-toolbar.c
+++ b/src/bjb-selection-toolbar.c
@@ -28,6 +28,8 @@
#include "bjb-main-view.h"
#include "bjb-organize-dialog.h"
#include "bjb-selection-toolbar.h"
+#include "bjb-share.h"
+#include "bjb-trash-bar.h"
#include "bjb-window-base.h"
enum
@@ -40,20 +42,26 @@ enum
static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
+
+/* Selection toolbar
+ * it uses two widgets
+ * header bar for classic view -> only show when selection
+ * toolbar for archive view -> always show bar for trash bin
+ */
+
struct _BjbSelectionToolbarPrivate
{
GtkHeaderBar *bar;
-
- GtkWidget *toolbar_trash;
- GtkWidget *toolbar_color;
- GtkWidget *toolbar_tag;
-
- /* sure */
BjbMainView *view ;
+ BjbTrashBar *trash_bar;
GtkWidget *widget ;
GdMainView *selection ;
- /* misc gtk */
+ /* Header bar members. Classic view */
+ GtkWidget *toolbar_trash;
+ GtkWidget *toolbar_color;
+ GtkWidget *toolbar_tag;
+ GtkWidget *toolbar_share;
GtkToolItem *left_group;
GtkToolItem *right_group;
GtkToolItem *separator;
@@ -132,6 +140,22 @@ action_delete_selected_items (GtkWidget *w, BjbSelectionToolbar *self)
static void
+action_share_item_callback (GtkWidget *w, BjbSelectionToolbar *self)
+{
+ GList *l, *selection;
+
+ selection = bjb_main_view_get_selected_items (self->priv->view);
+
+ for (l=selection; l!= NULL; l=l->next)
+ {
+ on_email_note_callback (w, l->data);
+ }
+
+ g_list_free (selection);
+}
+
+
+static void
bjb_selection_toolbar_fade_in (BjbSelectionToolbar *self)
{
gtk_revealer_set_reveal_child (GTK_REVEALER (self), TRUE);
@@ -151,6 +175,7 @@ bjb_selection_toolbar_set_item_visibility (BjbSelectionToolbar *self)
BjbSelectionToolbarPrivate *priv;
GList *l, *selection;
GdkRGBA color;
+ gboolean can_tag, can_color, can_share;
g_return_if_fail (BJB_IS_SELECTION_TOOLBAR (self));
@@ -158,52 +183,80 @@ bjb_selection_toolbar_set_item_visibility (BjbSelectionToolbar *self)
selection = bjb_main_view_get_selected_items (priv->view);
- /* Color */
- gtk_widget_set_sensitive (priv->toolbar_color, FALSE);
+ /* Default */
+ can_color = TRUE;
+ can_tag = TRUE;
+ can_share = TRUE;
+ /* Adapt */
for (l=selection; l !=NULL; l=l->next)
{
- if (!biji_item_has_color (l->data))
+ if (can_tag == TRUE) /* tag is default. check if still applies */
{
- gtk_widget_set_sensitive (priv->toolbar_color, FALSE);
- break;
+ if (!biji_item_is_collectable (l->data))
+ can_tag = FALSE;
}
- else if (BIJI_IS_NOTE_OBJ (l->data))
- {
- if (biji_note_obj_get_rgba (BIJI_NOTE_OBJ (l->data), &color))
- {
- gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->toolbar_color), &color);
- gtk_widget_set_sensitive (priv->toolbar_color, TRUE);
- break;
- }
- }
- }
+ if (can_color == TRUE) /* color is default. check */
+ {
+ if (!BIJI_IS_NOTE_OBJ (l->data)
+ || !biji_item_has_color (l->data)
+ || !biji_note_obj_get_rgba (BIJI_NOTE_OBJ (l->data), &color))
+ can_color = FALSE;
- /* Organize */
- gtk_widget_set_sensitive (priv->toolbar_tag, TRUE);
+ else
+ gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->toolbar_color), &color);
+ }
- for (l=selection; l!=NULL; l=l->next)
- {
- if (!biji_item_is_collectable (l->data))
+ if (can_share == TRUE) /* share is default. check. */
{
- gtk_widget_set_sensitive (priv->toolbar_tag, FALSE);
- break;
+ if (!BIJI_IS_NOTE_OBJ (l->data))
+ can_share = FALSE;
}
}
+
+ gtk_widget_set_sensitive (priv->toolbar_color, can_color);
+ gtk_widget_set_sensitive (priv->toolbar_tag, can_tag);
+ gtk_widget_set_sensitive (priv->toolbar_share, can_share);
+
g_list_free (selection);
}
static void
bjb_selection_toolbar_selection_changed (GdMainView *view, gpointer user_data)
{
-
- BjbSelectionToolbar *self = BJB_SELECTION_TOOLBAR (user_data);
+
+ BjbSelectionToolbar *self;
+ BjbSelectionToolbarPrivate *priv;
GList *selection;
+ BijiItemsGroup group;
+
+ self = BJB_SELECTION_TOOLBAR (user_data);
+ priv = self->priv;
+ group = bjb_controller_get_group (
+ bjb_window_base_get_controller (
+ BJB_WINDOW_BASE (
+ bjb_main_view_get_window (self->priv->view))));
+
+
+ /* always show bar for archive view */
+ if (group == BIJI_ARCHIVED_ITEMS)
+ {
+ priv->bar = g_object_ref (priv->bar);
+ bjb_selection_toolbar_fade_in (self);
+ gtk_container_remove (GTK_CONTAINER (self), GTK_WIDGET (priv->bar));
+ gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (priv->trash_bar));
+ bjb_trash_bar_set_visibility (priv->trash_bar);
+ return;
+ }
+
+ priv->trash_bar = g_object_ref (priv->trash_bar);
+ gtk_container_remove (GTK_CONTAINER (self), GTK_WIDGET (priv->trash_bar));
+ gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (priv->bar));
selection = gd_main_view_get_selection(view);
if (g_list_length (selection) > 0)
@@ -211,7 +264,7 @@ bjb_selection_toolbar_selection_changed (GdMainView *view, gpointer user_data)
bjb_selection_toolbar_set_item_visibility (self);
bjb_selection_toolbar_fade_in (self);
}
-
+
else
bjb_selection_toolbar_fade_out (self);
}
@@ -227,8 +280,8 @@ static void
bjb_selection_toolbar_init (BjbSelectionToolbar *self)
{
BjbSelectionToolbarPrivate *priv;
- GtkWidget *widget;
-
+ GtkWidget *widget, *share;
+ GtkSizeGroup *size;
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, BJB_TYPE_SELECTION_TOOLBAR, BjbSelectionToolbarPrivate);
priv = self->priv;
@@ -240,10 +293,12 @@ bjb_selection_toolbar_init (BjbSelectionToolbar *self)
priv->bar = GTK_HEADER_BAR (gtk_header_bar_new ());
gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (priv->bar));
- /* Trash notes */
- priv->toolbar_trash = gtk_button_new_with_label (_("Delete"));
- gtk_widget_set_valign (priv->toolbar_trash, GTK_ALIGN_CENTER);
- gtk_header_bar_pack_start (priv->bar, priv->toolbar_trash);
+
+ /* Notes tags */
+ priv->toolbar_tag = gtk_button_new_with_label (_("Notebooks"));
+ gtk_widget_set_valign (priv->toolbar_tag, GTK_ALIGN_CENTER);
+ gtk_header_bar_pack_start (priv->bar, priv->toolbar_tag);
+
/* Notes color */
@@ -251,13 +306,35 @@ bjb_selection_toolbar_init (BjbSelectionToolbar *self)
gtk_widget_set_tooltip_text (GTK_WIDGET (priv->toolbar_color),
_("Note color"));
gtk_widget_set_valign (priv->toolbar_color, GTK_ALIGN_CENTER);
- gtk_header_bar_pack_end (priv->bar, priv->toolbar_color);
+ gtk_header_bar_pack_start (priv->bar, priv->toolbar_color);
- /* Notes tags */
- priv->toolbar_tag = gtk_button_new_with_label (_("Notebooks"));
- gtk_widget_set_valign (priv->toolbar_tag, GTK_ALIGN_CENTER);
- gtk_header_bar_pack_end (priv->bar, priv->toolbar_tag);
+ /* Share */
+ priv->toolbar_share = gtk_button_new ();
+ share = gtk_image_new_from_icon_name ("send-to-symbolic", GTK_ICON_SIZE_MENU);
+ gtk_button_set_image (GTK_BUTTON (priv->toolbar_share), share);
+ gtk_widget_set_valign (share, GTK_ALIGN_CENTER);
+ gtk_style_context_add_class (gtk_widget_get_style_context (priv->toolbar_share),
+ "image-button");
+ gtk_widget_set_tooltip_text (priv->toolbar_share, _("Share note"));
+ gtk_header_bar_pack_start (priv->bar, priv->toolbar_share);
+
+
+ /* Trash notes */
+ priv->toolbar_trash = gtk_button_new_with_label (_("Move to Trash"));
+ gtk_widget_set_valign (priv->toolbar_trash, GTK_ALIGN_CENTER);
+ gtk_header_bar_pack_end (priv->bar, priv->toolbar_trash);
+
+
+
+ /* Align buttons */
+ size = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
+ gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->toolbar_tag);
+ gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->toolbar_color);
+ gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->toolbar_share);
+ gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->toolbar_trash);
+ g_object_unref (size);
+
gtk_widget_show_all (widget);
@@ -310,23 +387,34 @@ bjb_selection_toolbar_constructed(GObject *obj)
{
BjbSelectionToolbar *self = BJB_SELECTION_TOOLBAR(obj);
BjbSelectionToolbarPrivate *priv = self->priv ;
-
+
G_OBJECT_CLASS (bjb_selection_toolbar_parent_class)->constructed (obj);
- /* item(s) selected --> fade in */
+
+ priv->trash_bar = bjb_trash_bar_new (
+ bjb_window_base_get_controller (
+ BJB_WINDOW_BASE (
+ bjb_main_view_get_window (self->priv->view))),
+ self->priv->selection);
+
+
+
g_signal_connect (self->priv->selection,
"view-selection-changed",
G_CALLBACK(bjb_selection_toolbar_selection_changed),
self);
+ g_signal_connect (priv->toolbar_tag,"clicked",
+ G_CALLBACK (action_tag_selected_items), self);
+
g_signal_connect_swapped (priv->toolbar_color,"clicked",
G_CALLBACK (hide_self), self);
g_signal_connect (priv->toolbar_color,"color-set",
G_CALLBACK (action_color_selected_items), self);
- g_signal_connect (priv->toolbar_tag,"clicked",
- G_CALLBACK (action_tag_selected_items), self);
+ g_signal_connect (priv->toolbar_share, "clicked",
+ G_CALLBACK (action_share_item_callback), self);
g_signal_connect (priv->toolbar_trash,"clicked",
G_CALLBACK (action_delete_selected_items), self);
diff --git a/src/bjb-trash-bar.c b/src/bjb-trash-bar.c
new file mode 100644
index 0000000..1b8bdbd
--- /dev/null
+++ b/src/bjb-trash-bar.c
@@ -0,0 +1,213 @@
+/* bjb-trash-bar.c
+ * Copyright (C) Pierre-Yves LUYTEN 2013 <py luyten fr>
+ *
+ * bijiben 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * bijiben 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <libgd/gd.h>
+
+#include "bjb-main-view.h"
+#include "bjb-selection-toolbar.h"
+#include "bjb-trash-bar.h"
+#include "bjb-window-base.h"
+
+
+enum
+{
+ PROP_0,
+ PROP_BJB_SELECTION,
+ PROP_BJB_CONTROLLER,
+ NUM_PROPERTIES
+};
+
+
+
+static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
+
+
+struct BjbTrashBarPrivate_
+{
+ GtkWidget *bar;
+ BjbController *controller;
+ GdMainView *selection;
+
+ GtkWidget *restore;
+ GtkWidget *delete;
+ GtkWidget *empty_bin;
+};
+
+
+
+
+G_DEFINE_TYPE (BjbTrashBar, bjb_trash_bar, GTK_TYPE_BOX)
+
+
+void
+bjb_trash_bar_set_visibility (BjbTrashBar *self)
+{
+/*
+ BjbTrashBarPrivate *priv;
+ GList *items;
+
+ priv = self->priv;
+ items = gd_main_view_get_selection (priv->selection);
+
+ if (items != NULL)
+ gtk_widget_hide (priv->empty_bin);
+
+ else
+ gtk_widget_show (priv->empty_bin);
+
+ g_list_free (items);
+*/
+}
+
+void
+bjb_trash_bar_fade_in (BjbTrashBar *self)
+{
+}
+
+
+void
+bjb_trash_bar_fade_out (BjbTrashBar *self)
+{
+}
+
+static void
+bjb_trash_bar_dispose (GObject *obj)
+{
+ G_OBJECT_CLASS (bjb_trash_bar_parent_class)->dispose (obj);
+}
+
+
+static void
+bjb_trash_bar_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ BjbTrashBar *self = BJB_TRASH_BAR (object);
+
+ switch (property_id)
+ {
+ case PROP_BJB_SELECTION:
+ g_value_set_object(value, self->priv->selection);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+
+static void
+bjb_trash_bar_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ BjbTrashBar *self = BJB_TRASH_BAR (object);
+
+ switch (property_id)
+ {
+ case PROP_BJB_SELECTION:
+ self->priv->selection = g_value_get_object (value);
+ break;
+
+ case PROP_BJB_CONTROLLER:
+ self->priv->controller = g_value_get_object (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+
+static void
+bjb_trash_bar_constructed (GObject *obj)
+{
+ BjbTrashBar *self;
+ BjbTrashBarPrivate *priv;
+
+ G_OBJECT_CLASS (bjb_trash_bar_parent_class)->constructed (obj);
+
+ self = BJB_TRASH_BAR (obj);
+ priv = self->priv;
+
+ priv->empty_bin = gtk_label_new (_("Empty"));
+ //gtk_container_add (GTK_CONTAINER (self), priv->empty_bin);
+ gtk_widget_show_all (GTK_WIDGET (self));
+}
+
+
+
+static void
+bjb_trash_bar_class_init (BjbTrashBarClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->dispose = bjb_trash_bar_dispose;
+ object_class->get_property = bjb_trash_bar_get_property;
+ object_class->set_property = bjb_trash_bar_set_property;
+ object_class->constructed = bjb_trash_bar_constructed;
+
+ properties[PROP_BJB_SELECTION] = g_param_spec_object ("selection",
+ "Selection",
+ "SelectionController",
+ GD_TYPE_MAIN_VIEW,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS);
+
+
+ properties[PROP_BJB_CONTROLLER] = g_param_spec_object ("controller",
+ "Controller",
+ "Window Controller",
+ BJB_TYPE_CONTROLLER,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
+
+ g_type_class_add_private ((gpointer)klass, sizeof (BjbTrashBarPrivate));
+}
+
+
+
+static void
+bjb_trash_bar_init (BjbTrashBar *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, BJB_TYPE_TRASH_BAR, BjbTrashBarPrivate);
+}
+
+
+BjbTrashBar *
+bjb_trash_bar_new (BjbController *controller,
+ GdMainView *view)
+{
+ return g_object_new (BJB_TYPE_TRASH_BAR,
+ "orientation", GTK_ORIENTATION_HORIZONTAL,
+ "spacing", 2,
+ "controller", controller,
+ "selection", view,
+ NULL);
+}
diff --git a/src/bjb-trash-bar.h b/src/bjb-trash-bar.h
new file mode 100644
index 0000000..3a8a3be
--- /dev/null
+++ b/src/bjb-trash-bar.h
@@ -0,0 +1,73 @@
+/* bjb-trash-bar.h
+ * Copyright (C) Pierre-Yves LUYTEN 2013 <py luyten fr>
+ *
+ * bijiben 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * bijiben 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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef BJB_TRASH_BAR_H_
+#define BJB_TRASH_BAR_H_ 1
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+#include <libgd/gd.h>
+
+#include "bjb-controller.h"
+
+G_BEGIN_DECLS
+
+
+#define BJB_TYPE_TRASH_BAR (bjb_trash_bar_get_type ())
+#define BJB_TRASH_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BJB_TYPE_TRASH_BAR, BjbTrashBar))
+#define BJB_TRASH_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BJB_TYPE_TRASH_BAR,
BjbTrashBarClass))
+#define BJB_IS_TRASH_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BJB_TYPE_TRASH_BAR))
+#define BJB_IS_TRASH_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BJB_TYPE_TRASH_BAR))
+#define BJB_TRASH_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BJB_TYPE_TRASH_BAR,
BjbTrashBarClass))
+
+typedef struct BjbTrashBar_ BjbTrashBar;
+typedef struct BjbTrashBarClass_ BjbTrashBarClass;
+typedef struct BjbTrashBarPrivate_ BjbTrashBarPrivate;
+
+struct BjbTrashBar_
+{
+ GtkBox parent;
+ BjbTrashBarPrivate *priv;
+};
+
+struct BjbTrashBarClass_
+{
+ GtkBoxClass parent_class;
+};
+
+
+GType bjb_trash_bar_get_type (void);
+
+
+BjbTrashBar * bjb_trash_bar_new (BjbController *controller,
+ GdMainView *selection);
+
+
+void bjb_trash_bar_set_visibility (BjbTrashBar *self);
+
+
+void bjb_trash_bar_fade_in (BjbTrashBar *self);
+
+
+void bjb_trash_bar_fade_out (BjbTrashBar *self);
+
+
+G_END_DECLS
+
+#endif /* BJB_TRASH_BAR_H_ */
diff --git a/src/bjb-window-base.c b/src/bjb-window-base.c
index ff9e2b0..434131d 100644
--- a/src/bjb-window-base.c
+++ b/src/bjb-window-base.c
@@ -126,13 +126,13 @@ bjb_window_base_constructed (GObject *obj)
bjb = gdk_pixbuf_new_from_file (full_path, &error);
g_free (full_path);
-
+
if ( error )
{
g_message("%s", error->message);
g_error_free(error);
}
-
+
icons = g_list_prepend(icons,bjb);
gtk_window_set_default_icon_list(icons);
g_list_foreach (icons, (GFunc) g_object_unref, NULL);
@@ -256,6 +256,9 @@ bjb_window_base_get_note (BjbWindowBase *self)
return self->priv->note;
}
+
+
+
static void
destroy_note_if_needed (BjbWindowBase *bwb)
{
@@ -279,7 +282,10 @@ bjb_window_base_switch_to (BjbWindowBase *bwb, BjbWindowViewType type)
/* Precise the window does not display any specific note
* Refresh the model
- * Ensure the main view receives the proper signals */
+ * Ensure the main view receives the proper signals
+ *
+ * main view & archive view are the same widget
+ */
case BJB_WINDOW_BASE_MAIN_VIEW:
bjb_search_toolbar_connect (priv->search_bar);
@@ -287,6 +293,11 @@ bjb_window_base_switch_to (BjbWindowBase *bwb, BjbWindowViewType type)
gtk_stack_set_visible_child_name (priv->stack, "main-view");
break;
+ case BJB_WINDOW_BASE_ARCHIVE_VIEW:
+ bjb_search_toolbar_connect (priv->search_bar);
+ bjb_main_view_connect_signals (priv->view);
+ gtk_stack_set_visible_child_name (priv->stack, "main-view");
+ break;
case BJB_WINDOW_BASE_SPINNER_VIEW:
gtk_stack_set_visible_child_name (priv->stack, "spinner");
diff --git a/src/bjb-window-base.h b/src/bjb-window-base.h
index e225b74..74ad300 100644
--- a/src/bjb-window-base.h
+++ b/src/bjb-window-base.h
@@ -31,6 +31,7 @@ struct _BjbWindowBase
};
typedef enum {
+ BJB_WINDOW_BASE_ARCHIVE_VIEW,
BJB_WINDOW_BASE_MAIN_VIEW,
BJB_WINDOW_BASE_SPINNER_VIEW,
BJB_WINDOW_BASE_NOTE_VIEW,
@@ -44,7 +45,7 @@ GType bjb_window_base_get_type (void);
GtkWindow * bjb_window_base_new(void);
-// Accessor
+// Accessor
BjbController * bjb_window_base_get_controller ( BjbWindowBase *window ) ;
diff --git a/src/libbiji/biji-manager.c b/src/libbiji/biji-manager.c
index f021219..c01c2ed 100644
--- a/src/libbiji/biji-manager.c
+++ b/src/libbiji/biji-manager.c
@@ -34,6 +34,7 @@ struct _BijiManagerPrivate
* Keep a direct pointer to local provider for convenience. */
GHashTable *items;
+ GHashTable *archives;
GHashTable *providers;
BijiProvider *local_provider;
@@ -97,6 +98,10 @@ biji_manager_init (BijiManager *self)
NULL,
g_object_unref);
+ priv->archives = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ NULL,
+ g_object_unref);
/*
* Providers are the different notes storage
* the hash table use an id
@@ -153,6 +158,8 @@ biji_manager_finalize (GObject *object)
g_clear_object (&manager->priv->location);
g_hash_table_destroy (manager->priv->items);
+ g_hash_table_destroy (manager->priv->archives);
+
G_OBJECT_CLASS (biji_manager_parent_class)->finalize (object);
}
@@ -267,13 +274,15 @@ biji_manager_get_unique_title (BijiManager *manager, const gchar *title)
void
biji_manager_notify_changed (BijiManager *manager,
- BijiManagerChangeFlag flag,
- BijiItem *item)
+ BijiItemsGroup group,
+ BijiManagerChangeFlag flag,
+ BijiItem *item)
{
g_debug ("manager: notify changed, %i", flag);
g_signal_emit (manager,
biji_manager_signals[BOOK_AMENDED],
0,
+ group,
flag,
item);
}
@@ -283,18 +292,27 @@ biji_manager_notify_changed (BijiManager *manager,
void
manager_on_note_changed_cb (BijiNoteObj *note, BijiManager *manager)
{
- biji_manager_notify_changed (manager, BIJI_MANAGER_NOTE_AMENDED, BIJI_ITEM (note));
+ biji_manager_notify_changed (manager,
+ BIJI_LIVING_ITEMS,
+ BIJI_MANAGER_NOTE_AMENDED,
+ BIJI_ITEM (note));
}
static void
manager_on_item_icon_changed_cb (BijiNoteObj *note, BijiManager *manager)
{
- biji_manager_notify_changed (manager, BIJI_MANAGER_ITEM_ICON_CHANGED, BIJI_ITEM (note));
+ biji_manager_notify_changed (manager,
+ BIJI_LIVING_ITEMS,
+ BIJI_MANAGER_ITEM_ICON_CHANGED,
+ BIJI_ITEM (note));
}
gboolean
-biji_manager_add_item (BijiManager *manager, BijiItem *item, gboolean notify)
+biji_manager_add_item (BijiManager *manager,
+ BijiItem *item,
+ BijiItemsGroup group,
+ gboolean notify)
{
const gchar *uid;
gboolean retval;
@@ -305,17 +323,34 @@ biji_manager_add_item (BijiManager *manager, BijiItem *item, gboolean notify)
retval = TRUE;
uid = biji_item_get_uuid (item);
- if (uid != NULL &&
- g_hash_table_lookup (manager->priv->items, uid))
- retval = FALSE;
+ /* Check if item is not already there */
+ if (uid != NULL)
+ {
+ if (group == BIJI_LIVING_ITEMS &&
+ g_hash_table_lookup (manager->priv->items, uid))
+ retval = FALSE;
+ if (group == BIJI_ARCHIVED_ITEMS &&
+ g_hash_table_lookup (manager->priv->archives, uid))
+ retval = FALSE;
+ }
- else
- {
- g_hash_table_insert (manager->priv->items,
- (gpointer) biji_item_get_uuid (item), item);
+ /* Fail because UUID is null */
+ else
+ retval = FALSE;
+ if (retval == TRUE)
+ {
+ /* Add the item*/
+ if (group == BIJI_LIVING_ITEMS)
+ g_hash_table_insert (manager->priv->items,
+ (gpointer) biji_item_get_uuid (item), item);
+ else if (group == BIJI_ARCHIVED_ITEMS)
+ g_hash_table_insert (manager->priv->archives,
+ (gpointer) biji_item_get_uuid (item), item);
+
+ /* Connect */
if (BIJI_IS_NOTE_OBJ (item))
{
g_signal_connect (item, "changed", G_CALLBACK (manager_on_note_changed_cb), manager);
@@ -330,7 +365,7 @@ biji_manager_add_item (BijiManager *manager, BijiItem *item, gboolean notify)
}
if (retval && notify)
- biji_manager_notify_changed (manager, BIJI_MANAGER_ITEM_ADDED, item);
+ biji_manager_notify_changed (manager, group, BIJI_MANAGER_ITEM_ADDED, item);
return retval;
}
@@ -341,31 +376,40 @@ biji_manager_add_item (BijiManager *manager, BijiItem *item, gboolean notify)
static void
on_provider_loaded_cb (BijiProvider *provider,
GList *items,
+ BijiItemsGroup group,
BijiManager *manager)
{
- BijiItem *item = NULL;
GList *l;
- gint i = 0;
- for (l=items; l!=NULL; l=l->next)
+ switch (group)
{
- if (BIJI_IS_ITEM (l->data))
- {
- biji_manager_add_item (manager, l->data, FALSE);
- i++;
- }
- }
+ case BIJI_LIVING_ITEMS:
+ for (l=items; l!=NULL; l=l->next)
+ {
+ if (BIJI_IS_ITEM (l->data))
+ biji_manager_add_item (manager, l->data, BIJI_LIVING_ITEMS, FALSE);
+ }
+ break;
+ case BIJI_ARCHIVED_ITEMS:
+ for (l=items; l!= NULL; l=l->next)
+ {
+ if (BIJI_IS_ITEM (l->data))
+ biji_manager_add_item (manager, l->data, BIJI_ARCHIVED_ITEMS, FALSE);
+ }
+ break;
- g_debug ("on provider loaded: %i", i);
+ default:
+ break;
+ }
/* More cautious to ask to fully rebuild the model
* because this might be the first provider.
* See #708458
* There are more performant fixes but not worth it */
- biji_manager_notify_changed (manager, BIJI_MANAGER_MASS_CHANGE, item);
+ biji_manager_notify_changed (manager, group, BIJI_MANAGER_MASS_CHANGE, NULL);
}
@@ -476,8 +520,8 @@ biji_manager_class_init (BijiManagerClass *klass)
biji_manager_signals[BOOK_AMENDED] =
g_signal_new ("changed", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST,
0, NULL, NULL, /* offset & accumulator */
- _biji_marshal_VOID__ENUM_POINTER,
- G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_POINTER);
+ _biji_marshal_VOID__ENUM_ENUM_POINTER,
+ G_TYPE_NONE, 3, G_TYPE_INT, G_TYPE_INT, G_TYPE_POINTER);
properties[PROP_LOCATION] =
g_param_spec_object ("location",
@@ -517,7 +561,7 @@ biji_manager_get_default_color (BijiManager *manager, GdkRGBA *color)
}
-gboolean
+gboolean
biji_manager_remove_item (BijiManager *manager, BijiItem *item)
{
g_return_val_if_fail (BIJI_IS_MANAGER (manager), FALSE);
@@ -534,7 +578,7 @@ biji_manager_remove_item (BijiManager *manager, BijiItem *item)
{
/* Signal before doing anything here. So the note is still
* fully available for signal receiver. */
- biji_manager_notify_changed (manager, BIJI_MANAGER_ITEM_TRASHED, to_delete);
+ biji_manager_notify_changed (manager, BIJI_LIVING_ITEMS, BIJI_MANAGER_ITEM_TRASHED, to_delete);
biji_item_trash (item);
g_hash_table_remove (manager->priv->items, path);
@@ -545,12 +589,46 @@ biji_manager_remove_item (BijiManager *manager, BijiItem *item)
}
+
GList *
-biji_manager_get_items (BijiManager *manager)
+biji_manager_get_items (BijiManager *manager,
+ BijiItemsGroup group)
+{
+ GList *list;
+
+
+ switch (group)
+ {
+ case BIJI_LIVING_ITEMS:
+ list = g_hash_table_get_values (manager->priv->items);
+ break;
+
+ case BIJI_ARCHIVED_ITEMS:
+ list = g_hash_table_get_values (manager->priv->archives);
+ break;
+
+ default:
+ list = NULL;
+ g_warning ("invalid BijiItemsGroup:%i", group);
+ }
+
+ return list;
+}
+
+
+void
+biji_manager_load_archives (BijiManager *manager)
{
- return g_hash_table_get_values (manager->priv->items);
+ GList *l, *ll;
+
+ l = g_hash_table_get_values (manager->priv->providers);
+ for (ll=l; ll!= NULL; ll=ll->next)
+ biji_provider_load_archives (BIJI_PROVIDER (ll->data));
+ g_list_free (l);
}
+
+
BijiItem *
biji_manager_get_item_at_path (BijiManager *manager, const gchar *path)
{
@@ -657,7 +735,7 @@ biji_manager_local_note_new (BijiManager *manager, gchar *str)
}
biji_note_obj_save_note (ret);
- biji_manager_add_item (manager, BIJI_ITEM (ret), TRUE);
+ biji_manager_add_item (manager, BIJI_ITEM (ret), TRUE, BIJI_LIVING_ITEMS);
return ret;
}
@@ -677,7 +755,7 @@ biji_manager_import_uri (BijiManager *manager,
ret = biji_import_provider_new (manager, target_provider_id, uri);
g_signal_connect (ret, "loaded",
G_CALLBACK (on_provider_loaded_cb), manager);
-
+
}
/*
@@ -707,11 +785,11 @@ biji_manager_note_new (BijiManager *manager,
retval = BIJI_PROVIDER_GET_CLASS (provider)->create_new_note (provider, str);
// do not save. up to the provider implementation to save it or not
// at creation.
- biji_manager_add_item (manager, BIJI_ITEM (retval), TRUE);
+ biji_manager_add_item (manager, BIJI_ITEM (retval), TRUE, BIJI_LIVING_ITEMS);
return retval;
}
-
+
diff --git a/src/libbiji/biji-manager.h b/src/libbiji/biji-manager.h
index 3a4d434..55b6b86 100644
--- a/src/libbiji/biji-manager.h
+++ b/src/libbiji/biji-manager.h
@@ -27,6 +27,14 @@ typedef enum
BIJI_MANAGER_NOTE_AMENDED, // Single note amended (title, content)
} BijiManagerChangeFlag;
+
+typedef enum
+{
+ BIJI_LIVING_ITEMS,
+ BIJI_ARCHIVED_ITEMS
+} BijiItemsGroup;
+
+
#define BIJI_TYPE_MANAGER (biji_manager_get_type ())
#define BIJI_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BIJI_TYPE_MANAGER, BijiManager))
#define BIJI_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BIJI_TYPE_MANAGER,
BijiManagerClass))
@@ -89,14 +97,16 @@ gchar *biji_manager_get_unique_title (BijiManager *manager,
const gchar *title);
-gboolean biji_manager_add_item (BijiManager *manager,
+gboolean biji_manager_add_item (BijiManager *manager,
BijiItem *item,
+ BijiItemsGroup group,
gboolean notify);
void biji_manager_notify_changed (BijiManager *manager,
- BijiManagerChangeFlag flag,
- BijiItem *item);
+ BijiItemsGroup group,
+ BijiManagerChangeFlag flag,
+ BijiItem *item);
gboolean biji_manager_remove_item (BijiManager *manager,
@@ -109,7 +119,14 @@ BijiItem *biji_manager_get_item_at_path (BijiManager *manager,
/* Get all items, either notes or notebooks
* Free the GList, not its content */
-GList *biji_manager_get_items (BijiManager *manager);
+
+
+GList *biji_manager_get_items (BijiManager *manager,
+ BijiItemsGroup group);
+
+
+
+void biji_manager_load_archives (BijiManager *manager);
diff --git a/src/libbiji/biji-marshalers.list b/src/libbiji/biji-marshalers.list
index 118a52f..19d678e 100644
--- a/src/libbiji/biji-marshalers.list
+++ b/src/libbiji/biji-marshalers.list
@@ -1,2 +1,3 @@
-VOID:ENUM,POINTER
+VOID:ENUM,ENUM,POINTER
VOID:BOOLEAN,BOOLEAN
+VOID:POINTER,ENUM
diff --git a/src/libbiji/biji-tracker.c b/src/libbiji/biji-tracker.c
index ec2ce04..4b10e49 100644
--- a/src/libbiji/biji-tracker.c
+++ b/src/libbiji/biji-tracker.c
@@ -364,7 +364,8 @@ biji_get_items_with_notebook_async (BijiManager *manager,
void
-biji_get_items_matching_async (BijiManager *manager,
+biji_get_items_matching_async (BijiManager *manager,
+ BijiItemsGroup group,
gchar *needle,
BijiItemsListCallback list_cb,
gpointer user_data)
@@ -459,7 +460,7 @@ on_new_notebook_query_executed (GObject *source_object, GAsyncResult *res, gpoin
urn,
finisher->str,
g_get_real_time () / G_USEC_PER_SEC);
- biji_manager_add_item (finisher->manager, BIJI_ITEM (notebook), TRUE);
+ biji_manager_add_item (finisher->manager, BIJI_ITEM (notebook), TRUE, BIJI_LIVING_ITEMS);
}
/* Run the callback from the caller */
diff --git a/src/libbiji/biji-tracker.h b/src/libbiji/biji-tracker.h
index 2883d1c..e9dcc2f 100644
--- a/src/libbiji/biji-tracker.h
+++ b/src/libbiji/biji-tracker.h
@@ -55,6 +55,7 @@ void biji_get_items_with_notebook_async (BijiManager *manager,
void biji_get_items_matching_async (BijiManager *manager,
+ BijiItemsGroup group,
gchar *needle,
BijiItemsListCallback cb,
gpointer user_data);
diff --git a/src/libbiji/provider/biji-import-provider.c b/src/libbiji/provider/biji-import-provider.c
index f3b3c3a..ff201eb 100644
--- a/src/libbiji/provider/biji-import-provider.c
+++ b/src/libbiji/provider/biji-import-provider.c
@@ -91,7 +91,6 @@ instanciate_note (BijiImportProvider *self, GFileInfo *info, GFile *container)
BijiInfoSet *set;
gchar *html = NULL;
GList *notebooks = NULL;
-
biji_tomboy_reader_read (path,
&error,
@@ -181,7 +180,8 @@ go_through_notes_cb (GObject *object, GAsyncResult *res, gpointer data)
g_list_free_full (notes_info, g_object_unref);
BIJI_PROVIDER_GET_CLASS (self)->notify_loaded (BIJI_PROVIDER (self),
- g_hash_table_get_values (self->priv->items));
+ g_hash_table_get_values (self->priv->items),
+ BIJI_LIVING_ITEMS);
diff --git a/src/libbiji/provider/biji-local-provider.c b/src/libbiji/provider/biji-local-provider.c
index 82cf93b..b725396 100644
--- a/src/libbiji/provider/biji-local-provider.c
+++ b/src/libbiji/provider/biji-local-provider.c
@@ -40,8 +40,13 @@ struct BijiLocalProviderPrivate_
BijiProviderInfo info;
GFile *location;
+ GFile *trash_file;
GHashTable *items;
+ GHashTable *archives;
GCancellable *load_cancellable;
+
+ BijiProviderHelper *living_helper;
+ BijiProviderHelper *archives_helper;
};
@@ -60,7 +65,7 @@ enum {
static GParamSpec *properties[BIJI_LOCAL_PROP] = { NULL, };
-#define ATTRIBUTES_FOR_NOTEBOOK "standard::content-type,standard::name"
+#define ATTRIBUTES_FOR_LOCATION "standard::content-type,standard::name"
static void
@@ -68,7 +73,6 @@ load_location_error (GFile *location,
GError *error)
{
gchar *path;
-
path = g_file_get_path (location);
g_printerr ("Unable to load location %s: %s", path, error->message);
@@ -89,17 +93,25 @@ release_enum_cb (GObject *source, GAsyncResult *res, gpointer user_data)
static void
create_notebook_if_needed (gpointer key,
- gpointer value,
- gpointer user_data)
+ gpointer value,
+ gpointer user_data)
{
BijiLocalProvider *self;
+ BijiProviderHelper *helper;
BijiInfoSet *set;
BijiNotebook *notebook;
BijiManager *manager;
+ helper = user_data;
+
+ /* hmm. rather not load notebooks for archives
+ * this is the work for the restore task
+ * to handle notebooks. */
+ if (helper->group == BIJI_ARCHIVED_ITEMS)
+ return;
- self = user_data;
set = value;
+ self = BIJI_LOCAL_PROVIDER (helper->provider);
notebook = g_hash_table_lookup (self->priv->items, key);
manager = biji_provider_get_manager (BIJI_PROVIDER (self));
@@ -121,17 +133,24 @@ local_provider_finish (GHashTable *notebooks,
gpointer user_data)
{
BijiLocalProvider *self;
+ BijiProviderHelper *helper;
GList *list;
+ helper = user_data;
+ self = BIJI_LOCAL_PROVIDER (helper->provider);
- self = user_data;
- g_hash_table_foreach (notebooks, create_notebook_if_needed, user_data);
- g_hash_table_destroy (notebooks);
+ if (helper->group == BIJI_LIVING_ITEMS)
+ g_hash_table_foreach (notebooks, create_notebook_if_needed, user_data);
+ g_hash_table_destroy (notebooks);
/* Now simply provide data to controller */
- list = g_hash_table_get_values (self->priv->items);
- BIJI_PROVIDER_GET_CLASS (self)->notify_loaded (BIJI_PROVIDER (self), list);
+ if (helper->group == BIJI_LIVING_ITEMS)
+ list = g_hash_table_get_values (self->priv->items);
+ else
+ list = g_hash_table_get_values (self->priv->archives);
+
+ BIJI_PROVIDER_GET_CLASS (self)->notify_loaded (BIJI_PROVIDER (self), list, helper->group);
g_list_free (list);
}
@@ -143,13 +162,15 @@ enumerate_next_files_ready_cb (GObject *source,
{
GFileEnumerator *enumerator;
BijiLocalProvider *self;
+ BijiProviderHelper *helper;
GList *files, *l;
GError *error;
gchar *base_path;
enumerator = G_FILE_ENUMERATOR (source);
- self = user_data;
+ helper = user_data;
+ self = BIJI_LOCAL_PROVIDER (helper->provider);
error = NULL;
files = g_file_enumerator_next_files_finish (enumerator, res, &error);
g_file_enumerator_close_async (enumerator, G_PRIORITY_DEFAULT, NULL,
@@ -162,7 +183,10 @@ enumerate_next_files_ready_cb (GObject *source,
}
- base_path = g_file_get_path (self->priv->location);
+ if (helper->group == BIJI_LIVING_ITEMS)
+ base_path = g_file_get_path (self->priv->location);
+ else
+ base_path = g_file_get_path (self->priv->trash_file);
for (l = files; l != NULL; l = l->next)
{
@@ -170,6 +194,7 @@ enumerate_next_files_ready_cb (GObject *source,
const gchar *name;
BijiNoteObj *note;
BijiInfoSet info;
+ GHashTable *target;
file = l->data;
name = g_file_info_get_name (file);
@@ -188,9 +213,12 @@ enumerate_next_files_ready_cb (GObject *source,
&info);
biji_lazy_deserialize (note);
+ if (helper->group == BIJI_LIVING_ITEMS)
+ target = self->priv->items;
+ else
+ target = self->priv->archives;
- g_hash_table_replace (self->priv->items,
- info.url, note);
+ g_hash_table_replace (target, info.url, note);
}
@@ -200,8 +228,8 @@ enumerate_next_files_ready_cb (GObject *source,
/* Now we have all notes,
* load the notebooks and we're good to notify loading done */
biji_get_all_notebooks_async (biji_provider_get_manager (BIJI_PROVIDER (self)),
- local_provider_finish,
- self);
+ local_provider_finish,
+ helper);
}
static void
@@ -213,10 +241,12 @@ enumerate_children_ready_cb (GObject *source,
GFileEnumerator *enumerator;
GError *error;
BijiLocalProvider *self;
+ BijiProviderHelper *helper;
location = G_FILE (source);
- self = user_data;
+ helper = user_data;
+ self = BIJI_LOCAL_PROVIDER (helper->provider);
error = NULL;
enumerator = g_file_enumerate_children_finish (location,
res, &error);
@@ -232,7 +262,7 @@ enumerate_children_ready_cb (GObject *source,
G_PRIORITY_DEFAULT,
self->priv->load_cancellable,
enumerate_next_files_ready_cb,
- self);
+ helper);
}
@@ -240,14 +270,33 @@ enumerate_children_ready_cb (GObject *source,
static void
-load_from_location (BijiLocalProvider *self)
+load_from_location (BijiProviderHelper *helper)
{
- g_file_enumerate_children_async (self->priv->location,
- ATTRIBUTES_FOR_NOTEBOOK, 0,
+ GFile *file;
+ GCancellable *cancel;
+ BijiLocalProvider *self;
+
+ self = BIJI_LOCAL_PROVIDER (helper->provider);
+
+ if (helper->group == BIJI_LIVING_ITEMS)
+ {
+ file = self->priv->location;
+ cancel = self->priv->load_cancellable;
+ }
+
+ else /* BIJI_ARCHIVED_ITEMS */
+ {
+ file = self->priv->trash_file;
+ cancel = NULL;
+ }
+
+
+ g_file_enumerate_children_async (file,
+ ATTRIBUTES_FOR_LOCATION, 0,
G_PRIORITY_DEFAULT,
- self->priv->load_cancellable,
+ cancel,
enumerate_children_ready_cb,
- self);
+ helper);
}
@@ -259,7 +308,9 @@ biji_local_provider_constructed (GObject *object)
g_return_if_fail (BIJI_IS_LOCAL_PROVIDER (object));
self = BIJI_LOCAL_PROVIDER (object);
- load_from_location (self);
+
+ self->priv->trash_file = g_file_get_child (self->priv->location, ".Trash");
+ load_from_location (self->priv->living_helper);
}
@@ -277,6 +328,11 @@ biji_local_provider_finalize (GObject *object)
g_object_unref (self->priv->load_cancellable);
g_object_unref (self->priv->info.icon);
+ g_object_unref (self->priv->location);
+ g_object_unref (self->priv->trash_file);
+
+ biji_provider_helper_free (self->priv->living_helper);
+ biji_provider_helper_free (self->priv->archives_helper);
G_OBJECT_CLASS (biji_local_provider_parent_class)->finalize (object);
}
@@ -290,6 +346,7 @@ biji_local_provider_init (BijiLocalProvider *self)
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, BIJI_TYPE_LOCAL_PROVIDER, BijiLocalProviderPrivate);
priv->load_cancellable = g_cancellable_new ();
priv->items = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
+ priv->archives = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
/* Info */
priv->info.unique_id = "local";
@@ -301,6 +358,11 @@ biji_local_provider_init (BijiLocalProvider *self)
gtk_image_set_pixel_size (GTK_IMAGE (priv->info.icon), 48);
g_object_ref (priv->info.icon);
+ /* Helpers */
+ priv->living_helper = biji_provider_helper_new (BIJI_PROVIDER (self),
+ BIJI_LIVING_ITEMS);
+ priv->archives_helper = biji_provider_helper_new (BIJI_PROVIDER (self),
+ BIJI_ARCHIVED_ITEMS);
}
@@ -340,6 +402,18 @@ local_prov_create_note_full (BijiProvider *provider,
static void
+local_prov_load_archives (BijiProvider *prov)
+{
+ BijiLocalProvider *self;
+
+ g_return_if_fail (BIJI_IS_LOCAL_PROVIDER (prov));
+
+ self = BIJI_LOCAL_PROVIDER (prov);
+ load_from_location (self->priv->archives_helper);
+}
+
+
+static void
biji_local_provider_set_property (GObject *object,
guint property_id,
const GValue *value,
@@ -406,6 +480,7 @@ biji_local_provider_class_init (BijiLocalProviderClass *klass)
provider_class->get_info = local_provider_get_info;
// provider_class->create_new_note = local_prov_create_new_note;
provider_class->create_note_full = local_prov_create_note_full;
+ provider_class->load_archives = local_prov_load_archives;
properties[PROP_LOCATION] =
g_param_spec_object ("location",
diff --git a/src/libbiji/provider/biji-own-cloud-provider.c b/src/libbiji/provider/biji-own-cloud-provider.c
index fbe262b..5edea4a 100644
--- a/src/libbiji/provider/biji-own-cloud-provider.c
+++ b/src/libbiji/provider/biji-own-cloud-provider.c
@@ -62,6 +62,7 @@ struct BijiOwnCloudProviderPrivate_
GoaAccount *account;
GHashTable *notes;
+ GHashTable *archives;
GHashTable *tracker;
GQueue *queue;
@@ -316,7 +317,7 @@ handle_next_item (BijiOwnCloudProvider *self)
/* Now simply provide data to controller */
list = g_hash_table_get_values (self->priv->notes);
- BIJI_PROVIDER_GET_CLASS (self)->notify_loaded (BIJI_PROVIDER (self), list);
+ BIJI_PROVIDER_GET_CLASS (self)->notify_loaded (BIJI_PROVIDER (self), list, BIJI_LIVING_ITEMS);
g_list_free (list);
}
}
@@ -620,7 +621,7 @@ biji_own_cloud_provider_constructed (GObject *obj)
self = BIJI_OWN_CLOUD_PROVIDER (obj);
priv = self->priv;
-
+
if (!GOA_IS_OBJECT (priv->object))
return;
@@ -659,6 +660,13 @@ biji_own_cloud_provider_constructed (GObject *obj)
}
+/* ownCloud has no archive at the moment */
+static void
+ocloud_prov_load_archives (BijiProvider *provider)
+{
+ return;
+}
+
static void
biji_own_cloud_provider_init (BijiOwnCloudProvider *self)
@@ -775,7 +783,7 @@ own_cloud_create_full (BijiProvider *provider,
biji_manager_get_default_color (manager, &override_color);
biji_note_obj_set_rgba (retval, &override_color);
-
+
return retval;
}
@@ -805,7 +813,7 @@ biji_own_cloud_provider_class_init (BijiOwnCloudProviderClass *klass)
provider_class->get_info = own_cloud_get_info;
provider_class->create_new_note = own_cloud_create_note;
provider_class->create_note_full = own_cloud_create_full;
-
+ provider_class->load_archives = ocloud_prov_load_archives;
properties[PROP_GOA_OBJECT] =
g_param_spec_object("goa",
diff --git a/src/libbiji/provider/biji-provider.c b/src/libbiji/provider/biji-provider.c
index 1967c22..5f50b03 100644
--- a/src/libbiji/provider/biji-provider.c
+++ b/src/libbiji/provider/biji-provider.c
@@ -27,6 +27,8 @@
*
*/
+#include "../biji-marshalers.h"
+
#include "biji-provider.h"
@@ -57,6 +59,31 @@ struct BijiProviderPrivate_
G_DEFINE_TYPE (BijiProvider, biji_provider, G_TYPE_OBJECT)
+
+
+BijiProviderHelper *
+biji_provider_helper_new (BijiProvider *provider,
+ BijiItemsGroup group)
+{
+ BijiProviderHelper *retval;
+
+ retval = g_slice_new (BijiProviderHelper);
+ retval->provider = provider;
+ retval->group = group;
+
+ return retval;
+}
+
+
+void
+biji_provider_helper_free (BijiProviderHelper *helper)
+{
+ g_slice_free (BijiProviderHelper, helper);
+}
+
+
+
+
BijiManager *
biji_provider_get_manager (BijiProvider *provider)
{
@@ -71,6 +98,14 @@ biji_provider_get_info (BijiProvider *provider)
}
+
+void
+biji_provider_load_archives (BijiProvider *provider)
+{
+ return BIJI_PROVIDER_GET_CLASS (provider)->load_archives (provider);
+}
+
+
static void
biji_provider_finalize (GObject *object)
{
@@ -94,12 +129,14 @@ biji_provider_init (BijiProvider *self)
static void
biji_provider_notify_loaded (BijiProvider *self,
- GList *items)
+ GList *items,
+ BijiItemsGroup group)
{
g_signal_emit (self,
biji_provider_signals[PROVIDER_LOADED],
0,
- items);
+ items,
+ group);
}
@@ -162,10 +199,11 @@ biji_provider_class_init (BijiProviderClass *klass)
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
+ _biji_marshal_VOID__POINTER_ENUM,
G_TYPE_NONE,
- 1,
- G_TYPE_POINTER);
+ 2,
+ G_TYPE_POINTER,
+ G_TYPE_INT);
properties[PROP_BOOK] =
diff --git a/src/libbiji/provider/biji-provider.h b/src/libbiji/provider/biji-provider.h
index ccf7125..05356db 100644
--- a/src/libbiji/provider/biji-provider.h
+++ b/src/libbiji/provider/biji-provider.h
@@ -71,12 +71,23 @@ struct BijiProviderClass_
* ie. persistent data source */
const BijiProviderInfo* (*get_info) (BijiProvider *provider);
-
+
/* When a provider is loaded, notify the manager to transmit the items */
void (*notify_loaded) (BijiProvider *provider,
- GList *loaded_items);
+ GList *loaded_items,
+ BijiItemsGroup group);
+
+
+ /* When created, the provider is supposed to load the items.
+ * Loading archives might or might not happen at creation time.
+ * This function ensures the provider loads its archived items.
+ * The provider will notify when done */
+
+ void (*load_archives) (BijiProvider *provider);
+
+
/* Create a single note and let the provider handle things.
@@ -117,11 +128,34 @@ struct BijiProviderClass_
+/* BijiProviderHelper is for convenience for callbacks
+ atm it is used by local provider
+ */
+
+
+typedef struct
+{
+ BijiProvider *provider;
+ BijiItemsGroup group;
+} BijiProviderHelper;
GType biji_provider_get_type (void);
+
+BijiProviderHelper* biji_provider_helper_new (BijiProvider *provider,
+ BijiItemsGroup group);
+
+
+void biji_provider_helper_free (BijiProviderHelper *helper);
+
+
+
+void biji_provider_load_archives (BijiProvider *provider);
+
+
+
BijiManager *biji_provider_get_manager (BijiProvider *provider);
diff --git a/src/resources/app-menu.ui b/src/resources/app-menu.ui
index ac159cf..2d12aad 100644
--- a/src/resources/app-menu.ui
+++ b/src/resources/app-menu.ui
@@ -10,6 +10,10 @@
<attribute name="label" translatable="yes">_Import Notes</attribute>
<attribute name="action">app.external</attribute>
</item>
+ <item>
+ <attribute name="label" translatable="yes">_View Trash</attribute>
+ <attribute name="action">app.trash</attribute>
+ </item>
</section>
<section>
<item>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]