From 2e22b1ee9fc457387c21c767b5c848328692320f Mon Sep 17 00:00:00 2001 From: Roman Moravcik Date: Tue, 16 Mar 2010 19:32:06 +0100 Subject: [PATCH] imported version 0.1-3 --- debian/changelog | 7 ++ po/sk.po | 16 ++-- src/birthday.c | 277 ++++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 232 insertions(+), 68 deletions(-) diff --git a/debian/changelog b/debian/changelog index 3dd93e4..07dd275 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +birthday (0.1-3) fremantle; urgency=low + + * Added simple search on enter text feature. + * Updated Slovak translation. + + -- Roman Moravcik Mon, 15 Mar 2010 10:47:39 +0100 + birthday (0.1-2) fremantle; urgency=low * Fixed loading of avatars. diff --git a/po/sk.po b/po/sk.po index 994cc65..76392dd 100644 --- 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 \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" diff --git a/src/birthday.c b/src/birthday.c index 022974b..acb6c07 100644 --- a/src/birthday.c +++ b/src/birthday.c @@ -38,8 +38,6 @@ #include #include -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 (); -- 1.7.9.5