GTK+: Add things to shader parameters dialog:

Spin buttons next to sliders for precise control.
Save as box to save a new preset.
This commit is contained in:
Brandon Wright 2019-01-31 16:33:17 -06:00
parent c9f66cf910
commit 0cb166862f
3 changed files with 181 additions and 100 deletions

View File

@ -113,6 +113,8 @@ int Snes9xConfig::load_defaults ()
window_height = -1;
preferences_width = -1;
preferences_height = -1;
shader_parameters_width = -1;
shader_parameters_height = -1;
sram_directory.clear ();
export_directory.clear ();
savestate_directory.clear ();
@ -305,6 +307,8 @@ int Snes9xConfig::save_config_file ()
cf.SetInt (z"MainHeight", window_height);
cf.SetInt (z"PreferencesWidth", preferences_width);
cf.SetInt (z"PreferencesHeight", preferences_height);
cf.SetInt (z"ShaderParametersWidth", shader_parameters_width);
cf.SetInt (z"ShaderParametersHeight", shader_parameters_height);
outbool (cf, z"UIVisible", ui_visible);
outbool (cf, z"StatusBarVisible", statusbar_visible);
if (default_esc_behavior != ESC_TOGGLE_MENUBAR)
@ -535,6 +539,8 @@ int Snes9xConfig::load_config_file ()
inint (z"MainHeight", window_height);
inint (z"PreferencesWidth", preferences_width);
inint (z"PreferencesHeight", preferences_height);
inint (z"ShaderParametersWidth", shader_parameters_width);
inint (z"ShaderParametersHeight", shader_parameters_height);
inbool (z"UIVisible", ui_visible);
inbool (z"StatusBarVisible", statusbar_visible);
inbool (z"Fullscreen", fullscreen);

View File

@ -126,6 +126,7 @@ class Snes9xConfig
bool rom_loaded;
int window_width, window_height;
int preferences_width, preferences_height;
int shader_parameters_width, shader_parameters_height;
bool pause_emulation_on_switch;
int num_threads;
bool screensaver_needs_reset;

View File

