From 640d02750228f388689b57b7692cf2f293cf43bf Mon Sep 17 00:00:00 2001 From: "Geoffrey D. Bennett" Date: Thu, 26 Dec 2024 23:32:59 +1030 Subject: [PATCH] Update routing hover to highlight corresponding source sink --- src/alsa-scarlett-gui.css | 2 +- src/window-routing.c | 106 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 1 deletion(-) diff --git a/src/alsa-scarlett-gui.css b/src/alsa-scarlett-gui.css index c02ed64..3053d76 100644 --- a/src/alsa-scarlett-gui.css +++ b/src/alsa-scarlett-gui.css @@ -55,7 +55,7 @@ border-radius: 3px; } -.route-label:hover { +.route-label-hover { background: #801010; outline: 2px solid #801010; } diff --git a/src/window-routing.c b/src/window-routing.c index 14c1271..82a07d0 100644 --- a/src/window-routing.c +++ b/src/window-routing.c @@ -308,6 +308,101 @@ static GtkWidget *make_socket_widget(void) { return w; } +static void routing_label_enter( + GtkEventControllerMotion *controller, + double x, double y, + gpointer user_data +) { + GtkWidget *widget = GTK_WIDGET(user_data); + + gtk_widget_add_css_class(widget, "route-label-hover"); + + struct routing_src *r_src = g_object_get_data(G_OBJECT(widget), "routing_src"); + struct routing_snk *r_snk = g_object_get_data(G_OBJECT(widget), "routing_snk"); + + if (r_src) { + struct alsa_card *card = r_src->card; + + for (int i = 0; i < card->routing_snks->len; i++) { + struct routing_snk *r_snk = &g_array_index( + card->routing_snks, struct routing_snk, i + ); + + if (!r_snk->box_widget) + continue; + + if (alsa_get_elem_value(r_snk->elem) == r_src->id) + gtk_widget_add_css_class(r_snk->box_widget, "route-label-hover"); + } + + } else if (r_snk) { + struct alsa_card *card = r_snk->elem->card; + + int r_src_idx = alsa_get_elem_value(r_snk->elem); + + for (int i = 0; i < card->routing_srcs->len; i++) { + struct routing_src *r_src = &g_array_index( + card->routing_srcs, struct routing_src, i + ); + + if (!r_src->widget) + continue; + + if (r_src->id == r_src_idx) + gtk_widget_add_css_class(r_src->widget, "route-label-hover"); + } + } +} + +static void routing_label_leave( + GtkEventControllerMotion *controller, + gpointer user_data +) { + GtkWidget *widget = GTK_WIDGET(user_data); + + gtk_widget_remove_css_class(widget, "route-label-hover"); + + struct routing_src *r_src = g_object_get_data(G_OBJECT(widget), "routing_src"); + struct routing_snk *r_snk = g_object_get_data(G_OBJECT(widget), "routing_snk"); + + if (r_src) { + struct alsa_card *card = r_src->card; + + for (int i = 0; i < card->routing_snks->len; i++) { + struct routing_snk *r_snk = &g_array_index( + card->routing_snks, struct routing_snk, i + ); + + if (!r_snk->box_widget) + continue; + + gtk_widget_remove_css_class(r_snk->box_widget, "route-label-hover"); + } + + } else if (r_snk) { + struct alsa_card *card = r_snk->elem->card; + + for (int i = 0; i < card->routing_srcs->len; i++) { + struct routing_src *r_src = &g_array_index( + card->routing_srcs, struct routing_src, i + ); + + if (!r_src->widget) + continue; + + gtk_widget_remove_css_class(r_src->widget, "route-label-hover"); + } + } +} + +static void add_routing_hover_controller(GtkWidget *widget) { + GtkEventController *motion = gtk_event_controller_motion_new(); + + g_signal_connect(motion, "enter", G_CALLBACK(routing_label_enter), widget); + g_signal_connect(motion, "leave", G_CALLBACK(routing_label_leave), widget); + gtk_widget_add_controller(widget, motion); +} + // something was dropped on a routing source static gboolean dropped_on_src( GtkDropTarget *dest, @@ -605,6 +700,8 @@ static void make_src_routing_widget( GtkWidget *box = r_src->widget = gtk_box_new(orientation, 5); GtkWidget *socket = r_src->widget2 = make_socket_widget(); + g_object_set_data(G_OBJECT(box), "routing_src", r_src); + // create label for mixer inputs (length > 1) and mixer outputs if // not talkback (talkback has a button outside the box instead of a // label inside the box) @@ -638,6 +735,9 @@ static void make_src_routing_widget( GTK_WIDGET(box), GTK_EVENT_CONTROLLER(gesture) ); + // handle hovering + add_routing_hover_controller(box); + // handle dragging to or from the box setup_src_drag(r_src); } @@ -670,6 +770,9 @@ static void make_snk_routing_widget( GtkWidget *label = gtk_label_new(name); gtk_box_append(GTK_BOX(box), label); GtkWidget *socket = r_snk->socket_widget = make_socket_widget(); + + g_object_set_data(G_OBJECT(box), "routing_snk", r_snk); + if (orientation == GTK_ORIENTATION_VERTICAL) { gtk_box_append(GTK_BOX(box), socket); gtk_widget_set_margin_start(box, 5); @@ -691,6 +794,9 @@ static void make_snk_routing_widget( GTK_WIDGET(box), GTK_EVENT_CONTROLLER(gesture) ); + // handle hovering + add_routing_hover_controller(box); + // handle dragging to or from the box setup_snk_drag(r_snk); }