diff --git a/src/sview/grid.c b/src/sview/grid.c index 378584e7a683768d961cc0be93c47e7a9d224f73..fa1a96cf0092a6416d623dec86aa3b4e14c2cac0 100644 --- a/src/sview/grid.c +++ b/src/sview/grid.c @@ -1050,10 +1050,9 @@ extern char *change_grid_color(List button_list, int start, int end, itr = list_iterator_create(button_list); while ((grid_button = list_next(itr))) { - if (start != -1) - if ((grid_button->inx < start) - || (grid_button->inx > end)) - continue; + if ((start != -1) && + ((grid_button->inx < start) || (grid_button->inx > end))) + continue; _change_button_color(grid_button, color_inx, new_col, color, only_change_unused, state_override); } @@ -1062,6 +1061,50 @@ extern char *change_grid_color(List button_list, int start, int end, return sview_colors[color_inx]; } +/* This variation of change_grid_color() is faster when changing many + * button colors at the same time since we can issue a single call to + * _change_button_color() and eliminate a nested loop. */ +extern void change_grid_color_array(List button_list, int array_len, + int *color_inx, bool *color_set_flag, + bool only_change_unused, + enum node_states state_override) +{ + ListIterator itr = NULL; + grid_button_t *grid_button = NULL; + GdkColor color; + char *new_col = NULL; + + if (!button_list) + return; + + itr = list_iterator_create(button_list); + while ((grid_button = list_next(itr))) { + if ((grid_button->inx < 0) || (grid_button->inx >= array_len)) + continue; + if (!color_set_flag[grid_button->inx]) + continue; + + if (color_inx[grid_button->inx] >= 0) { + color_inx[grid_button->inx] %= sview_colors_cnt; + new_col = sview_colors[color_inx[grid_button->inx]]; + } else if (color_inx[grid_button->inx] == MAKE_BLACK) { + new_col = blank_color; + } else if (color_inx[grid_button->inx] == MAKE_TOPO_1) { + new_col = topo1_color; + } else if (color_inx[grid_button->inx] == MAKE_TOPO_2) { + new_col = topo2_color; + } else + new_col = white_color; + gdk_color_parse(new_col, &color); + + _change_button_color(grid_button, color_inx[grid_button->inx], + new_col, color, only_change_unused, + state_override); + } + list_iterator_destroy(itr); + return; +} + extern void highlight_grid(GtkTreeView *tree_view, int node_inx_id, int color_inx_id, List button_list) { diff --git a/src/sview/node_info.c b/src/sview/node_info.c index 79ed446f4f8e960826775713b63c3568ea3f8333..1179e9a8d1cb129a13ea78b7e7e80cb3ce4f5865 100644 --- a/src/sview/node_info.c +++ b/src/sview/node_info.c @@ -1255,6 +1255,9 @@ display_it: &path, &focus_column); } if (!path || working_sview_config.grid_topological) { + int array_size = node_info_ptr->record_count; + int *color_inx = xmalloc(sizeof(int) * array_size); + bool *color_set_flag = xmalloc(sizeof(bool) * array_size); itr = list_iterator_create(info_list); while ((sview_node_info_ptr = list_next(itr))) { if (g_topo_info_msg_ptr) { @@ -1269,11 +1272,15 @@ display_it: } } else b_color_ndx = i; - change_grid_color(grid_button_list, i, i, - b_color_ndx, true, 0); + color_set_flag[i] = true; + color_inx[i] = b_color_ndx; i++; } list_iterator_destroy(itr); + change_grid_color_array(grid_button_list, array_size, + color_inx, color_set_flag, true, 0); + xfree(color_inx); + xfree(color_set_flag); } else highlight_grid(GTK_TREE_VIEW(display_widget), SORTID_POS, (int)NO_VAL, grid_button_list); diff --git a/src/sview/sview.h b/src/sview/sview.h index 44163326d7e6085a28ace7cbbb95a9936609f6d3..230c0937b46c97e6f280d02b6a2f3885db439cf6 100644 --- a/src/sview/sview.h +++ b/src/sview/sview.h @@ -400,6 +400,10 @@ extern grid_button_t *create_grid_button_from_another( extern char *change_grid_color(List button_list, int start, int end, int color_inx, bool change_unused, enum node_states state_override); +extern void change_grid_color_array(List button_list, int array_len, + int *color_inx, bool *color_set_flag, + bool only_change_unused, + enum node_states state_override); extern void highlight_grid(GtkTreeView *tree_view, int node_inx_id, int color_inx_id, List button_list); extern void highlight_grid_range(int start, int end, List button_list);