yacos/client/src/cart_item.c

266 lines
8.0 KiB
C
Raw Normal View History

2019-07-20 23:50:50 +02:00
#include "cart_item.h"
2019-07-24 20:22:10 +02:00
#include <json-glib/json-glib.h>
typedef struct _YacosCartItemPriv {
2019-07-26 21:09:10 +02:00
GtkWidget *box;
2019-07-24 20:22:10 +02:00
GtkWidget *label_title;
GtkWidget *label_description;
2019-07-26 21:42:18 +02:00
GtkWidget *entry_comment;
2019-07-24 20:22:10 +02:00
GtkWidget *label_id;
GtkWidget *button_delete;
GtkWidget *image;
GtkStack *stack_image_loader;
yacos_tag_id tag_id;
2019-07-26 20:47:54 +02:00
yacos_cart_item_status status;
2019-07-24 20:22:10 +02:00
struct api {
gchar *url_base;
2019-07-24 21:35:40 +02:00
gchar *token;
2019-07-24 20:22:10 +02:00
SoupSession *soup_session_meta;
} api;
} YacosCartItemPriv;
struct _YacosCartItem {
/* Inheritance */
GtkListBoxRow parent;
/* Custom Elements */
YacosCartItemPriv priv;
};
2019-07-20 23:50:50 +02:00
G_DEFINE_TYPE(YacosCartItem, yacos_cart_item, GTK_TYPE_LIST_BOX_ROW)
static void yacos_cart_item_dispose(GObject *obj)
{
/* destroy parent container. This destroys all widgets inside */
G_OBJECT_CLASS(yacos_cart_item_parent_class)->dispose(obj);
}
static void yacos_cart_item_constructed(GObject *obj)
{
G_OBJECT_CLASS(yacos_cart_item_parent_class)->constructed(obj);
}
2019-07-24 20:22:10 +02:00
static void yacos_cart_item_finalize(GObject *gobject)
{
YacosCartItem *self = yacos_cart_item_get_instance_private(YACOS_CART_ITEM(gobject));
g_free(self->priv.api.url_base);
2019-07-24 21:35:40 +02:00
g_free(self->priv.api.token);
2019-07-24 20:22:10 +02:00
G_OBJECT_CLASS(yacos_cart_item_parent_class)->constructed(gobject);
}
2019-07-20 23:50:50 +02:00
static void yacos_cart_item_class_init(YacosCartItemClass *klass)
{
GObjectClass *oclass = G_OBJECT_CLASS(klass);
oclass->dispose = yacos_cart_item_dispose;
oclass->constructed = yacos_cart_item_constructed;
2019-07-24 20:22:10 +02:00
oclass->finalize = yacos_cart_item_finalize;
2019-07-20 23:50:50 +02:00
}
2019-07-26 21:42:18 +02:00
static void yacos_cart_item_button_delete_cb(GtkWidget *widget, gpointer user_data)
2019-07-26 21:09:10 +02:00
{
YacosCartItem *self = (YacosCartItem *)user_data;
GtkWidget *list_box_row = gtk_widget_get_parent(self->priv.box);
gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(list_box_row)), list_box_row);
}
2019-07-20 23:50:50 +02:00
static void yacos_cart_item_init(YacosCartItem *self)
{
GtkBuilder *builder;
2019-07-26 21:09:10 +02:00
2019-07-20 23:50:50 +02:00
builder = gtk_builder_new_from_resource("/net/notsyncing/yacos/glade/cartItem.glade");
2019-07-26 21:09:10 +02:00
self->priv.box = GTK_WIDGET(gtk_builder_get_object(builder, "cart_item"));
2019-07-20 23:50:50 +02:00
2019-07-24 20:22:10 +02:00
self->priv.label_id = GTK_WIDGET(gtk_builder_get_object(builder, "label_id"));
self->priv.label_title = GTK_WIDGET(gtk_builder_get_object(builder, "label_title"));
2019-07-26 21:42:18 +02:00
self->priv.entry_comment = GTK_WIDGET(gtk_builder_get_object(builder, "entry_comment"));
2019-07-24 20:22:10 +02:00
self->priv.label_description = GTK_WIDGET(gtk_builder_get_object(builder, "label_description"));
self->priv.button_delete = GTK_WIDGET(gtk_builder_get_object(builder, "button_delete"));
self->priv.image = GTK_WIDGET(gtk_builder_get_object(builder, "image_item"));
self->priv.stack_image_loader = GTK_STACK(gtk_builder_get_object(builder, "stack_image_loader"));
self->priv.api.url_base = g_strdup("http://localhost:8080/api.php");
2019-07-24 21:35:40 +02:00
self->priv.api.token = g_strdup("123456");
2019-07-24 20:22:10 +02:00
self->priv.api.soup_session_meta = soup_session_new();
2019-07-26 21:09:10 +02:00
g_signal_connect(self->priv.button_delete,
"clicked",
2019-07-26 21:42:18 +02:00
(GCallback) yacos_cart_item_button_delete_cb,
self);
2019-07-26 21:09:10 +02:00
gtk_container_add(GTK_CONTAINER(self), self->priv.box);
2019-07-20 23:50:50 +02:00
g_object_unref(builder);
2019-07-26 21:42:18 +02:00
GtkStyleContext *context;
GtkCssProvider *provider;
context = gtk_widget_get_style_context (self->priv.entry_comment);
provider = gtk_css_provider_new ();
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider),
".entry_comment {\n"
" font-style: italic;\n"
"}\n", -1, NULL);
gtk_style_context_add_provider (context,
GTK_STYLE_PROVIDER (provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
g_object_unref (provider);
2019-07-20 23:50:50 +02:00
}
GtkWidget *yacos_cart_item_new(void)
{
return GTK_WIDGET(g_object_new(TYPE_YACOS_CART_ITEM, NULL));
}
2019-07-24 20:22:10 +02:00
void yacos_cart_item_set_id(YacosCartItem *self, yacos_tag_id tag_id)
{
gchar *id_str;
2019-07-24 21:19:26 +02:00
gchar *id_str2;
2019-07-24 20:22:10 +02:00
2019-07-26 20:47:54 +02:00
self->priv.status = YACOS_CART_ITEM_STATUS_PENDING;
2019-07-24 20:22:10 +02:00
self->priv.tag_id = tag_id;
id_str = yacos_tag_id_to_str(tag_id);
2019-07-24 21:19:26 +02:00
id_str2 = g_strdup_printf("#%s", id_str);
2019-07-24 20:22:10 +02:00
g_free(id_str);
2019-07-24 21:19:26 +02:00
gtk_label_set_text(GTK_LABEL(self->priv.label_id), id_str2);
g_free(id_str2);
2019-07-24 20:22:10 +02:00
}
static void yacos_cart_item_fetch_meta_cb (SoupSession *session, SoupMessage *msg, gpointer user_data)
{
YacosCartItem *self = YACOS_CART_ITEM(user_data);
const char *temp;
JsonParser *parser;
JsonReader *reader;
2019-07-26 20:47:54 +02:00
const static GdkRGBA color_error = {.red = 1.0, .green = 0.0, .blue = 0.0, .alpha = 1.0};
2019-07-24 20:22:10 +02:00
if (msg->status_code != 200) {
2019-07-26 20:47:54 +02:00
g_warning("Received error code %d from server.", msg->status_code);
gtk_label_set_text(GTK_LABEL(self->priv.label_title), "Unknown article");
gtk_widget_override_color(self->priv.label_title, GTK_STATE_FLAG_NORMAL, &color_error);
gtk_label_set_text(GTK_LABEL(self->priv.label_description), "This article will be ignored on checkout.");
2019-07-26 21:42:18 +02:00
gtk_entry_set_text(GTK_ENTRY(self->priv.entry_comment), "If you think this is an error, please contact a member of staff.");
2019-07-26 20:47:54 +02:00
self->priv.status = YACOS_CART_ITEM_STATUS_INVALID;
2019-07-24 20:22:10 +02:00
return;
}
parser = json_parser_new ();
json_parser_load_from_data (parser,
msg->response_body->data,
msg->response_body->length,
NULL);
reader = json_reader_new (json_parser_get_root (parser));
json_reader_read_member (reader, "title");
temp = json_reader_get_string_value (reader);
gtk_label_set_text(GTK_LABEL(self->priv.label_title), temp);
json_reader_end_member (reader);
json_reader_read_member (reader, "description");
temp = json_reader_get_string_value (reader);
gtk_label_set_text(GTK_LABEL(self->priv.label_description), temp);
json_reader_end_member (reader);
json_reader_read_member (reader, "comment");
temp = json_reader_get_string_value (reader);
2019-07-26 21:42:18 +02:00
gtk_entry_set_text(GTK_ENTRY(self->priv.entry_comment), temp);
2019-07-24 20:22:10 +02:00
json_reader_end_member (reader);
g_object_unref (reader);
g_object_unref (parser);
2019-07-26 20:47:54 +02:00
2019-07-26 21:42:18 +02:00
gtk_editable_set_editable(GTK_EDITABLE(self->priv.entry_comment), TRUE);
2019-07-26 20:47:54 +02:00
self->priv.status = YACOS_CART_ITEM_STATUS_VALID;
2019-07-24 20:22:10 +02:00
}
void yacos_cart_item_fetch_meta(YacosCartItem *self)
{
SoupMessage *msg;
gchar *url;
gchar *id_str;
2019-07-24 21:19:26 +02:00
gtk_label_set_text(GTK_LABEL(self->priv.label_title), "Loading ...");
gtk_label_set_text(GTK_LABEL(self->priv.label_description), "");
2019-07-26 21:46:23 +02:00
gtk_entry_set_text(GTK_ENTRY(self->priv.entry_comment), " ");
2019-07-24 21:19:26 +02:00
2019-07-24 20:22:10 +02:00
id_str = yacos_tag_id_to_str(self->priv.tag_id);
url = g_strdup_printf("%s?meta&id=%s", self->priv.api.url_base, id_str);
msg = soup_message_new("GET", url);
2019-07-24 21:35:40 +02:00
soup_message_headers_append (msg->request_headers, "x-token", self->priv.api.token);
2019-07-24 20:22:10 +02:00
g_free(url);
g_free(id_str);
soup_session_queue_message(self->priv.api.soup_session_meta,
msg,
yacos_cart_item_fetch_meta_cb,
self);
2019-07-24 21:43:39 +02:00
// TODO: The soup 's probably memory-leaking all over the place. Check this some time..
2019-07-24 20:22:10 +02:00
}
2019-07-24 21:19:26 +02:00
2019-07-26 20:38:33 +02:00
static void yacos_cart_item_fetch_image_cb (SoupSession *session, SoupMessage *msg, gpointer user_data)
{
YacosCartItem *self = YACOS_CART_ITEM(user_data);
GdkPixbuf *pixbuf_raw, *pixbuf_scaled;
GMemoryInputStream *s;
if (msg->status_code != 200) {
g_warning("image: Received error code %d from server.", msg->status_code);
} else {
s = G_MEMORY_INPUT_STREAM(g_memory_input_stream_new());
g_memory_input_stream_add_data(s, msg->response_body->data, msg->response_body->length, NULL);
pixbuf_raw = gdk_pixbuf_new_from_stream(G_INPUT_STREAM(s), NULL, NULL);
g_object_unref(s);
pixbuf_scaled = gdk_pixbuf_scale_simple(pixbuf_raw, 100, 100, GDK_INTERP_BILINEAR);
g_object_unref(pixbuf_raw);
gtk_image_set_from_pixbuf(GTK_IMAGE(self->priv.image), pixbuf_scaled);
g_object_unref(pixbuf_scaled);
}
gtk_stack_set_visible_child(self->priv.stack_image_loader, self->priv.image);
}
2019-07-24 21:19:26 +02:00
void yacos_cart_item_fetch_image(YacosCartItem *self)
{
2019-07-26 20:38:33 +02:00
SoupMessage *msg;
gchar *url;
gchar *id_str;
id_str = yacos_tag_id_to_str(self->priv.tag_id);
url = g_strdup_printf("%s?image&id=%s", self->priv.api.url_base, id_str);
g_free(id_str);
msg = soup_message_new("GET", url);
soup_message_headers_append (msg->request_headers, "x-token", self->priv.api.token);
g_free(url);
soup_session_queue_message(self->priv.api.soup_session_meta,
msg,
yacos_cart_item_fetch_image_cb,
self);
/* TODO: More memory leaks? */
2019-07-24 21:19:26 +02:00
}
yacos_tag_id yacos_cart_item_get_id(YacosCartItem *self)
{
return self->priv.tag_id;
}