[bijiben] MainView : keep track of current scrolled position and search
- From: Pierre-Yves Luyten <pyluyten src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [bijiben] MainView : keep track of current scrolled position and search
- Date: Thu, 7 Feb 2013 00:14:56 +0000 (UTC)
commit 555aa6af95991532efc4584a3483f0e419ea719e
Author: Pierre-Yves Luyten <py luyten fr>
Date: Thu Feb 7 01:13:50 2013 +0100
MainView : keep track of current scrolled position and search
Use a GtkNotebook to store the main view rather than destroying the main view.
src/bjb-main-view.c | 56 ++++++++++++++++++++++++----------
src/bjb-main-view.h | 2 +
src/bjb-note-view.c | 20 ++++--------
src/bjb-search-toolbar.c | 76 +++++++++++++++++++++++++++++++---------------
src/bjb-search-toolbar.h | 4 ++
src/bjb-window-base.c | 67 ++++++++++++++++++++++++++--------------
src/bjb-window-base.h | 20 +++++-------
7 files changed, 155 insertions(+), 90 deletions(-)
---
diff --git a/src/bjb-main-view.c b/src/bjb-main-view.c
index e1f297f..7ecbfd3 100644
--- a/src/bjb-main-view.c
+++ b/src/bjb-main-view.c
@@ -71,6 +71,12 @@ struct _BjbMainViewPriv {
* add one window specific controller */
GdMainView *view ;
BjbController *controller ;
+
+ /* Signals */
+ gulong key;
+ gulong button;
+ gulong activated;
+ gulong data;
};
G_DEFINE_TYPE (BjbMainView, bjb_main_view, CLUTTER_TYPE_ACTOR);
@@ -101,6 +107,17 @@ bjb_main_view_finalize (GObject *object)
}
static void
+bjb_main_view_disconnect_handlers (BjbMainView *self)
+{
+ BjbMainViewPriv *priv = self->priv;
+
+ g_signal_handler_disconnect (priv->window, priv->key);
+ g_signal_handler_disconnect (priv->view, priv->button);
+ g_signal_handler_disconnect (priv->view, priv->activated);
+ g_signal_handler_disconnect (priv->view, priv->data);
+}
+
+static void
bjb_main_view_set_controller ( BjbMainView *self, BjbController *controller)
{
self->priv->controller = controller ;
@@ -165,12 +182,11 @@ biji_main_view_constructor (GType gtype,
/* Callbacks */
void
-switch_to_note_view(BjbMainView *self,BijiNoteObj *note)
+switch_to_note_view (BjbMainView *self, BijiNoteObj *note)
{
- GtkWidget *window = self->priv->window;
-
- g_clear_object (&self);
- bjb_note_view_new (window,note);
+ bjb_search_toolbar_disconnect (self->priv->search_bar);
+ bjb_main_view_disconnect_handlers (self);
+ bjb_note_view_new (self->priv->window, note);
}
static void
@@ -440,6 +456,23 @@ on_drag_data_received (GtkWidget *widget,
gtk_drag_finish (context, FALSE, FALSE, time);
}
+void
+bjb_main_view_connect_signals (BjbMainView *self)
+{
+ BjbMainViewPriv *priv = self->priv;
+
+ bjb_search_toolbar_connect (priv->search_bar);
+
+ priv->key = g_signal_connect (priv->window, "key-press-event",
+ G_CALLBACK (on_key_press_event_cb), self);
+ priv->button = g_signal_connect (priv->view, "button-press-event",
+ G_CALLBACK (on_button_press_event_cb), self);
+ priv->activated = g_signal_connect(priv->view,"item-activated",
+ G_CALLBACK(on_item_activated),self);
+ priv->data = g_signal_connect (priv->view, "drag-data-received",
+ G_CALLBACK (on_drag_data_received), self);
+}
+
static void
bjb_main_view_constructed(GObject *o)
{
@@ -454,18 +487,11 @@ bjb_main_view_constructed(GObject *o)
self = BJB_MAIN_VIEW(o);
priv = self->priv ;
- stage = bjb_window_base_get_stage (BJB_WINDOW_BASE(priv->window));
+ stage = bjb_window_base_get_stage (BJB_WINDOW_BASE (priv->window), MAIN_VIEW);
priv->view = gd_main_view_new (DEFAULT_VIEW);
bjb_controller_set_main_view (priv->controller, priv->view);
- g_signal_connect (priv->window, "key-press-event",
- G_CALLBACK (on_key_press_event_cb), self);
- g_signal_connect (priv->view, "button-press-event",
- G_CALLBACK (on_button_press_event_cb), self);
- g_signal_connect(priv->view,"item-activated",
- G_CALLBACK(on_item_activated),self);
-
/* Probably move this to window_base or delete this */
filler = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER,
CLUTTER_BIN_ALIGNMENT_CENTER);
@@ -541,9 +567,7 @@ bjb_main_view_constructed(GObject *o)
gtk_drag_dest_set (GTK_WIDGET (priv->view), GTK_DEST_DEFAULT_ALL,
target_list, 1, GDK_ACTION_COPY);
- g_signal_connect (GTK_WIDGET (priv->view), "drag-data-received",
- G_CALLBACK (on_drag_data_received), self);
-
+ bjb_main_view_connect_signals (self);
gtk_widget_show_all (priv->window);
}
diff --git a/src/bjb-main-view.h b/src/bjb-main-view.h
index bdefb83..f91ed30 100644
--- a/src/bjb-main-view.h
+++ b/src/bjb-main-view.h
@@ -37,6 +37,8 @@ GType bjb_main_view_get_type (void) G_GNUC_CONST;
BjbMainView * bjb_main_view_new(GtkWidget *win, BjbController *controller);
+void bjb_main_view_connect_signals (BjbMainView *self);
+
ClutterActor * bjb_main_view_get_actor(BjbMainView *b) ;
GtkWidget *bjb_main_view_get_window(BjbMainView *view);
diff --git a/src/bjb-note-view.c b/src/bjb-note-view.c
index 82d9a32..d49493e 100644
--- a/src/bjb-note-view.c
+++ b/src/bjb-note-view.c
@@ -57,21 +57,14 @@ struct _BjbNoteViewPrivate {
ClutterActor *embed;
GtkAccelGroup *accel;
ClutterActor *edit_actor;
- GtkBox *toolbars_box;
BjbEditorToolbar *edit_bar;
ClutterActor *edit_bar_actor;
- gboolean edit_bar_is_sticky ;
+ gboolean edit_bar_is_sticky;
ClutterActor *last_update;
ClutterColor *last_date_bckgrd_clr;
- // Convenience
- GdkRGBA *color ;
-
- // hack when widget is destroyed.Probably obsolete.
- gboolean to_be_saved ;
-
- // Signal when window is destroyed. We may need to disconect g_signal
+ /* Signals */
gulong destroy ;
gulong renamed ;
gulong deleted ;
@@ -91,7 +84,7 @@ bjb_note_view_finalize(GObject *object)
g_clear_object (&priv->accel);
g_clear_object (&priv->edit_bar);
clutter_color_free (priv->last_date_bckgrd_clr);
- /* TODO : check if the editor has been destroyed */
+ clutter_actor_destroy (priv->edit_bar_actor);
G_OBJECT_CLASS (bjb_note_view_parent_class)->finalize (object);
}
@@ -166,14 +159,12 @@ static void
just_switch_to_main_view(BjbNoteView *self)
{
GtkWindow *window;
- BjbController *controller;
window = GTK_WINDOW(self->priv->window);
gtk_window_remove_accel_group (window, self->priv->accel);
- controller = bjb_window_base_get_controller(BJB_WINDOW_BASE(window));
g_clear_object (&self);
- bjb_main_view_new ((gpointer) window,controller);
+ bjb_window_base_switch_to (BJB_WINDOW_BASE (window), MAIN_VIEW);
}
static void
@@ -521,7 +512,7 @@ bjb_note_view_constructed (GObject *obj)
priv->note);
/* Start packing ui */
- stage = bjb_window_base_get_stage (BJB_WINDOW_BASE (priv->window));
+ stage = bjb_window_base_get_stage (BJB_WINDOW_BASE (priv->window), NOTE_VIEW);
full = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER,
CLUTTER_BIN_ALIGNMENT_CENTER);
@@ -614,6 +605,7 @@ bjb_note_view_constructed (GObject *obj)
/* Show & let's go */
gtk_widget_show_all (priv->window);
+ bjb_window_base_switch_to (BJB_WINDOW_BASE (priv->window), NOTE_VIEW);
}
BjbNoteView *
diff --git a/src/bjb-search-toolbar.c b/src/bjb-search-toolbar.c
index 5a84b8c..bb0d575 100644
--- a/src/bjb-search-toolbar.c
+++ b/src/bjb-search-toolbar.c
@@ -51,9 +51,12 @@ struct _BjbSearchToolbarPrivate
GtkTreeModel *completion_model;
BjbController *controller;
- /* A pressed key shows search entry */
+ /* Signals */
gulong key_pressed;
gulong key_released;
+ gulong icon;
+ gulong deleted;
+ gulong inserted;
/* Misc UI */
GtkWidget *window;
@@ -221,25 +224,65 @@ action_entry_delete_callback(GtkEntryBuffer *buffer,guint position,
self->priv->controller);
}
-static void
-bjb_search_toolbar_finalize (GObject *obj)
+void
+bjb_search_toolbar_disconnect (BjbSearchToolbar *self)
{
- BjbSearchToolbar *self = BJB_SEARCH_TOOLBAR (obj);
BjbSearchToolbarPrivate *priv = self->priv ;
g_signal_handler_disconnect (priv->window,priv->key_pressed);
- priv->key_pressed = 0;
-
g_signal_handler_disconnect (priv->window,priv->key_released);
+ g_signal_handler_disconnect (priv->search_entry, priv->icon);
+ g_signal_handler_disconnect (priv->entry_buf, priv->inserted);
+ g_signal_handler_disconnect (priv->entry_buf, priv->deleted);
+
priv->key_released = 0;
+ priv->key_pressed = 0;
+ priv->icon = 0;
+ priv->inserted = 0;
+ priv->deleted = 0;
+}
+
+static void
+bjb_search_toolbar_finalize (GObject *obj)
+{
+ BjbSearchToolbar *self = BJB_SEARCH_TOOLBAR (obj);
+ bjb_search_toolbar_disconnect (self);
G_OBJECT_CLASS (bjb_search_toolbar_parent_class)->finalize (obj);
}
+void
+bjb_search_toolbar_connect (BjbSearchToolbar *self)
+{
+ BjbSearchToolbarPrivate *priv = self->priv ;
+
+ /* Connect to set the text */
+ if (priv->key_pressed == 0)
+ priv->key_pressed = g_signal_connect(priv->window,"key-press-event",
+ G_CALLBACK(on_key_pressed),self);
+
+ if (priv->key_released == 0)
+ priv->key_released = g_signal_connect(priv->window,"key-release-event",
+ G_CALLBACK(on_key_released),self);
+
+ /* Connect to set the notes */
+ if (priv->icon == 0)
+ priv->icon = g_signal_connect (priv->search_entry, "icon-press",
+ G_CALLBACK (clear_search_entry_callback),
+ self->priv->controller);
+
+ if (priv->inserted ==0)
+ priv->inserted = g_signal_connect(priv->entry_buf,"inserted-text",
+ G_CALLBACK(action_entry_insert_callback),self);
+
+ if (priv->deleted ==0)
+ priv->deleted = g_signal_connect(priv->entry_buf,"deleted-text",
+ G_CALLBACK(action_entry_delete_callback),self);
+}
+
static void
bjb_search_toolbar_constructed (GObject *obj)
{
- GtkEntryBuffer *entry_buf;
GtkEntryCompletion *completion ;
BjbSearchToolbar *self = BJB_SEARCH_TOOLBAR(obj);
BjbSearchToolbarPrivate *priv = self->priv ;
@@ -258,24 +301,7 @@ bjb_search_toolbar_constructed (GObject *obj)
gtk_entry_completion_set_model (completion, priv->completion_model);
gtk_entry_completion_set_text_column (completion, 0);
- /* Connect to set the text */
- priv->key_pressed = g_signal_connect(priv->window,"key-press-event",
- G_CALLBACK(on_key_pressed),self);
-
- priv->key_released = g_signal_connect(priv->window,"key-release-event",
- G_CALLBACK(on_key_released),self);
-
- /* Connect to set the notes */
- g_signal_connect (priv->search_entry, "icon-press",
- G_CALLBACK (clear_search_entry_callback),
- self->priv->controller);
-
- entry_buf = gtk_entry_get_buffer(GTK_ENTRY(priv->search_entry));
-
- g_signal_connect(entry_buf,"inserted-text",
- G_CALLBACK(action_entry_insert_callback),self);
- g_signal_connect(entry_buf,"deleted-text",
- G_CALLBACK(action_entry_delete_callback),self);
+ priv->entry_buf = gtk_entry_get_buffer (GTK_ENTRY (priv->search_entry));
/* Constraints */
priv->width_constraint = clutter_bind_constraint_new (priv->parent_actor,
diff --git a/src/bjb-search-toolbar.h b/src/bjb-search-toolbar.h
index d5bffce..6d11408 100644
--- a/src/bjb-search-toolbar.h
+++ b/src/bjb-search-toolbar.h
@@ -37,6 +37,10 @@ GType bjb_search_toolbar_get_type (void) G_GNUC_CONST;
BjbSearchToolbar * bjb_search_toolbar_new (GtkWidget *window, ClutterActor *parent_actor, BjbController *controller);
+void bjb_search_toolbar_disconnect (BjbSearchToolbar *self);
+
+void bjb_search_toolbar_connect (BjbSearchToolbar *self);
+
ClutterActor * bjb_search_toolbar_get_actor (BjbSearchToolbar *self);
G_END_DECLS
diff --git a/src/bjb-window-base.c b/src/bjb-window-base.c
index 9d15dec..f51fd6b 100644
--- a/src/bjb-window-base.c
+++ b/src/bjb-window-base.c
@@ -16,32 +16,26 @@
#define BJB_DEFAULT_FONT "Serif 10"
-/* Window available views..
- * Not sure we'll use it... */
-enum {
- MAIN_VIEW,
- TAGS_VIEW,
- NOTE_EDITOR
-};
-
/* As the main window remains, it owns the data */
struct _BjbWindowBasePriv
{
/* To register new windows and access the data */
- GtkApplication *app ;
- BjbController *controller;
+ GtkApplication *app ;
+ BjbController *controller;
- /* UI */
- ClutterActor *stage, *frame ;
- int current_view ;
- gchar *entry ;
+ /* UI
+ * The Notebook always has a main view.
+ * When editing a note, it _also_ has a note view */
+ GtkWidget *notebook;
+ BjbWindowViewType current_view;
+ BjbMainView *view;
+ BjbNoteView *note_view;
+
+ ClutterActor *stage, *note_stage, *frame;
+ gchar *entry;
/* To avoid loiding several times */
PangoFontDescription *font ;
-
- /* Tmp. Instead we want to be able to create a window base
- * without the view */
- BjbMainView *view;
};
/* Gobject */
@@ -96,7 +90,7 @@ bjb_window_base_init (BjbWindowBase *self)
gchar *full_path;
GList *icons = NULL;
GdkPixbuf *bjb ;
- GError *error = NULL ;
+ GError *error = NULL;
GtkClutterEmbed *embed;
self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self,
@@ -137,13 +131,26 @@ bjb_window_base_init (BjbWindowBase *self)
priv->font = pango_font_description_from_string (BJB_DEFAULT_FONT);
- /* UI */
+ /* UI : basic notebook */
+ priv->notebook = gtk_notebook_new ();
+ gtk_container_add (GTK_CONTAINER (self), priv->notebook);
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->notebook), FALSE);
+ gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->notebook), FALSE);
+
+ /* Page for overview */
embed = GTK_CLUTTER_EMBED (gtk_clutter_embed_new());
gtk_clutter_embed_set_use_layout_size (embed, TRUE);
-
- gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (embed));
+ gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook),
+ GTK_WIDGET (embed), gtk_label_new ("main-view"));
priv->stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (embed));
+ /* Page for note */
+ embed = GTK_CLUTTER_EMBED (gtk_clutter_embed_new());
+ gtk_clutter_embed_set_use_layout_size (embed, TRUE);
+ gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook),
+ GTK_WIDGET (embed), gtk_label_new ("note-view"));
+ priv->note_stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (embed));
+
/* Signals */
g_signal_connect(GTK_WIDGET(self),"destroy",
G_CALLBACK(bjb_window_base_destroy),self);
@@ -211,9 +218,21 @@ bjb_window_base_get_frame(BjbWindowBase *bwb)
}
ClutterActor *
-bjb_window_base_get_stage(BjbWindowBase *bwb)
+bjb_window_base_get_stage (BjbWindowBase *bwb, BjbWindowViewType type)
{
- return bwb->priv->stage ;
+ if (type == NOTE_VIEW)
+ return bwb->priv->note_stage;
+
+ return bwb->priv->stage;
+}
+
+void
+bjb_window_base_switch_to (BjbWindowBase *bwb, BjbWindowViewType type)
+{
+ if (type == MAIN_VIEW)
+ bjb_main_view_connect_signals (bwb->priv->view);
+
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (bwb->priv->notebook), type);
}
BijiNoteBook *
diff --git a/src/bjb-window-base.h b/src/bjb-window-base.h
index 586463b..bf7e87b 100644
--- a/src/bjb-window-base.h
+++ b/src/bjb-window-base.h
@@ -8,14 +8,6 @@
#include "bjb-settings.h"
#include "bjb-controller.h"
-/* The main window has three possible states
- * Opened notes are like tabs.*/
-enum {
- VIEW_ALL_NOTES_WINDOW,
- VIEW_TAGS_WINDOW,
- EDIT_NOTE_WINDOW
-};
-
#define BJB_TYPE_WINDOW_BASE (bjb_window_base_get_type ())
#define BJB_WINDOW_BASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BJB_TYPE_WINDOW_BASE, BjbWindowBase))
#define BJB_IS_WINDOW_BASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BJB_TYPE_WINDOW_BASE))
@@ -40,7 +32,11 @@ struct _BjbWindowBase
BjbWindowBasePriv *priv;
};
-
+typedef enum {
+ MAIN_VIEW,
+ NOTE_VIEW,
+ NO_VIEW
+} BjbWindowViewType;
GType bjb_window_base_get_type (void);
@@ -56,7 +52,10 @@ void bjb_window_base_set_frame(BjbWindowBase *bwb,ClutterActor *frame);
ClutterActor * bjb_window_base_get_frame(BjbWindowBase *bwb);
-ClutterActor * bjb_window_base_get_stage(BjbWindowBase *bwb);
+/* get the notebook relevant page */
+ClutterActor * bjb_window_base_get_stage (BjbWindowBase *bwb, BjbWindowViewType type);
+
+void bjb_window_base_switch_to (BjbWindowBase *bwb, BjbWindowViewType type);
BijiNoteBook * bjb_window_base_get_book(GtkWidget * win);
@@ -68,7 +67,6 @@ gchar * bjb_window_base_get_entry(GtkWidget *win) ;
gpointer bjb_window_base_get_main_view (BjbWindowBase *self);
-
// DEBUG
void biji_application_print_note_id(GtkWindow* win);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]