imported version 0.1-3 v0.1-3
authorRoman Moravcik <roman.moravcik@gmail.com>
Tue, 16 Mar 2010 18:32:06 +0000 (19:32 +0100)
committerRoman Moravcik <roman.moravcik@gmail.com>
Tue, 16 Mar 2010 18:32:06 +0000 (19:32 +0100)
debian/changelog
po/sk.po
src/birthday.c

index 3dd93e4..07dd275 100644 (file)
@@ -1,3 +1,10 @@
+birthday (0.1-3) fremantle; urgency=low
+
+  * Added simple search on enter text feature.
+  * Updated Slovak translation.
+
+ -- Roman Moravcik <roman.moravcik@gmail.com>  Mon, 15 Mar 2010 10:47:39 +0100
+
 birthday (0.1-2) fremantle; urgency=low
 
   * Fixed loading of avatars.
index 994cc65..76392dd 100644 (file)
--- a/po/sk.po
+++ b/po/sk.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-12 14:49+0100\n"
+"POT-Creation-Date: 2010-03-15 10:34+0100\n"
 "PO-Revision-Date: 2010-03-12 14:50+0100\n"
 "Last-Translator: Roman Moravčík <roman.moravcik@gmail.com>\n"
 "Language-Team: sk_SK <>\n"
@@ -17,7 +17,11 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
 
-#: ../src/birthday.c:267
+#: ../src/birthday.c:163
+msgid "No search results"
+msgstr ""
+
+#: ../src/birthday.c:395
 #, c-format
 msgid "next birthday in %d day"
 msgid_plural "next birthday in %d days"
@@ -25,19 +29,19 @@ msgstr[0] "nasledujúce narodeniny za %d deň"
 msgstr[1] "nasledujúce narodeniny za %d dní"
 msgstr[2] "nasledujúce narodeniny za %d dní"
 
-#: ../src/birthday.c:346
+#: ../src/birthday.c:478
 msgid "Name"
 msgstr "Meno"
 
-#: ../src/birthday.c:352
+#: ../src/birthday.c:484
 msgid "Date"
 msgstr "Dátum"
 
-#: ../src/birthday.c:370
+#: ../src/birthday.c:505
 msgid "Birthday"
 msgstr "Narodeniny"
 
 #. no_search_result label
-#: ../src/birthday.c:387
+#: ../src/birthday.c:525
 msgid "No contacts with set birthdate"
 msgstr "Žiadne kontakty s nastavenými narodeninami"
index 022974b..acb6c07 100644 (file)
@@ -38,8 +38,6 @@
 #include <libebook/e-book.h>
 #include <libosso-abook/osso-abook.h>
 
-GtkWidget *tree_view;
-
 enum
 {
        COLUMN_AVATAR = 0,
@@ -49,39 +47,158 @@ enum
        NUM_COLS
 };
 
+/* Application UI data struct */
+typedef struct _BirthdayData BirthdayData;
+struct _BirthdayData {
+       GtkWidget *window;
+       GtkWidget *label;
+       GtkWidget *view;
+       GtkWidget *search;
+
+       GtkTreeModel *sorted;
+       GtkTreeModel *filter;
+
+       gchar *searched_name;
+       gboolean found;
+};
+
+static gboolean
+birthday_filered_view_visible_func (GtkTreeModel *model,
+                                   GtkTreeIter *iter,
+                                   gpointer data)
+{
+       BirthdayData *priv;
+       gchar *fullname = NULL, *ascii_searched_name = NULL, *ascii_fullname = NULL;
+       gboolean found = FALSE;
+
+       g_return_val_if_fail (data, FALSE);
+       priv = (BirthdayData *) data;
+
+       if (priv->searched_name == NULL) {
+               priv->found = TRUE;
+               return TRUE;
+       }
+
+       ascii_searched_name = g_ascii_strdown (priv->searched_name, strlen (priv->searched_name));
+
+       gtk_tree_model_get (model, iter, COLUMN_FULLNAME, &fullname, -1);
+       if (fullname) {
+               ascii_fullname = g_ascii_strdown (fullname,  strlen (fullname));
+               g_free (fullname);
+       }
+
+       if (g_strstr_len (ascii_fullname, strlen (ascii_fullname), ascii_searched_name) != NULL)
+               found = TRUE;
+
+       if (ascii_searched_name)
+               g_free (ascii_searched_name);
+
+       if (ascii_fullname)
+               g_free (ascii_fullname);
+
+       if (found)
+               priv->found = TRUE;
+
+       return found;
+}
+
 static void
 sort_by_name_clicked (GtkButton *button,
-                      GtkLabel *label)
+                      gpointer data)
 {
-       GtkTreeModel *model;
+       BirthdayData *priv;
+
+       g_return_if_fail (data);
+       priv = (BirthdayData *) data;
 
-       model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
-       gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
-                                             COLUMN_FULLNAME, GTK_SORT_ASCENDING);
+       if (priv->sorted) {
+               gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->sorted),
+                                                     COLUMN_FULLNAME, GTK_SORT_ASCENDING);
+       }
 }
 
 static void
 sort_by_date_clicked (GtkButton *button,
-                      GtkLabel *label)
+                      gpointer data)
 {
-       GtkTreeModel *model;
+       BirthdayData *priv;
 
-       model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
-       gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
-                                             COLUMN_NEXT_BIRTHDAY, GTK_SORT_ASCENDING);
+       g_return_if_fail (data);
+       priv = (BirthdayData *) data;
 
