This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
FeedbackD-Configuration/src/dialog.c

165 lines
7.2 KiB
C

#include <gtk/gtk.h>
#include <json-glib/json-glib.h>
#include "main.h"
// Context For The Save/Modify Event Dialog
struct save_event_data {
struct event_location *location;
GtkWindow *window;
GtkEntry *name;
GtkStack *stack;
// Sound
GtkWidget *sound;
GtkEntry *sound_name;
// Vibration (Rumble)
GtkWidget *vibration_rumble;
GtkEntry *vibration_rumble_duration;
// Vibration (Periodic)
GtkWidget *vibration_periodic;
GtkEntry *magnitude;
GtkEntry *vibration_periodic_duration;
GtkEntry *fade_in_time;
GtkEntry *fade_in_level;
// LED
GtkWidget *led;
GtkEntry *color;
GtkEntry *frequency;
};
// Save Event Handler
static void on_save_event(__attribute__((unused)) GtkButton *button, struct save_event_data *data) {
JsonObject *event = json_object_new();
int free_obj = 0;
if (data->location->id != -1) {
JsonNode *node = json_array_get_element(data->location->profile, data->location->id);
json_node_set_object(node, event);
free_obj = 1;
} else {
json_array_add_object_element(data->location->profile, event);
}
json_object_set_string_member(event, "event-name", gtk_entry_get_text(data->name));
GtkWidget *visible_widget = gtk_stack_get_visible_child(data->stack);
if (visible_widget == data->sound) {
json_object_set_string_member(event, "type", "Sound");
json_object_set_string_member(event, "effect", gtk_entry_get_text(data->sound_name));
} else if (visible_widget == data->vibration_rumble) {
json_object_set_string_member(event, "type", "VibraRumble");
json_object_set_double_member(event, "duration", g_strtod(gtk_entry_get_text(data->vibration_rumble_duration), NULL));
} else if (visible_widget == data->vibration_periodic) {
json_object_set_string_member(event, "type", "VibraPeriodic");
json_object_set_double_member(event, "magnitude", g_strtod(gtk_entry_get_text(data->magnitude), NULL));
json_object_set_double_member(event, "duration", g_strtod(gtk_entry_get_text(data->vibration_periodic_duration), NULL));
json_object_set_double_member(event, "fade-in-time", g_strtod(gtk_entry_get_text(data->fade_in_time), NULL));
json_object_set_double_member(event, "fade-in-level", g_strtod(gtk_entry_get_text(data->fade_in_level), NULL));
} else if (visible_widget == data->led) {
json_object_set_string_member(event, "type", "Led");
json_object_set_string_member(event, "color", gtk_entry_get_text(data->color));
json_object_set_double_member(event, "frequency", g_strtod(gtk_entry_get_text(data->frequency), NULL));
}
gtk_window_close(GTK_WINDOW(data->window));
reload_profiles(1);
if (free_obj) {
json_object_unref(event);
}
}
// Sets Long In GtkEntry Text Field
static void set_entry_long(GtkEntry *entry, long x) {
gchar *str = g_strdup_printf("%ld", x);
gtk_entry_set_text(entry, str);
g_free(str);
}
// Pre-Fill Dialog With Existing Event Data
static void apply_event_to_dialog(struct save_event_data *data) {
if (data->location->id != -1) {
JsonObject *event = json_array_get_object_element(data->location->profile, data->location->id);
gtk_entry_set_text(data->name, json_object_get_string_member(event, "event-name"));
const gchar *type = json_object_get_string_member(event, "type");
if (g_strcmp0(type, "Sound") == 0) {
gtk_stack_set_visible_child(data->stack, data->sound);
gtk_entry_set_text(data->sound_name, json_object_get_string_member(event, "effect"));
} else if (g_strcmp0(type, "VibraRumble") == 0) {
gtk_stack_set_visible_child(data->stack, data->vibration_rumble);
set_entry_long(data->vibration_rumble_duration, json_object_get_int_member(event, "duration"));
} else if (g_strcmp0(type, "VibraPeriodic") == 0) {
gtk_stack_set_visible_child(data->stack, data->vibration_periodic);
set_entry_long(data->magnitude, json_object_get_int_member(event, "magnitude"));
set_entry_long(data->vibration_periodic_duration, json_object_get_int_member(event, "duration"));
set_entry_long(data->fade_in_time, json_object_get_int_member(event, "fade-in-time"));
set_entry_long(data->fade_in_level, json_object_get_int_member(event, "fade-in-level"));
} else if (g_strcmp0(type, "Led") == 0) {
gtk_stack_set_visible_child(data->stack, data->led);
gtk_entry_set_text(data->color, json_object_get_string_member(event, "color"));
set_entry_long(data->frequency, json_object_get_int_member(event, "frequency"));
}
} else {
gtk_stack_set_visible_child(data->stack, data->sound);
}
}
// Open Create/Modify Event Dialog
void open_dialog(GtkWidget *widget, struct event_location *location, int free_location) {
GtkBuilder *builder = gtk_builder_new();
GError *err = NULL;
if (gtk_builder_add_from_resource(builder, "/dialog_window.glade", &err) == 0) {
g_error("Error Loading UI: %s", err->message);
}
GtkWindow *window = GTK_WINDOW(gtk_builder_get_object(builder, "dialog_window"));
gtk_builder_connect_signals(builder, NULL);
struct save_event_data *data = malloc(sizeof (struct save_event_data));
data->location = location;
data->window = window;
data->name = GTK_ENTRY(gtk_builder_get_object(builder, "name"));
data->stack = GTK_STACK(gtk_builder_get_object(builder, "stack"));
// Sound
data->sound = GTK_WIDGET(gtk_builder_get_object(builder, "sound"));
data->sound_name = GTK_ENTRY(gtk_builder_get_object(builder, "sound-name"));
// Vibration (Rumble)
data->vibration_rumble = GTK_WIDGET(gtk_builder_get_object(builder, "vibration-rumble"));
data->vibration_rumble_duration = GTK_ENTRY(gtk_builder_get_object(builder, "vibration-rumble-duration"));
// Vibration (Periodic)
data->vibration_periodic = GTK_WIDGET(gtk_builder_get_object(builder, "vibration-periodic"));
data->magnitude = GTK_ENTRY(gtk_builder_get_object(builder, "magnitude"));
data->vibration_periodic_duration = GTK_ENTRY(gtk_builder_get_object(builder, "vibration-periodic-duration"));
data->fade_in_time = GTK_ENTRY(gtk_builder_get_object(builder, "fade-in-time"));
data->fade_in_level = GTK_ENTRY(gtk_builder_get_object(builder, "fade-in-level"));
// LED
data->led = GTK_WIDGET(gtk_builder_get_object(builder, "led"));
data->color = GTK_ENTRY(gtk_builder_get_object(builder, "color"));
data->frequency = GTK_ENTRY(gtk_builder_get_object(builder, "frequency"));
g_signal_connect(gtk_builder_get_object(builder, "save"), "clicked", G_CALLBACK(on_save_event), data);
g_signal_connect(window, "destroy", G_CALLBACK(free_userdata), data);
if (free_location) {
g_signal_connect(window, "destroy", G_CALLBACK(free_userdata), location);
}
g_object_unref(builder);
apply_event_to_dialog(data);
GtkWindow *parent_window = GTK_WINDOW(gtk_widget_get_toplevel(widget));
gtk_window_set_application(window, gtk_window_get_application(parent_window));
gtk_window_set_modal(window, 1);
gtk_window_set_transient_for(window, parent_window);
gtk_window_present(window);
}