bool TBSelectList::ChangeValue(SPECIAL_KEY key) { if (!m_source || !m_layout.GetContentRoot()->GetFirstChild()) return false; bool forward; if (key == TB_KEY_HOME || key == TB_KEY_DOWN) forward = true; else if (key == TB_KEY_END || key == TB_KEY_UP) forward = false; else return false; TBWidget *item_root = m_layout.GetContentRoot(); TBWidget *current = GetItemWidget(m_value); TBWidget *origin = nullptr; if (key == TB_KEY_HOME || (!current && key == TB_KEY_DOWN)) current = item_root->GetFirstChild(); else if (key == TB_KEY_END || (!current && key == TB_KEY_UP)) current = item_root->GetLastChild(); else origin = current; while (current) { if (current != origin && !current->GetDisabled()) break; current = forward ? current->GetNext() : current->GetPrev(); } // Select and focus what we found if (current) { SetValue(current->data.GetInt()); return true; } return false; }