diff options
Diffstat (limited to 'src/Body.cpp')
-rw-r--r-- | src/Body.cpp | 137 |
1 files changed, 88 insertions, 49 deletions
diff --git a/src/Body.cpp b/src/Body.cpp index 293f516..667232e 100644 --- a/src/Body.cpp +++ b/src/Body.cpp @@ -136,6 +136,10 @@ namespace QuickMedia { item_background.setFillColor(sf::Color(55, 60, 68)); sf::Vector2f loading_icon_size(loading_icon.getTexture()->getSize().x, loading_icon.getTexture()->getSize().y); loading_icon.setOrigin(loading_icon_size.x * 0.5f, loading_icon_size.y * 0.5f); + const char *qm_enable_touch = getenv("QM_ENABLE_TOUCH"); + if(qm_enable_touch && qm_enable_touch[0] == '1') { + experimental_use_touch = true; + } } // TODO: Make this work with wraparound enabled? @@ -372,35 +376,48 @@ namespace QuickMedia { } bool Body::on_event(const sf::RenderWindow &window, const sf::Event &event) { - #if 0 + if(!experimental_use_touch) + return false; + if(!mouse_state_set) { mouse_state_set = true; mouse_left_pressed = sf::Mouse::isButtonPressed(sf::Mouse::Left); - if(mouse_left_pressed) { - mouse_pos_raw = sf::Mouse::getPosition(window); - mouse_pos = sf::Vector2f(mouse_pos_raw.x, mouse_pos_raw.y); - prev_mouse_pos = mouse_pos; - return true; + if(sf::Mouse::isButtonPressed(sf::Mouse::Left)) { + auto mpos = sf::Mouse::getPosition(window); + if(sf::FloatRect(body_pos, body_size).contains(sf::Vector2f(mpos.x, mpos.y))) { + mouse_left_pressed = true; + mouse_pos_raw = sf::Mouse::getPosition(window); + mouse_pos = sf::Vector2f(mouse_pos_raw.x, mouse_pos_raw.y); + prev_mouse_pos = mouse_pos; + mouse_click_pos = mouse_pos; + mouse_press_pixels_moved_abs = 0.0; + return true; + } } } - if(event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left && !mouse_left_pressed) { + if(event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left && !mouse_left_pressed && sf::FloatRect(body_pos, body_size).contains(sf::Vector2f(event.mouseButton.x, event.mouseButton.y))) { mouse_left_pressed = true; mouse_pos_raw.x = event.mouseButton.x; mouse_pos_raw.y = event.mouseButton.y; mouse_pos = sf::Vector2f(mouse_pos_raw.x, mouse_pos_raw.y); prev_mouse_pos = mouse_pos; + mouse_click_pos = mouse_pos; + mouse_press_pixels_moved_abs = 0.0; return true; } else if(event.type == sf::Event::MouseButtonReleased && event.mouseButton.button == sf::Mouse::Left && mouse_left_pressed) { mouse_left_pressed = false; + mouse_left_clicked = true; + mouse_release_pos = sf::Vector2f(event.mouseButton.x, event.mouseButton.y); return true; } else if(event.type == sf::Event::MouseMoved && mouse_left_pressed) { + sf::Vector2i mouse_pos_diff(event.mouseMove.x - mouse_pos_raw.x, event.mouseMove.y - mouse_pos_raw.y); + mouse_press_pixels_moved_abs += std::sqrt(mouse_pos_diff.x*mouse_pos_diff.x + mouse_pos_diff.y*mouse_pos_diff.y); mouse_pos_raw.x = event.mouseMove.x; mouse_pos_raw.y = event.mouseMove.y; return true; } - #endif return false; } @@ -415,51 +432,60 @@ namespace QuickMedia { sf::Vector2f scissor_size = size; const float start_y = pos.y; + body_pos = pos; + body_size = size; + elapsed_time_sec = draw_timer.getElapsedTime().asSeconds(); -#if 0 - float frame_time = frame_timer.restart().asSeconds(); - if(frame_time > 2.0f) - frame_time = 2.0f; - - const sf::Vector2f mouse_pos_diff(mouse_pos_raw.x - mouse_pos.x, mouse_pos_raw.y - mouse_pos.y); - const float move_speed = 25.0f; - mouse_pos.x += (mouse_pos_diff.x * frame_time * move_speed); - mouse_pos.y += (mouse_pos_diff.y * frame_time * move_speed); - - sf::Vector2f mouse_smooth_diff(mouse_pos.x - prev_mouse_pos.x, mouse_pos.y - prev_mouse_pos.y); - prev_mouse_pos = mouse_pos; - - if(mouse_left_pressed) { - selected_scrolled += mouse_smooth_diff.y; - page_scroll += mouse_smooth_diff.y; - mouse_scroll_accel = mouse_smooth_diff; - } else { - selected_scrolled += mouse_scroll_accel.y; - page_scroll += mouse_scroll_accel.y; - const float scroll_deaccel = 1.02f; - double deaccel = scroll_deaccel * (1.0 + frame_time); - if(deaccel < 0.0001) - deaccel = 1.0; - - mouse_scroll_accel.x /= deaccel; - if(fabs(mouse_scroll_accel.x) < 0.0001) - mouse_scroll_accel.x = 0.0; - - mouse_scroll_accel.y /= deaccel; - if(fabs(mouse_scroll_accel.y) < 0.0001) - mouse_scroll_accel.y = 0.0; - } - if(selected_item != -1) { - if(selected_scrolled <= -selected_item_height) { - selected_scrolled += selected_item_height; - select_next_item(false); - } else if(selected_scrolled >= selected_item_height) { - selected_scrolled -= selected_item_height; - select_previous_item(false); + if(experimental_use_touch) { + float frame_time = frame_timer.restart().asSeconds(); + if(frame_time > 2.0f) + frame_time = 2.0f; + + const sf::Vector2f mouse_pos_diff(mouse_pos_raw.x - mouse_pos.x, mouse_pos_raw.y - mouse_pos.y); + const float move_speed = 25.0f; + mouse_pos.x += (mouse_pos_diff.x * frame_time * move_speed); + mouse_pos.y += (mouse_pos_diff.y * frame_time * move_speed); + + sf::Vector2f mouse_smooth_diff(mouse_pos.x - prev_mouse_pos.x, mouse_pos.y - prev_mouse_pos.y); + prev_mouse_pos = mouse_pos; + + if(items_cut_off) { + if(mouse_left_pressed) { + selected_scrolled += mouse_smooth_diff.y; + page_scroll += mouse_smooth_diff.y; + mouse_scroll_accel = mouse_smooth_diff; + } else { + selected_scrolled += mouse_scroll_accel.y; + page_scroll += mouse_scroll_accel.y; + } + } + + if(!mouse_left_pressed) { + const float scroll_deaccel = 1.02f; + double deaccel = scroll_deaccel * (1.0 + frame_time); + if(deaccel < 0.0001) + deaccel = 1.0; + + mouse_scroll_accel.x /= deaccel; + if(fabs(mouse_scroll_accel.x) < 0.0001) + mouse_scroll_accel.x = 0.0; + + mouse_scroll_accel.y /= deaccel; + if(fabs(mouse_scroll_accel.y) < 0.0001) + mouse_scroll_accel.y = 0.0; + } + + if(selected_item != -1) { + if(selected_scrolled <= -selected_item_height) { + selected_scrolled += selected_item_height; + select_next_item(false); + } else if(selected_scrolled >= selected_item_height) { + selected_scrolled -= selected_item_height; + select_previous_item(false); + } } } -#endif //item_background.setFillColor(front_color); //item_background.setOutlineThickness(1.0f); @@ -483,6 +509,7 @@ namespace QuickMedia { items_cut_off = false; offset_to_top = 0.0f; offset_to_bottom = 0.0f; + mouse_left_clicked = false; return; } @@ -559,6 +586,7 @@ namespace QuickMedia { page_scroll = 0.0f; } + page_scroll = std::floor(page_scroll); pos.y += page_scroll; bool last_item_fully_visible_set = false; @@ -650,6 +678,8 @@ namespace QuickMedia { if(!items_cut_off_set) items_cut_off = false; + mouse_left_clicked = false; + for(auto it = item_thumbnail_textures.begin(); it != item_thumbnail_textures.end();) { if(!it->second->referenced) it = item_thumbnail_textures.erase(it); @@ -813,6 +843,15 @@ namespace QuickMedia { item_pos.x = std::floor(pos.x); item_pos.y = std::floor(pos.y); + if(body_item_select_callback && mouse_left_clicked) { + sf::FloatRect item_box(pos, sf::Vector2f(size.x, item_height)); + // TODO: Scale mouse_press_pixels_moved_abs with monitor PPI instead of using get_ui_scale() + if(item_box.contains(mouse_click_pos) && item_box.contains(mouse_release_pos) && mouse_press_pixels_moved_abs <= 50.0 * get_ui_scale()) { + set_selected_item(item_index, false); + body_item_select_callback(item); + } + } + item_separator.setSize(sf::Vector2f(std::max(0.0f, size.x - 20.0f), 1.0f)); item_separator.setPosition(item_pos + sf::Vector2f(10.0f, std::floor(item_height + spacing_y * 0.5f))); window.draw(item_separator); |