From eef0e9e699ddfb2890837f44b26fddc4d62eb89a Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Wed, 29 Aug 2012 09:12:42 +0200 Subject: Deactivate 'Show profiles' if 'table print' is checked. This bug was reported by Henrik Brautaset Aronsen, it was happening when: """you select table print, perform the print and then open the print dialogue again""". In such case the 'Show profiles' button was activated while the 'Print table' type was selected. Signed-off-by: Pierre-Yves Chibon --- print.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/print.c b/print.c index 5a1a784b2..1a590bca3 100644 --- a/print.c +++ b/print.c @@ -490,6 +490,9 @@ static GtkWidget *print_dialog(GtkPrintOperation *operation, gpointer user_data) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), print_options.print_profiles); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 2); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(print_profiles_toggle), NULL); + if (print_options.type == TABLE) + // type == table - disable the profile option + gtk_widget_set_sensitive(button, FALSE); g_signal_connect(radio1, "toggled", G_CALLBACK(set_pretty), button); g_signal_connect(radio2, "toggled", G_CALLBACK(set_table), button); -- cgit v1.2.3-70-g09d2 From c4eeda1ef70651c3759afd3c0a9bbc38694248c5 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Wed, 29 Aug 2012 10:30:14 +0200 Subject: Invert the print 'dive profile' option. With this change, instead of asking to print the dive profile, you ask to not print them. So the checkbox in the print options changes from 'Show profiles' to 'No dive profiles'. Signed-off-by: Pierre-Yves Chibon --- display.h | 2 +- print.c | 32 +++++++++++++++++--------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/display.h b/display.h index 4e1511656..11895e6e1 100644 --- a/display.h +++ b/display.h @@ -28,7 +28,7 @@ extern void attach_tooltip(int x, int y, int w, int h, const char *text); struct options { enum { PRETTY, TABLE } type; - gboolean print_profiles; + gboolean print_no_profiles; }; extern char zoomed_plot; diff --git a/print.c b/print.c index 1a590bca3..8fbe62b3d 100644 --- a/print.c +++ b/print.c @@ -19,7 +19,7 @@ static void name(GtkWidget *w, gpointer data) \ option = GTK_TOGGLE_BUTTON(w)->active; \ } -PRETTYOPTIONCALLBACK(print_profiles_toggle, print_options.print_profiles) +PRETTYOPTIONCALLBACK(print_profiles_toggle, print_options.print_no_profiles) static void set_font(PangoLayout *layout, PangoFontDescription *font, @@ -139,7 +139,7 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w, } static void show_table_header(cairo_t *cr, double w, double h, - PangoFontDescription *font) + PangoFontDescription *font) { int len, width, height, maxwidth, maxheight; PangoLayout *layout; @@ -154,7 +154,7 @@ static void show_table_header(cairo_t *cr, double w, double h, len = snprintf(buffer, sizeof(buffer), "Dive# - Date - Depth - Time - Master" - " Buddy -- Location"); + " Buddy -- Location"); set_font(layout, font, FONT_LARGE, PANGO_ALIGN_LEFT); pango_layout_set_text(layout, buffer, len); @@ -301,7 +301,7 @@ static void print_pretty_table(int divenr, cairo_t *cr, double x, double y, static void print_table_header(cairo_t *cr, double x, double y, double w, double h, PangoFontDescription *font) { - cairo_save(cr); + cairo_save(cr); cairo_translate(cr, x, y); /* Plus 5% on all sides */ @@ -409,7 +409,7 @@ static void draw_table(GtkPrintOperation *operation, h = gtk_print_context_get_height(context)/(n_dive_per_page+1); nr = page_nr*n_dive_per_page; - print_table_header(cr, 0, 0+h, w, h, font); + print_table_header(cr, 0, 0+h, w, h, font); int i; for (i = 0; i < n_dive_per_page; i++) { print_table(nr+i, cr, 0, h*1.5+h*i, w, h, font); @@ -422,10 +422,10 @@ static void begin_print(GtkPrintOperation *operation, gpointer user_data) { int dives_per_page = 1; if (print_options.type == PRETTY) { - if (print_options.print_profiles){ - dives_per_page = 6; - } else { + if (print_options.print_no_profiles){ dives_per_page = 15; + } else { + dives_per_page = 6; } } else { dives_per_page = 25; @@ -486,11 +486,13 @@ static GtkWidget *print_dialog(GtkPrintOperation *operation, gpointer user_data) box = gtk_hbox_new(FALSE, 3); gtk_container_add(GTK_CONTAINER(frame), box); - button = gtk_check_button_new_with_label("Show profiles"); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), print_options.print_profiles); + button = gtk_check_button_new_with_label("No dive profiles"); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), + print_options.print_no_profiles); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 2); - g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(print_profiles_toggle), NULL); - if (print_options.type == TABLE) + g_signal_connect(G_OBJECT(button), "toggled", + G_CALLBACK(print_profiles_toggle), NULL); + if (print_options.type == TABLE) // type == table - disable the profile option gtk_widget_set_sensitive(button, FALSE); @@ -504,12 +506,12 @@ static GtkWidget *print_dialog(GtkPrintOperation *operation, gpointer user_data) static void print_dialog_apply(GtkPrintOperation *operation, GtkWidget *widget, gpointer user_data) { if (print_options.type == PRETTY) { - if (print_options.print_profiles){ + if (print_options.print_no_profiles == TRUE){ g_signal_connect(operation, "draw_page", - G_CALLBACK(draw_page), NULL); + G_CALLBACK(draw_pretty_table), NULL); } else { g_signal_connect(operation, "draw_page", - G_CALLBACK(draw_pretty_table), NULL); + G_CALLBACK(draw_page), NULL); } } else { g_signal_connect(operation, "draw_page", -- cgit v1.2.3-70-g09d2 From 823f266eea9479e909d09c2fccb9fba00b95718e Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Wed, 29 Aug 2012 18:02:47 +0200 Subject: Have a nice table formating with choosing the 'Table print' option. With this commit we finally have a nice table output when we want to print the list of dives with minimal information. Signed-off-by: Pierre-Yves Chibon --- print.c | 133 ++++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 46 deletions(-) diff --git a/print.c b/print.c index 8fbe62b3d..2c9c441fb 100644 --- a/print.c +++ b/print.c @@ -141,27 +141,40 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w, static void show_table_header(cairo_t *cr, double w, double h, PangoFontDescription *font) { - int len, width, height, maxwidth, maxheight; + int maxwidth, maxheight, colwidth, i, curwidth; PangoLayout *layout; - char buffer[160]; + char headers[7][80]= { "Dive#", "Date", "Depth", "Time", "Master", + "Buddy", "Location" }; maxwidth = w * PANGO_SCALE; maxheight = h * PANGO_SCALE * 0.9; + colwidth = maxwidth / 7; layout = pango_cairo_create_layout(cr); - pango_layout_set_width(layout, maxwidth); + + cairo_move_to(cr, 0, 0); pango_layout_set_height(layout, maxheight); + set_font(layout, font, FONT_LARGE, PANGO_ALIGN_LEFT); - len = snprintf(buffer, sizeof(buffer), - "Dive# - Date - Depth - Time - Master" - " Buddy -- Location"); - set_font(layout, font, FONT_LARGE, PANGO_ALIGN_LEFT); - pango_layout_set_text(layout, buffer, len); - pango_layout_get_size(layout, &width, &height); + curwidth = 0; + for (i = 0; i < 7; i++) { + cairo_move_to(cr, curwidth / PANGO_SCALE, 0); + if (i == 0 || i == 2 || i == 3 ){ + // Column 0, 2 and 3 (Dive #, Depth and Time) get 1/2 width + pango_layout_set_width(layout, colwidth/ (double) 2); + curwidth = curwidth + (colwidth / 2); + } else { + pango_layout_set_width(layout, colwidth); + curwidth = curwidth + colwidth; + } + pango_layout_set_text(layout, headers[i], -1); + pango_layout_set_justify(layout, 1); + pango_cairo_show_layout(cr, layout); + } - //cairo_move_to(cr, 0, 0); - pango_cairo_show_layout(cr, layout); + cairo_move_to(cr, 0, 0); + g_object_unref(layout); } static void show_dive_table(struct dive *dive, cairo_t *cr, double w, @@ -169,7 +182,7 @@ static void show_dive_table(struct dive *dive, cairo_t *cr, double w, { double depth; const char *unit; - int len, decimals, width, height, maxwidth, maxheight; + int len, decimals, maxwidth, maxheight, colwidth, curwidth; PangoLayout *layout; struct tm *tm; char buffer[160], divenr[20]; @@ -177,59 +190,86 @@ static void show_dive_table(struct dive *dive, cairo_t *cr, double w, maxwidth = w * PANGO_SCALE; maxheight = h * PANGO_SCALE * 0.9; + colwidth = maxwidth / 7; + layout = pango_cairo_create_layout(cr); - pango_layout_set_width(layout, maxwidth); + + cairo_move_to(cr, 0, 0); + pango_layout_set_width(layout, colwidth); pango_layout_set_height(layout, maxheight); + set_font(layout, font, FONT_NORMAL, PANGO_ALIGN_LEFT); + cairo_move_to(cr, 0, 0); + curwidth = 0; + // Col 1: Dive # *divenr = 0; if (dive->number) - snprintf(divenr, sizeof(divenr), "#%d -", dive->number); - - depth = get_depth_units(dive->maxdepth.mm, &decimals, &unit); + snprintf(divenr, sizeof(divenr), "#%d", dive->number); + pango_layout_set_width(layout, colwidth/ (double) 2); + pango_layout_set_text(layout, divenr, -1); + pango_layout_set_justify(layout, 1); + pango_cairo_show_layout(cr, layout); + curwidth = curwidth + (colwidth / 2); + // Col 2: Date # + pango_layout_set_width(layout, colwidth); tm = gmtime(&dive->when); len = snprintf(buffer, sizeof(buffer), - "%s %s, %s %d, %d %dh%02d - %.*f %s - %d min - %s %s -- %s", - divenr, + "%s, %s %d, %d %dh%02d", weekday(tm->tm_wday), monthname(tm->tm_mon), tm->tm_mday, tm->tm_year + 1900, - tm->tm_hour, tm->tm_min, - decimals, - depth, - unit, - (dive->duration.seconds+59) / 60, - dive->divemaster ? : " ", - dive->buddy ? : " ", - dive->location ? : " " + tm->tm_hour, tm->tm_min ); + cairo_move_to(cr, curwidth / PANGO_SCALE, 0); + pango_layout_set_text(layout, buffer, len); + pango_layout_set_justify(layout, 1); + pango_cairo_show_layout(cr, layout); + curwidth = curwidth + colwidth; - set_font(layout, font, FONT_NORMAL, PANGO_ALIGN_LEFT); + // Col 3: Depth + depth = get_depth_units(dive->maxdepth.mm, &decimals, &unit); + len = snprintf(buffer, sizeof(buffer), + "%.*f %s", decimals, depth, unit); + cairo_move_to(cr, curwidth / PANGO_SCALE, 0); + pango_layout_set_width(layout, colwidth/ (double) 2); pango_layout_set_text(layout, buffer, len); - pango_layout_get_size(layout, &width, &height); + pango_layout_set_justify(layout, 1); + pango_cairo_show_layout(cr, layout); + curwidth = curwidth + (colwidth / 2); + + // Col 4: Time + len = snprintf(buffer, sizeof(buffer), + "%d min",(dive->duration.seconds+59) / 60); + cairo_move_to(cr, curwidth / PANGO_SCALE, 0); + pango_layout_set_width(layout, colwidth/ (double) 2); + pango_layout_set_text(layout, buffer, len); + pango_layout_set_justify(layout, 1); + pango_cairo_show_layout(cr, layout); + curwidth = curwidth + (colwidth / 2); - cairo_move_to(cr, 0, 0); + // Col 5: Master + pango_layout_set_width(layout, colwidth); + cairo_move_to(cr, curwidth / PANGO_SCALE, 0); + pango_layout_set_text(layout, dive->divemaster ? : " ", -1); + pango_layout_set_justify(layout, 1); pango_cairo_show_layout(cr, layout); + curwidth = curwidth + colwidth; - ///* - //* Show the dive notes - //*/ - if (dive->notes) { - /* Move down by the size of the location (x2) */ - height = height * 1.3; - cairo_translate(cr, 20, height / (double) PANGO_SCALE); - maxheight -= height; + // Col 6: Buddy + cairo_move_to(cr, curwidth / PANGO_SCALE, 0); + pango_layout_set_text(layout, dive->buddy ? : " ", -1); + pango_layout_set_justify(layout, 1); + pango_cairo_show_layout(cr, layout); + curwidth = curwidth + colwidth; - /* Use the full width and remaining height for notes */ - pango_layout_set_height(layout, maxheight); - pango_layout_set_width(layout, maxwidth); - pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR); - pango_layout_set_justify(layout, 1); - pango_layout_set_text(layout, dive->notes, -1); + // Col 7: Location + cairo_move_to(cr, curwidth / PANGO_SCALE, 0); + pango_layout_set_width(layout, maxwidth - curwidth); + pango_layout_set_text(layout, dive->location ? : " ", -1); + pango_layout_set_justify(layout, 1); + pango_cairo_show_layout(cr, layout); - cairo_move_to(cr, 0, 0); - pango_cairo_show_layout(cr, layout); - } g_object_unref(layout); } @@ -412,6 +452,7 @@ static void draw_table(GtkPrintOperation *operation, print_table_header(cr, 0, 0+h, w, h, font); int i; for (i = 0; i < n_dive_per_page; i++) { + //for (i = 0; i < 1; i++) { print_table(nr+i, cr, 0, h*1.5+h*i, w, h, font); } -- cgit v1.2.3-70-g09d2 From e7abde48688180d707dd4e0d1553fd285520b0ed Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Thu, 30 Aug 2012 09:23:17 +0200 Subject: Remove the pretty-print without dive profile option. Until now we had the choice between: - pretty-print - with dive profiles - without dive profiles - table-print This commit remove the pretty-print without dive profiles, leaving the choice to either pretty-print or table-print. Signed-off-by: Pierre-Yves Chibon --- display.h | 1 - print.c | 105 ++++---------------------------------------------------------- 2 files changed, 6 insertions(+), 100 deletions(-) diff --git a/display.h b/display.h index 11895e6e1..581530efd 100644 --- a/display.h +++ b/display.h @@ -28,7 +28,6 @@ extern void attach_tooltip(int x, int y, int w, int h, const char *text); struct options { enum { PRETTY, TABLE } type; - gboolean print_no_profiles; }; extern char zoomed_plot; diff --git a/print.c b/print.c index 2c9c441fb..46e3c94f6 100644 --- a/print.c +++ b/print.c @@ -13,14 +13,6 @@ static struct options print_options; -#define PRETTYOPTIONCALLBACK(name, option) \ -static void name(GtkWidget *w, gpointer data) \ -{ \ - option = GTK_TOGGLE_BUTTON(w)->active; \ -} - -PRETTYOPTIONCALLBACK(print_profiles_toggle, print_options.print_no_profiles) - static void set_font(PangoLayout *layout, PangoFontDescription *font, double size, int align) @@ -315,29 +307,6 @@ static void print(int divenr, cairo_t *cr, double x, double y, double w, cairo_restore(cr); } -static void print_pretty_table(int divenr, cairo_t *cr, double x, double y, - double w, double h, PangoFontDescription *font) -{ - struct dive *dive; - - dive = get_dive(divenr); - if (!dive) - return; - cairo_save(cr); - cairo_translate(cr, x, y); - - /* Plus 5% on all sides */ - cairo_translate(cr, w/20, h/20); - w *= 0.9; h *= 0.9; - - /* We actually want to scale the text and the lines now */ - cairo_scale(cr, 0.5, 0.5); - - show_dive_text(dive, cr, w*2, h*2, font); - - cairo_restore(cr); -} - static void print_table_header(cairo_t *cr, double x, double y, double w, double h, PangoFontDescription *font) { @@ -406,31 +375,6 @@ static void draw_page(GtkPrintOperation *operation, pango_font_description_free(font); } -static void draw_pretty_table(GtkPrintOperation *operation, - GtkPrintContext *context, - gint page_nr, - gpointer user_data) -{ - int nr; - cairo_t *cr; - double w, h; - PangoFontDescription *font; - - cr = gtk_print_context_get_cairo_context(context); - font = pango_font_description_from_string("Sans"); - - w = gtk_print_context_get_width(context); - h = gtk_print_context_get_height(context)/15; - - nr = page_nr*15; - int i; - for (i = 0; i < 15; i++) { - print_pretty_table(nr+i, cr, 0, 0+h*i, w, h, font); - } - - pango_font_description_free(font); -} - static void draw_table(GtkPrintOperation *operation, GtkPrintContext *context, gint page_nr, @@ -452,7 +396,6 @@ static void draw_table(GtkPrintOperation *operation, print_table_header(cr, 0, 0+h, w, h, font); int i; for (i = 0; i < n_dive_per_page; i++) { - //for (i = 0; i < 1; i++) { print_table(nr+i, cr, 0, h*1.5+h*i, w, h, font); } @@ -463,11 +406,7 @@ static void begin_print(GtkPrintOperation *operation, gpointer user_data) { int dives_per_page = 1; if (print_options.type == PRETTY) { - if (print_options.print_no_profiles){ - dives_per_page = 15; - } else { - dives_per_page = 6; - } + dives_per_page = 6; } else { dives_per_page = 25; } @@ -476,22 +415,12 @@ static void begin_print(GtkPrintOperation *operation, gpointer user_data) gtk_print_operation_set_n_pages(operation, pages); } -static void update_print_window(GtkWidget *w) { - if (print_options.type == TABLE) { - // type == table - disable the profile option - gtk_widget_set_sensitive(w, FALSE); - } else { - // type == pretty - enable the profile option - gtk_widget_set_sensitive(w, TRUE); - } -} #define OPTIONCALLBACK(name, type, value) \ static void name(GtkWidget *w, gpointer data) \ {\ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) \ print_options.type = value; \ - update_print_window(data); \ } OPTIONCALLBACK(set_pretty, type, PRETTY) @@ -499,7 +428,7 @@ OPTIONCALLBACK(set_table, type, TABLE) static GtkWidget *print_dialog(GtkPrintOperation *operation, gpointer user_data) { - GtkWidget *vbox, *button, *radio1, *radio2, *frame, *box; + GtkWidget *vbox, *radio1, *radio2, *frame, *box; gtk_print_operation_set_custom_tab_label(operation, "Dive details"); vbox = gtk_vbox_new(TRUE, 5); @@ -520,25 +449,8 @@ static GtkWidget *print_dialog(GtkPrintOperation *operation, gpointer user_data) gtk_box_pack_start (GTK_BOX (box), radio1, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box), radio2, TRUE, TRUE, 0); - - frame = gtk_frame_new("Print options"); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 1); - - box = gtk_hbox_new(FALSE, 3); - gtk_container_add(GTK_CONTAINER(frame), box); - - button = gtk_check_button_new_with_label("No dive profiles"); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), - print_options.print_no_profiles); - gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 2); - g_signal_connect(G_OBJECT(button), "toggled", - G_CALLBACK(print_profiles_toggle), NULL); - if (print_options.type == TABLE) - // type == table - disable the profile option - gtk_widget_set_sensitive(button, FALSE); - - g_signal_connect(radio1, "toggled", G_CALLBACK(set_pretty), button); - g_signal_connect(radio2, "toggled", G_CALLBACK(set_table), button); + g_signal_connect(radio1, "toggled", G_CALLBACK(set_pretty), NULL); + g_signal_connect(radio2, "toggled", G_CALLBACK(set_table), NULL); gtk_widget_show_all(vbox); return vbox; @@ -547,13 +459,8 @@ static GtkWidget *print_dialog(GtkPrintOperation *operation, gpointer user_data) static void print_dialog_apply(GtkPrintOperation *operation, GtkWidget *widget, gpointer user_data) { if (print_options.type == PRETTY) { - if (print_options.print_no_profiles == TRUE){ - g_signal_connect(operation, "draw_page", - G_CALLBACK(draw_pretty_table), NULL); - } else { - g_signal_connect(operation, "draw_page", - G_CALLBACK(draw_page), NULL); - } + g_signal_connect(operation, "draw_page", + G_CALLBACK(draw_page), NULL); } else { g_signal_connect(operation, "draw_page", G_CALLBACK(draw_table), NULL); -- cgit v1.2.3-70-g09d2