summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar boret <salvador.cunat@gmail.com>2012-11-10 16:51:44 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2012-11-11 11:04:38 +0100
commit240ef9e9e5d0be37894ffa76dff36135fbf2bc19 (patch)
tree4001db3f527babb8f4db2cc4c588ace668f65a42
parent8514ec8723542b11a555af2d204a4a7b66b062cc (diff)
downloadsubsurface-240ef9e9e5d0be37894ffa76dff36135fbf2bc19.tar.gz
Add another print option, 1 dive per sheet.
Simply add a dive option on bigger surface, whith bigger fonts. The size isn't A4 nor A5, but the size used by some popular paper divelogs. The modification performs better if we transpose the profile and the text of the dive, because, if the notes are very brief,we get an excess of white space at the bottom of the print. Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--display.h2
-rw-r--r--print.c72
2 files changed, 66 insertions, 8 deletions
diff --git a/display.h b/display.h
index 82d12682b..880a8b7be 100644
--- a/display.h
+++ b/display.h
@@ -33,7 +33,7 @@ extern void init_profile_background(struct graphics_context *gc);
extern void attach_tooltip(int x, int y, int w, int h, const char *text);
struct options {
- enum { PRETTY, TABLE } type;
+ enum { PRETTY, TABLE, ONEPERPAGE } type;
int print_selected;
};
diff --git a/print.c b/print.c
index e0fd2847c..ec07aa611 100644
--- a/print.c
+++ b/print.c
@@ -76,7 +76,11 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w,
tm.tm_mday, tm.tm_year + 1900,
tm.tm_hour, tm.tm_min);
- set_font(layout, font, FONT_LARGE, PANGO_ALIGN_LEFT);
+ if (print_options.type == ONEPERPAGE){
+ set_font(layout, font, FONT_LARGE, PANGO_ALIGN_LEFT);
+ } else {
+ set_font(layout, font, FONT_NORMAL, PANGO_ALIGN_LEFT);
+ }
pango_layout_set_text(layout, buffer, len);
pango_layout_get_size(layout, &width, &height);
@@ -116,7 +120,11 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w,
pango_layout_set_height(layout, 1);
pango_layout_set_width(layout, width);
- set_font(layout, font, FONT_NORMAL, PANGO_ALIGN_LEFT);
+ if (print_options.type == ONEPERPAGE){
+ set_font(layout, font, FONT_LARGE, PANGO_ALIGN_LEFT);
+ } else {
+ set_font(layout, font, FONT_NORMAL, PANGO_ALIGN_LEFT);
+ }
pango_layout_set_text(layout, dive->location ? : " ", -1);
cairo_move_to(cr, 0, 0);
@@ -136,6 +144,11 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w,
/* Use the full width and remaining height for notes */
pango_layout_set_height(layout, maxheight);
pango_layout_set_width(layout, maxwidth);
+ if (print_options.type == ONEPERPAGE){
+ set_font(layout, font, FONT_NORMAL, PANGO_ALIGN_LEFT);
+ } else {
+ set_font(layout, font, FONT_SMALL, PANGO_ALIGN_LEFT);
+ }
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
pango_layout_set_justify(layout, 1);
pango_layout_set_text(layout, dive->notes, -1);
@@ -306,6 +319,12 @@ static void print(int divenr, cairo_t *cr, double x, double y, double w,
if (!dive)
return;
cairo_save(cr);
+
+ /*Create a frame for each print x,y are provided in draw_page()*/
+ cairo_rectangle(cr, x, y, w, h);
+ cairo_set_line_width(cr, 0.01);
+ cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
+ cairo_stroke(cr);
cairo_translate(cr, x, y);
/* Plus 5% on all sides */
@@ -394,6 +413,31 @@ static void draw_page(GtkPrintOperation *operation,
pango_font_description_free(font);
}
+static void draw_oneperpage(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");
+
+ /*Get bigger area reducing the divisors */
+ w = gtk_print_context_get_width(context)/1.8;
+ h = gtk_print_context_get_height(context)/1.6;
+
+ /*only one page, only one print*/
+ nr = page_nr;
+ print(nr, cr, 0, 0, w, h, font);
+ pango_font_description_free(font);
+}
+
+
+
static void draw_table(GtkPrintOperation *operation,
GtkPrintContext *context,
gint page_nr,
@@ -442,6 +486,8 @@ static void begin_print(GtkPrintOperation *operation, gpointer user_data)
if (print_options.type == PRETTY) {
dives_per_page = 6;
+ } else if (print_options.type == ONEPERPAGE) {
+ dives_per_page = 1;
} else {
dives_per_page = 25;
}
@@ -459,6 +505,7 @@ static void name(GtkWidget *w, gpointer data) \
OPTIONCALLBACK(set_pretty, type, PRETTY)
OPTIONCALLBACK(set_table, type, TABLE)
+OPTIONCALLBACK(set_oneperpage, type, ONEPERPAGE)
#define OPTIONSELECTEDCALLBACK(name, option) \
static void name(GtkWidget *w, gpointer data) \
@@ -471,7 +518,7 @@ OPTIONSELECTEDCALLBACK(print_selection_toggle, print_options.print_selected)
static GtkWidget *print_dialog(GtkPrintOperation *operation, gpointer user_data)
{
- GtkWidget *vbox, *radio1, *radio2, *frame, *box;
+ GtkWidget *vbox, *radio1, *radio2, *radio3, *frame, *box;
int dives;
gtk_print_operation_set_custom_tab_label(operation, _("Dive details"));
@@ -483,18 +530,24 @@ static GtkWidget *print_dialog(GtkPrintOperation *operation, gpointer user_data)
box = gtk_hbox_new(FALSE, 2);
gtk_container_add(GTK_CONTAINER(frame), box);
- radio1 = gtk_radio_button_new_with_label (NULL, _("Pretty print"));
+ radio1 = gtk_radio_button_new_with_label (NULL, _("6 dives per page"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio1),
print_options.type == PRETTY);
radio2 = gtk_radio_button_new_with_label_from_widget (
- GTK_RADIO_BUTTON (radio1), _("Table print"));
+ GTK_RADIO_BUTTON (radio1), _("1 dive per page"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio2),
+ print_options.type == ONEPERPAGE);
+ radio3 = gtk_radio_button_new_with_label_from_widget (
+ GTK_RADIO_BUTTON (radio1), _("Table print"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio3),
print_options.type == TABLE);
gtk_box_pack_start (GTK_BOX (box), radio1, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (box), radio2, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (box), radio3, TRUE, TRUE, 0);
g_signal_connect(radio1, "toggled", G_CALLBACK(set_pretty), NULL);
- g_signal_connect(radio2, "toggled", G_CALLBACK(set_table), NULL);
+ g_signal_connect(radio2, "toggled", G_CALLBACK(set_oneperpage), NULL);
+ g_signal_connect(radio3, "toggled", G_CALLBACK(set_table), NULL);
dives = nr_selected_dives();
print_options.print_selected = dives >= 1;
@@ -522,8 +575,13 @@ static void print_dialog_apply(GtkPrintOperation *operation, GtkWidget *widget,
g_signal_connect(operation, "draw_page",
G_CALLBACK(draw_page), NULL);
} else {
- g_signal_connect(operation, "draw_page",
+ if (print_options.type == ONEPERPAGE) {
+ g_signal_connect(operation, "draw_page",
+ G_CALLBACK(draw_oneperpage), NULL);
+ } else {
+ g_signal_connect(operation, "draw_page",
G_CALLBACK(draw_table), NULL);
+ }
}
}