+       if (priv->sorted) {
+               gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->sorted),
+                                                     COLUMN_NEXT_BIRTHDAY, GTK_SORT_ASCENDING);
+       }
+}
+
+static void
+on_search_entry_changed (GtkEditable *editable,
+                        gpointer data)
+{
+       BirthdayData *priv;
+       GtkWidget *pannable;
+
+       g_return_if_fail (data);
+       priv = (BirthdayData *) data;
+
+       priv->found = FALSE;
+
+       if (priv->searched_name)
+               g_free (priv->searched_name);
+       priv->searched_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (editable)));
+
+       /* refilter tree view */
+       gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
+
+       if (priv->found) {
+               /* hide label */
+               gtk_widget_hide (priv->label);
+
+               /* show tree view */
+               gtk_widget_show (priv->view);
+       } else {
+               /* hide label */
+               gtk_widget_show (priv->label);
+               gtk_label_set_text (GTK_LABEL (priv->label), _("No search results"));
+
+               /* show tree view */
+               gtk_widget_hide (priv->view);
+       }
+
+       pannable = g_object_get_data (G_OBJECT (priv->view), "pannable");
+       hildon_pannable_area_jump_to (HILDON_PANNABLE_AREA (pannable), 0, 0);
 }
 
 static void
 on_search_close_clicked (GtkButton *button,
                         gpointer data)
 {
-       GtkWidget *search = GTK_WIDGET (data);
+       BirthdayData *priv;
+       GtkWidget *pannable;
+
+       g_return_if_fail (data);
+       priv = (BirthdayData *) data;
 
        /* hide search bar */
-       gtk_widget_hide (search);
+       gtk_widget_hide (priv->search);
+
+       /* hide label */
+       gtk_widget_hide (priv->label);
+
+       /* show tree view */
+       gtk_widget_show (priv->view);
 
-       /* FIXME: refilter treeview */
+       /* clear searched name */
+       if (priv->searched_name)
+               g_free (priv->searched_name);
+       priv->searched_name = NULL;
+
+       /* refilter tree view */
+       gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
+
+       pannable = g_object_get_data (G_OBJECT (priv->view), "pannable");
+       hildon_pannable_area_jump_to (HILDON_PANNABLE_AREA (pannable), 0, 0);
 }
 
 
@@ -90,13 +207,24 @@ on_key_press_event (GtkWidget *widget,
                    GdkEventKey *event,
                    gpointer data)
 {
-       GtkWidget *search = GTK_WIDGET (data);
+       BirthdayData *priv;
+
+       g_return_val_if_fail (data, TRUE);
+       priv = (BirthdayData *) data;
+
+       if ((event->keyval > GDK_space) && (event->keyval <= GDK_stricteq) && !GTK_WIDGET_VISIBLE (priv->search)) {
+               GtkWidget *entry;
 
-       if ((event->keyval > GDK_space) && (event->keyval <= GDK_stricteq) && !GTK_WIDGET_VISIBLE (search)) {
                /* show search bar */
-               gtk_widget_show (search);
+               gtk_widget_show (priv->search);
 
-               /* FIXME: focus on entry */
+               /* focus on search entry */
+               entry  = g_object_get_data (G_OBJECT (priv->search), "entry");
+               gtk_entry_set_text (GTK_ENTRY (entry), "");
+               gtk_widget_grab_focus (GTK_WIDGET (entry));
+
+               /* refilter tree view */
+               gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
        }
 
        return FALSE;
@@ -302,19 +430,21 @@ create_bday_liststore (GList *contacts)
        return store;
 }
 
-static GtkWidget *
-create_search_bar ()
+static void
+create_search_bar (BirthdayData *priv)
 {
-       GtkWidget *hbox, *entry, *button;
+       GtkWidget *entry, *button;
        GtkEntryCompletion *completion;
 
+       g_return_if_fail (priv);
+
        /* search hbox */
-       hbox = gtk_hbox_new (FALSE, HILDON_MARGIN_DEFAULT);
+       priv->search = gtk_hbox_new (FALSE, HILDON_MARGIN_DEFAULT);
 
        /* search entry */
        entry = hildon_entry_new (HILDON_SIZE_FINGER_HEIGHT);
        hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry), HILDON_GTK_INPUT_MODE_FULL);
