/* Eye on Manga - Manga collection software for Maemo 5 Copyright (C) 2010-2013 Tom Willemse Eye on Manga is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Eye on Manga is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Eye on Manga. If not, see . */ #include "eom-main-window.h" #include #include #include #include #include "data.h" #include "eom-new-item-dialog.h" #include "interface.h" G_DEFINE_TYPE(EomMainWindow, eom_main_window, HILDON_TYPE_STACKABLE_WINDOW) enum { COL_ID = 0, COL_NAME, COL_CURRENT, COL_TOTAL, NUM_COLS }; enum { STATE_NORMAL = 0, STATE_COLLECT, STATE_READ }; struct filter_args { EomMainWindow *window; gint state; }; static void add_menu(EomMainWindow*); static void eom_main_window_class_init(EomMainWindowClass*); static void eom_main_window_init(EomMainWindow*); static void on_detail_hidden(GtkWidget*, gpointer); static void on_filter(GtkWidget*, struct filter_args*); static void on_new(GtkWidget*, GtkWindow*); static void on_row_activated(GtkWidget*, GtkTreePath*, GtkTreeViewColumn*, gpointer); void eom_main_window_add_line(EomMainWindow *window, gint id, const gchar *name, gint current_qty, gint total_qty) { gtk_list_store_append(window->store, &window->iter); gtk_list_store_set(window ->store, &window->iter, COL_ID, id, COL_NAME, name, COL_CURRENT, current_qty, COL_TOTAL, total_qty, -1); } void eom_main_window_load(EomMainWindow *self) { GList *list; int i; gtk_list_store_clear(self->store); switch (self->state) { case STATE_COLLECT: list = data_get_incomplete_manga(); break; case STATE_READ: list = data_get_unread_manga(); break; default: list = data_get_manga(); break; } while (list) { Manga *manga = list->data; eom_main_window_add_line(self, manga->id, manga->name, manga->current_qty, manga->total_qty); free(manga->name); if (manga->volumes != NULL) { for (i = 0; i < manga->vol_count; i++) free(manga->volumes + i); } free(manga); list = g_list_next(list); } g_list_free_1(list); } GtkWidget * eom_main_window_new(void) { return g_object_new(EOM_TYPE_MAIN_WINDOW, NULL); } static void add_menu(EomMainWindow *window) { HildonAppMenu *appmenu; GtkWidget *new_button; GtkWidget *all_filter, *collect_filter, *read_filter; struct filter_args *args0 = malloc(sizeof(struct filter_args)); struct filter_args *args1 = malloc(sizeof(struct filter_args)); struct filter_args *args2 = malloc(sizeof(struct filter_args)); args0->window = window; args0->state = STATE_NORMAL; args1->window = window; args1->state = STATE_COLLECT; args2->window = window; args2->state = STATE_READ; appmenu = HILDON_APP_MENU(hildon_app_menu_new()); new_button = hildon_gtk_button_new(HILDON_SIZE_AUTO); gtk_button_set_label(GTK_BUTTON(new_button), "New..."); g_signal_connect_after(new_button, "clicked", G_CALLBACK(on_new), GTK_WINDOW(window)); hildon_app_menu_append(appmenu, GTK_BUTTON(new_button)); 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(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(on_filter), args1); hildon_app_menu_add_filter(appmenu, GTK_BUTTON(collect_filter)); gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(collect_filter), FALSE); read_filter = hildon_gtk_radio_button_new_from_widget(HILDON_SIZE_AUTO, GTK_RADIO_BUTTON(all_filter)); gtk_button_set_label(GTK_BUTTON(read_filter), "Read"); g_signal_connect_after(read_filter, "clicked", G_CALLBACK(on_filter), args2); hildon_app_menu_add_filter(appmenu, GTK_BUTTON(read_filter)); gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(read_filter), FALSE); gtk_widget_show_all(GTK_WIDGET(appmenu)); hildon_stackable_window_set_main_menu(HILDON_STACKABLE_WINDOW(window), HILDON_APP_MENU(appmenu)); } static void eom_main_window_class_init(EomMainWindowClass *class) {} static void eom_main_window_init(EomMainWindow *window) { GtkCellRenderer *renderer; GtkWidget *view; GtkWidget *pannablearea; GtkTreeViewColumn *current_column; GtkTreeSelection *selection; int index; index = -1; add_menu(window); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL); window->store = gtk_list_store_new(NUM_COLS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); pannablearea = hildon_pannable_area_new(); g_object_set(G_OBJECT(pannablearea), "mov-mode", HILDON_MOVEMENT_MODE_VERT, NULL); gtk_container_add(GTK_CONTAINER(window), pannablearea); view = hildon_gtk_tree_view_new(HILDON_UI_MODE_NORMAL); g_signal_connect(view, "row-activated", G_CALLBACK(on_row_activated), window); gtk_container_add(GTK_CONTAINER(pannablearea), view); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), ++index, "Naam", renderer, "text", COL_NAME, NULL); current_column = gtk_tree_view_get_column(GTK_TREE_VIEW(view), index); gtk_tree_view_column_set_expand(current_column, TRUE); renderer = gtk_cell_renderer_text_new(); gtk_object_set(GTK_OBJECT(renderer), "xalign", 1.0, "width", 100, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), ++index, "", renderer, "text", COL_CURRENT, NULL); renderer = gtk_cell_renderer_text_new(); gtk_object_set(GTK_OBJECT(renderer), "xalign", 1.0, "width", 100, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), ++index, "", renderer, "text", COL_TOTAL, NULL); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(window->store)); g_object_unref(window->store); } static void on_detail_hidden(GtkWidget *widget, gpointer user_data) { EomMainWindow *self = EOM_MAIN_WINDOW(user_data); eom_main_window_load(self); } static void on_filter(GtkWidget *widget, struct filter_args *arg) { arg->window->state = arg->state; eom_main_window_load(arg->window); } static void on_new(GtkWidget *widget, GtkWindow *window) { GtkWidget *dialog; gint result; const gchar *name = NULL; gint total_qty; dialog = interface_show_new_item_dialog(window); result = gtk_dialog_run(GTK_DIALOG(dialog)); if (result == GTK_RESPONSE_OK) { name = eom_new_item_dialog_get_name(EOM_NEW_ITEM_DIALOG(dialog)); total_qty = eom_new_item_dialog_get_total_qty(EOM_NEW_ITEM_DIALOG(dialog)); } if (name != NULL) { if (data_add_manga(name, total_qty)) eom_main_window_load(EOM_MAIN_WINDOW(window)); } gtk_widget_destroy(dialog); } static void on_row_activated(GtkWidget *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) { EomMainWindow *self = user_data; GtkTreeIter iter; GtkTreeModel *model; gint id; GtkWidget *window; model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); if (!gtk_tree_model_get_iter(model, &iter, path)) return; gtk_tree_model_get(model, &iter, COL_ID, &id, -1); window = interface_show_detail_window(id); g_signal_connect(window, "hide", G_CALLBACK(on_detail_hidden), self); }