static void ShowSelectedWidget(txt_scrollpane_t *scrollpane) { txt_widget_t *selected; selected = TXT_GetSelectedWidget(scrollpane->child); // Scroll up or down? if (selected->y <= scrollpane->widget.y) { scrollpane->y -= scrollpane->widget.y - selected->y; } else if ((signed) (selected->y + selected->h) > (signed) (scrollpane->widget.y + scrollpane->h)) { scrollpane->y += (selected->y + selected->h) - (scrollpane->widget.y + scrollpane->h); } // Scroll left or right? if (selected->x <= scrollpane->widget.x) { scrollpane->x -= scrollpane->widget.x - selected->x; } else if ((signed) (selected->x + selected->w) > (signed) (scrollpane->widget.x + scrollpane->w)) { scrollpane->x += (selected->x + selected->w) - (scrollpane->widget.x + scrollpane->w); } }
txt_widget_t *TXT_GetSelectedWidget(TXT_UNCAST_ARG(table)) { TXT_CAST_ARG(txt_table_t, table); txt_widget_t *result; int index; index = table->selected_y * table->columns + table->selected_x; result = NULL; if (index >= 0 && index < table->num_widgets) { result = table->widgets[index]; if (!IsActualWidget(result)) { result = NULL; } } if (result != NULL && result->widget_class == &txt_table_class) { result = TXT_GetSelectedWidget(result); } return result; }