diff --git a/glade/dialog.glade b/glade/dialog.glade
index c60e085..792d1ca 100644
--- a/glade/dialog.glade
+++ b/glade/dialog.glade
@@ -113,7 +113,7 @@
False
- False
+ True
True
6
@@ -151,5 +151,38 @@
7
+
+
+
+ False
+ True
+ 8
+
+
diff --git a/main-window.c b/main-window.c
index a5328bf..600bf0a 100644
--- a/main-window.c
+++ b/main-window.c
@@ -250,13 +250,14 @@ static void on_convert_clicked(gpointer button, gpointer user)
bounding_box_prepare_empty(&cell_box);
calculate_cell_bounding_box(&cell_box, cell_to_render);
- /* Calculate size in meters */
- height = (cell_box.vectors.upper_right.y - cell_box.vectors.lower_left.y) * cell_to_render->parent_library->unit_in_meters;
- width = (cell_box.vectors.upper_right.x - cell_box.vectors.lower_left.x) * cell_to_render->parent_library->unit_in_meters;
+ /* Calculate size in meters database units */
+ height = (cell_box.vectors.upper_right.y - cell_box.vectors.lower_left.y);
+ width = (cell_box.vectors.upper_right.x - cell_box.vectors.lower_left.x);
/* Show settings dialog */
settings = renderer_settings_dialog_new(GTK_WINDOW(data->main_window));
renderer_settings_dialog_set_settings(settings, &sett);
+ renderer_settings_dialog_set_database_unit_scale(settings, cell_to_render->parent_library->unit_in_meters);
renderer_settings_dialog_set_cell_height(settings, height);
renderer_settings_dialog_set_cell_width(settings, width);
diff --git a/widgets/conv-settings-dialog.c b/widgets/conv-settings-dialog.c
index a10e1a5..7460dfb 100644
--- a/widgets/conv-settings-dialog.c
+++ b/widgets/conv-settings-dialog.c
@@ -43,8 +43,12 @@ struct _RendererSettingsDialog {
GtkLabel *x_label;
GtkLabel *y_label;
- double cell_height;
- double cell_width;
+ GtkLabel *x_output_label;
+ GtkLabel *y_output_label;
+
+ unsigned int cell_height;
+ unsigned int cell_width;
+ double unit_in_meters;
};
G_DEFINE_TYPE(RendererSettingsDialog, renderer_settings_dialog, GTK_TYPE_DIALOG)
@@ -110,13 +114,13 @@ static gboolean shape_drawer_drawing_callback(GtkWidget *widget, cairo_t *cr, gp
usable_width = (0.95*(double)width) - 15.0;
usable_height = (0.95*(double)height) - 15.0;
- width_scale = usable_width/dialog->cell_width;
- height_scale = usable_height/dialog->cell_height;
+ width_scale = usable_width/(double)dialog->cell_width;
+ height_scale = usable_height/(double)dialog->cell_height;
final_scale_value = (width_scale < height_scale ? width_scale : height_scale);
- cairo_rectangle(cr, -dialog->cell_width*final_scale_value/2, -dialog->cell_height*final_scale_value/2,
- dialog->cell_width*final_scale_value, dialog->cell_height*final_scale_value);
+ cairo_rectangle(cr, -(double)dialog->cell_width*final_scale_value/2.0, -(double)dialog->cell_height*final_scale_value/2.0,
+ (double)dialog->cell_width*final_scale_value, (double)dialog->cell_height*final_scale_value);
cairo_stroke(cr);
cairo_restore(cr);
@@ -126,11 +130,31 @@ static gboolean shape_drawer_drawing_callback(GtkWidget *widget, cairo_t *cr, gp
static void renderer_settings_dialog_update_labels(RendererSettingsDialog *self)
{
char default_buff[100];
+ double scale;
- snprintf(default_buff, sizeof(default_buff), "Width: %E", self->cell_width);
+ if (!self)
+ return;
+
+ snprintf(default_buff, sizeof(default_buff), "Width: %E", self->cell_width * self->unit_in_meters);
gtk_label_set_text(self->x_label, default_buff);
- snprintf(default_buff, sizeof(default_buff), "Height: %E", self->cell_height);
+ snprintf(default_buff, sizeof(default_buff), "Height: %E", self->cell_height * self->unit_in_meters);
gtk_label_set_text(self->y_label, default_buff);
+
+ scale = gtk_range_get_value(GTK_RANGE(self->scale));
+
+ snprintf(default_buff, sizeof(default_buff), "Output Width: %u px", (unsigned int)((double)self->cell_width / scale));
+ gtk_label_set_text(self->x_output_label, default_buff);
+ snprintf(default_buff, sizeof(default_buff), "Output Height: %u px", (unsigned int)((double)self->cell_height / scale));
+ gtk_label_set_text(self->y_output_label, default_buff);
+}
+
+static void scale_value_changed(GtkRange *range, gpointer user_data)
+{
+ (void)range;
+ RendererSettingsDialog *dialog;
+
+ dialog = RENDERER_SETTINGS_DIALOG(user_data);
+ renderer_settings_dialog_update_labels(dialog);
}
static void renderer_settings_dialog_init(RendererSettingsDialog *self)
@@ -152,6 +176,8 @@ static void renderer_settings_dialog_init(RendererSettingsDialog *self)
self->shape_drawing = GTK_DRAWING_AREA(gtk_builder_get_object(builder, "shape-drawer"));
self->x_label = GTK_LABEL(gtk_builder_get_object(builder, "x-label"));
self->y_label = GTK_LABEL(gtk_builder_get_object(builder, "y-label"));
+ self->x_output_label = GTK_LABEL(gtk_builder_get_object(builder, "x-output-label"));
+ self->y_output_label = GTK_LABEL(gtk_builder_get_object(builder, "y-output-label"));
gtk_dialog_add_buttons(dialog, "Cancel", GTK_RESPONSE_CANCEL, "OK", GTK_RESPONSE_OK, NULL);
gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(dialog)), box);
@@ -161,9 +187,12 @@ static void renderer_settings_dialog_init(RendererSettingsDialog *self)
g_signal_connect(G_OBJECT(self->shape_drawing),
"draw", G_CALLBACK(shape_drawer_drawing_callback), (gpointer)self);
+ g_signal_connect(self->scale, "value-changed", G_CALLBACK(scale_value_changed), (gpointer)self);
+
/* Default values */
- self->cell_width = 1E-6;
- self->cell_height = 1E-6;
+ self->cell_width = 1;
+ self->cell_height = 1;
+ self->unit_in_meters = 1E-6;
renderer_settings_dialog_update_labels(self);
g_object_unref(builder);
@@ -228,34 +257,41 @@ void renderer_settings_dialog_set_settings(RendererSettingsDialog *dialog, struc
}
}
-void renderer_settings_dialog_set_cell_width(RendererSettingsDialog *dialog, double width)
+void renderer_settings_dialog_set_cell_width(RendererSettingsDialog *dialog, unsigned int width)
{
if (!dialog)
return;
- if (width == 0.0)
- width = 1E-6;
+ if (width == 0)
+ width = 1;
- if (width < 0.0)
- width = -width;
dialog->cell_width = width;
renderer_settings_dialog_update_labels(dialog);
}
-void renderer_settings_dialog_set_cell_height(RendererSettingsDialog *dialog, double height)
+void renderer_settings_dialog_set_cell_height(RendererSettingsDialog *dialog, unsigned int height)
{
if (!dialog)
return;
- if (height == 0.0)
- height = 1E-6;
-
- if (height < 0.0)
- height = -height;
+ if (height == 0)
+ height = 1;
dialog->cell_height = height;
renderer_settings_dialog_update_labels(dialog);
}
+void renderer_settings_dialog_set_database_unit_scale(RendererSettingsDialog *dialog, double unit_in_meters)
+{
+ if (!dialog)
+ return;
+
+ if (unit_in_meters < 0)
+ unit_in_meters *= -1;
+
+ dialog->unit_in_meters = unit_in_meters;
+ renderer_settings_dialog_update_labels(dialog);
+}
+
/** @} */
diff --git a/widgets/conv-settings-dialog.h b/widgets/conv-settings-dialog.h
index 3680c04..562a114 100644
--- a/widgets/conv-settings-dialog.h
+++ b/widgets/conv-settings-dialog.h
@@ -78,16 +78,23 @@ void renderer_settings_dialog_get_settings(RendererSettingsDialog *dialog, struc
/**
* @brief renderer_settings_dialog_set_cell_width Set width for rendered cell
* @param dialog
- * @param width Width in meters
+ * @param width Width in database units
*/
-void renderer_settings_dialog_set_cell_width(RendererSettingsDialog *dialog, double width);
+void renderer_settings_dialog_set_cell_width(RendererSettingsDialog *dialog, unsigned int width);
/**
* @brief renderer_settings_dialog_set_cell_height Set height for rendered cell
* @param dialog
- * @param height Height in meters
+ * @param height Height in database units
*/
-void renderer_settings_dialog_set_cell_height(RendererSettingsDialog *dialog, double height);
+void renderer_settings_dialog_set_cell_height(RendererSettingsDialog *dialog, unsigned int height);
+
+/**
+ * @brief renderer_settings_dialog_set_database_unit_scale Set database scale
+ * @param dialog dialog element
+ * @param unit_in_meters Database unit in meters
+ */
+void renderer_settings_dialog_set_database_unit_scale(RendererSettingsDialog *dialog, double unit_in_meters);
#endif /* __CONV_SETTINGS_DIALOG_H__ */