]> git.sesse.net Git - casparcg/commitdiff
* Rudimentary support for mouse interaction in html producer. The only interaction...
authorHelge Norberg <helge.norberg@svt.se>
Thu, 21 May 2015 19:15:10 +0000 (21:15 +0200)
committerHelge Norberg <helge.norberg@svt.se>
Thu, 21 May 2015 19:15:10 +0000 (21:15 +0200)
core/interaction/interaction_event.h
core/producer/frame_producer.cpp
modules/html/producer/html_producer.cpp
modules/screen/consumer/screen_consumer.cpp

index 03e8d4007ff79d3b41fb14e627d84d1284c8e3a5..6d8e7ab2f48afae744d97119ca2d293a92836939 100644 (file)
@@ -87,6 +87,25 @@ protected:
        }
 };
 
+struct mouse_wheel_event : public position_event
+{
+       typedef spl::shared_ptr<mouse_wheel_event> ptr;
+
+       const int ticks_delta;
+
+       mouse_wheel_event(int source_id, double x, double y, int ticks_delta)
+               : position_event(source_id, x, y)
+               , ticks_delta(ticks_delta)
+       {
+       }
+protected:
+       virtual interaction_event::ptr clone(
+                       double new_x, double new_y) const override
+       {
+               return spl::make_shared<mouse_wheel_event>(source_id, new_x, new_y, ticks_delta);
+       }
+};
+
 struct mouse_button_event : public position_event
 {
        typedef spl::shared_ptr<mouse_button_event> ptr;
index e5936e58404a0c7ea68d3bf072f4ba6d5aeae44f..16f48ea9d9c94d40a95a056c1c84f36a1dcc0d11 100644 (file)
@@ -250,8 +250,8 @@ public:
        class draw_frame                                                                        last_frame()                                                                                                                                    {return producer_->last_frame();}
        draw_frame                                                                                      create_thumbnail_frame()                                                                                                                {return producer_->create_thumbnail_frame();}
        monitor::subject&                                                                       monitor_output() override                                                                                                               {return producer_->monitor_output();}                                                                           
-       bool                                                                                            collides(double x, double y)                                                                                                    {return producer_->collides(x, y);}
-       void                                                                                            on_interaction(const interaction_event::ptr& event)                                                             {return producer_->on_interaction(event);}
+       bool                                                                                            collides(double x, double y) const override                                                                             {return producer_->collides(x, y);}
+       void                                                                                            on_interaction(const interaction_event::ptr& event)     override                                        {return producer_->on_interaction(event);}
        constraints&                                                                            pixel_constraints() override                                                                                                    {return producer_->pixel_constraints();}
 };
 
index 6a0b509b80c647d1acf7033855251652ce53b19e..c8355433ef56089e21553dfce8a90779c9affa29 100644 (file)
@@ -27,6 +27,7 @@
 #include <core/frame/draw_frame.h>
 #include <core/frame/frame_factory.h>
 #include <core/producer/frame_producer.h>
+#include <core/interaction/interaction_event.h>
 #include <core/frame/frame.h>
 #include <core/frame/pixel_format.h>
 #include <core/frame/geometry.h>
@@ -149,6 +150,11 @@ namespace caspar {
                                }
                        }
 
+                       CefRefPtr<CefBrowserHost> get_browser_host()
+                       {
+                               return browser_->GetHost();
+                       }
+
                        void close()
                        {
                                if (!animation_frame_requested_)
@@ -492,6 +498,56 @@ namespace caspar {
                                return L"html";
                        }
 
+                       void on_interaction(const core::interaction_event::ptr& event) override
+                       {
+                               if (core::is<core::mouse_move_event>(event))
+                               {
+                                       auto move = core::as<core::mouse_move_event>(event);
+                                       int x = static_cast<int>(move->x * constraints_.width.get());
+                                       int y = static_cast<int>(move->y * constraints_.height.get());
+
+                                       CefMouseEvent e;
+                                       e.x = x;
+                                       e.y = y;
+                                       client_->get_browser_host()->SendMouseMoveEvent(e, false);
+                               }
+                               else if (core::is<core::mouse_button_event>(event))
+                               {
+                                       auto button = core::as<core::mouse_button_event>(event);
+                                       int x = static_cast<int>(button->x * constraints_.width.get());
+                                       int y = static_cast<int>(button->y * constraints_.height.get());
+
+                                       CefMouseEvent e;
+                                       e.x = x;
+                                       e.y = y;
+                                       client_->get_browser_host()->SendMouseClickEvent(
+                                                       e,
+                                                       static_cast<CefBrowserHost::MouseButtonType>(button->button),
+                                                       !button->pressed,
+                                                       1);
+                               }
+                               else if (core::is<core::mouse_wheel_event>(event))
+                               {
+                                       auto wheel = core::as<core::mouse_wheel_event>(event);
+                                       int x = static_cast<int>(wheel->x * constraints_.width.get());
+                                       int y = static_cast<int>(wheel->y * constraints_.height.get());
+
+                                       CefMouseEvent e;
+                                       e.x = x;
+                                       e.y = y;
+                                       static const int WHEEL_TICKS_AMPLIFICATION = 40;
+                                       client_->get_browser_host()->SendMouseWheelEvent(
+                                                       e,
+                                                       0,                                               // delta_x
+                                                       wheel->ticks_delta * WHEEL_TICKS_AMPLIFICATION); // delta_y
+                               }
+                       }
+
+                       bool collides(double x, double y) const override
+                       {
+                               return true;
+                       }
+
                        core::draw_frame receive_impl() override
                        {
                                if (client_)
index e2e7d81c8bf84e0de60faf9c8920c17868543bde..fc71f14281dcc72fbd7d1955752ced0292e045e3 100644 (file)
@@ -333,6 +333,16 @@ public:
                                                                                        e.type == sf::Event::MouseButtonPressed));
                                                                }
                                                                break;
+                                                       case sf::Event::MouseWheelMoved:
+                                                               {
+                                                                       auto& wheel_moved = e.mouseWheel;
+                                                                       sink_->on_interaction(spl::make_shared<core::mouse_wheel_event>(
+                                                                                       1,
+                                                                                       static_cast<double>(wheel_moved.x) / screen_width_,
+                                                                                       static_cast<double>(wheel_moved.y) / screen_height_,
+                                                                                       wheel_moved.delta));
+                                                               }
+                                                               break;
                                                        }
                                                }
                                        }