From 4559c7245ad9dedb0948da4076b12b16ba0fc703 Mon Sep 17 00:00:00 2001 From: DiSlord Date: Tue, 2 Mar 2021 23:07:39 +0300 Subject: [PATCH] More compact marker drag functions --- nanovna.h | 5 ++++- plot.c | 22 ++++++++-------------- ui.c | 55 ++++++++++++++++++++++++++++++------------------------- 3 files changed, 42 insertions(+), 40 deletions(-) diff --git a/nanovna.h b/nanovna.h index f95714a..a5a6bca 100644 --- a/nanovna.h +++ b/nanovna.h @@ -437,6 +437,9 @@ extern uint16_t graph_bottom; #define GRID_X_TEXT (AREA_WIDTH_NORMAL - 7*5) +// Marker start drag distance (can be bigger for various display resolution) +#define MARKER_PICKUP_DISTANCE 20 + // Smith/polar chart //#define P_CENTER_X (CELLOFFSETX + WIDTH/2) //#define P_CENTER_Y (HEIGHT/2) @@ -697,7 +700,7 @@ void draw_cal_status(void); //void markmap_all_markers(void); -void marker_position(int m, int t, int *x, int *y); +int distance_to_index(int8_t t, uint16_t idx, int16_t x, int16_t y); int search_nearest_index(int x, int y, int t); int marker_search_max(void); diff --git a/plot.c b/plot.c index fb772f8..115d88e 100644 --- a/plot.c +++ b/plot.c @@ -1369,29 +1369,23 @@ markmap_all_markers(void) markmap_upperarea(); } -void -marker_position(int m, int t, int *x, int *y) +int +distance_to_index(int8_t t, uint16_t idx, int16_t x, int16_t y) { - index_t index = trace_index[t][markers[m].index]; - *x = CELL_X(index); - *y = CELL_Y(index); + index_t *index = trace_index[t]; + x-= CELL_X(index[idx]); + y-= CELL_Y(index[idx]); + return x*x + y*y; } int search_nearest_index(int x, int y, int t) { - index_t *index = trace_index[t]; int min_i = -1; - int min_d = 1000; + int min_d = MARKER_PICKUP_DISTANCE * MARKER_PICKUP_DISTANCE; int i; for (i = 0; i < sweep_points; i++) { - int16_t dx = x - CELL_X(index[i]); - int16_t dy = y - CELL_Y(index[i]); - if (dx < 0) dx = -dx; - if (dy < 0) dy = -dy; - if (dx > 20 || dy > 20) - continue; - int d = dx*dx + dy*dy; + int d = distance_to_index(t, i, x , y); if (d < min_d) { min_d = d; min_i = i; diff --git a/ui.c b/ui.c index 4077eaa..3099b93 100644 --- a/ui.c +++ b/ui.c @@ -2777,36 +2777,41 @@ touch_pickup_marker(void) touch_x -= OFFSETX; touch_y -= OFFSETY; - for (m = 0; m < MARKERS_MAX; m++) { - if (!markers[m].enabled) + int i = MARKER_INVALID, mt; + int min_dist = MARKER_PICKUP_DISTANCE * MARKER_PICKUP_DISTANCE; + // Search closest marker to touch position + for (t = 0; t < TRACES_MAX; t++) { + if (!trace[t].enabled) continue; - - for (t = 0; t < TRACES_MAX; t++) { - int x, y; - if (!trace[t].enabled) + for (m = 0; m < MARKERS_MAX; m++) { + if (!markers[m].enabled) continue; - - marker_position(m, t, &x, &y); - x -= touch_x; - y -= touch_y; - if ((x * x + y * y) < 20 * 20) { - if (active_marker != m) { - previous_marker = active_marker; - active_marker = m; - redraw_marker(active_marker); - } - // select trace - uistat.current_trace = t; - select_lever_mode(LM_MARKER); - markers[m].mtype &= ~M_TRACKING; // Disable tracking when dragging marker - // drag marker until release - drag_marker(t, m); - return TRUE; + // Get distance to marker from touch point + int dist = distance_to_index(t, markers[m].index, touch_x, touch_y); + if (dist < min_dist) { + min_dist = dist; + i = m; + mt = t; } } } - - return FALSE; + // Marker not found + if (i == MARKER_INVALID) + return FALSE; + // Marker found, set as active and start drag it + if (active_marker != i) { + previous_marker = active_marker; + active_marker = i; + } + // Disable tracking + markers[i].mtype &= ~M_TRACKING; // Disable tracking when dragging marker + // Leveler mode = marker move + select_lever_mode(LM_MARKER); + // select trace + uistat.current_trace = mt; + // drag marker until release + drag_marker(mt, i); + return TRUE; } static int touch_quick_menu(void)