-       gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+       gtk_box_pack_start (GTK_BOX (priv->search), entry, TRUE, TRUE, 0);
 
        completion = gtk_entry_completion_new ();
        gtk_entry_completion_set_inline_completion (completion, TRUE);
@@ -324,86 +454,110 @@ create_search_bar ()
        /* clear button */
        button = GTK_WIDGET (gtk_tool_button_new (gtk_image_new_from_icon_name
                             ("general_close", (GtkIconSize) HILDON_ICON_PIXEL_SIZE_FINGER), "Clear"));
-       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+       gtk_box_pack_end (GTK_BOX (priv->search), button, FALSE, TRUE, 0);
 
        /* search signals */
-//     g_signal_connect (entry, "changed", G_CALLBACK (onSearchEntryChanged), this);
-       g_signal_connect (button, "clicked", G_CALLBACK (on_search_close_clicked), hbox);
+       g_signal_connect (entry, "changed", G_CALLBACK (on_search_entry_changed), priv);
+       g_signal_connect (button, "clicked", G_CALLBACK (on_search_close_clicked), priv);
 
-       return hbox;
+       g_object_set_data (G_OBJECT (priv->search), "entry", entry);
 }
 
 static void
-create_main_menu (GtkWidget *window)
+create_main_menu (BirthdayData *priv)
 {
        HildonAppMenu *menu;
        GtkWidget *filter;
 
+       g_return_if_fail (priv);
+
        menu = HILDON_APP_MENU (hildon_app_menu_new ());
-       hildon_window_set_app_menu (HILDON_WINDOW (window), menu);
+       hildon_window_set_app_menu (HILDON_WINDOW (priv->window), menu);
 
        filter = hildon_gtk_radio_button_new (HILDON_SIZE_FINGER_HEIGHT , NULL);
        gtk_button_set_label (GTK_BUTTON (filter), _("Name"));
        gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (filter), FALSE);
-       g_signal_connect_after (filter, "clicked", G_CALLBACK (sort_by_name_clicked), NULL);
+       g_signal_connect_after (filter, "clicked", G_CALLBACK (sort_by_name_clicked), priv);
        hildon_app_menu_add_filter (menu, GTK_BUTTON (filter));
 
        filter = hildon_gtk_radio_button_new_from_widget (HILDON_SIZE_FINGER_HEIGHT , GTK_RADIO_BUTTON (filter));
        gtk_button_set_label (GTK_BUTTON (filter), _("Date"));
        gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (filter), FALSE);
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (filter), TRUE);
-       g_signal_connect_after (filter, "clicked", G_CALLBACK (sort_by_date_clicked), NULL);
+       g_signal_connect_after (filter, "clicked", G_CALLBACK (sort_by_date_clicked), priv);
        hildon_app_menu_add_filter (menu, GTK_BUTTON (filter));
 
        gtk_widget_show_all (GTK_WIDGET (menu));
 }
 
