165 lines
7.2 KiB
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_int_member(event, "duration", strtol(gtk_entry_get_text(data->vibration_rumble_duration), NULL, 10));
|
|
} else if (visible_widget == data->vibration_periodic) {
|
|
json_object_set_string_member(event, "type", "VibraPeriodic");
|
|
json_object_set_int_member(event, "magnitude", strtol(gtk_entry_get_text(data->magnitude), NULL, 10));
|
|
json_object_set_int_member(event, "duration", strtol(gtk_entry_get_text(data->vibration_periodic_duration), NULL, 10));
|
|
json_object_set_int_member(event, "fade-in-time", strtol(gtk_entry_get_text(data->fade_in_time), NULL, 10));
|
|
json_object_set_int_member(event, "fade-in-level", strtol(gtk_entry_get_text(data->fade_in_level), NULL, 10));
|
|
} 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_int_member(event, "frequency", strtol(gtk_entry_get_text(data->frequency), NULL, 10));
|
|
}
|
|
|
|
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);
|
|
} |