increase list scroll speed. add list jump start/end. add L2 + scroll to select multiple enrties.
This commit is contained in:
@@ -474,15 +474,29 @@ struct Controller {
|
|||||||
|
|
||||||
void UpdateButtonHeld(u64 buttons, double delta) {
|
void UpdateButtonHeld(u64 buttons, double delta) {
|
||||||
if (m_kdown & buttons) {
|
if (m_kdown & buttons) {
|
||||||
m_step = 50;
|
m_step_max = m_MAX_STEP;
|
||||||
|
m_step = m_INC_STEP;
|
||||||
m_counter = 0;
|
m_counter = 0;
|
||||||
|
m_step_max_counter = 0;
|
||||||
} else if (m_kheld & buttons) {
|
} else if (m_kheld & buttons) {
|
||||||
m_counter += m_step * delta;
|
m_counter += m_step * delta;
|
||||||
|
|
||||||
|
// if we are at the max, ignore the delta and go as fast as the frame rate.
|
||||||
|
if (m_step_max == m_MAX) {
|
||||||
|
m_counter = m_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_counter >= m_MAX) {
|
if (m_counter >= m_MAX) {
|
||||||
m_kdown |= m_kheld & buttons;
|
m_kdown |= m_kheld & buttons;
|
||||||
m_counter = 0;
|
m_counter = 0;
|
||||||
m_step = std::min(m_step + 50, m_MAX_STEP);
|
m_step = std::min(m_step + m_INC_STEP, m_step_max);
|
||||||
|
|
||||||
|
// slowly speed up until we reach 1 button down per frame.
|
||||||
|
m_step_max_counter++;
|
||||||
|
if (m_step_max_counter >= 5) {
|
||||||
|
m_step_max_counter = 0;
|
||||||
|
m_step_max = std::min(m_step_max + m_INC_STEP, m_MAX);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -490,8 +504,12 @@ struct Controller {
|
|||||||
private:
|
private:
|
||||||
static constexpr double m_MAX = 1000;
|
static constexpr double m_MAX = 1000;
|
||||||
static constexpr double m_MAX_STEP = 250;
|
static constexpr double m_MAX_STEP = 250;
|
||||||
double m_step = 50;
|
static constexpr double m_INC_STEP = 50;
|
||||||
|
|
||||||
|
double m_step_max = m_MAX_STEP;
|
||||||
|
double m_step = m_INC_STEP;
|
||||||
double m_counter = 0;
|
double m_counter = 0;
|
||||||
|
int m_step_max_counter = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace sphaira
|
} // namespace sphaira
|
||||||
|
|||||||
@@ -65,11 +65,7 @@ auto List::ScrollDown(s64& index, s64 step, s64 count) -> bool {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index + step < count) {
|
index = std::min(index + step, count - 1);
|
||||||
index += step;
|
|
||||||
} else {
|
|
||||||
index = count - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index != old_index) {
|
if (index != old_index) {
|
||||||
App::PlaySoundEffect(SoundEffect::Scroll);
|
App::PlaySoundEffect(SoundEffect::Scroll);
|
||||||
@@ -103,11 +99,7 @@ auto List::ScrollUp(s64& index, s64 step, s64 count) -> bool {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index >= step) {
|
index = std::max<s64>(0, index - step);
|
||||||
index -= step;
|
|
||||||
} else {
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index != old_index) {
|
if (index != old_index) {
|
||||||
App::PlaySoundEffect(SoundEffect::Scroll);
|
App::PlaySoundEffect(SoundEffect::Scroll);
|
||||||
@@ -169,20 +161,24 @@ void List::OnUpdateGrid(Controller* controller, TouchInfo* touch, s64 index, s64
|
|||||||
const auto page_up_button = GetPageJump() ? (m_row == 1 ? Button::DPAD_LEFT : Button::L2) : (Button::NONE);
|
const auto page_up_button = GetPageJump() ? (m_row == 1 ? Button::DPAD_LEFT : Button::L2) : (Button::NONE);
|
||||||
const auto page_down_button = GetPageJump() ? (m_row == 1 ? Button::DPAD_RIGHT : Button::R2) : (Button::NONE);
|
const auto page_down_button = GetPageJump() ? (m_row == 1 ? Button::DPAD_RIGHT : Button::R2) : (Button::NONE);
|
||||||
|
|
||||||
|
const auto hotkey = m_row == 1 ? controller->GotHeld(Button::R2) : false;
|
||||||
|
const auto end_page = INT32_MAX;
|
||||||
|
const auto hot_page = m_page * 4;
|
||||||
|
|
||||||
if (controller->GotDown(Button::DOWN)) {
|
if (controller->GotDown(Button::DOWN)) {
|
||||||
if (ScrollDown(index, m_row, count)) {
|
if (ScrollDown(index, hotkey ? end_page : m_row, count)) {
|
||||||
callback(false, index);
|
callback(false, index);
|
||||||
}
|
}
|
||||||
} else if (controller->GotDown(Button::UP)) {
|
} else if (controller->GotDown(Button::UP)) {
|
||||||
if (ScrollUp(index, m_row, count)) {
|
if (ScrollUp(index, hotkey ? end_page : m_row, count)) {
|
||||||
callback(false, index);
|
callback(false, index);
|
||||||
}
|
}
|
||||||
} else if (controller->GotDown(page_down_button)) {
|
} else if (controller->GotDown(page_down_button)) {
|
||||||
if (ScrollDown(index, m_page, count)) {
|
if (ScrollDown(index, hotkey ? hot_page : m_page, count)) {
|
||||||
callback(false, index);
|
callback(false, index);
|
||||||
}
|
}
|
||||||
} else if (controller->GotDown(page_up_button)) {
|
} else if (controller->GotDown(page_up_button)) {
|
||||||
if (ScrollUp(index, m_page, count)) {
|
if (ScrollUp(index, hotkey ? hot_page : m_page, count)) {
|
||||||
callback(false, index);
|
callback(false, index);
|
||||||
}
|
}
|
||||||
} else if (m_row > 1 && controller->GotDown(Button::RIGHT)) {
|
} else if (m_row > 1 && controller->GotDown(Button::RIGHT)) {
|
||||||
|
|||||||
@@ -529,12 +529,31 @@ FsView::~FsView() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FsView::Update(Controller* controller, TouchInfo* touch) {
|
void FsView::Update(Controller* controller, TouchInfo* touch) {
|
||||||
m_list->OnUpdate(controller, touch, m_index, m_entries_current.size(), [this](bool touch, auto i) {
|
m_list->OnUpdate(controller, touch, m_index, m_entries_current.size(), [this, controller](bool touch, auto i) {
|
||||||
if (touch && m_index == i) {
|
if (touch && m_index == i) {
|
||||||
FireAction(Button::A);
|
FireAction(Button::A);
|
||||||
} else {
|
} else {
|
||||||
App::PlaySoundEffect(SoundEffect::Focus);
|
App::PlaySoundEffect(SoundEffect::Focus);
|
||||||
|
auto old_index = m_index;
|
||||||
SetIndex(i);
|
SetIndex(i);
|
||||||
|
const auto new_index = m_index;
|
||||||
|
|
||||||
|
// if L2 is helt, select all between old and new index.
|
||||||
|
if (old_index != new_index && controller->GotHeld(Button::L2)) {
|
||||||
|
const auto inc = old_index < new_index ? +1 : -1;
|
||||||
|
|
||||||
|
while (old_index != new_index) {
|
||||||
|
old_index += inc;
|
||||||
|
|
||||||
|
auto& e = GetEntry(old_index);
|
||||||
|
e.selected ^= 1;
|
||||||
|
if (e.selected) {
|
||||||
|
m_selected_count++;
|
||||||
|
} else {
|
||||||
|
m_selected_count--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user