-static GtkWidget *
-create_main_window (GtkListStore *store)
+static void
+create_main_window (BirthdayData *priv, GtkListStore *store)
 {
        HildonProgram *program = NULL;
-       GtkWidget *window, *main_vbox, *alignment, *label, *pannable, *search;
+       GtkWidget *main_vbox, *alignment, *pannable, *tree_view;
+       GtkTreeModel *filter;
        GtkTreeViewColumn *column;
        GtkCellRenderer *renderer;
 
+       g_return_if_fail (priv);
+
        program = hildon_program_get_instance ();
        g_set_application_name (_("Birthday"));
 
        /* main window */
-       window = hildon_stackable_window_new ();
-       hildon_program_add_window (program, HILDON_WINDOW (window));
+       priv->window = hildon_stackable_window_new ();
+       hildon_program_add_window (program, HILDON_WINDOW (priv->window));
+
+       /* create main menu */
+       create_main_menu (priv);
 
        /* aligment */
        alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
        gtk_alignment_set_padding (GTK_ALIGNMENT (alignment),
                                   HILDON_MARGIN_HALF, 0, HILDON_MARGIN_DEFAULT, HILDON_MARGIN_DEFAULT);
-       gtk_container_add (GTK_CONTAINER (window), alignment);
+       gtk_container_add (GTK_CONTAINER (priv->window), alignment);
 
        /* main vbox */
        main_vbox = gtk_vbox_new (FALSE, 0);
        gtk_container_add (GTK_CONTAINER (alignment), main_vbox);
 
        /* no_search_result label */
-       label = gtk_label_new (_("No contacts with set birthdate"));
-       hildon_helper_set_logical_color (label, GTK_RC_FG,
+       priv->label = gtk_label_new (_("No contacts with set birthdate"));
+       hildon_helper_set_logical_color (priv->label, GTK_RC_FG,
                                         GTK_STATE_NORMAL, "SecondaryTextColor");
-       hildon_helper_set_logical_font (label, "LargeSystemFont");
-       gtk_box_pack_start (GTK_BOX (main_vbox), label, TRUE, TRUE, 0);
+       hildon_helper_set_logical_font (priv->label, "LargeSystemFont");
+       gtk_box_pack_start (GTK_BOX (main_vbox), priv->label, TRUE, TRUE, 0);
 
        /* alignment for pannable area */
-       alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
-       gtk_alignment_set_padding (GTK_ALIGNMENT (alignment),
+       priv->view = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
+       gtk_alignment_set_padding (GTK_ALIGNMENT (priv->view),
                                   0, 0, HILDON_MARGIN_DEFAULT, 0);
-       gtk_box_pack_start (GTK_BOX (main_vbox), alignment, TRUE, TRUE, 0);
+       gtk_box_pack_start (GTK_BOX (main_vbox), priv->view, TRUE, TRUE, 0);
 
        /* pannable for tree view */
        pannable = hildon_pannable_area_new ();
        g_object_set (G_OBJECT (pannable), "mov-mode", HILDON_MOVEMENT_MODE_VERT, NULL);
-       gtk_container_add (GTK_CONTAINER (alignment), pannable);
+       g_object_set_data (G_OBJECT (priv->view), "pannable", pannable);
+       gtk_container_add (GTK_CONTAINER (priv->view), pannable);
+
+       /* sort list by next birthdays */
+       gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
+                                             COLUMN_NEXT_BIRTHDAY, GTK_SORT_ASCENDING);
+       priv->sorted = GTK_TREE_MODEL (store);
+
+       /* filtered view */
+       filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
+       gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
+                                               birthday_filered_view_visible_func,
+                                               priv,
+                                               NULL);
+       gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter));
+       priv->filter = GTK_TREE_MODEL (filter);
 
        /* tree view */
-       tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
+       tree_view = hildon_gtk_tree_view_new_with_model (HILDON_UI_MODE_NORMAL, filter);
        gtk_container_add (GTK_CONTAINER (pannable), tree_view);
+
        /* display column */
        column = gtk_tree_view_column_new ();
        gtk_tree_view_column_set_fixed_width (column, 709);
@@ -429,21 +583,21 @@ create_main_window (GtkListStore *store)
        gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
 
        /* search bar */
-       search = create_search_bar();
-       gtk_box_pack_end (GTK_BOX (main_vbox), search, FALSE, FALSE, 0);
+       create_search_bar(priv);
+       gtk_box_pack_end (GTK_BOX (main_vbox), priv->search, FALSE, FALSE, 0);
 
        /* window signals */
-       g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
-//     g_signal_connect (G_OBJECT (window), "key-press-event", G_CALLBACK (on_key_press_event), search);
+       g_signal_connect (G_OBJECT (priv->window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
+       g_signal_connect (G_OBJECT (priv->window), "key-press-event", G_CALLBACK (on_key_press_event), priv);
 
-       gtk_widget_show_all (GTK_WIDGET (window));
-       gtk_widget_hide (GTK_WIDGET (label));
-       gtk_widget_hide (GTK_WIDGET (search));
-       return window;
+       gtk_widget_show_all (GTK_WIDGET (priv->window));
+       gtk_widget_hide (GTK_WIDGET (priv->label));
+       gtk_widget_hide (GTK_WIDGET (priv->search));
 }
 
 int main (int argc, char **argv)
 {
+       BirthdayData *data;
        osso_context_t *osso_context;
        EBook *ebook;
        EBookQuery *query;
@@ -454,6 +608,11 @@ int main (int argc, char **argv)
 
        hildon_gtk_init (&argc, &argv);
 
+       /* create application data */
+       data = g_new0 (BirthdayData, 1);
+       data->searched_name = NULL;
+       data->found = TRUE;
+
        /* initialize localization */
        setlocale(LC_ALL, "");
        bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
@@ -495,13 +654,7 @@ int main (int argc, char **argv)
        }
 
        store = create_bday_liststore (contacts);
-       window = create_main_window (store);
-       g_object_unref (G_OBJECT (store));
-       create_main_menu (window);
-
-       /* sort list by next birthdays */
-       gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
-                                             COLUMN_NEXT_BIRTHDAY, GTK_SORT_ASCENDING);
+       create_main_window (data, store);
 
        gtk_main ();