Add sample mouse support to Viewer

Bug: skia:6830
Change-Id: I1a6bb781465a29cec4946462e234d63c48693454
Reviewed-on: https://skia-review.googlesource.com/66543
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
diff --git a/tools/viewer/SampleSlide.cpp b/tools/viewer/SampleSlide.cpp
index 93a495e..68dab92 100644
--- a/tools/viewer/SampleSlide.cpp
+++ b/tools/viewer/SampleSlide.cpp
@@ -12,13 +12,17 @@
 #include "SkOSFile.h"
 #include "SkStream.h"
 
-SampleSlide::SampleSlide(const SkViewFactory* factory) : fViewFactory(factory) {
+using namespace sk_app;
+
+SampleSlide::SampleSlide(const SkViewFactory* factory)
+    : fViewFactory(factory)
+    , fClick(nullptr) {
     SkView* view = (*factory)();
     SampleCode::RequestTitle(view, &fName);
     view->unref();
 }
 
-SampleSlide::~SampleSlide() {}
+SampleSlide::~SampleSlide() { delete fClick; }
 
 void SampleSlide::draw(SkCanvas* canvas) {
     SkASSERT(fView);
@@ -45,6 +49,47 @@
     return fView->doQuery(&evt);
 }
 
+bool SampleSlide::onMouse(SkScalar x, SkScalar y, Window::InputState state,
+                          uint32_t modifiers) {
+    // map to SkView modifiers
+    unsigned modifierKeys = 0;
+    modifierKeys |= (state & Window::kShift_ModifierKey) ? kShift_SkModifierKey : 0;
+    modifierKeys |= (state & Window::kControl_ModifierKey) ? kControl_SkModifierKey : 0;
+    modifierKeys |= (state & Window::kOption_ModifierKey) ? kOption_SkModifierKey : 0;
+    modifierKeys |= (state & Window::kCommand_ModifierKey) ? kCommand_SkModifierKey : 0;
+
+    bool handled = false;
+    switch (state) {
+        case Window::kDown_InputState: {
+            delete fClick;
+            fClick = fView->findClickHandler(SkIntToScalar(x), SkIntToScalar(y), modifierKeys);
+            if (fClick) {
+                SkView::DoClickDown(fClick, x, y, modifierKeys);
+                handled = true;
+            }
+            break;
+        }
+        case Window::kMove_InputState: {
+            if (fClick) {
+                SkView::DoClickMoved(fClick, x, y, modifierKeys);
+                handled = true;
+            }
+            break;
+        }
+        case Window::kUp_InputState: {
+            if (fClick) {
+                SkView::DoClickUp(fClick, x, y, modifierKeys);
+                delete fClick;
+                fClick = nullptr;
+                handled = true;
+            }
+            break;
+        }
+    }
+
+    return handled;
+}
+
 #if defined(SK_BUILD_FOR_ANDROID)
 // these are normally defined in SkOSWindow_unix, but we don't
 // want to include that