Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 681) +++ trunk/src/data.c (revision 682) @@ -2,7 +2,7 @@ * COPYRIGHT * * camv-rnd - electronics-related CAM viewer - * Copyright (C) 2019 Tibor 'Igor2' Palinkas + * Copyright (C) 2019,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -203,3 +203,9 @@ } } } + +void camv_layer_select(camv_design_t *camv, int idx) +{ + camv->lysel = idx; + rnd_event(&camv->hidlib, CAMV_EVENT_LAYER_SELECTED, "i", idx); +} Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 681) +++ trunk/src/data.h (revision 682) @@ -2,7 +2,7 @@ * COPYRIGHT * * camv-rnd - electronics-related CAM viewer - * Copyright (C) 2019 Tibor 'Igor2' Palinkas + * Copyright (C) 2019,2023 Tibor 'Igor2' Palinkas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -43,6 +43,7 @@ /* data */ vtp0_t layers; /* to camv_layer_t */ + int lysel; /* layer idx (lid) of the currently selected layer */ camv_rtree_box_t bbox; }; @@ -91,6 +92,10 @@ void camv_data_bbox(camv_design_t *camv); +/* Change layer selection. -1 means none selected */ +void camv_layer_select(camv_design_t *camv, int idx); + + #define camv_hid_redraw(camv) rnd_render->invalidate_all(rnd_render) extern char camv_measurement_layer_name[]; Index: trunk/src_plugins/gui/layersel.c =================================================================== --- trunk/src_plugins/gui/layersel.c (revision 681) +++ trunk/src_plugins/gui/layersel.c (revision 682) @@ -2,7 +2,7 @@ * COPYRIGHT * * camv-rnd - electronics-related CAM viewer - * Copyright (C) 2019,2020 Tibor 'Igor2' Palinkas + * Copyright (C) 2019,2020,2023 Tibor 'Igor2' Palinkas * (copied from pcb-rnd by the author) * * This program is free software; you can redistribute it and/or modify @@ -201,7 +201,6 @@ int sub_inited; int wbut_up, wbut_down, wbut_top, wbut_bottom, wbut_load, wbut_remove, wbut_vis, wbut_invis; int lock_vis, lock_sel; - int selected; /* layer idx (lid) of the currently selected layer */ vtp0_t layers; /* -> ls_layer_t */ }; @@ -245,14 +244,14 @@ static void layer_unselect(layersel_ctx_t *ls) { ls_layer_t **lys; - if (ls->selected < 0) + if (ls->camv->lysel < 0) return; - lys = (ls_layer_t **)vtp0_get(&ls->layers, ls->selected, 0); + lys = (ls_layer_t **)vtp0_get(&ls->layers, ls->camv->lysel, 0); if (lys != NULL) rnd_gui->attr_dlg_widget_state(ls->sub.dlg_hid_ctx, (*lys)->wlab, 1); - ls->selected = -1; - rnd_event(&layersel.camv->hidlib, CAMV_EVENT_LAYER_SELECTED, "i", ls->selected); + + camv_layer_select(ls->camv, -1); } static void layer_select_idx(layersel_ctx_t *ls, int idx) @@ -260,13 +259,11 @@ ls_layer_t **lys; layer_unselect(ls); lys = (ls_layer_t **)vtp0_get(&ls->layers, idx, 0); - if (lys != NULL) { + if (lys != NULL) rnd_gui->attr_dlg_widget_state(ls->sub.dlg_hid_ctx, (*lys)->wlab, 2); - ls->selected = idx; - } else - ls->selected = -1; - rnd_event(&layersel.camv->hidlib, CAMV_EVENT_LAYER_SELECTED, "i", ls->selected); + idx = -1; + camv_layer_select(layersel.camv, idx); } static void layer_select(ls_layer_t *lys) @@ -487,7 +484,7 @@ static void layer_move(int dst) { - int step, n, src = layersel.selected; + int step, n, src = layersel.camv->lysel; camv_design_t *camv = layersel.camv; camv_layer_t *dst_ly = camv->layers.array[src]; @@ -503,7 +500,7 @@ static void layer_del(void) { - int src = layersel.selected; + int src = layersel.camv->lysel; camv_layer_t *ly = layersel.camv->layers.array[src]; vtp0_remove(&layersel.camv->layers, src, 1); @@ -510,15 +507,14 @@ vtp0_remove(&layersel.layers, src, 1); camv_layer_destroy(ly); - layersel.selected = -1; + camv_layer_select(layersel.camv, -1); rnd_event(&layersel.camv->hidlib, CAMV_EVENT_LAYERS_CHANGED, NULL); - rnd_event(&layersel.camv->hidlib, CAMV_EVENT_LAYER_SELECTED, "i", layersel.selected); camv_hid_redraw(layersel.camv); } static void layer_set_color(const rnd_color_t clr) { - int src = layersel.selected; + int src = layersel.camv->lysel; camv_layer_t *ly = layersel.camv->layers.array[src]; ly->color = clr; @@ -527,7 +523,7 @@ static void layer_rename(const char *name) { - int src = layersel.selected; + int src = layersel.camv->lysel; camv_layer_t *ly = layersel.camv->layers.array[src]; free(ly->short_name); @@ -546,9 +542,9 @@ camv_layer_destroy(ly); } - layersel.selected = -1; + camv_layer_select(layersel.camv, -1); rnd_event(&layersel.camv->hidlib, CAMV_EVENT_LAYERS_CHANGED, NULL); - rnd_event(&layersel.camv->hidlib, CAMV_EVENT_LAYER_SELECTED, "i", layersel.selected); + camv_hid_redraw(layersel.camv); } @@ -577,27 +573,27 @@ RND_ACT_CONVARG(1, FGW_STR, Layer, cmd = argv[1].val.str); if (strcmp(cmd, "down") == 0) { - if (layersel.selected < 0) goto nolayer; - if (layersel.selected == 0) goto nop; - layer_move(layersel.selected-1); + if (camv->lysel < 0) goto nolayer; + if (camv->lysel == 0) goto nop; + layer_move(camv->lysel-1); } else if (strcmp(cmd, "up") == 0) { - if (layersel.selected < 0) goto nolayer; - if (layersel.selected == camv->layers.used-1) goto nop; - layer_move(layersel.selected+1); + if (camv->lysel < 0) goto nolayer; + if (camv->lysel == camv->layers.used-1) goto nop; + layer_move(camv->lysel+1); } else if (strcmp(cmd, "bottom") == 0) { - if (layersel.selected < 0) goto nolayer; - if (layersel.selected == 0) goto nop; + if (camv->lysel < 0) goto nolayer; + if (camv->lysel == 0) goto nop; layer_move(0); } else if (strcmp(cmd, "top") == 0) { - if (layersel.selected < 0) goto nolayer; - if (layersel.selected == camv->layers.used-1) goto nop; + if (camv->lysel < 0) goto nolayer; + if (camv->lysel == camv->layers.used-1) goto nop; layer_move(camv->layers.used-1); } else if (strcmp(cmd, "del") == 0) { - if (layersel.selected < 0) goto nolayer; + if (camv->lysel < 0) goto nolayer; layer_del(); } else if (strcmp(cmd, "all-visible") == 0) { @@ -607,11 +603,11 @@ all_vis(camv, 0); } else if (rnd_strcasecmp(cmd, "delall") == 0) { - if (layersel.selected < 0) goto nolayer; + if (camv->lysel < 0) goto nolayer; layer_del_all(); } else if (rnd_strcasecmp(cmd, "getidx") == 0) { - RND_ACT_IRES(layersel.selected); + RND_ACT_IRES(camv->lysel); return 0; } else if (rnd_strcasecmp(cmd, "select") == 0) {