[bijiben] MainView : keep track of current scrolled position and search



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]