#include "pch.h" #include "app.h" #ifdef __ANDROID__ void displayKeyboard(android_app* mApplication, bool pShow); #elif _WIN32 std::string win32_open_file(); #endif using namespace ui; void App::resize(float w, float h) { redraw = true; width = w; height = h; if (auto* main = layout[main_id]) main->update(w , h, zoom); } void App::showKeyboard() { LOG("show keyboard"); redraw = true; #ifdef __IOS__ [ios_view registerForKeyboardNotifications]; [ios_view becomeFirstResponder]; #elif __ANDROID__ displayKeyboard(and_app, true); #endif } void App::hideKeyboard() { LOG("hide keyboard"); redraw = true; #ifdef __IOS__ [ios_view resignFirstResponder]; // [ios_view unregisterForKeyboardNotifications]; #elif __ANDROID__ displayKeyboard(and_app, false); #endif } void App::pick_image(std::function callback) { redraw = true; #ifdef __IOS__ [ios_view pick_photo:callback]; #elif __OSX__ std::string path = [osx_view pick_file]; callback(path); #elif __ANDROID__ //displayKeyboard(and_app, false); #elif _WIN32 std::string path = win32_open_file(); if (!path.empty()) callback(path); #endif } bool App::mouse_down(int button, float x, float y, float pressure, kEventSource source) { redraw = true; MouseEvent e; e.m_type = button ? kEventType::MouseDownR : kEventType::MouseDownL; e.m_pos = { x / zoom, y / zoom }; e.m_pressure = pressure; e.m_source = source; auto ret = layout[main_id]->on_event(&e); layout[main_id]->update(); return ret == kEventResult::Consumed; } bool App::mouse_move(float x, float y, float pressure, kEventSource source) { redraw = true; MouseEvent e; e.m_type = kEventType::MouseMove; e.m_pos = { x / zoom, y / zoom }; e.m_pressure = pressure; e.m_source = source; kEventResult ret = kEventResult::Available; if (auto* main = layout[main_id]) ret = main->on_event(&e); return ret == kEventResult::Consumed; } bool App::mouse_up(int button, float x, float y, kEventSource source) { redraw = true; MouseEvent e; e.m_type = button ? kEventType::MouseUpR : kEventType::MouseUpL; e.m_pos = { x / zoom, y / zoom }; e.m_source = source; auto ret = layout[main_id]->on_event(&e); layout[main_id]->update(); return ret == kEventResult::Consumed; } bool App::mouse_scroll(float x, float y, float delta) { redraw = true; MouseEvent e; e.m_type = kEventType::MouseScroll; e.m_pos = { x / zoom, y / zoom }; e.m_scroll_delta = delta; auto ret = layout[main_id]->on_event(&e); layout[main_id]->update(); return ret == kEventResult::Consumed; } bool App::mouse_cancel(int button) { redraw = true; MouseEvent e; e.m_type = kEventType::MouseCancel; auto ret = layout[main_id]->on_event(&e); layout[main_id]->update(); return ret == kEventResult::Consumed; } bool App::gesture_start(const glm::vec2& p0, const glm::vec2& p1) { redraw = true; GestureEvent e; glm::vec2 p = glm::lerp(p0, p1, 0.5f); e.m_type = kEventType::GestureStart; e.m_pos = p / glm::vec2(zoom); e.m_distance = glm::distance(p0, p1); gesture_p0 = p0; gesture_p1 = p1; auto ret = layout[main_id]->on_event(&e); layout[main_id]->update(); return ret == kEventResult::Consumed; } bool App::gesture_move(const glm::vec2& p0, const glm::vec2& p1) { redraw = true; GestureEvent e; glm::vec2 p = glm::lerp(p0, p1, 0.5f); e.m_type = kEventType::GestureMove; e.m_pos = p / glm::vec2(zoom); e.m_distance = glm::distance(p0, p1); e.m_distance_delta = e.m_distance - glm::distance(gesture_p0, gesture_p1); e.m_pos_delta = p - glm::lerp(gesture_p0, gesture_p1, 0.5f); auto ret = layout[main_id]->on_event(&e); layout[main_id]->update(); return ret == kEventResult::Consumed; } bool App::gesture_end() { redraw = true; GestureEvent e; e.m_type = kEventType::GestureEnd; auto ret = layout[main_id]->on_event(&e); layout[main_id]->update(); return ret == kEventResult::Consumed; } bool App::key_down(kKey key) { redraw = true; keys[(int)key] = true; KeyEvent e; e.m_type = kEventType::KeyDown; e.m_key = key; auto ret = layout[main_id]->on_event(&e); layout[main_id]->update(); return ret == kEventResult::Consumed; } bool App::key_up(kKey key) { redraw = true; keys[(int)key] = false; KeyEvent e; e.m_type = kEventType::KeyUp; e.m_key = key; auto ret = layout[main_id]->on_event(&e); layout[main_id]->update(); return ret == kEventResult::Consumed; } bool App::key_char(char key) { redraw = true; KeyEvent e; e.m_type = kEventType::KeyChar; e.m_char = key; auto ret = layout[main_id]->on_event(&e); layout[main_id]->update(); return ret == kEventResult::Consumed; }