From 4d3bb22d33ea44aaacb8b45163ecb2cac3703d50 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Tue, 23 Oct 2012 01:49:27 +0200 Subject: Rename edit window to detail window It won't function as an edit window much longer. --- src/eom-detail-window.c | 299 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 src/eom-detail-window.c (limited to 'src/eom-detail-window.c') diff --git a/src/eom-detail-window.c b/src/eom-detail-window.c new file mode 100644 index 0000000..8426831 --- /dev/null +++ b/src/eom-detail-window.c @@ -0,0 +1,299 @@ +#include "eom-detail-window.h" + +#include +#include +#include +#include + +#include "data.h" +#include "eom-main-window.h" + +#define COLUMNS 8 + +enum { + EOM_EDIT_PROP_0, + EOM_EDIT_PROP_CID +}; + +static GtkWidget *create_volume_button(gchar*, GtkTable*, int, int); +static void eom_detail_window_class_init(EomDetailWindowClass*); +static void eom_detail_window_init(EomDetailWindow *self); +static void finalize(GObject*); +static void get_property(GObject*, guint, GValue*, GParamSpec*); +static void on_volume_read_toggled(GtkToggleButton*, gpointer); +static void on_volume_toggled(GtkToggleButton*, gpointer); +static void set_manga_id(EomDetailWindow*, gint); +static void set_property(GObject*, guint, const GValue*, GParamSpec*); + +G_DEFINE_TYPE(EomDetailWindow, eom_detail_window, + HILDON_TYPE_STACKABLE_WINDOW) + +GtkWidget * +eom_detail_window_new(gint manga_id) +{ + return g_object_new(EOM_TYPE_EDIT_WINDOW, + "manga-id", manga_id, + NULL); +} + +static GtkWidget * +create_volume_button(gchar* text, GtkTable* table, int column, int row) +{ + GtkWidget *btn; + + btn = hildon_gtk_toggle_button_new(HILDON_SIZE_THUMB_HEIGHT + | HILDON_SIZE_AUTO_WIDTH); + gtk_button_set_label(GTK_BUTTON(btn), text); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(btn), FALSE); + gtk_table_attach(GTK_TABLE(table), btn, + column, column + 1, + row, row + 1, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, + 0, 0); + + return btn; +} + +static void +eom_detail_window_class_init(EomDetailWindowClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + GParamSpec *pspec; + + gobject_class->set_property = set_property; + gobject_class->get_property = get_property; + gobject_class->finalize = finalize; + pspec = g_param_spec_int("manga-id", "ID of the manga", + "Set the manga-id", 0, INT_MAX, 0, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE); + + g_object_class_install_property(gobject_class, EOM_EDIT_PROP_CID, + pspec); +} + +static void +eom_detail_window_init(EomDetailWindow *self) +{ + GtkWidget *panarea; + GtkWidget *table; + GtkWidget *nameclabel; + GtkWidget *haveclabel; + GtkWidget *totalclabel; + + panarea = hildon_pannable_area_new(); + g_object_set(G_OBJECT(panarea), + "mov-mode", HILDON_MOVEMENT_MODE_VERT, + NULL); + gtk_container_add(GTK_CONTAINER(self), panarea); + + table = gtk_table_new(4, 2, FALSE); + hildon_pannable_area_add_with_viewport(HILDON_PANNABLE_AREA(panarea), + table); + + /* Label for the name field */ + nameclabel = gtk_label_new("Name:"); + gtk_misc_set_alignment(GTK_MISC(nameclabel), 0.0, 0.5); + gtk_table_attach(GTK_TABLE(table), nameclabel, 0, 1, 0, 1, + GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); + + /* The name field */ + self->name_entry = hildon_entry_new(HILDON_SIZE_AUTO); + gtk_entry_set_alignment(GTK_ENTRY(self->name_entry), 1.0); + gtk_table_attach(GTK_TABLE(table), self->name_entry, 1, 2, 0, 1, + GTK_EXPAND | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); + + /* Label for the collected field */ + haveclabel = gtk_label_new("You have:"); + gtk_misc_set_alignment(GTK_MISC(haveclabel), 0.0, 0.5); + gtk_table_attach(GTK_TABLE(table), haveclabel, 0, 1, 1, 2, + GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); + + /* The collected field */ + self->have_label = gtk_label_new(""); + gtk_misc_set_alignment(GTK_MISC(self->have_label), 1.0, 0.5); + gtk_table_attach(GTK_TABLE(table), self->have_label, 1, 2, 1, 2, + GTK_EXPAND | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); + + /* Label for the total field */ + totalclabel = gtk_label_new("There are:"); + gtk_misc_set_alignment(GTK_MISC(totalclabel), 0.0, 0.5); + gtk_table_attach(GTK_TABLE(table), totalclabel, 0, 1, 2, 3, + GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); + + /* The total field */ + self->total_entry = hildon_entry_new(HILDON_SIZE_AUTO); + gtk_entry_set_alignment(GTK_ENTRY(self->total_entry), 1.0); + gtk_table_attach(GTK_TABLE(table), self->total_entry, 1, 2, 2, 3, + GTK_EXPAND | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); + + self->volsbox = gtk_vbox_new(FALSE, 0); + gtk_table_attach(GTK_TABLE(table), self->volsbox, 0, 2, 3, 4, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); +} + +static void +finalize(GObject *object) +{ + EomDetailWindow *self = EOM_DETAIL_WINDOW(object); + + g_free(self->manga); + + G_OBJECT_CLASS(eom_detail_window_parent_class)->finalize(object); +} + +static void +get_property(GObject *object, guint property_id, GValue *value, + GParamSpec *pspec) +{ + EomDetailWindow *self = EOM_DETAIL_WINDOW(object); + + switch (property_id) { + case EOM_EDIT_PROP_CID: + g_value_set_int(value, self->manga->id); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); + break; + } +} + +static void +on_volume_read_toggled(GtkToggleButton *togglebutton, gpointer user_data) +{ + EomDetailWindow *self = (EomDetailWindow *)user_data; + gboolean active = gtk_toggle_button_get_active(togglebutton); + gint volume = atoi(gtk_button_get_label(GTK_BUTTON(togglebutton))); + + if (!data_mark_volume_read(active, self->manga->id, volume)) + g_print("coulnd't mark volume as read\n"); +} + +static void +on_volume_toggled(GtkToggleButton *togglebutton, gpointer user_data) +{ + EomDetailWindow *self = (EomDetailWindow *)user_data; + gboolean active = gtk_toggle_button_get_active(togglebutton); + gint volume = atoi(gtk_button_get_label(GTK_BUTTON(togglebutton))); + gchar *txt; + + if (active) { + /* Add 1 to mangas collected */ + if (!data_add_to_manga(self->manga->id, 1)) { + return; + } + if (!data_add_volume_to_manga(self->manga->id, volume)) { + data_add_to_manga(self->manga->id, 1); + return; + } + self->manga->current_qty++; + } + else { + /* Remove 1 from mangas collected */ + if (!data_add_to_manga(self->manga->id, -1)) { + return; + } + if (!data_remove_volume_from_manga(self->manga->id, + volume)) { + data_add_to_manga(self->manga->id, 1); /* Undo */ + return; + } + self->manga->current_qty--; + } + + txt = g_strdup_printf("%d", self->manga->current_qty); + gtk_label_set_text(GTK_LABEL(self->have_label), txt); + g_free(txt); +} + +static void +set_manga_id(EomDetailWindow *self, gint manga_id) +{ + GtkWidget *bbox; + GtkWidget *clabel, *rlabel; + GtkWidget *ctable, *rtable; + Manga *manga; + gchar *txt; + gint i, j = 0, row = 0, col = 0; + + manga = data_get_manga_by_id(manga_id); + data_get_volumes_for_manga(manga); + self->manga = manga; + + gtk_window_set_title(GTK_WINDOW(self), manga->name); + gtk_entry_set_text(GTK_ENTRY(self->name_entry), manga->name); + + txt = g_strdup_printf("%d", manga->current_qty); + gtk_label_set_text(GTK_LABEL(self->have_label), txt); + g_free(txt); + + txt = g_strdup_printf("%d", manga->total_qty); + gtk_entry_set_text(GTK_ENTRY(self->total_entry), txt); + g_free(txt); + + clabel = gtk_label_new("Collected:"); + gtk_misc_set_alignment(GTK_MISC(clabel), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(self->volsbox), clabel, FALSE, FALSE, 0); + + ctable = gtk_table_new((int)floor(manga->total_qty / COLUMNS), + COLUMNS, TRUE); + gtk_box_pack_start(GTK_BOX(self->volsbox), ctable, TRUE, TRUE, 0); + + rlabel = gtk_label_new("Read:"); + gtk_misc_set_alignment(GTK_MISC(rlabel), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(self->volsbox), rlabel, FALSE, FALSE, 0); + + rtable = gtk_table_new((int)floor(manga->total_qty / COLUMNS), + COLUMNS, TRUE); + gtk_box_pack_start(GTK_BOX(self->volsbox), rtable, TRUE, TRUE, 0); + + for (i = 0; i < manga->total_qty; i++) { + GtkWidget *cbtn, *rbtn; + + if (i > 0 && i % COLUMNS == 0) { + row++; + col = 0; + } + + txt = g_strdup_printf("%d", i + 1); + + cbtn = create_volume_button(txt, GTK_TABLE(ctable), col, row); + rbtn = create_volume_button(txt, GTK_TABLE(rtable), col, row); + + if (j < manga->vol_count && manga->volumes[j].number == i + 1) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbtn), TRUE); + + if (manga->volumes[j].read) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rbtn), + TRUE); + + j++; + } + + g_signal_connect(cbtn, "toggled", G_CALLBACK(on_volume_toggled), + (gpointer)self); + g_signal_connect(rbtn, "toggled", + G_CALLBACK(on_volume_read_toggled), + (gpointer)self); + + g_free(txt); + col++; + } +} + +static void +set_property(GObject *object, guint property_id, const GValue *value, + GParamSpec *pspec) +{ + EomDetailWindow *self = EOM_DETAIL_WINDOW(object); + gint manga_id = g_value_get_int(value); + + switch (property_id) { + case EOM_EDIT_PROP_CID: + set_manga_id(self, manga_id); + break; + default: + /* We don't have any other properties */ + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); + break; + } +} -- cgit v1.2.3-54-g00ecf