diff options
-rw-r--r-- | example/HelloWorld.cpp | 19 | ||||
-rw-r--r-- | example/HelloWorld.h | 9 | ||||
-rw-r--r-- | tools/sk_app/Window.cpp | 87 | ||||
-rw-r--r-- | tools/sk_app/Window.h | 81 | ||||
-rw-r--r-- | tools/viewer/Viewer.cpp | 168 | ||||
-rw-r--r-- | tools/viewer/Viewer.h | 18 |
6 files changed, 128 insertions, 254 deletions
diff --git a/example/HelloWorld.cpp b/example/HelloWorld.cpp index fba7f7e5a0..5954e71532 100644 --- a/example/HelloWorld.cpp +++ b/example/HelloWorld.cpp @@ -18,21 +18,6 @@ Application* Application::Create(int argc, char** argv, void* platformData) { return new HelloWorld(argc, argv, platformData); } -static void on_backend_created_func(void* userData) { - HelloWorld* hw = reinterpret_cast<HelloWorld*>(userData); - return hw->onBackendCreated(); -} - -static void on_paint_handler(SkCanvas* canvas, void* userData) { - HelloWorld* hw = reinterpret_cast<HelloWorld*>(userData); - return hw->onPaint(canvas); -} - -static bool on_char_handler(SkUnichar c, uint32_t modifiers, void* userData) { - HelloWorld* hw = reinterpret_cast<HelloWorld*>(userData); - return hw->onChar(c, modifiers); -} - HelloWorld::HelloWorld(int argc, char** argv, void* platformData) : fBackendType(Window::kNativeGL_BackendType) , fRotationAngle(0) { @@ -42,9 +27,7 @@ HelloWorld::HelloWorld(int argc, char** argv, void* platformData) fWindow->setRequestedDisplayParams(DisplayParams()); // register callbacks - fWindow->registerBackendCreatedFunc(on_backend_created_func, this); - fWindow->registerPaintFunc(on_paint_handler, this); - fWindow->registerCharFunc(on_char_handler, this); + fWindow->pushLayer(this); fWindow->attach(fBackendType); } diff --git a/example/HelloWorld.h b/example/HelloWorld.h index 44f1321d6b..28715fe89b 100644 --- a/example/HelloWorld.h +++ b/example/HelloWorld.h @@ -13,15 +13,16 @@ class SkCanvas; -class HelloWorld : public sk_app::Application { +class HelloWorld : public sk_app::Application, sk_app::Window::Layer { public: HelloWorld(int argc, char** argv, void* platformData); ~HelloWorld() override; - void onBackendCreated(); - void onPaint(SkCanvas* canvas); void onIdle() override; - bool onChar(SkUnichar c, uint32_t modifiers); + + void onBackendCreated() override; + void onPaint(SkCanvas* canvas) override; + bool onChar(SkUnichar c, uint32_t modifiers) override; private: void updateTitle(); diff --git a/tools/sk_app/Window.cpp b/tools/sk_app/Window.cpp index d7904fd8a7..436b6b9aa9 100644 --- a/tools/sk_app/Window.cpp +++ b/tools/sk_app/Window.cpp @@ -13,45 +13,7 @@ namespace sk_app { -static void default_backend_created_func(void* userData) {} - -static bool default_char_func(SkUnichar c, uint32_t modifiers, void* userData) { - return false; -} - -static bool default_key_func(Window::Key key, Window::InputState state, uint32_t modifiers, - void* userData) { - return false; -} - -static bool default_mouse_func(int x, int y, Window::InputState state, uint32_t modifiers, - void* userData) { - return false; -} - -static bool default_mouse_wheel_func(float delta, uint32_t modifiers, void* userData) { - return false; -} - -static bool default_touch_func(intptr_t owner, Window::InputState state, float x, float y, - void* userData) { - return false; -} - -static void default_ui_state_changed_func( - const SkString& stateName, const SkString& stateValue, void* userData) {} - -static void default_paint_func(SkCanvas*, void* userData) {} - -Window::Window() : fBackendCreatedFunc(default_backend_created_func) - , fCharFunc(default_char_func) - , fKeyFunc(default_key_func) - , fMouseFunc(default_mouse_func) - , fMouseWheelFunc(default_mouse_wheel_func) - , fTouchFunc(default_touch_func) - , fUIStateChangedFunc(default_ui_state_changed_func) - , fPaintFunc(default_paint_func) { -} +Window::Window() {} void Window::detach() { delete fWindowContext; @@ -59,31 +21,60 @@ void Window::detach() { } void Window::onBackendCreated() { - fBackendCreatedFunc(fBackendCreatedUserData); + for (int i = 0; i < fLayers.count(); ++i) { + fLayers[i]->onBackendCreated(); + } } bool Window::onChar(SkUnichar c, uint32_t modifiers) { - return fCharFunc(c, modifiers, fCharUserData); + for (int i = fLayers.count() - 1; i >= 0; --i) { + if (fLayers[i]->onChar(c, modifiers)) { + return true; + } + } + return false; } bool Window::onKey(Key key, InputState state, uint32_t modifiers) { - return fKeyFunc(key, state, modifiers, fKeyUserData); + for (int i = fLayers.count() - 1; i >= 0; --i) { + if (fLayers[i]->onKey(key, state, modifiers)) { + return true; + } + } + return false; } bool Window::onMouse(int x, int y, InputState state, uint32_t modifiers) { - return fMouseFunc(x, y, state, modifiers, fMouseUserData); + for (int i = fLayers.count() - 1; i >= 0; --i) { + if (fLayers[i]->onMouse(x, y, state, modifiers)) { + return true; + } + } + return false; } bool Window::onMouseWheel(float delta, uint32_t modifiers) { - return fMouseWheelFunc(delta, modifiers, fMouseWheelUserData); + for (int i = fLayers.count() - 1; i >= 0; --i) { + if (fLayers[i]->onMouseWheel(delta, modifiers)) { + return true; + } + } + return false; } bool Window::onTouch(intptr_t owner, InputState state, float x, float y) { - return fTouchFunc(owner, state, x, y, fTouchUserData); + for (int i = fLayers.count() - 1; i >= 0; --i) { + if (fLayers[i]->onTouch(owner, state, x, y)) { + return true; + } + } + return false; } void Window::onUIStateChanged(const SkString& stateName, const SkString& stateValue) { - return fUIStateChangedFunc(stateName, stateValue, fUIStateChangedUserData); + for (int i = 0; i < fLayers.count(); ++i) { + fLayers[i]->onUIStateChanged(stateName, stateValue); + } } void Window::onPaint() { @@ -96,7 +87,9 @@ void Window::onPaint() { // draw into the canvas of this surface SkCanvas* canvas = backbuffer->getCanvas(); - fPaintFunc(canvas, fPaintUserData); + for (int i = 0; i < fLayers.count(); ++i) { + fLayers[i]->onPaint(canvas); + } canvas->flush(); diff --git a/tools/sk_app/Window.h b/tools/sk_app/Window.h index 4d40780964..77478b598e 100644 --- a/tools/sk_app/Window.h +++ b/tools/sk_app/Window.h @@ -130,55 +130,23 @@ public: kMove_InputState // only valid for mouse }; - // return value of 'true' means 'I have handled this event' - typedef void(*OnBackendCreatedFunc)(void* userData); - typedef bool(*OnCharFunc)(SkUnichar c, uint32_t modifiers, void* userData); - typedef bool(*OnKeyFunc)(Key key, InputState state, uint32_t modifiers, void* userData); - typedef bool(*OnMouseFunc)(int x, int y, InputState state, uint32_t modifiers, void* userData); - typedef bool(*OnMouseWheelFunc)(float delta, uint32_t modifiers, void* userData); - typedef bool(*OnTouchFunc)(intptr_t owner, InputState state, float x, float y, void* userData); - typedef void(*OnUIStateChangedFunc)( - const SkString& stateName, const SkString& stateValue, void* userData); - typedef void(*OnPaintFunc)(SkCanvas*, void* userData); - - void registerBackendCreatedFunc(OnBackendCreatedFunc func, void* userData) { - fBackendCreatedFunc = func; - fBackendCreatedUserData = userData; - } - - void registerCharFunc(OnCharFunc func, void* userData) { - fCharFunc = func; - fCharUserData = userData; - } - - void registerKeyFunc(OnKeyFunc func, void* userData) { - fKeyFunc = func; - fKeyUserData = userData; - } - - void registerMouseFunc(OnMouseFunc func, void* userData) { - fMouseFunc = func; - fMouseUserData = userData; - } - - void registerMouseWheelFunc(OnMouseWheelFunc func, void* userData) { - fMouseWheelFunc = func; - fMouseWheelUserData = userData; - } - - void registerPaintFunc(OnPaintFunc func, void* userData) { - fPaintFunc = func; - fPaintUserData = userData; - } - - void registerTouchFunc(OnTouchFunc func, void* userData) { - fTouchFunc = func; - fTouchUserData = userData; - } + class Layer { + public: + virtual ~Layer() = default; + + // return value of 'true' means 'I have handled this event' + virtual void onBackendCreated() {} + virtual bool onChar(SkUnichar c, uint32_t modifiers) { return false; } + virtual bool onKey(Key key, InputState state, uint32_t modifiers) { return false; } + virtual bool onMouse(int x, int y, InputState state, uint32_t modifiers) { return false; } + virtual bool onMouseWheel(float delta, uint32_t modifiers) { return false; } + virtual bool onTouch(intptr_t owner, InputState state, float x, float y) { return false; } + virtual void onUIStateChanged(const SkString& stateName, const SkString& stateValue) {} + virtual void onPaint(SkCanvas*) {} + }; - void registerUIStateChangedFunc(OnUIStateChangedFunc func, void* userData) { - fUIStateChangedFunc = func; - fUIStateChangedUserData = userData; + void pushLayer(Layer* layer) { + fLayers.push(layer); } void onBackendCreated(); @@ -207,22 +175,7 @@ public: protected: Window(); - OnBackendCreatedFunc fBackendCreatedFunc; - void* fBackendCreatedUserData; - OnCharFunc fCharFunc; - void* fCharUserData; - OnKeyFunc fKeyFunc; - void* fKeyUserData; - OnMouseFunc fMouseFunc; - void* fMouseUserData; - OnMouseWheelFunc fMouseWheelFunc; - void* fMouseWheelUserData; - OnTouchFunc fTouchFunc; - void* fTouchUserData; - OnUIStateChangedFunc fUIStateChangedFunc; - void* fUIStateChangedUserData; - OnPaintFunc fPaintFunc; - void* fPaintUserData; + SkTDArray<Layer*> fLayers; DisplayParams fRequestedDisplayParams; WindowContext* fWindowContext = nullptr; diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp index ddef1da1fb..a1b7baac6b 100644 --- a/tools/viewer/Viewer.cpp +++ b/tools/viewer/Viewer.cpp @@ -56,81 +56,6 @@ Application* Application::Create(int argc, char** argv, void* platformData) { return new Viewer(argc, argv, platformData); } -static void on_backend_created_func(void* userData) { - Viewer* vv = reinterpret_cast<Viewer*>(userData); - - return vv->onBackendCreated(); -} - -static void on_paint_handler(SkCanvas* canvas, void* userData) { - Viewer* vv = reinterpret_cast<Viewer*>(userData); - - return vv->onPaint(canvas); -} - -static bool on_touch_handler(intptr_t owner, Window::InputState state, float x, float y, void* userData) -{ - Viewer* viewer = reinterpret_cast<Viewer*>(userData); - - return viewer->onTouch(owner, state, x, y); -} - -static void on_ui_state_changed_handler(const SkString& stateName, const SkString& stateValue, void* userData) { - Viewer* viewer = reinterpret_cast<Viewer*>(userData); - - return viewer->onUIStateChanged(stateName, stateValue); -} - -static bool on_mouse_handler(int x, int y, Window::InputState state, uint32_t modifiers, - void* userData) { - ImGuiIO& io = ImGui::GetIO(); - io.MousePos.x = static_cast<float>(x); - io.MousePos.y = static_cast<float>(y); - if (Window::kDown_InputState == state) { - io.MouseDown[0] = true; - } else if (Window::kUp_InputState == state) { - io.MouseDown[0] = false; - } - if (io.WantCaptureMouse) { - return true; - } else { - Viewer* viewer = reinterpret_cast<Viewer*>(userData); - return viewer->onMouse(x, y, state, modifiers); - } -} - -static bool on_mouse_wheel_handler(float delta, uint32_t modifiers, void* userData) { - ImGuiIO& io = ImGui::GetIO(); - io.MouseWheel += delta; - return true; -} - -static bool on_key_handler(Window::Key key, Window::InputState state, uint32_t modifiers, - void* userData) { - ImGuiIO& io = ImGui::GetIO(); - io.KeysDown[static_cast<int>(key)] = (Window::kDown_InputState == state); - - if (io.WantCaptureKeyboard) { - return true; - } else { - Viewer* viewer = reinterpret_cast<Viewer*>(userData); - return viewer->onKey(key, state, modifiers); - } -} - -static bool on_char_handler(SkUnichar c, uint32_t modifiers, void* userData) { - ImGuiIO& io = ImGui::GetIO(); - if (io.WantTextInput) { - if (c > 0 && c < 0x10000) { - io.AddInputCharacter(c); - } - return true; - } else { - Viewer* viewer = reinterpret_cast<Viewer*>(userData); - return viewer->onChar(c, modifiers); - } -} - static DEFINE_bool2(fullscreen, f, true, "Run fullscreen."); static DEFINE_string2(match, m, nullptr, @@ -325,14 +250,7 @@ Viewer::Viewer(int argc, char** argv, void* platformData) // register callbacks fCommands.attach(fWindow); - fWindow->registerBackendCreatedFunc(on_backend_created_func, this); - fWindow->registerPaintFunc(on_paint_handler, this); - fWindow->registerTouchFunc(on_touch_handler, this); - fWindow->registerUIStateChangedFunc(on_ui_state_changed_handler, this); - fWindow->registerMouseFunc(on_mouse_handler, this); - fWindow->registerMouseWheelFunc(on_mouse_wheel_handler, this); - fWindow->registerKeyFunc(on_key_handler, this); - fWindow->registerCharFunc(on_char_handler, this); + fWindow->pushLayer(this); // add key-bindings fCommands.addCommand(' ', "GUI", "Toggle Debug GUI", [this]() { @@ -810,14 +728,7 @@ void Viewer::setBackend(sk_app::Window::BackendType backendType) { // re-register callbacks fCommands.attach(fWindow); - fWindow->registerBackendCreatedFunc(on_backend_created_func, this); - fWindow->registerPaintFunc(on_paint_handler, this); - fWindow->registerTouchFunc(on_touch_handler, this); - fWindow->registerUIStateChangedFunc(on_ui_state_changed_handler, this); - fWindow->registerMouseFunc(on_mouse_handler, this); - fWindow->registerMouseWheelFunc(on_mouse_wheel_handler, this); - fWindow->registerKeyFunc(on_key_handler, this); - fWindow->registerCharFunc(on_char_handler, this); + fWindow->pushLayer(this); // Don't allow the window to re-attach. If we're in MSAA mode, the params we grabbed above // will still include our correct sample count. But the re-created fWindow will lose that // information. On Windows, we need to re-create the window when changing sample count, @@ -1023,28 +934,46 @@ bool Viewer::onTouch(intptr_t owner, Window::InputState state, float x, float y) return true; } -bool Viewer::onMouse(float x, float y, Window::InputState state, uint32_t modifiers) { - if (!fSlides[fCurrentSlide]->onMouse(x, y, state, modifiers)) { - if (GestureDevice::kTouch == fGestureDevice) { - return false; - } - switch (state) { - case Window::kUp_InputState: { - fGesture.touchEnd(nullptr); - break; - } - case Window::kDown_InputState: { - fGesture.touchBegin(nullptr, x, y); - break; +bool Viewer::onMouse(int x, int y, Window::InputState state, uint32_t modifiers) { + ImGuiIO& io = ImGui::GetIO(); + io.MousePos.x = static_cast<float>(x); + io.MousePos.y = static_cast<float>(y); + if (Window::kDown_InputState == state) { + io.MouseDown[0] = true; + } else if (Window::kUp_InputState == state) { + io.MouseDown[0] = false; + } + if (io.WantCaptureMouse) { + return true; + } else { + if (!fSlides[fCurrentSlide]->onMouse(x, y, state, modifiers)) { + if (GestureDevice::kTouch == fGestureDevice) { + return false; } - case Window::kMove_InputState: { - fGesture.touchMoved(nullptr, x, y); - break; + switch (state) { + case Window::kUp_InputState: { + fGesture.touchEnd(nullptr); + break; + } + case Window::kDown_InputState: { + fGesture.touchBegin(nullptr, x, y); + break; + } + case Window::kMove_InputState: { + fGesture.touchMoved(nullptr, x, y); + break; + } } + fGestureDevice = fGesture.isBeingTouched() ? GestureDevice::kMouse : GestureDevice::kNone; } - fGestureDevice = fGesture.isBeingTouched() ? GestureDevice::kMouse : GestureDevice::kNone; + fWindow->inval(); + return true; } - fWindow->inval(); +} + +bool Viewer::onMouseWheel(float delta, uint32_t modifiers) { + ImGuiIO& io = ImGui::GetIO(); + io.MouseWheel += delta; return true; } @@ -1697,14 +1626,27 @@ void Viewer::onUIStateChanged(const SkString& stateName, const SkString& stateVa } bool Viewer::onKey(sk_app::Window::Key key, sk_app::Window::InputState state, uint32_t modifiers) { - return fCommands.onKey(key, state, modifiers); + ImGuiIO& io = ImGui::GetIO(); + io.KeysDown[static_cast<int>(key)] = (Window::kDown_InputState == state); + + if (io.WantCaptureKeyboard) { + return true; + } else { + return fCommands.onKey(key, state, modifiers); + } } bool Viewer::onChar(SkUnichar c, uint32_t modifiers) { - if (fSlides[fCurrentSlide]->onChar(c)) { + ImGuiIO& io = ImGui::GetIO(); + if (io.WantTextInput) { + if (c > 0 && c < 0x10000) { + io.AddInputCharacter(c); + } + return true; + } else if (fSlides[fCurrentSlide]->onChar(c)) { fWindow->inval(); return true; + } else { + return fCommands.onChar(c, modifiers); } - - return fCommands.onChar(c, modifiers); } diff --git a/tools/viewer/Viewer.h b/tools/viewer/Viewer.h index ff47b35f7f..1f5d1c5dc4 100644 --- a/tools/viewer/Viewer.h +++ b/tools/viewer/Viewer.h @@ -20,19 +20,21 @@ class SkCanvas; -class Viewer : public sk_app::Application { +class Viewer : public sk_app::Application, sk_app::Window::Layer { public: Viewer(int argc, char** argv, void* platformData); ~Viewer() override; - void onBackendCreated(); - void onPaint(SkCanvas* canvas); void onIdle() override; - bool onTouch(intptr_t owner, sk_app::Window::InputState state, float x, float y); - bool onMouse(float x, float y, sk_app::Window::InputState state, uint32_t modifiers); - void onUIStateChanged(const SkString& stateName, const SkString& stateValue); - bool onKey(sk_app::Window::Key key, sk_app::Window::InputState state, uint32_t modifiers); - bool onChar(SkUnichar c, uint32_t modifiers); + + void onBackendCreated() override; + void onPaint(SkCanvas* canvas) override; + bool onTouch(intptr_t owner, sk_app::Window::InputState state, float x, float y) override; + bool onMouse(int x, int y, sk_app::Window::InputState state, uint32_t modifiers) override; + bool onMouseWheel(float delta, uint32_t modifiers) override; + void onUIStateChanged(const SkString& stateName, const SkString& stateValue) override; + bool onKey(sk_app::Window::Key key, sk_app::Window::InputState state, uint32_t modifiers) override; + bool onChar(SkUnichar c, uint32_t modifiers) override; private: enum class ColorMode { |