]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Start re-working the print UI to allow printing tables with no profiles.
authorPierre-Yves Chibon <pingou@pingoured.fr>
Mon, 27 Aug 2012 15:01:00 +0000 (17:01 +0200)
committerPierre-Yves Chibon <pingou@pingoured.fr>
Mon, 27 Aug 2012 15:01:00 +0000 (17:01 +0200)
With this commit we add a checkbox in the "Dive details" tab of the print
window. This checkbox allows to print the dives profile or not.

If you don't print the dives profile, you get 15 dives on the page (instead
of 6 with the profiles).

Future work should include:
- Ability to choose what is printed
- Table layout vs the current one (if no dives profile)
- Ability to choose the number of dives per page (play with the font size for this)

Signed-off-by: Pierre-Yves Chibon <pingou@pingoured.fr>
Signed-off-by: Pierre-Yves Chibon <pingou@pingoured.fr>
display-gtk.h
print.c

index dd7e2c4a0d97a8522ce84d4a4c02d6efbb5f9d67..85ebae3e2ef70a743d90d3b206107bf8b81e57d5 100644 (file)
@@ -19,6 +19,7 @@ typedef struct {
        gboolean nitrox;
        gboolean sac;
        gboolean otu;
+    gboolean print_profiles;
 } visible_cols_t;
 
 typedef enum {
diff --git a/print.c b/print.c
index 0bd3110a7bc67d4fdab31ac483bc93230e7f1a66..d8373e5cf441a2a9513085c853be0360d430bf13 100644 (file)
--- a/print.c
+++ b/print.c
 #define FONT_SMALL (FONT_NORMAL / 1.2)
 #define FONT_LARGE (FONT_NORMAL * 1.2)
 
+#define OPTIONCALLBACK(name, option) \
+static void name(GtkWidget *w, gpointer data) \
+{ \
+       option = GTK_TOGGLE_BUTTON(w)->active; \
+}
+
+OPTIONCALLBACK(print_profiles_toggle, visible_cols.print_profiles)
+
+
 static void set_font(PangoLayout *layout, PangoFontDescription *font, double size, int align)
 {
        pango_font_description_set_size(font, size * PANGO_SCALE);
@@ -165,6 +174,28 @@ static void print(int divenr, cairo_t *cr, double x, double y, double w, double
        cairo_restore(cr);
 }
 
+static void print_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 draw_page(GtkPrintOperation *operation,
                        GtkPrintContext *context,
                        gint page_nr,
@@ -192,24 +223,71 @@ static void draw_page(GtkPrintOperation *operation,
        pango_font_description_free(font);
 }
 
+static void draw_page_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_table(nr+i, cr, 0,   0+h*i, w, h, font);
+       }
+
+       pango_font_description_free(font);
+}
+
 static void begin_print(GtkPrintOperation *operation, gpointer user_data)
 {
+       int pages;
+       if (visible_cols.print_profiles){
+               pages = (dive_table.nr + 5) / 6;
+               gtk_print_operation_set_n_pages(operation, pages);
+       } else {
+               pages = (dive_table.nr + 9) / 15;
+               gtk_print_operation_set_n_pages(operation, pages);
+       }
 }
 
 static GtkWidget *print_dialog(GtkPrintOperation *operation, gpointer user_data)
 {
-       GtkWidget *vbox, *hbox, *label;
+       GtkWidget *vbox, *button, *frame, *box;
        gtk_print_operation_set_custom_tab_label(operation, "Dive details");
 
        vbox = gtk_vbox_new(TRUE, 5);
-       label = gtk_label_new("Print Dive details");
-       gtk_box_pack_start(GTK_BOX(vbox), label, 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, 1);
+       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), visible_cols.print_profiles);
+       gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6);
+       g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(print_profiles_toggle), NULL);
+
        gtk_widget_show_all(vbox);
        return vbox;
 }
 
 static void print_dialog_apply(GtkPrintOperation *operation, GtkWidget *widget, gpointer user_data)
 {
+       if (visible_cols.print_profiles){
+               g_signal_connect(operation, "draw_page", G_CALLBACK(draw_page), NULL);
+       } else {
+               g_signal_connect(operation, "draw_page", G_CALLBACK(draw_page_table), NULL);
+       }
 }
 
 static GtkPrintSettings *settings = NULL;
@@ -224,12 +302,9 @@ void do_print(void)
        print = gtk_print_operation_new();
        if (settings != NULL)
                gtk_print_operation_set_print_settings(print, settings);
-       pages = (dive_table.nr + 5) / 6;
-       gtk_print_operation_set_n_pages(print, pages);
        g_signal_connect(print, "create-custom-widget", G_CALLBACK(print_dialog), NULL);
        g_signal_connect(print, "custom-widget-apply", G_CALLBACK(print_dialog_apply), NULL);
        g_signal_connect(print, "begin_print", G_CALLBACK(begin_print), NULL);
-       g_signal_connect(print, "draw_page", G_CALLBACK(draw_page), NULL);
        res = gtk_print_operation_run(print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
                                         GTK_WINDOW(main_window), NULL);
        if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {