This commit is contained in:
Juan Ferrer Toribio 2014-10-09 18:35:23 +02:00
parent 6192dfb0db
commit eee4aacfaa
5 changed files with 111 additions and 72 deletions

View File

@ -33,6 +33,7 @@ struct _VnAllocator
gint current_shelf; gint current_shelf;
gint current_tray; gint current_tray;
gint column_width; gint column_width;
gint last_box_width;
gint tray_x; gint tray_x;
gint tray_y; gint tray_y;
}; };
@ -72,6 +73,7 @@ vn_allocator_add_column (VnAllocator * self, gint width)
self->tray_y = 0; self->tray_y = 0;
self->column_width = width; self->column_width = width;
self->last_box_width = width;
} }
void void
@ -83,13 +85,16 @@ vn_allocator_add_box (VnAllocator * self, Item * i, gint amount)
tray_height = self->top_tray_height; tray_height = self->top_tray_height;
if (self->tray_y + i->box_height > tray_height if (self->tray_y + i->box_height > tray_height
|| i->box_width > self->column_width) || i->box_width > self->last_box_width)
vn_allocator_add_column (self, i->box_width); vn_allocator_add_column (self, i->box_width);
if (self->box_func) if (self->box_func)
self->box_func (self, self->user_data, i, amount); self->box_func (self, self->user_data, i, amount);
self->tray_y += i->box_height; self->tray_y += i->box_height;
if (i->box_width < self->last_box_width)
self->last_box_width = i->box_width;
} }
gint gint
@ -102,10 +107,11 @@ vn_allocator_run (VnAllocator * self)
self->current_shelf = -1; self->current_shelf = -1;
self->current_tray = -1; self->current_tray = -1;
self->column_width = 0; self->column_width = 0;
self->last_box_width = 0;
self->tray_x = 0; self->tray_x = 0;
self->tray_y = 0; self->tray_y = 0;
for (i = &self->items[0]; i->name; i++) for (i = self->items; i->name; i++)
for (amount = 0; amount < i->amount; amount++) for (amount = 0; amount < i->amount; amount++)
{ {
if (amount == 0 if (amount == 0

View File

@ -22,24 +22,11 @@
G_DEFINE_TYPE (VnShelves, vn_shelves, VN_TYPE_FORM); G_DEFINE_TYPE (VnShelves, vn_shelves, VN_TYPE_FORM);
typedef struct
{
gint width;
gint height;
gint max_height;
gint tray_height;
gint first_tray_elevation;
gint tray_density;
gint vspace;
gint hspace;
}
Shelf;
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private //+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
#define LINE_WIDTH 10 #define LINE_WIDTH 10
#define PAGE_MARGIN 40 #define PAGE_MARGIN 40
#define HEADER_HEIGHT 60 #define HEADER_HEIGHT 80
#define TITLE_SIZE 40 #define TITLE_SIZE 40
#define BOX_TEXT_SIZE 35 #define BOX_TEXT_SIZE 35
#define BOX_MARGIN 6 #define BOX_MARGIN 6
@ -52,18 +39,6 @@ GdkRGBA colors[] = {
,{0.96, 0.96, 0.76, 1} // Yellow ,{0.96, 0.96, 0.76, 1} // Yellow
}; };
static
Shelf shelf = {
1250 // Width
,1700 // Height
,2100 // Max. height
,620 // Tray height
,150 // First tray elevation
,15 // Tray density
,25 // V. space
,25 // H. space
};
//-------------------------- Drawing methods //-------------------------- Drawing methods
void void
@ -72,9 +47,10 @@ vn_shelves_draw_box (VnAllocator * allocator, VnShelves * self, Item * i, gint a
if (i->box_width == 0 || i->box_height == 0) if (i->box_width == 0 || i->box_height == 0)
return; return;
VnShelf shelf = self->shelf;
cairo_t * cr = self->cr; cairo_t * cr = self->cr;
gint x = self->shelf_x + allocator->tray_x + shelf.hspace; gint x = self->shelf_x + allocator->tray_x + shelf.hspacing;
gint y = self->shelf_y - allocator->tray_y gint y = self->shelf_y - allocator->tray_y
- shelf.first_tray_elevation - shelf.tray_density - shelf.first_tray_elevation - shelf.tray_density
- allocator->current_tray * (shelf.tray_height + shelf.tray_density); - allocator->current_tray * (shelf.tray_height + shelf.tray_density);
@ -128,6 +104,7 @@ void
vn_shelves_draw_shelf (VnAllocator * allocator, VnShelves * self) vn_shelves_draw_shelf (VnAllocator * allocator, VnShelves * self)
{ {
gint y; gint y;
VnShelf shelf = self->shelf;
cairo_surface_t * surface = cairo_surface_create_similar ( cairo_surface_t * surface = cairo_surface_create_similar (
cairo_get_target (self->context_cr), cairo_get_target (self->context_cr),
@ -215,13 +192,30 @@ vn_shelves_draw_shelf (VnAllocator * allocator, VnShelves * self)
void void
vn_shelves_on_begin_print (GtkPrintOperation * op, GtkPrintContext * context, VnShelves * self) vn_shelves_on_begin_print (GtkPrintOperation * op, GtkPrintContext * context, VnShelves * self)
{ {
DbIterator * iter;
self->pages = NULL; self->pages = NULL;
self->context_cr = gtk_print_context_get_cairo_context (context); self->context_cr = gtk_print_context_get_cairo_context (context);
// XXX // XXX: Shelf dimensions
gint i; iter = $("iter-shelves");
DbIterator * iter = $("iter-items"); VnShelf shelf = {
db_iterator_get_int (iter, "width")
,db_iterator_get_int (iter, "height")
,db_iterator_get_int (iter, "max_height")
,db_iterator_get_int (iter, "tray_height")
,db_iterator_get_int (iter, "first_tray_elevation")
,db_iterator_get_int (iter, "tray_density")
,db_iterator_get_int (iter, "vspacing")
,db_iterator_get_int (iter, "hspacing")
};
self->shelf = shelf;
// XXX: Items list
Item * i;
iter = $("iter-items");
gint nitems = db_iterator_get_nrows (iter); gint nitems = db_iterator_get_nrows (iter);
Item * items = g_new (Item, nitems + 1); Item * items = g_new (Item, nitems + 1);
@ -229,18 +223,15 @@ vn_shelves_on_begin_print (GtkPrintOperation * op, GtkPrintContext * context, Vn
db_iterator_move_iter (iter, NULL); db_iterator_move_iter (iter, NULL);
for (i = 0; db_iterator_move_next (iter); i++) for (i = items; db_iterator_move_next (iter); i++)
{ {
const gchar * name = gvn_value_get_string (db_iterator_get_value (iter, "Article")); i->name = g_strdup_printf ("%s x%d"
gint size = gvn_value_get_int (db_iterator_get_value (iter, "Medida")); ,db_iterator_get_string (iter, "Article")
gint width = gvn_value_get_double (db_iterator_get_value (iter, "x")); ,db_iterator_get_int (iter, "Medida")
gint height = gvn_value_get_double (db_iterator_get_value (iter, "z")); );
gint amount = gvn_value_get_double (db_iterator_get_value (iter, "etiquetas")); i->box_width = db_iterator_get_double (iter, "x") * 10;
i->box_height = db_iterator_get_double (iter, "z") * 10;
items[i].name = g_strdup_printf ("%s x%d", name, size); i->amount = db_iterator_get_double (iter, "etiquetas");
items[i].box_width = width * 10;
items[i].box_height = height * 10;
items[i].amount = amount;
} }
// Initializing // Initializing
@ -283,19 +274,19 @@ vn_shelves_on_begin_print (GtkPrintOperation * op, GtkPrintContext * context, Vn
(gdouble) (shelf.height - shelf.first_tray_elevation) / (gdouble) (shelf.height - shelf.first_tray_elevation) /
(shelf.tray_height + shelf.tray_density) (shelf.tray_height + shelf.tray_density)
); );
alloc.tray_width = shelf.width - shelf.hspace * 2; alloc.tray_width = shelf.width - shelf.hspacing * 2;
alloc.tray_height = shelf.tray_height - shelf.vspace; alloc.tray_height = shelf.tray_height - shelf.vspacing;
alloc.top_tray_height = shelf.max_height - shelf.vspace alloc.top_tray_height = shelf.max_height - shelf.vspacing
- shelf.first_tray_elevation - (alloc.ntrays - 1) * shelf.tray_height; - shelf.first_tray_elevation - (alloc.ntrays - 1) * shelf.tray_height;
gint npages = vn_allocator_run (&alloc); gint npages = vn_allocator_run (&alloc);
gtk_print_operation_set_n_pages (op, npages); gtk_print_operation_set_n_pages (op, npages);
// XXX // XXX: Freeing items list
for (i = 0; i < nitems; i++) for (i = items; i->name; i++)
g_free (items[i].name); g_free (i->name);
g_free (items); g_free (items);
} }
@ -317,6 +308,20 @@ vn_shelves_on_draw_page (GtkPrintOperation * op, GtkPrintContext * context, gint
cairo_paint (cr); cairo_paint (cr);
} }
void
vn_shelves_show_message (VnShelves * self, const gchar * message)
{
GtkWindow * parent = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)));
GtkWidget * dialog = gtk_message_dialog_new (parent
,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT
,GTK_MESSAGE_INFO
,GTK_BUTTONS_CLOSE
,message
);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (GTK_WIDGET (dialog));
}
void void
vn_shelves_on_items_changed (DbModel * model, DbModelStatus status, VnShelves * self) vn_shelves_on_items_changed (DbModel * model, DbModelStatus status, VnShelves * self)
{ {
@ -326,17 +331,9 @@ vn_shelves_on_items_changed (DbModel * model, DbModelStatus status, VnShelves *
if (status != DB_MODEL_STATUS_READY || self->action == -1) if (status != DB_MODEL_STATUS_READY || self->action == -1)
return; return;
GtkWindow * parent = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)));
if (db_model_get_nrows (model) == 0) if (db_model_get_nrows (model) == 0)
{ {
GtkWidget * dialog = gtk_message_dialog_new (parent vn_shelves_show_message (self, _("There are no items to allocate"));
,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT
,GTK_MESSAGE_INFO
,GTK_BUTTONS_OK
,_("There are no items to allocate")
);
gtk_dialog_run (GTK_DIALOG (dialog));
return; return;
} }
@ -345,7 +342,7 @@ vn_shelves_on_items_changed (DbModel * model, DbModelStatus status, VnShelves *
if (self->print_settings) if (self->print_settings)
gtk_print_operation_set_print_settings (op, self->print_settings); gtk_print_operation_set_print_settings (op, self->print_settings);
gtk_print_operation_set_job_name (op, _("Selves")); gtk_print_operation_set_job_name (op, _("Shelves"));
gtk_print_operation_set_embed_page_setup (op, TRUE); gtk_print_operation_set_embed_page_setup (op, TRUE);
g_object_connect (op g_object_connect (op
,"signal::begin-print", vn_shelves_on_begin_print, self ,"signal::begin-print", vn_shelves_on_begin_print, self
@ -355,6 +352,7 @@ vn_shelves_on_items_changed (DbModel * model, DbModelStatus status, VnShelves *
); );
GError * err = NULL; GError * err = NULL;
GtkWindow * parent = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)));
GtkPrintOperationResult result = GtkPrintOperationResult result =
gtk_print_operation_run (op, self->action, parent, &err); gtk_print_operation_run (op, self->action, parent, &err);
@ -365,7 +363,7 @@ vn_shelves_on_items_changed (DbModel * model, DbModelStatus status, VnShelves *
} }
else if (result == GTK_PRINT_OPERATION_RESULT_ERROR && err) else if (result == GTK_PRINT_OPERATION_RESULT_ERROR && err)
{ {
g_warning (err->message); vn_shelves_show_message (self, err->message);
g_error_free (err); g_error_free (err);
} }
} }
@ -386,16 +384,34 @@ vn_shelves_print_clicked (GtkButton * button, VnShelves * self)
//-------------------------- Form //-------------------------- Form
void
vn_shelves_on_edit_clicked (GtkButton * button, VnShelves * self)
{
GtkWidget * dialog = $("shelves-dialog");
gtk_window_set_transient_for (GTK_WINDOW (dialog),
GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))));
gtk_widget_show_all (dialog);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_hide (dialog);
}
void
vn_shelves_on_close_clicked (GtkButton * button, VnShelves * self)
{
gtk_dialog_response ($("shelves-dialog"), 1);
}
static void static void
vn_shelves_open (VnShelves * self, gpointer user_data) vn_shelves_open (VnShelves * self, gpointer user_data)
{ {
// XXX: Developer: Default field values // XXX: Default field values
self->action = -1; self->action = -1;
gvn_param_set_string ($("title"), "Anthuriums"); gvn_param_set_string ($("title"), "Anthuriums");
gvn_param_set_string ($("filter"), "a.Article LIKE \\'Ant %\\'"); gvn_param_set_string ($("filter"), "a.Article LIKE \\'Ant %\\'");
gvn_param_set_int ($("wh"), 1); gvn_param_set_int ($("wh"), 1);
gvn_param_set_int ($("shelf"), 1);
GValue date = G_VALUE_INIT; GValue date = G_VALUE_INIT;
g_value_init (&date, G_TYPE_DATE_TIME); g_value_init (&date, G_TYPE_DATE_TIME);

View File

@ -26,12 +26,26 @@
typedef struct _VnShelves VnShelves; typedef struct _VnShelves VnShelves;
typedef struct _VnShelvesClass VnShelvesClass; typedef struct _VnShelvesClass VnShelvesClass;
typedef struct _VnShelf VnShelf;
struct _VnShelf
{
gint width;
gint height;
gint max_height;
gint tray_height;
gint first_tray_elevation;
gint tray_density;
gint vspacing;
gint hspacing;
};
struct _VnShelves struct _VnShelves
{ {
VnForm parent; VnForm parent;
GtkPrintSettings * print_settings; GtkPrintSettings * print_settings;
GtkPrintOperationAction action; GtkPrintOperationAction action;
VnShelf shelf;
// Cairo // Cairo

View File

@ -270,6 +270,11 @@ static void vn_combo_init (VnCombo * self)
gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->combo)); gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->combo));
self->cell = gtk_cell_renderer_text_new (); self->cell = gtk_cell_renderer_text_new ();
g_object_set (self->cell
,"ellipsize", PANGO_ELLIPSIZE_END
,"width", 0
,NULL
);
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self->combo), self->cell, TRUE); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self->combo), self->cell, TRUE);
VN_FIELD_GET_CLASS (self)->set_widget (VN_FIELD (self), VN_FIELD_GET_CLASS (self)->set_widget (VN_FIELD (self),

View File

@ -189,7 +189,7 @@ static void vn_login_set_loading (VnLogin * self, gboolean loading)
gtk_widget_show_all (spinner); gtk_widget_show_all (spinner);
} }
else else
gtk_button_set_label (self->connect, "gtk-connect"); gtk_button_set_label (self->connect, "Connect");
gtk_widget_set_sensitive (GTK_WIDGET (self->connect), !loading); gtk_widget_set_sensitive (GTK_WIDGET (self->connect), !loading);
} }
@ -252,7 +252,7 @@ void vn_login_on_server_changed (DbIterator * iterator, VnLogin * self)
if (db_iterator_get_row (self->login_data) != -1) if (db_iterator_get_row (self->login_data) != -1)
{ {
const gchar * pass = gvn_value_get_string (db_iterator_get_value (self->login_data, "password")); const gchar * pass = db_iterator_get_string (self->login_data, "password");
gvn_param_set_value (self->user, db_iterator_get_value (self->login_data, "user")); gvn_param_set_value (self->user, db_iterator_get_value (self->login_data, "user"));
@ -367,11 +367,9 @@ static gboolean vn_login_done (ConnectData * connect_data)
if (gvn_param_get_boolean (self->remember)) if (gvn_param_get_boolean (self->remember))
{ {
GValue encoded = G_VALUE_INIT; gchar * encoded = gvn_encode (gvn_param_get_string (self->pass));
g_value_init (&encoded, G_TYPE_STRING); db_iterator_set_string (self->login_data, "password", encoded);
g_value_take_string (&encoded, gvn_encode (gvn_param_get_string (self->pass))); g_free (encoded);
db_iterator_set_value (self->login_data, "password", &encoded, NULL);
g_value_unset (&encoded);
} }
db_iterator_perform_operations (self->last_conn); db_iterator_perform_operations (self->last_conn);
@ -430,10 +428,10 @@ static void vn_login_thread (ConnectData * connect_data)
// FIXME: Thread unsafe functions // FIXME: Thread unsafe functions
const gchar * user = gvn_param_get_string (self->user); const gchar * user = gvn_param_get_string (self->user);
const gchar * pass = gvn_param_get_string (self->pass); const gchar * pass = gvn_param_get_string (self->pass);
const gchar * plugin = gvn_value_get_string (db_iterator_get_value (self->login_data, "plugin")); const gchar * plugin = db_iterator_get_string (self->login_data, "plugin");
const gchar * host = gvn_value_get_string (db_iterator_get_value (self->login_data, "host")); const gchar * host = db_iterator_get_string (self->login_data, "host");
const gchar * schema = gvn_value_get_string (db_iterator_get_value (self->login_data, "schema")); const gchar * schema = db_iterator_get_string (self->login_data, "schema");
const gchar * ssl_ca = gvn_value_get_string (db_iterator_get_value (self->login_data, "ssl_ca")); const gchar * ssl_ca = db_iterator_get_string (self->login_data, "ssl_ca");
if (IS_DEFINED (plugin) && IS_DEFINED (schema)) if (IS_DEFINED (plugin) && IS_DEFINED (schema))
{ {