PIKApp/plug-ins/map-object/map-object-ui.c

958 lines
39 KiB
C
Raw Normal View History

2023-09-26 00:35:21 +02:00
/**************************************************************/
/* Dialog creation and updaters, callbacks and event-handlers */
/**************************************************************/
#include "config.h"
#include <libpika/pika.h>
#include <libpika/pikaui.h>
#include "arcball.h"
#include "map-object-ui.h"
#include "map-object-icons.h"
#include "map-object-image.h"
#include "map-object-apply.h"
#include "map-object-preview.h"
#include "map-object-main.h"
#include "libpika/stdplugins-intl.h"
2023-10-30 23:55:30 +01:00
GtkWidget *previewarea = NULL;
2023-09-26 00:35:21 +02:00
static GtkWidget *appwin = NULL;
static GtkNotebook *options_note_book = NULL;
static GtkWidget *pointlightwid;
static GtkWidget *dirlightwid;
static GtkAdjustment *xadj, *yadj, *zadj;
2023-10-30 23:55:30 +01:00
static GtkWidget *sphere_page = NULL;
static GtkWidget *box_page = NULL;
static GtkWidget *cylinder_page = NULL;
2023-09-26 00:35:21 +02:00
static guint left_button_pressed = FALSE;
static guint light_hit = FALSE;
2023-10-30 23:55:30 +01:00
static gint preview_events (GtkWidget *area,
GdkEvent *event);
2023-09-26 00:35:21 +02:00
static void update_light_pos_entries (void);
2023-10-30 23:55:30 +01:00
static void update_preview (PikaProcedureConfig *config);
static void double_adjustment_update (GtkAdjustment *adjustment,
gpointer data);
2023-09-26 00:35:21 +02:00
2023-10-30 23:55:30 +01:00
static void toggle_update (GtkWidget *widget,
gpointer data);
2023-09-26 00:35:21 +02:00
2023-10-30 23:55:30 +01:00
static void lightmenu_callback (GtkWidget *widget,
gpointer data);
2023-09-26 00:35:21 +02:00
2023-10-30 23:55:30 +01:00
static void preview_callback (GtkWidget *widget,
gpointer data);
2023-09-26 00:35:21 +02:00
/******************************************************/
/* Update angle & position (redraw grid if necessary) */
/******************************************************/
static void
2023-10-30 23:55:30 +01:00
update_preview (PikaProcedureConfig *config)
2023-09-26 00:35:21 +02:00
{
2023-10-30 23:55:30 +01:00
copy_from_config (config);
2023-09-26 00:35:21 +02:00
if (mapvals.livepreview)
compute_preview_image ();
gtk_widget_queue_draw (previewarea);
}
static void
double_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
pika_double_adjustment_update (adjustment, data);
if (mapvals.livepreview)
compute_preview_image ();
gtk_widget_queue_draw (previewarea);
}
static void
update_light_pos_entries (void)
{
g_signal_handlers_block_by_func (xadj,
double_adjustment_update,
&mapvals.lightsource.position.x);
gtk_adjustment_set_value (xadj,
mapvals.lightsource.position.x);
g_signal_handlers_unblock_by_func (xadj,
double_adjustment_update,
&mapvals.lightsource.position.x);
g_signal_handlers_block_by_func (yadj,
double_adjustment_update,
&mapvals.lightsource.position.y);
gtk_adjustment_set_value (yadj,
mapvals.lightsource.position.y);
g_signal_handlers_unblock_by_func (yadj,
double_adjustment_update,
&mapvals.lightsource.position.y);
g_signal_handlers_block_by_func (zadj,
double_adjustment_update,
&mapvals.lightsource.position.z);
gtk_adjustment_set_value (zadj,
mapvals.lightsource.position.z);
g_signal_handlers_unblock_by_func (zadj,
double_adjustment_update,
&mapvals.lightsource.position.z);
}
/**********************/
/* Std. toggle update */
/**********************/
static void
toggle_update (GtkWidget *widget,
gpointer data)
{
pika_toggle_button_update (widget, data);
compute_preview_image ();
gtk_widget_queue_draw (previewarea);
}
/*****************************************/
/* Main window light type menu callback. */
/*****************************************/
static void
lightmenu_callback (GtkWidget *widget,
gpointer data)
{
2023-10-30 23:55:30 +01:00
int light_type;
PikaProcedureConfig *config = (PikaProcedureConfig *) data;
2023-09-26 00:35:21 +02:00
2023-10-30 23:55:30 +01:00
light_type = pika_procedure_config_get_choice_id (config, "light-type");
2023-09-26 00:35:21 +02:00
2023-10-30 23:55:30 +01:00
if (light_type == POINT_LIGHT)
2023-09-26 00:35:21 +02:00
{
2023-10-30 23:55:30 +01:00
gtk_widget_set_visible (dirlightwid, FALSE);
gtk_widget_set_visible (pointlightwid, TRUE);
2023-09-26 00:35:21 +02:00
}
2023-10-30 23:55:30 +01:00
else if (light_type == DIRECTIONAL_LIGHT)
2023-09-26 00:35:21 +02:00
{
2023-10-30 23:55:30 +01:00
gtk_widget_set_visible (dirlightwid, TRUE);
gtk_widget_set_visible (pointlightwid, FALSE);
2023-09-26 00:35:21 +02:00
}
else
{
2023-10-30 23:55:30 +01:00
gtk_widget_set_visible (dirlightwid, FALSE);
gtk_widget_set_visible (pointlightwid, FALSE);
2023-09-26 00:35:21 +02:00
}
if (mapvals.livepreview)
{
2023-10-30 23:55:30 +01:00
copy_from_config (config);
2023-09-26 00:35:21 +02:00
compute_preview_image ();
gtk_widget_queue_draw (previewarea);
}
}
/***************************************/
/* Main window map type menu callback. */
/***************************************/
static void
mapmenu_callback (GtkWidget *widget,
gpointer data)
{
2023-10-30 23:55:30 +01:00
int map_type;
PikaProcedureConfig *config = (PikaProcedureConfig *) data;
2023-09-26 00:35:21 +02:00
2023-10-30 23:55:30 +01:00
map_type = pika_procedure_config_get_choice_id (config, "map-type");
2023-09-26 00:35:21 +02:00
if (mapvals.livepreview)
{
2023-10-30 23:55:30 +01:00
copy_from_config (config);
2023-09-26 00:35:21 +02:00
compute_preview_image ();
gtk_widget_queue_draw (previewarea);
}
2023-10-30 23:55:30 +01:00
gtk_widget_set_visible (sphere_page, FALSE);
gtk_widget_set_visible (box_page, FALSE);
gtk_widget_set_visible (cylinder_page, FALSE);
if (map_type == MAP_SPHERE)
gtk_widget_set_visible (sphere_page, TRUE);
else if (map_type == MAP_BOX)
gtk_widget_set_visible (box_page, TRUE);
else if (map_type == MAP_CYLINDER)
gtk_widget_set_visible (cylinder_page, TRUE);
2023-09-26 00:35:21 +02:00
}
/******************************************/
/* Main window "Preview!" button callback */
/******************************************/
static void
preview_callback (GtkWidget *widget,
gpointer data)
{
2023-10-30 23:55:30 +01:00
PikaProcedureConfig *config = (PikaProcedureConfig *) data;
copy_from_config (config);
2023-09-26 00:35:21 +02:00
compute_preview_image ();
gtk_widget_queue_draw (previewarea);
}
static void
zoomed_callback (PikaZoomModel *model)
{
mapvals.zoom = pika_zoom_model_get_factor (model);
compute_preview_image ();
gtk_widget_queue_draw (previewarea);
}
/******************************/
/* Preview area event handler */
/******************************/
static gint
preview_events (GtkWidget *area,
GdkEvent *event)
{
HVect __attribute__((unused))pos;
/* HMatrix RotMat;
gdouble a,b,c; */
switch (event->type)
{
case GDK_ENTER_NOTIFY:
break;
case GDK_LEAVE_NOTIFY:
break;
case GDK_BUTTON_PRESS:
light_hit = check_light_hit (event->button.x, event->button.y);
if (light_hit == FALSE)
{
pos.x = -(2.0 * (gdouble) event->button.x /
(gdouble) PREVIEW_WIDTH - 1.0);
pos.y = (2.0 * (gdouble) event->button.y /
(gdouble) PREVIEW_HEIGHT - 1.0);
/*ArcBall_Mouse(pos);
ArcBall_BeginDrag(); */
}
left_button_pressed = TRUE;
break;
case GDK_BUTTON_RELEASE:
if (light_hit == TRUE)
{
compute_preview_image ();
gtk_widget_queue_draw (previewarea);
}
else
{
pos.x = -(2.0 * (gdouble) event->button.x /
(gdouble) PREVIEW_WIDTH - 1.0);
pos.y = (2.0 * (gdouble) event->button.y /
(gdouble) PREVIEW_HEIGHT - 1.0);
/*ArcBall_Mouse(pos);
ArcBall_EndDrag(); */
}
left_button_pressed = FALSE;
break;
case GDK_MOTION_NOTIFY:
if (left_button_pressed == TRUE)
{
if (light_hit == TRUE)
{
gint live = mapvals.livepreview;
mapvals.livepreview = FALSE;
update_light (event->motion.x, event->motion.y);
update_light_pos_entries ();
mapvals.livepreview = live;
gtk_widget_queue_draw (previewarea);
}
else
{
pos.x = -(2.0 * (gdouble) event->motion.x /
(gdouble) PREVIEW_WIDTH - 1.0);
pos.y = (2.0 * (gdouble) event->motion.y /
(gdouble) PREVIEW_HEIGHT - 1.0);
/* ArcBall_Mouse(pos);
ArcBall_Update();
ArcBall_Values(&a,&b,&c);
Alpha+=RadToDeg(-a);
Beta+RadToDeg(-b);
Gamma+=RadToDeg(-c);
if (Alpha>180) Alpha-=360;
if (Alpha<-180) Alpha+=360;
if (Beta>180) Beta-=360;
if (Beta<-180) Beta+=360;
if (Gamma>180) Gamma-=360;
if (Gamma<-180) Gamma+=360;
UpdateAngleSliders(); */
}
}
break;
default:
break;
}
return FALSE;
}
/********************************/
/* Create and show main dialog. */
/********************************/
gboolean
2023-10-30 23:55:30 +01:00
main_dialog (PikaProcedure *procedure,
PikaProcedureConfig *config,
PikaDrawable *drawable)
2023-09-26 00:35:21 +02:00
{
GtkWidget *main_hbox;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *frame;
GtkWidget *button;
GtkWidget *toggle;
PikaZoomModel *model;
2023-10-30 23:55:30 +01:00
GtkWidget *map_combo;
GtkWidget *combo;
2023-09-26 00:35:21 +02:00
gboolean run = FALSE;
pika_ui_init (PLUG_IN_BINARY);
2023-10-30 23:55:30 +01:00
appwin = pika_procedure_dialog_new (procedure,
PIKA_PROCEDURE_CONFIG (config),
_("Map to Object"));
2023-09-26 00:35:21 +02:00
/* Create the Preview */
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
gtk_widget_show (vbox);
/* Add preview widget and various buttons to the first part */
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
gtk_widget_realize (appwin);
previewarea = gtk_drawing_area_new ();
gtk_widget_set_size_request (previewarea, PREVIEW_WIDTH, PREVIEW_HEIGHT);
gtk_widget_set_events (previewarea, (GDK_EXPOSURE_MASK |
GDK_BUTTON1_MOTION_MASK |
GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK));
gtk_container_add (GTK_CONTAINER (frame), previewarea);
gtk_widget_show (previewarea);
g_signal_connect (previewarea, "event",
G_CALLBACK (preview_events),
previewarea);
g_signal_connect (previewarea, "draw",
G_CALLBACK (preview_draw),
previewarea);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
button = gtk_button_new_with_mnemonic (_("_Preview!"));
g_object_set (gtk_bin_get_child (GTK_BIN (button)),
"margin-start", 2,
"margin-end", 2,
NULL);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
g_signal_connect (button, "clicked",
G_CALLBACK (preview_callback),
2023-10-30 23:55:30 +01:00
config);
2023-09-26 00:35:21 +02:00
pika_help_set_help_data (button, _("Recompute preview image"), NULL);
model = pika_zoom_model_new ();
pika_zoom_model_set_range (model, 0.25, 1.0);
pika_zoom_model_zoom (model, PIKA_ZOOM_TO, mapvals.zoom);
button = pika_zoom_button_new (model, PIKA_ZOOM_IN, GTK_ICON_SIZE_MENU);
gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
button = pika_zoom_button_new (model, PIKA_ZOOM_OUT, GTK_ICON_SIZE_MENU);
gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
g_signal_connect (model, "zoomed",
G_CALLBACK (zoomed_callback),
NULL);
toggle = gtk_check_button_new_with_mnemonic (_("Show _wireframe"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), mapvals.showgrid);
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_widget_show (toggle);
g_signal_connect (toggle, "toggled",
G_CALLBACK (toggle_update),
&mapvals.showgrid);
toggle = gtk_check_button_new_with_mnemonic (_("Update preview _live"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), mapvals.livepreview);
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_widget_show (toggle);
g_signal_connect (toggle, "toggled",
G_CALLBACK (toggle_update),
&mapvals.livepreview);
2023-10-30 23:55:30 +01:00
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"options-tab", _("O_ptions"), FALSE, TRUE);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"light-tab", _("Li_ght"), FALSE, TRUE);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"viewpoint-tab", _("_Viewpoint"), FALSE, TRUE);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"material-tab", _("_Material"), FALSE, TRUE);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"orientation-tab", _("Orient_ation"),
FALSE, TRUE);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"sphere-tab", _("Sp_here"), FALSE, TRUE);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"box-tab", _("_Box"), FALSE, TRUE);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"cylinder-tab", _("C_ylinder"), FALSE, TRUE);
/* Options Tab */
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"general-options", _("General Options"),
FALSE, FALSE);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin), "general-box",
"map-type",
"transparent-background",
"tiled",
"new-image",
"new-layer",
NULL);
map_combo = pika_procedure_dialog_get_widget (PIKA_PROCEDURE_DIALOG (appwin),
"map-type", G_TYPE_NONE);
g_signal_connect (map_combo, "value-changed",
G_CALLBACK (mapmenu_callback),
config);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"options-frame",
"general-options", FALSE,
"general-box");
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"depth", 1.0);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin), "options-box",
"options-frame",
"antialiasing",
"depth",
"threshold",
NULL);
g_signal_connect (config, "notify::transparent-background",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::tiled",
G_CALLBACK (update_preview),
config);
/* Light Tab */
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"light-settings-label", _("Light Settings"),
FALSE, FALSE);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"light-settings-box",
"light-type",
"light-color",
NULL);
combo = pika_procedure_dialog_get_widget (PIKA_PROCEDURE_DIALOG (appwin),
"light-type", G_TYPE_NONE);
g_signal_connect (combo, "value-changed",
G_CALLBACK (lightmenu_callback),
config);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"light-frame",
"light-settings-label", FALSE,
"light-settings-box");
/* Depending on light settings, only one of these are visible */
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"vector-label", _("Direction Vector"),
FALSE, FALSE);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"vector-box",
"light-direction-x",
"light-direction-y",
"light-direction-z",
NULL);
dirlightwid = pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"vector-frame",
"vector-label", FALSE,
"vector-box");
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"position-label", _("Position"),
FALSE, FALSE);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"position-box",
"light-position-x",
"light-position-y",
"light-position-z",
NULL);
pointlightwid = pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"position-frame",
"position-label", FALSE,
"position-box");
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin), "light-box",
"light-frame",
"vector-frame",
"position-frame",
NULL);
g_signal_connect (config, "notify::light-color",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::light-direction-x",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::light-direction-y",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::light-direction-z",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::light-position-x",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::light-position-y",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::light-position-z",
G_CALLBACK (update_preview),
config);
lightmenu_callback (combo, config);
/* Viewpoint Tab */
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"viewpoint-position-label", _("Viewpoint Position"),
FALSE, FALSE);
hbox = pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"viewpoint-position-box",
"viewpoint-x",
"viewpoint-y",
"viewpoint-z",
NULL);
gtk_orientable_set_orientation (GTK_ORIENTABLE (hbox),
GTK_ORIENTATION_HORIZONTAL);
pointlightwid = pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"viewpoint-position-frame",
"viewpoint-position-label", FALSE,
"viewpoint-position-box");
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"first-axis-x", 1.0);
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"first-axis-y", 1.0);
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"first-axis-z", 1.0);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"first-axis-label", _("First Axis"),
FALSE, FALSE);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"first-axis-box",
"first-axis-x",
"first-axis-y",
"first-axis-z",
NULL);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"first-axis-frame",
"first-axis-label", FALSE,
"first-axis-box");
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"second-axis-x", 1.0);
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"second-axis-y", 1.0);
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"second-axis-z", 1.0);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"second-axis-label", _("Second Axis"),
FALSE, FALSE);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"second-axis-box",
"second-axis-x",
"second-axis-y",
"second-axis-z",
NULL);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"second-axis-frame",
"second-axis-label", FALSE,
"second-axis-box");
hbox = pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"axis-box",
"first-axis-frame",
"second-axis-frame",
NULL);
gtk_orientable_set_orientation (GTK_ORIENTABLE (hbox),
GTK_ORIENTATION_HORIZONTAL);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"viewpoint-box",
"viewpoint-position-frame",
"axis-box",
NULL);
g_signal_connect (config, "notify::viewpoint-x",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::viewpoint-y",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::viewpoint-z",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::first-axis-x",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::first-axis-y",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::first-axis-z",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::second-axis-x",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::second-axis-y",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::second-axis-z",
G_CALLBACK (update_preview),
config);
/* Material Tab */
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"intensity-label", _("Intensity Levels"),
FALSE, FALSE);
/* TODO: Restore icons */
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"intensity-box",
"ambient-intensity",
"diffuse-intensity",
NULL);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"intensity-frame",
"intensity-label", FALSE,
"intensity-box");
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"reflexivity-label", _("Intensity Levels"),
FALSE, FALSE);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"reflexivity-box",
"diffuse-reflectivity",
"specular-reflectivity",
"highlight",
NULL);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"reflexivity-frame",
"reflexivity-label", FALSE,
"reflexivity-box");
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"material-box",
"intensity-frame",
"reflexivity-frame",
NULL);
g_signal_connect (config, "notify::ambient-intensity",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::diffuse-intensity",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::diffuse-reflectivity",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::specular-reflectivity",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::highlight",
G_CALLBACK (update_preview),
config);
/* Orientation Tab */
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"position-x", 1.0);
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"position-y", 1.0);
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"position-z", 1.0);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"orientation-position-label", _("Position"),
FALSE, FALSE);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"orientation-position-box",
"position-x",
"position-y",
"position-z",
NULL);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"orientation-position-frame",
"orientation-position-label", FALSE,
"orientation-position-box");
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"rotation-angle-x", 1.0);
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"rotation-angle-y", 1.0);
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"rotation-angle-z", 1.0);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"rotation-angle-label", _("Rotation"),
FALSE, FALSE);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"rotation-angle-box",
"rotation-angle-x",
"rotation-angle-y",
"rotation-angle-z",
NULL);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"rotation-angle-frame",
"rotation-angle-label", FALSE,
"rotation-angle-box");
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"orientation-box",
"orientation-position-frame",
"rotation-angle-frame",
NULL);
g_signal_connect (config, "notify::position-x",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::position-y",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::position-z",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::rotation-angle-x",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::rotation-angle-y",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::rotation-angle-z",
G_CALLBACK (update_preview),
config);
/* Sphere Tab */
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"sphere-label", _("Size"),
FALSE, FALSE);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"sphere-frame",
"sphere-label", FALSE,
"sphere-radius");
g_signal_connect (config, "notify::sphere-radius",
G_CALLBACK (update_preview),
config);
/* Box Tab */
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"box-drawable-label", _("Map Images to Box Faces"),
FALSE, FALSE);
pika_procedure_dialog_fill_flowbox (PIKA_PROCEDURE_DIALOG (appwin),
"box-drawable-box",
"box-front-drawable",
"box-back-drawable",
"box-top-drawable",
"box-bottom-drawable",
"box-left-drawable",
"box-right-drawable",
NULL);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"box-drawable-frame",
"box-drawable-label", FALSE,
"box-drawable-box");
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"x-scale", 1.0);
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"y-scale", 1.0);
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"z-scale", 1.0);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"box-scale-box",
"x-scale",
"y-scale",
"z-scale",
NULL);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"box-box",
"box-drawable-frame",
"box-scale-box",
NULL);
g_signal_connect (config, "notify::box-front-drawable",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::box-back-drawable",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::box-top-drawable",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::box-bottom-drawable",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::box-left-drawable",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::box-right-drawable",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::x-scale",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::y-scale",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::z-scale",
G_CALLBACK (update_preview),
config);
/* Cylinder Tab */
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"cyl-drawable-label", _("Images for the Cap Faces"),
FALSE, FALSE);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"cyl-drawable-box",
"cyl-top-drawable",
"cyl-bottom-drawable",
NULL);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (appwin),
"cyl-drawable-frame",
"cyl-drawable-label", FALSE,
"cyl-drawable-box");
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"cylinder-radius", 1.0);
pika_procedure_dialog_get_scale_entry (PIKA_PROCEDURE_DIALOG (appwin),
"cylinder-length", 1.0);
pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (appwin),
"cyl-size-label", _("Size"),
FALSE, FALSE);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"cyl-size-box",
"cylinder-radius",
"cylinder-length",
NULL);
pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"cylinder-box",
"cyl-drawable-frame",
"cyl-size-box",
NULL);
g_signal_connect (config, "notify::cyl-top-drawable",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::cyl-bottom-drawable",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::cylinder-radius",
G_CALLBACK (update_preview),
config);
g_signal_connect (config, "notify::cylinder-length",
G_CALLBACK (update_preview),
config);
options_note_book =
GTK_NOTEBOOK (pika_procedure_dialog_fill_notebook (PIKA_PROCEDURE_DIALOG (appwin),
"main-notebook",
"options-tab", "options-box",
"light-tab", "light-box",
"viewpoint-tab", "viewpoint-box",
"orientation-tab", "orientation-box",
"material-tab", "material-box",
"sphere-tab", "sphere-frame",
"box-tab", "box-box",
"cylinder-tab", "cylinder-box",
NULL));
/* Save reference to tabs for hiding/showing */
sphere_page = gtk_notebook_get_nth_page (options_note_book, 5);
box_page = gtk_notebook_get_nth_page (options_note_book, 6);
cylinder_page = gtk_notebook_get_nth_page (options_note_book, 7);
mapmenu_callback (map_combo, config);
/* Create overall layout */
main_hbox = pika_procedure_dialog_fill_box (PIKA_PROCEDURE_DIALOG (appwin),
"main-hbox",
"main-notebook",
NULL);
gtk_orientable_set_orientation (GTK_ORIENTABLE (main_hbox),
GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start (GTK_BOX (main_hbox), vbox, FALSE, FALSE, 0);
gtk_box_reorder_child (GTK_BOX (main_hbox), vbox, 0);
pika_procedure_dialog_fill (PIKA_PROCEDURE_DIALOG (appwin), "main-hbox", NULL);
2023-09-26 00:35:21 +02:00
gtk_widget_show (appwin);
{
GdkCursor *cursor;
cursor = gdk_cursor_new_for_display (gtk_widget_get_display (previewarea),
GDK_HAND2);
gdk_window_set_cursor (gtk_widget_get_window (previewarea), cursor);
g_object_unref (cursor);
}
2023-10-30 23:55:30 +01:00
copy_from_config (config);
image_setup (drawable, TRUE, config);
2023-09-26 00:35:21 +02:00
compute_preview_image ();
2023-10-30 23:55:30 +01:00
run = pika_procedure_dialog_run (PIKA_PROCEDURE_DIALOG (appwin));
2023-09-26 00:35:21 +02:00
gtk_widget_destroy (appwin);
if (preview_rgb_data)
g_free (preview_rgb_data);
if (preview_surface)
cairo_surface_destroy (preview_surface);
return run;
}