@ -58,6 +58,11 @@ static void dialog_response (GtkDialog *pdialog, gint response_id, gpointer user
{
std::vector<GLSLParam> *params = (std::vector<GLSLParam> *)user_data;
int width, height;
gtk_window_get_size(GTK_WINDOW(pdialog), &width, &height);
gui_config->shader_parameters_width = width;
gui_config->shader_parameters_height = height;
switch (response_id)
{
case GTK_RESPONSE_OK:
@ -89,6 +94,49 @@ static void dialog_response (GtkDialog *pdialog, gint response_id, gpointer user
S9xDeinitUpdate(top_level->last_width, top_level->last_height);
break;
case 15: // Save As
{
auto dialog = gtk_file_chooser_dialog_new(_("Export Shader Preset to:"),
top_level->get_window(),
GTK_FILE_CHOOSER_ACTION_SAVE,
"gtk-cancel", GTK_RESPONSE_CANCEL,
"gtk-save", GTK_RESPONSE_ACCEPT,
NULL);
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
gui_config->last_shader_directory.c_str());
const char *name;
const char *extension;
if (gui_config->shader_filename.find(".slang") != std::string::npos)
{
name = "new.slangp";
extension = "*.slangp";
}
else
{
name = "new.glslp";
extension = "*.glslp";
}
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), name);
gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), true);
auto filter = gtk_file_filter_new();
gtk_file_filter_set_name(filter, _("Shader Preset"));
gtk_file_filter_add_pattern(filter, extension);
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
auto result = gtk_dialog_run(GTK_DIALOG(dialog));
if (result == GTK_RESPONSE_ACCEPT)
{
auto filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
S9xDisplayGetDriver()->save(filename);
g_free(filename);
}
gtk_widget_destroy(dialog);
break;
}
default:
break;
}
@ -123,6 +171,8 @@ bool gtk_shader_parameters_dialog (GtkWindow *parent)
GTK_DIALOG_DESTROY_WITH_PARENT,
"gtk-cancel",
GTK_RESPONSE_CANCEL,
"gtk-save-as",
15,
"gtk-save",
GTK_RESPONSE_OK,
NULL);
@ -131,11 +181,19 @@ bool gtk_shader_parameters_dialog (GtkWindow *parent)
GtkWidget *scrolled_window;
gtk_widget_set_size_request(dialog, 640, 480);
if (gui_config->shader_parameters_width > 0 && gui_config->shader_parameters_height > 0)
{
gtk_window_resize(GTK_WINDOW(dialog),
gui_config->shader_parameters_width,
gui_config->shader_parameters_height);
}
scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
scrolled_window);
GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
#if GTK_MAJOR_VERSION >= 3
gtk_widget_set_hexpand(scrolled_window, true);
@ -147,7 +205,9 @@ bool gtk_shader_parameters_dialog (GtkWindow *parent)
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
GtkWidget *grid = gtk_grid_new();
gtk_widget_set_margin_end(grid, 5);
gtk_grid_set_row_homogeneous(GTK_GRID(grid), true);
gtk_grid_set_row_spacing(GTK_GRID(grid), 2);
gtk_grid_set_column_spacing(GTK_GRID(grid), 12);
gtk_container_add(GTK_CONTAINER(vbox), grid);
gtk_container_add(GTK_CONTAINER(scrolled_window), vbox);
@ -170,12 +230,19 @@ bool gtk_shader_parameters_dialog (GtkWindow *parent)
}
else
{
GtkWidget *scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, p->min, p->max, p->step);
GtkWidget *spin = gtk_spin_button_new_with_range(p->min, p->max, p->step);
gtk_grid_attach(GTK_GRID(grid), spin, 1, i, 1, 1);
gtk_size_group_add_widget(sizegroup, spin);
int digits = gtk_spin_button_get_digits(GTK_SPIN_BUTTON(spin));
if (digits == 2)
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
GtkAdjustment *adjustment = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(spin));
GtkWidget *scale = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, adjustment);
gtk_widget_set_hexpand(scale, true);
gtk_grid_attach (GTK_GRID (grid), scale, 1, i, 1, 1);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_LEFT);
gtk_scale_set_draw_value (GTK_SCALE (scale), true);
gtk_scale_set_digits (GTK_SCALE (scale), 3);
gtk_grid_attach(GTK_GRID(grid), scale, 2, i, 1, 1);
gtk_scale_set_draw_value(GTK_SCALE(scale), false);
gtk_range_set_value(GTK_RANGE(scale), p->val);
g_signal_connect_data(G_OBJECT(scale),
"value-changed",
@ -187,7 +254,7 @@ bool gtk_shader_parameters_dialog (GtkWindow *parent)
}
#else
GtkWidget *vbox = gtk_vbox_new(false, 5);
GtkWidget *table = gtk_table_new (params->size (), 2, false);
GtkWidget *table = gtk_table_new(params->size(), 3, false);
gtk_table_set_row_spacings(GTK_TABLE(table), 5);
gtk_table_set_col_spacings(GTK_TABLE(table), 12);
gtk_container_add(GTK_CONTAINER(vbox), table);
@ -213,11 +280,18 @@ bool gtk_shader_parameters_dialog (GtkWindow *parent)
}
else
{
GtkWidget *scale = gtk_hscale_new_with_range (p->min, p->max, p->step);
gtk_table_attach (GTK_TABLE (table), scale, 1, 2, i, i + 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), GTK_FILL, 0, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_LEFT);
gtk_scale_set_draw_value (GTK_SCALE (scale), true);
gtk_scale_set_digits (GTK_SCALE (scale), 3);
GtkWidget *spin = gtk_spin_button_new_with_range(p->min, p->max, p->step);
gtk_table_attach(GTK_TABLE(table), spin, 1, 2, i, i + 1, GTK_FILL, GTK_FILL, 0, 0);
gtk_size_group_add_widget(sizegroup, spin);
int digits = gtk_spin_button_get_digits(GTK_SPIN_BUTTON(spin));
if (digits == 2)
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3);
GtkAdjustment *adjustment = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(spin));
GtkWidget *scale = gtk_hscale_new(adjustment);
gtk_table_attach(GTK_TABLE(table), scale, 2, 3, i, i + 1, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), GTK_FILL, 0, 0);
gtk_scale_set_draw_value(GTK_SCALE(scale), false);
gtk_range_set_value(GTK_RANGE(scale), p->val);
g_signal_connect_data(G_OBJECT(scale),
"value-changed",