Add Collect filter
This filter, in the main window, shows only the manga that still need to be collected, not the completed ones. * src/data.c (data_get_manga): Use `data_get_manga_for_query'. (data_get_incomplete_manga): New function, get all manga that arent' completely collected yet. (data_get_manga_for_query): New function, fetches all the manga as `query' specifies. * src/data.h: Add `data_get_incomplete_manga'. * src/eom-main-window.c (filter_args): New struct. Contains arguments needed by the filter callback. (eom_main_window_load): Accept a list of manga, this list will be used to show the manga, if it's NULL, a list of all manga is used. (eom_main_window_add_menu): Add `All' and `Collect' filter buttons. (eom_main_window_on_filter): Callback for the filter buttons, reloads the list with the correct manga. * src/eom-main-window.h: Add manga parameter to `eom_main_window_load'. * src/interface.c (interface_show_main_window): Pass `NULL' to `eom_main_window_load' to show all manga.
This commit is contained in:
parent
12c5dd9231
commit
395c534fd9
5 changed files with 95 additions and 25 deletions
45
src/data.c
45
src/data.c
|
@ -11,8 +11,36 @@
|
||||||
static gboolean data_check_and_create_database(gchar *data_file);
|
static gboolean data_check_and_create_database(gchar *data_file);
|
||||||
static gint data_create_new_database(const gchar *filename);
|
static gint data_create_new_database(const gchar *filename);
|
||||||
static Manga *data_get_manga_from_statement(sqlite3_stmt *stmt);
|
static Manga *data_get_manga_from_statement(sqlite3_stmt *stmt);
|
||||||
|
static GList *data_get_manga_for_query(const gchar *query);
|
||||||
|
|
||||||
GList *data_get_manga(void)
|
GList *data_get_manga(void)
|
||||||
|
{
|
||||||
|
const char *sql =
|
||||||
|
" SELECT id, "
|
||||||
|
" name, "
|
||||||
|
" current_qty, "
|
||||||
|
" total_qty "
|
||||||
|
" FROM manga "
|
||||||
|
" ORDER BY name "
|
||||||
|
" COLLATE NOCASE ";
|
||||||
|
return data_get_manga_for_query(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
GList *data_get_incomplete_manga(void)
|
||||||
|
{
|
||||||
|
const char *sql =
|
||||||
|
" SELECT id, "
|
||||||
|
" name, "
|
||||||
|
" current_qty, "
|
||||||
|
" total_qty "
|
||||||
|
" FROM manga "
|
||||||
|
" WHERE current_qty != total_qty "
|
||||||
|
" ORDER BY name "
|
||||||
|
" COLLATE NOCASE ";
|
||||||
|
return data_get_manga_for_query(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
GList *data_get_manga_for_query(const gchar *query)
|
||||||
{
|
{
|
||||||
sqlite3 *database;
|
sqlite3 *database;
|
||||||
sqlite3_stmt *statement;
|
sqlite3_stmt *statement;
|
||||||
|
@ -23,20 +51,11 @@ GList *data_get_manga(void)
|
||||||
|
|
||||||
if (data_check_and_create_database(data_file)) {
|
if (data_check_and_create_database(data_file)) {
|
||||||
if (sqlite3_open(data_file, &database) == SQLITE_OK) {
|
if (sqlite3_open(data_file, &database) == SQLITE_OK) {
|
||||||
int res;
|
int res = sqlite3_prepare_v2(database,
|
||||||
const char *sql =
|
query,
|
||||||
" SELECT id, "
|
strlen(query),
|
||||||
" name, "
|
|
||||||
" current_qty, "
|
|
||||||
" total_qty "
|
|
||||||
" FROM manga "
|
|
||||||
" ORDER BY name "
|
|
||||||
" COLLATE NOCASE ";
|
|
||||||
|
|
||||||
res = sqlite3_prepare_v2(database,
|
|
||||||
sql,
|
|
||||||
strlen(sql),
|
|
||||||
&statement, NULL);
|
&statement, NULL);
|
||||||
|
|
||||||
if (res == SQLITE_OK) {
|
if (res == SQLITE_OK) {
|
||||||
while (sqlite3_step(statement) == SQLITE_ROW) {
|
while (sqlite3_step(statement) == SQLITE_ROW) {
|
||||||
Manga *manga = data_get_manga_from_statement(statement);
|
Manga *manga = data_get_manga_from_statement(statement);
|
||||||
|
|
|
@ -24,6 +24,7 @@ struct _manga
|
||||||
};
|
};
|
||||||
|
|
||||||
GList *data_get_manga(void);
|
GList *data_get_manga(void);
|
||||||
|
GList *data_get_incomplete_manga(void);
|
||||||
Manga *data_get_manga_by_id(gint manga_id);
|
Manga *data_get_manga_by_id(gint manga_id);
|
||||||
void data_get_volumes_for_manga(Manga *manga);
|
void data_get_volumes_for_manga(Manga *manga);
|
||||||
gboolean data_add_manga(gchar *name, gint total_qty);
|
gboolean data_add_manga(gchar *name, gint total_qty);
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
#include "eom-main-window.h"
|
#include "eom-main-window.h"
|
||||||
#include <hildon/hildon.h>
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <hildon/hildon.h>
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
#include "eom-new-item-dialog.h"
|
#include "eom-new-item-dialog.h"
|
||||||
#include "data.h"
|
#include "data.h"
|
||||||
#include "interface.h"
|
#include "interface.h"
|
||||||
|
@ -17,8 +20,14 @@ enum {
|
||||||
NUM_COLS
|
NUM_COLS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct filter_args {
|
||||||
|
EomMainWindow *window;
|
||||||
|
gint state;
|
||||||
|
};
|
||||||
|
|
||||||
static void eom_main_window_add_menu(EomMainWindow *window);
|
static void eom_main_window_add_menu(EomMainWindow *window);
|
||||||
static void eom_main_window_on_new(GtkWidget *widget, GtkWindow *window);
|
static void eom_main_window_on_new(GtkWidget *widget, GtkWindow *window);
|
||||||
|
static void eom_main_window_on_filter(GtkWidget *widget, struct filter_args *arg);
|
||||||
static void eom_main_window_on_add_clicked(GtkWidget *widget,
|
static void eom_main_window_on_add_clicked(GtkWidget *widget,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
static void eom_main_window_on_remove_clicked(GtkWidget *widget,
|
static void eom_main_window_on_remove_clicked(GtkWidget *widget,
|
||||||
|
@ -36,13 +45,16 @@ GtkWidget *eom_main_window_new(void)
|
||||||
return g_object_new(EOM_TYPE_MAIN_WINDOW, NULL);
|
return g_object_new(EOM_TYPE_MAIN_WINDOW, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void eom_main_window_load(EomMainWindow *self)
|
void eom_main_window_load(EomMainWindow *self, GList *manga)
|
||||||
{
|
{
|
||||||
GList *list;
|
GList *list;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
gtk_list_store_clear(self->store);
|
gtk_list_store_clear(self->store);
|
||||||
|
|
||||||
|
if (manga)
|
||||||
|
list = manga;
|
||||||
|
else
|
||||||
list = data_get_manga();
|
list = data_get_manga();
|
||||||
|
|
||||||
while (list) {
|
while (list) {
|
||||||
|
@ -157,10 +169,17 @@ static void eom_main_window_init(EomMainWindow *window)
|
||||||
|
|
||||||
static void eom_main_window_add_menu(EomMainWindow *window)
|
static void eom_main_window_add_menu(EomMainWindow *window)
|
||||||
{
|
{
|
||||||
GtkWidget *appmenu;
|
HildonAppMenu *appmenu;
|
||||||
GtkWidget *new_button;
|
GtkWidget *new_button;
|
||||||
|
GtkWidget *all_filter, *collect_filter;
|
||||||
|
struct filter_args *args0 = malloc(sizeof(struct filter_args));
|
||||||
|
struct filter_args *args1 = malloc(sizeof(struct filter_args));
|
||||||
|
|
||||||
appmenu = hildon_app_menu_new();
|
args0->window = window;
|
||||||
|
args0->state = 0;
|
||||||
|
args1->window = window;
|
||||||
|
args1->state = 1;
|
||||||
|
appmenu = HILDON_APP_MENU(hildon_app_menu_new());
|
||||||
|
|
||||||
new_button = hildon_gtk_button_new(HILDON_SIZE_AUTO);
|
new_button = hildon_gtk_button_new(HILDON_SIZE_AUTO);
|
||||||
gtk_button_set_label(GTK_BUTTON(new_button), "New Manga");
|
gtk_button_set_label(GTK_BUTTON(new_button), "New Manga");
|
||||||
|
@ -169,13 +188,44 @@ static void eom_main_window_add_menu(EomMainWindow *window)
|
||||||
G_CALLBACK(eom_main_window_on_new),
|
G_CALLBACK(eom_main_window_on_new),
|
||||||
GTK_WINDOW(window));
|
GTK_WINDOW(window));
|
||||||
|
|
||||||
hildon_app_menu_append(HILDON_APP_MENU(appmenu), GTK_BUTTON(new_button));
|
hildon_app_menu_append(appmenu, GTK_BUTTON(new_button));
|
||||||
gtk_widget_show_all(appmenu);
|
|
||||||
|
all_filter = hildon_gtk_radio_button_new(HILDON_SIZE_AUTO, NULL);
|
||||||
|
gtk_button_set_label(GTK_BUTTON(all_filter), "All");
|
||||||
|
g_signal_connect_after(all_filter, "clicked",
|
||||||
|
G_CALLBACK(eom_main_window_on_filter),
|
||||||
|
args0);
|
||||||
|
hildon_app_menu_add_filter(appmenu, GTK_BUTTON(all_filter));
|
||||||
|
gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(all_filter), FALSE);
|
||||||
|
|
||||||
|
collect_filter =
|
||||||
|
hildon_gtk_radio_button_new_from_widget(HILDON_SIZE_AUTO,
|
||||||
|
GTK_RADIO_BUTTON(all_filter));
|
||||||
|
gtk_button_set_label(GTK_BUTTON(collect_filter), "Collect");
|
||||||
|
g_signal_connect_after(collect_filter, "clicked",
|
||||||
|
G_CALLBACK(eom_main_window_on_filter),
|
||||||
|
args1);
|
||||||
|
hildon_app_menu_add_filter(appmenu, GTK_BUTTON(collect_filter));
|
||||||
|
gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(collect_filter), FALSE);
|
||||||
|
|
||||||
|
gtk_widget_show_all(GTK_WIDGET(appmenu));
|
||||||
|
|
||||||
hildon_stackable_window_set_main_menu(HILDON_STACKABLE_WINDOW(window),
|
hildon_stackable_window_set_main_menu(HILDON_STACKABLE_WINDOW(window),
|
||||||
HILDON_APP_MENU(appmenu));
|
HILDON_APP_MENU(appmenu));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void eom_main_window_on_filter(GtkWidget *widget, struct filter_args *arg)
|
||||||
|
{
|
||||||
|
GList *manga;
|
||||||
|
|
||||||
|
if (arg->state)
|
||||||
|
manga = data_get_incomplete_manga();
|
||||||
|
else
|
||||||
|
manga = data_get_manga();
|
||||||
|
|
||||||
|
eom_main_window_load(arg->window, manga);
|
||||||
|
}
|
||||||
|
|
||||||
static void eom_main_window_on_new(GtkWidget *widget, GtkWindow *window)
|
static void eom_main_window_on_new(GtkWidget *widget, GtkWindow *window)
|
||||||
{
|
{
|
||||||
GtkWidget *dialog;
|
GtkWidget *dialog;
|
||||||
|
@ -202,7 +252,7 @@ static void eom_main_window_on_new(GtkWidget *widget, GtkWindow *window)
|
||||||
|
|
||||||
if (name != NULL) {
|
if (name != NULL) {
|
||||||
if (data_add_manga(name, total_qty))
|
if (data_add_manga(name, total_qty))
|
||||||
eom_main_window_load(EOM_MAIN_WINDOW(window));
|
eom_main_window_load(EOM_MAIN_WINDOW(window), NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,7 +262,7 @@ static gboolean eom_main_window_on_edit_closed(GtkWidget *widget,
|
||||||
{
|
{
|
||||||
EomMainWindow *self = user_data;
|
EomMainWindow *self = user_data;
|
||||||
|
|
||||||
eom_main_window_load(self);
|
eom_main_window_load(self, NULL);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ GType eom_main_window_get_type(void);
|
||||||
|
|
||||||
GtkWidget *eom_main_window_new(void);
|
GtkWidget *eom_main_window_new(void);
|
||||||
|
|
||||||
void eom_main_window_load(EomMainWindow *self);
|
void eom_main_window_load(EomMainWindow *self, GList *manga);
|
||||||
void eom_main_window_add_line(EomMainWindow *window,
|
void eom_main_window_add_line(EomMainWindow *window,
|
||||||
gint id,
|
gint id,
|
||||||
const gchar *name,
|
const gchar *name,
|
||||||
|
|
|
@ -12,7 +12,7 @@ void interface_show_main_window(void)
|
||||||
window = eom_main_window_new();
|
window = eom_main_window_new();
|
||||||
gtk_widget_show_all(window);
|
gtk_widget_show_all(window);
|
||||||
|
|
||||||
eom_main_window_load(EOM_MAIN_WINDOW(window));
|
eom_main_window_load(EOM_MAIN_WINDOW(window), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *interface_show_edit_window(gint manga_id)
|
GtkWidget *interface_show_edit_window(gint manga_id)
|
||||||
|
|
Loading…
Reference in a new issue