Added a menu allowing to filter tasks given their completion state

This commit is contained in:
Pierre Pronchery 2010-09-04 17:25:31 +00:00
parent ec8238e796
commit bd1f7cd75e
5 changed files with 169 additions and 34 deletions

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Todo 0.0.0\n" "Project-Id-Version: Todo 0.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-08-01 03:49+0200\n" "POT-Creation-Date: 2010-09-04 19:24+0200\n"
"PO-Revision-Date: 2010-04-23 14:35+0200\n" "PO-Revision-Date: 2010-04-23 14:35+0200\n"
"Last-Translator: Pierre Pronchery <khorben@defora.org>\n" "Last-Translator: Pierre Pronchery <khorben@defora.org>\n"
"Language-Team: French\n" "Language-Team: French\n"
@ -20,114 +20,130 @@ msgstr ""
msgid "Usage: todo\n" msgid "Usage: todo\n"
msgstr "Usage: todo\n" msgstr "Usage: todo\n"
#: ../src/todo.c:70 #: ../src/todo.c:73
msgid "Done" msgid "Done"
msgstr "Effectuée" msgstr "Effectuée"
#: ../src/todo.c:72 #: ../src/todo.c:75
msgid "Title" msgid "Title"
msgstr "Titre" msgstr "Titre"
#: ../src/todo.c:74 #: ../src/todo.c:77
msgid "Beginning" msgid "Beginning"
msgstr "Départ" msgstr "Départ"
#: ../src/todo.c:75 #: ../src/todo.c:78
msgid "Completion" msgid "Completion"
msgstr "Fin" msgstr "Fin"
#: ../src/todo.c:85 #: ../src/todo.c:88
msgid "Unknown" msgid "Unknown"
msgstr "Inconnue" msgstr "Inconnue"
#: ../src/todo.c:86 #: ../src/todo.c:89
msgid "Low" msgid "Low"
msgstr "Faible" msgstr "Faible"
#: ../src/todo.c:87 #: ../src/todo.c:90
msgid "Medium" msgid "Medium"
msgstr "Moyenne" msgstr "Moyenne"
#: ../src/todo.c:88 #: ../src/todo.c:91
msgid "High" msgid "High"
msgstr "Haute" msgstr "Haute"
#: ../src/todo.c:89 #: ../src/todo.c:92
msgid "Urgent" msgid "Urgent"
msgstr "Urgent" msgstr "Urgent"
#: ../src/todo.c:105 #: ../src/todo.c:108
msgid "_New" msgid "_New"
msgstr "_Nouvelle" msgstr "_Nouvelle"
#: ../src/todo.c:107 ../src/todo.c:142 #: ../src/todo.c:110 ../src/todo.c:154
msgid "_Edit" msgid "_Edit"
msgstr "Modifier" msgstr "Modifier"
#: ../src/todo.c:110 #: ../src/todo.c:113
msgid "_Close" msgid "_Close"
msgstr "_Fermer" msgstr "_Fermer"
#: ../src/todo.c:117 ../src/todo.c:120 #: ../src/todo.c:120 ../src/todo.c:123
msgid "_Select all" msgid "_Select all"
msgstr "Tout sélectionner" msgstr "Tout sélectionner"
#: ../src/todo.c:124 #: ../src/todo.c:127
msgid "_Delete" msgid "_Delete"
msgstr "Supprimer" msgstr "Supprimer"
#: ../src/todo.c:126 #: ../src/todo.c:129
msgid "_Preferences" msgid "_Preferences"
msgstr "_Préférences" msgstr "_Préférences"
#: ../src/todo.c:133 ../src/todo.c:135 #: ../src/todo.c:135
msgid "_All tasks"
msgstr "_Toutes les tâches"
#: ../src/todo.c:136
msgid "_Completed tasks"
msgstr "Tâches _complétées"
#: ../src/todo.c:138
msgid "_Remaining tasks"
msgstr "Tâches _restantes"
#: ../src/todo.c:145 ../src/todo.c:147
msgid "_About" msgid "_About"
msgstr "À _propos" msgstr "À _propos"
#: ../src/todo.c:141 #: ../src/todo.c:153
msgid "_File" msgid "_File"
msgstr "_Fichier" msgstr "_Fichier"
#: ../src/todo.c:143 #: ../src/todo.c:155
msgid "_View"
msgstr "_Vue"
#: ../src/todo.c:156
msgid "_Help" msgid "_Help"
msgstr "_Aide" msgstr "_Aide"
#: ../src/todo.c:151 ../src/todo.c:396 #: ../src/todo.c:164 ../src/todo.c:432
msgid "New task" msgid "New task"
msgstr "Nouvelle tâche" msgstr "Nouvelle tâche"
#: ../src/todo.c:152 #: ../src/todo.c:165
msgid "Edit task" msgid "Edit task"
msgstr "Modifier la tâche" msgstr "Modifier la tâche"
#: ../src/todo.c:155 ../src/todo.c:158 #: ../src/todo.c:168 ../src/todo.c:171
msgid "Select all" msgid "Select all"
msgstr "Tout sélectionner" msgstr "Tout sélectionner"
#: ../src/todo.c:161 #: ../src/todo.c:174
msgid "Delete task" msgid "Delete task"
msgstr "Supprimer la tâche" msgstr "Supprimer la tâche"
#: ../src/todo.c:165 #: ../src/todo.c:178
msgid "Preferences" msgid "Preferences"
msgstr "Préférences" msgstr "Préférences"
#: ../src/todo.c:204 #: ../src/todo.c:223
msgid "Todo" msgid "Todo"
msgstr "Todo" msgstr "Todo"
#: ../src/todo.c:301 #: ../src/todo.c:328
msgid "Priority" msgid "Priority"
msgstr "Priorité" msgstr "Priorité"
#: ../src/todo.c:357 ../src/todo.c:362 #: ../src/todo.c:393 ../src/todo.c:398
msgid "Error" msgid "Error"
msgstr "Erreur" msgstr "Erreur"
#: ../src/todo.c:449 #: ../src/todo.c:485
msgid "Are you sure you want to delete the selected task(s)?" msgid "Are you sure you want to delete the selected task(s)?"
msgstr "Voulez-vous vraiment supprimer la sélection?" msgstr "Voulez-vous vraiment supprimer la sélection?"
#: ../src/todo.c:657 ../src/todo.c:662 #: ../src/todo.c:693 ../src/todo.c:698
msgid "Question" msgid "Question"
msgstr "Question" msgstr "Question"

