Prepared statements were already being used, but wrong. Instead of
creating a string with the right information the SQL should contain
parameters which should be bound by other functions.
When creating a new manga with a name containing a quote (') it would
fail. No message was shown to indicate it had failed and the manga was
not added.
This was caused by not quoting the quote in the SQL. All SQL queries
should use prepared statements in order to make no mistakes quoting
quotes and other things.
* src/data.c (data_delete_manga): New function, deletes a manga and
its associated volumes.
(data_update_manga): Extra free.
* src/eom-detail-window.c (add_menu): Add a "Delete" button to the
menu.
(on_delete): New function. Shows a confirmation dialog and if the
user pressed "Ok" tries to delete the manga and close the window.
* src/eom-main-window.c (on_row_activated): Connect to the `hide'
signal instead of the `delete-event' signal. I couldn't find how te
emit my own `delete-event' signal, then I found that hide works both
when I close a window and when the window manager does it.
* src/data.c (data_update_manga): When updating, set `current_qty' to
the lesser of `current_qty' and `total_qty' so that current will
never exceed total. If the update went well remove any volumes that
have numbers greater than the `total_qty'.
* src/eom-detail-window.c (eom_detail_window_load): Get to upper bound
of rows, if I need 1.5 rows I actually need 2 rows, what was I
thinking? Clear both tables of children before filling them up
again.
(cb_destroy): New function. Just calls destroy in `widget', but
`gtk_widget_destroy' doesn't seem like a valid `GtkCallback'.
(on_volume_toggled): When adding a volume fails, revert one from
`current_qty'. Don't mess with `self->manga->current_qty', just
reset the manga id, otherwise we will know that there should be one
more or less volume, but won't show it in the manga's volumes
collection.
* src/eom-detail-window.c (eom_detail_window_load): If the currently
selected manga's `total_qty' is `0', take, for viewing/editing
purposes, the manga's `current_qty' + `1' instead.
(on_volume_toggled): If the current manga's `total_qty' is `0'
reload the screen after toggling a manga as collected.
* src/data.c (data_get_unread_manga): New function. Gets any manga
that have unread volumes.
(data_get_volumes_for_manga): Default `volumes' to `NULL' to make
sure we don't get garbage by mistake.
* src/eom-main-window.c: Add new enum. The filter states
that the main screen has.
(eom_main_window_load): Get a list of unread manga if the window's
state indecates we're looking for them.
(add_menu): Add read filter button, shows only unread manga.
These should make it easier to work with numbers.
* src/eom-new-item-dialog.c (change): New function. Callback for the
`+' and `-' buttons, either adds or subtracts one from the quantity
field.
(eom_new_item_dialog_init): Add `+' and `-' buttons after quantity
entry.
The title and total numbers can now be changed.
* src/data.c (data_add_manga): Change `name' to `const gchar*', we're
not changing it.
(data_update_manga): New function, updates a manga's information.
* src/eom-detail-window.c (eom_detail_window_load): New function,
prepares the tables to show the right data.
(add_menu): New function, adds a menu to the window.
(eom_detail_window_init): Call `add_menu' and prepare the other
widgets for showing.
(on_edit): New function, opens an edit dialog and reloads the screen
afterwards.
(set_manga_id): Move data filling to `eom_detail_window_load' and
widget preparation to `eom_detail_window_init' and call
`eom_detail_window_load'.
* src/eom-detail-window.h (EomDetailWindow): Add `ctable' and `rtable'
members, these are the tables that show the data.
* src/eom-main-window.c (on_new): No need to save and copy the name of
a manga, just destroy the widget later and destroy it always.
* src/eom-new-item-dialog.c (eom_new_item_dialog_class_init): Add
write-only `manga-id' property.
(EOM_NEW_PROP_MID): New enum.
(finalize): New function. Free the associated manga.
(get_property): New function. Get a property, has no properties to
get for now.
(set_manga_id): New function. Show a manga's information in the
entries.
(set_property): New function. Set a property. Calls `set_manga_id'
for the `manga-id' property.
* src/eom-new-item-dialog.h (EomNewItemDialog): Add a `Manga' as
member.
Makes it look ugly.
* src/eom-detail-window.c (on_volume_toggled): Remove unused variable
`txt'.
(set_manga_id): Remove unused variable `bbox'. Change the `expand'
and `fill' arguments to `gtk_box_pack_start' to `FALSE' for both
tables.
First collected volumes, then read volumes.
* src/eom-edit-window.c (COLUMNS): New constant, the number of columns
to show in the table.
(create_volume_button): New function. Creates a button that
represent the state of a volume.
(eom_edit_window_init): Don't make the box with volumes force all
widgets to be the same size.
(set_manga_id): Show labels above each group of volumes, this way
nobody has to guess on what they mean.
* src/eom-main-window.c (eom_main_window_new): Set the `state'
variable to 0 the first time around.
(eom_main_window_load): Remove the `manga' parameter. Get
incomplete collections when `state' is `0'.
(eom_main_window_on_filter): Don't fetch any manga, just set the
window's `state'.
(eom_main_window_on_new):
(eom_main_window_on_edit_closed): No more `manga' parameter for
`eom_main_window_load'.
* src/eom-main-window.h (struct _EomMainWindow): Add `state' property.
* src/interface.c (interface_show_main_window): No more `manga'
parameter for `eom_main_window_load'.
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.