diff --git a/src/routing-drag-line.c b/src/routing-drag-line.c index c95be02..91020fd 100644 --- a/src/routing-drag-line.c +++ b/src/routing-drag-line.c @@ -40,6 +40,44 @@ static void drag_motion( card->drag_x = x; card->drag_y = y; + + // Retrieve the scrolled window and its child + GtkWindow *win = GTK_WINDOW(card->window_routing); + GtkScrolledWindow *sw = GTK_SCROLLED_WINDOW(gtk_window_get_child(win)); + GtkWidget *child = gtk_scrolled_window_get_child(sw); + + // Get horizontal and vertical adjustments for the scrolled window + GtkAdjustment *hadj = gtk_scrolled_window_get_hadjustment(sw); + GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(sw); + + // Calculate the total scrollable width and height + double w = gtk_adjustment_get_upper(hadj) - + gtk_adjustment_get_page_size(hadj); + double h = gtk_adjustment_get_upper(vadj) - + gtk_adjustment_get_page_size(vadj); + + // Determine the relative size of the scrollable area + double rel_w = gtk_adjustment_get_upper(hadj) - gtk_widget_get_allocated_width(GTK_WIDGET(sw)) + gtk_widget_get_allocated_width(child); + double rel_h = gtk_adjustment_get_upper(vadj) - gtk_widget_get_allocated_height(GTK_WIDGET(sw)) + gtk_widget_get_allocated_height(child); + + // Add margin + rel_w -= 100; + rel_h -= 100; + x -= 50; + y -= 50; + if (x < 0) x = 0; + if (y < 0) y = 0; + if (x > rel_w) x = rel_w; + if (y > rel_h) y = rel_h; + + // Calculate new scroll positions based on mouse coordinates + double new_hpos = (x / rel_w) * w; + double new_vpos = (y / rel_h) * h; + + // Update the scrolled window's position + gtk_adjustment_set_value(vadj, new_vpos); + gtk_adjustment_set_value(hadj, new_hpos); + gtk_widget_queue_draw(card->drag_line); gtk_widget_queue_draw(card->routing_lines); }