View File

@ -86,6 +86,34 @@ void on_edit_select_all(gpointer data)
} }
/* view menu */
/* on_view_all_tasks */
void on_view_all_tasks(gpointer data)
{
Todo * todo = data;
todo_set_view(todo, TODO_VIEW_ALL_TASKS);
}
/* on_view_completed_tasks */
void on_view_completed_tasks(gpointer data)
{
Todo * todo = data;
todo_set_view(todo, TODO_VIEW_COMPLETED_TASKS);
}
/* on_view_remaining_tasks */
void on_view_remaining_tasks(gpointer data)
{
Todo * todo = data;
todo_set_view(todo, TODO_VIEW_REMAINING_TASKS);
}
/* help menu */ /* help menu */
/* on_help_about */ /* on_help_about */
void on_help_about(gpointer data) void on_help_about(gpointer data)

View File

@ -35,6 +35,11 @@ void on_edit_select_all(gpointer data);
void on_edit_delete(gpointer data); void on_edit_delete(gpointer data);
void on_edit_preferences(gpointer data); void on_edit_preferences(gpointer data);
/* view menu */
void on_view_all_tasks(gpointer data);
void on_view_completed_tasks(gpointer data);
void on_view_remaining_tasks(gpointer data);
/* help menu */ /* help menu */
void on_help_about(gpointer data); void on_help_about(gpointer data);

View File

