Update routing hover to highlight corresponding source sink
This commit is contained in:
@@ -55,7 +55,7 @@
|
|||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.route-label:hover {
|
.route-label-hover {
|
||||||
background: #801010;
|
background: #801010;
|
||||||
outline: 2px solid #801010;
|
outline: 2px solid #801010;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -308,6 +308,101 @@ static GtkWidget *make_socket_widget(void) {
|
|||||||
return w;
|
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
|
// something was dropped on a routing source
|
||||||
static gboolean dropped_on_src(
|
static gboolean dropped_on_src(
|
||||||
GtkDropTarget *dest,
|
GtkDropTarget *dest,
|
||||||
@@ -605,6 +700,8 @@ static void make_src_routing_widget(
|
|||||||
GtkWidget *box = r_src->widget = gtk_box_new(orientation, 5);
|
GtkWidget *box = r_src->widget = gtk_box_new(orientation, 5);
|
||||||
GtkWidget *socket = r_src->widget2 = make_socket_widget();
|
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
|
// create label for mixer inputs (length > 1) and mixer outputs if
|
||||||
// not talkback (talkback has a button outside the box instead of a
|
// not talkback (talkback has a button outside the box instead of a
|
||||||
// label inside the box)
|
// label inside the box)
|
||||||
@@ -638,6 +735,9 @@ static void make_src_routing_widget(
|
|||||||
GTK_WIDGET(box), GTK_EVENT_CONTROLLER(gesture)
|
GTK_WIDGET(box), GTK_EVENT_CONTROLLER(gesture)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// handle hovering
|
||||||
|
add_routing_hover_controller(box);
|
||||||
|
|
||||||
// handle dragging to or from the box
|
// handle dragging to or from the box
|
||||||
setup_src_drag(r_src);
|
setup_src_drag(r_src);
|
||||||
}
|
}
|
||||||
@@ -670,6 +770,9 @@ static void make_snk_routing_widget(
|
|||||||
GtkWidget *label = gtk_label_new(name);
|
GtkWidget *label = gtk_label_new(name);
|
||||||
gtk_box_append(GTK_BOX(box), label);
|
gtk_box_append(GTK_BOX(box), label);
|
||||||
GtkWidget *socket = r_snk->socket_widget = make_socket_widget();
|
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) {
|
if (orientation == GTK_ORIENTATION_VERTICAL) {
|
||||||
gtk_box_append(GTK_BOX(box), socket);
|
gtk_box_append(GTK_BOX(box), socket);
|
||||||
gtk_widget_set_margin_start(box, 5);
|
gtk_widget_set_margin_start(box, 5);
|
||||||
@@ -691,6 +794,9 @@ static void make_snk_routing_widget(
|
|||||||
GTK_WIDGET(box), GTK_EVENT_CONTROLLER(gesture)
|
GTK_WIDGET(box), GTK_EVENT_CONTROLLER(gesture)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// handle hovering
|
||||||
|
add_routing_hover_controller(box);
|
||||||
|
|
||||||
// handle dragging to or from the box
|
// handle dragging to or from the box
|
||||||
setup_snk_drag(r_snk);
|
setup_snk_drag(r_snk);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user