aboutsummaryrefslogtreecommitdiff
path: root/src/Body.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Body.cpp')
-rw-r--r--src/Body.cpp137
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);