@ -46,6 +46,9 @@ struct _Todo
GtkWidget * scrolled; GtkWidget * scrolled;
GtkListStore * store; GtkListStore * store;
GtkListStore * priorities; GtkListStore * priorities;
GtkTreeModel * filter;
GtkTreeModel * filter_sort;
TodoView filter_view;
GtkWidget * view; GtkWidget * view;
GtkWidget * statusbar; GtkWidget * statusbar;
GtkWidget * about; GtkWidget * about;
@ -127,6 +130,15 @@ static DesktopMenu _edit_menu[] =
GTK_STOCK_PREFERENCES, GDK_CONTROL_MASK, GDK_P }, GTK_STOCK_PREFERENCES, GDK_CONTROL_MASK, GDK_P },
{ NULL, NULL, NULL, 0, 0 } { NULL, NULL, NULL, 0, 0 }
}; };
static DesktopMenu _view_menu[] =
{
{ N_("_All tasks"), G_CALLBACK(on_view_all_tasks), NULL, 0, 0 },
{ N_("_Completed tasks"), G_CALLBACK(on_view_completed_tasks), NULL, 0,
0 },
{ N_("_Remaining tasks"), G_CALLBACK(on_view_remaining_tasks), NULL, 0,
0 },
{ NULL, NULL, NULL, 0, 0 }
};
static DesktopMenu _help_menu[] = static DesktopMenu _help_menu[] =
{ {
#if GTK_CHECK_VERSION(2, 6, 0) #if GTK_CHECK_VERSION(2, 6, 0)
@ -140,6 +152,7 @@ static DesktopMenubar _menubar[] =
{ {
{ N_("_File"), _file_menu }, { N_("_File"), _file_menu },
{ N_("_Edit"), _edit_menu }, { N_("_Edit"), _edit_menu },
{ N_("_View"), _view_menu },
{ N_("_Help"), _help_menu }, { N_("_Help"), _help_menu },
{ NULL, NULL }, { NULL, NULL },
}; };
@ -171,11 +184,17 @@ static DesktopToolbar _toolbar[] =
/* prototypes */ /* prototypes */
static int _todo_confirm(GtkWidget * window, char const * message); static int _todo_confirm(GtkWidget * window, char const * message);
static gboolean _todo_get_iter(Todo * todo, GtkTreeIter * iter,
GtkTreePath * path);
static char * _todo_task_get_directory(void); static char * _todo_task_get_directory(void);
static char * _todo_task_get_filename(char const * filename); static char * _todo_task_get_filename(char const * filename);
static char * _todo_task_get_new_filename(void); static char * _todo_task_get_new_filename(void);
static void _todo_task_save(Todo * todo, GtkTreeIter * iter); static void _todo_task_save(Todo * todo, GtkTreeIter * iter);
/* callbacks */
static gboolean _on_todo_filter_view(GtkTreeModel * model, GtkTreeIter * iter,
gpointer data);
/* public */ /* public */
/* functions */ /* functions */
@ -256,7 +275,15 @@ static void _new_view(Todo * todo)
0, _todo_priorities[i].priority, 0, _todo_priorities[i].priority,
1, _todo_priorities[i].title, -1); 1, _todo_priorities[i].title, -1);
} }
todo->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(todo->store)); todo->filter = gtk_tree_model_filter_new(GTK_TREE_MODEL(todo->store),
NULL);
todo->filter_view = TODO_VIEW_ALL_TASKS;
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(
todo->filter), _on_todo_filter_view, todo,
NULL);
todo->filter_sort = gtk_tree_model_sort_new_with_model(todo->filter);
todo->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(
todo->filter_sort));
if((sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(todo->view))) if((sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(todo->view)))
!= NULL) != NULL)
gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE); gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
@ -323,6 +350,15 @@ void todo_delete(Todo * todo)
} }
/* accessors */
/* todo_set_view */
void todo_set_view(Todo * todo, TodoView view)
{
todo->filter_view = view;
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(todo->filter));
}
/* useful */ /* useful */
/* todo_about */ /* todo_about */
void todo_about(Todo * todo) void todo_about(Todo * todo)
@ -473,7 +509,7 @@ static void _task_delete_selected_foreach(GtkTreeRowReference * reference,
return; return;
if((path = gtk_tree_row_reference_get_path(reference)) == NULL) if((path = gtk_tree_row_reference_get_path(reference)) == NULL)
return; return;
if(gtk_tree_model_get_iter(model, &iter, path) == TRUE) if(_todo_get_iter(todo, &iter, path) == TRUE)
{ {
gtk_tree_model_get(model, &iter, TD_COL_TASK, &task, -1); gtk_tree_model_get(model, &iter, TD_COL_TASK, &task, -1);
task_unlink(task); task_unlink(task);
@ -586,7 +622,7 @@ void todo_task_set_priority(Todo * todo, GtkTreePath * path,
size_t i; size_t i;
TodoPriority tp = TODO_PRIORITY_UNKNOWN; TodoPriority tp = TODO_PRIORITY_UNKNOWN;
gtk_tree_model_get_iter(model, &iter, path); _todo_get_iter(todo, &iter, path);
gtk_tree_model_get(model, &iter, TD_COL_TASK, &task, -1); gtk_tree_model_get(model, &iter, TD_COL_TASK, &task, -1);
task_set_priority(task, priority); task_set_priority(task, priority);
for(i = 0; _todo_priorities[i].title != NULL; i++) for(i = 0; _todo_priorities[i].title != NULL; i++)
@ -608,7 +644,7 @@ void todo_task_set_title(Todo * todo, GtkTreePath * path, char const * title)
GtkTreeIter iter; GtkTreeIter iter;
Task * task; Task * task;
gtk_tree_model_get_iter(model, &iter, path); _todo_get_iter(todo, &iter, path);
gtk_tree_model_get(model, &iter, TD_COL_TASK, &task, -1); gtk_tree_model_get(model, &iter, TD_COL_TASK, &task, -1);
task_set_title(task, title); task_set_title(task, title);
gtk_list_store_set(todo->store, &iter, TD_COL_TITLE, title, -1); gtk_list_store_set(todo->store, &iter, TD_COL_TITLE, title, -1);
@ -626,7 +662,7 @@ void todo_task_toggle_done(Todo * todo, GtkTreePath * path)
struct tm t; struct tm t;
char completion[32] = ""; char completion[32] = "";
gtk_tree_model_get_iter(GTK_TREE_MODEL(todo->store), &iter, path); _todo_get_iter(todo, &iter, path);
gtk_tree_model_get(GTK_TREE_MODEL(todo->store), &iter, gtk_tree_model_get(GTK_TREE_MODEL(todo->store), &iter,
TD_COL_TASK, &task, TD_COL_DONE, &done, -1); TD_COL_TASK, &task, TD_COL_DONE, &done, -1);
done = !done; done = !done;
@ -668,6 +704,23 @@ static int _todo_confirm(GtkWidget * window, char const * message)
} }
/* todo_get_iter */
static gboolean _todo_get_iter(Todo * todo, GtkTreeIter * iter,
GtkTreePath * path)
{
GtkTreeIter p;
if(gtk_tree_model_get_iter(GTK_TREE_MODEL(todo->filter_sort), iter,
path) == FALSE)
return FALSE;
gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT(
todo->filter_sort), &p, iter);
gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(
todo->filter), iter, &p);
return TRUE;
}
/* todo_task_get_directory */ /* todo_task_get_directory */
static char * _todo_task_get_directory(void) static char * _todo_task_get_directory(void)
{ {
@ -743,3 +796,26 @@ static void _todo_task_save(Todo * todo, GtkTreeIter * iter)
gtk_tree_model_get(model, iter, TD_COL_TASK, &task, -1); gtk_tree_model_get(model, iter, TD_COL_TASK, &task, -1);
task_save(task); task_save(task);
} }
/* callbacks */
/* on_todo_filter_view */
static gboolean _on_todo_filter_view(GtkTreeModel * model, GtkTreeIter * iter,
gpointer data)
{
Todo * todo = data;
gboolean done = FALSE;
switch(todo->filter_view)
{
case TODO_VIEW_COMPLETED_TASKS:
gtk_tree_model_get(model, iter, TD_COL_DONE, &done, -1);
return done ? TRUE : FALSE;
case TODO_VIEW_REMAINING_TASKS:
gtk_tree_model_get(model, iter, TD_COL_DONE, &done, -1);
return done ? FALSE : TRUE;
default:
case TODO_VIEW_ALL_TASKS:
return TRUE;
}
}

View File

@ -35,11 +35,21 @@ typedef enum _TodoPriority
TODO_PRIORITY_URGENT TODO_PRIORITY_URGENT
} TodoPriority; } TodoPriority;
typedef enum _TodoView
{
TODO_VIEW_ALL_TASKS,
TODO_VIEW_COMPLETED_TASKS,
TODO_VIEW_REMAINING_TASKS
} TodoView;
/* functions */ /* functions */
Todo * todo_new(void); Todo * todo_new(void);
void todo_delete(Todo * todo); void todo_delete(Todo * todo);
/* accessors */
void todo_set_view(Todo * todo, TodoView view);
/* useful */ /* useful */
void todo_about(Todo * todo); void todo_about(Todo * todo);
int todo_error(Todo * todo, char const * message, int ret); int todo_error(Todo * todo, char const * message, int ret);