diff options
45 files changed, 611 insertions, 35 deletions
diff --git a/icon-themes/colibre/sd/res/nextslide.png b/icon-themes/colibre/sd/res/nextslide.png Binary files differnew file mode 100644 index 000000000000..780c93d99951 --- /dev/null +++ b/icon-themes/colibre/sd/res/nextslide.png diff --git a/icon-themes/colibre/sd/res/nextslide_mouseover.png b/icon-themes/colibre/sd/res/nextslide_mouseover.png Binary files differnew file mode 100644 index 000000000000..56b105438d58 --- /dev/null +++ b/icon-themes/colibre/sd/res/nextslide_mouseover.png diff --git a/icon-themes/colibre/sd/res/prevslide.png b/icon-themes/colibre/sd/res/prevslide.png Binary files differnew file mode 100644 index 000000000000..35d4f649ff22 --- /dev/null +++ b/icon-themes/colibre/sd/res/prevslide.png diff --git a/icon-themes/colibre/sd/res/prevslide_mouseover.png b/icon-themes/colibre/sd/res/prevslide_mouseover.png Binary files differnew file mode 100644 index 000000000000..547a9a25c956 --- /dev/null +++ b/icon-themes/colibre/sd/res/prevslide_mouseover.png diff --git a/icon-themes/colibre/sd/res/slideshowmenu.png b/icon-themes/colibre/sd/res/slideshowmenu.png Binary files differnew file mode 100644 index 000000000000..ba37646bfa2b --- /dev/null +++ b/icon-themes/colibre/sd/res/slideshowmenu.png diff --git a/icon-themes/colibre/sd/res/slideshowmenu_mouseover.png b/icon-themes/colibre/sd/res/slideshowmenu_mouseover.png Binary files differnew file mode 100644 index 000000000000..4dfa5588db37 --- /dev/null +++ b/icon-themes/colibre/sd/res/slideshowmenu_mouseover.png diff --git a/icon-themes/colibre_dark/sd/res/nextslide.png b/icon-themes/colibre_dark/sd/res/nextslide.png Binary files differnew file mode 100644 index 000000000000..689eec7c2d3b --- /dev/null +++ b/icon-themes/colibre_dark/sd/res/nextslide.png diff --git a/icon-themes/colibre_dark/sd/res/nextslide_mouseover.png b/icon-themes/colibre_dark/sd/res/nextslide_mouseover.png Binary files differnew file mode 100644 index 000000000000..1a3224d435fc --- /dev/null +++ b/icon-themes/colibre_dark/sd/res/nextslide_mouseover.png diff --git a/icon-themes/colibre_dark/sd/res/prevslide.png b/icon-themes/colibre_dark/sd/res/prevslide.png Binary files differnew file mode 100644 index 000000000000..e09a658f3ae7 --- /dev/null +++ b/icon-themes/colibre_dark/sd/res/prevslide.png diff --git a/icon-themes/colibre_dark/sd/res/prevslide_mouseover.png b/icon-themes/colibre_dark/sd/res/prevslide_mouseover.png Binary files differnew file mode 100644 index 000000000000..94bb1c82f246 --- /dev/null +++ b/icon-themes/colibre_dark/sd/res/prevslide_mouseover.png diff --git a/icon-themes/colibre_dark/sd/res/slideshowmenu.png b/icon-themes/colibre_dark/sd/res/slideshowmenu.png Binary files differnew file mode 100644 index 000000000000..071de61f2ff0 --- /dev/null +++ b/icon-themes/colibre_dark/sd/res/slideshowmenu.png diff --git a/icon-themes/colibre_dark/sd/res/slideshowmenu_mouseover.png b/icon-themes/colibre_dark/sd/res/slideshowmenu_mouseover.png Binary files differnew file mode 100644 index 000000000000..4278b2254946 --- /dev/null +++ b/icon-themes/colibre_dark/sd/res/slideshowmenu_mouseover.png diff --git a/icon-themes/colibre_dark_svg/sd/res/nextslide.svg b/icon-themes/colibre_dark_svg/sd/res/nextslide.svg new file mode 100644 index 000000000000..e80f3c825f1a --- /dev/null +++ b/icon-themes/colibre_dark_svg/sd/res/nextslide.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64a9.6000004 9.6000004 0 0 0 -9.6 9.6 9.6000004 9.6000004 0 0 0 9.6 9.6 9.6000004 9.6000004 0 0 0 9.6-9.6 9.6000004 9.6000004 0 0 0 -9.6-9.6zm0 2.56a7.04 7.04 0 0 1 7.04 7.04 7.04 7.04 0 0 1 -7.04 7.04 7.04 7.04 0 0 1 -7.04-7.04 7.04 7.04 0 0 1 7.04-7.04zm-3.1875 1.27875a.63920524.63920524 0 0 0 -.32625.08125.63920524.63920524 0 0 0 -.32625.55875v.64125a.63920524.63920524 0 0 0 .0375.215l1.52375 4.265-1.52375 4.26625a.63920524.63920524 0 0 0 -.0375.215v.6375a.63920524.63920524 0 0 0 .9725.545l8.32125-5.11875a.63920524.63920524 0 0 0 .00125-1.09l-8.32-5.12125a.63920524.63920524 0 0 0 -.3225-.095z" fill="#3a3a38" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c-4.9484715 0-8.96 4.0115287-8.96 8.96 0 4.948471 4.0115285 8.96 8.96 8.96 4.948471 0 8.96-4.011529 8.96-8.96 0-4.9484713-4.011529-8.96-8.96-8.96zm0 1.2799999c4.241546 0 7.679999 3.4384531 7.679999 7.6800001s-3.438453 7.68-7.679999 7.68c-4.241547 0-7.6800001-3.438453-7.6800001-7.68s3.4384531-7.6800001 7.6800001-7.6800001zm-3.2000002 2.5599999v.6399999l1.6000004 4.4800003-1.6000004 4.48v.64l8.3200002-5.12z" fill="#fafafa" stroke-width=".639999"/></svg>
\ No newline at end of file diff --git a/icon-themes/colibre_dark_svg/sd/res/nextslide_mouseover.svg b/icon-themes/colibre_dark_svg/sd/res/nextslide_mouseover.svg new file mode 100644 index 000000000000..b4c5b5ae2845 --- /dev/null +++ b/icon-themes/colibre_dark_svg/sd/res/nextslide_mouseover.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64c-5.301934.00000022-9.6 4.2980665-9.6 9.6 0 5.301934 4.298066 9.6 9.6 9.6 5.301933 0 9.6-4.298066 9.6-9.6 0-5.3019335-4.298067-9.59999978-9.6-9.6z" fill="#3a3a38" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c4.948466 0 8.96 4.0115336 8.96 8.96 0 4.948466-4.011534 8.96-8.96 8.96-4.948467 0-8.96-4.011534-8.96-8.96 0-4.9484664 4.011533-8.96 8.96-8.96zm-3.2 3.84v.64l1.6 4.48-1.6 4.48v.64l8.32-5.12z" fill="#fafafa"/></svg>
\ No newline at end of file diff --git a/icon-themes/colibre_dark_svg/sd/res/prevslide.svg b/icon-themes/colibre_dark_svg/sd/res/prevslide.svg new file mode 100644 index 000000000000..04e202e6d222 --- /dev/null +++ b/icon-themes/colibre_dark_svg/sd/res/prevslide.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64a9.6000004 9.6000004 0 0 1 9.6 9.6 9.6000004 9.6000004 0 0 1 -9.6 9.6 9.6000004 9.6000004 0 0 1 -9.6-9.6 9.6000004 9.6000004 0 0 1 9.6-9.6zm0 2.56a7.04 7.04 0 0 0 -7.04 7.04 7.04 7.04 0 0 0 7.04 7.04 7.04 7.04 0 0 0 7.04-7.04 7.04 7.04 0 0 0 -7.04-7.04zm3.1875 1.27875a.63920524.63920524 0 0 1 .32625.08125.63920524.63920524 0 0 1 .32625.55875v.64125a.63920524.63920524 0 0 1 -.0375.215l-1.52375 4.265 1.52375 4.26625a.63920524.63920524 0 0 1 .0375.215v.6375a.63920524.63920524 0 0 1 -.9725.545l-8.32125-5.11875a.63920524.63920524 0 0 1 -.00125-1.09l8.32-5.12125a.63920524.63920524 0 0 1 .3225-.095z" fill="#3a3a38" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c4.948472 0 8.96 4.0115287 8.96 8.96 0 4.948471-4.011528 8.96-8.96 8.96-4.948471 0-8.96-4.011529-8.96-8.96 0-4.9484713 4.011529-8.96 8.96-8.96zm0 1.2799999c-4.241546 0-7.679999 3.4384531-7.679999 7.6800001s3.438453 7.68 7.679999 7.68c4.241547 0 7.68-3.438453 7.68-7.68s-3.438453-7.6800001-7.68-7.6800001zm3.2 2.5599999v.6399999l-1.6 4.4800003 1.6 4.48v.64l-8.32-5.12z" fill="#fafafa" stroke-width=".639999"/></svg>
\ No newline at end of file diff --git a/icon-themes/colibre_dark_svg/sd/res/prevslide_mouseover.svg b/icon-themes/colibre_dark_svg/sd/res/prevslide_mouseover.svg new file mode 100644 index 000000000000..da295a2f32d6 --- /dev/null +++ b/icon-themes/colibre_dark_svg/sd/res/prevslide_mouseover.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64c5.301934.00000022 9.6 4.2980665 9.6 9.6 0 5.301934-4.298066 9.6-9.6 9.6-5.3019335 0-9.59999978-4.298066-9.6-9.6.00000022-5.3019335 4.2980665-9.59999978 9.6-9.6z" fill="#3a3a38" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c-4.9484661 0-8.96 4.0115336-8.96 8.96 0 4.948466 4.0115339 8.96 8.96 8.96 4.948467 0 8.96-4.011534 8.96-8.96 0-4.9484664-4.011533-8.96-8.96-8.96zm3.2 3.84v.64l-1.6 4.48 1.6 4.48v.64l-8.32-5.12z" fill="#fafafa"/></svg>
\ No newline at end of file diff --git a/icon-themes/colibre_dark_svg/sd/res/slideshowmenu.svg b/icon-themes/colibre_dark_svg/sd/res/slideshowmenu.svg new file mode 100644 index 000000000000..1b47f1b04b1f --- /dev/null +++ b/icon-themes/colibre_dark_svg/sd/res/slideshowmenu.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64c5.301934.00000022 9.6 4.2980665 9.6 9.6 0 5.301934-4.298066 9.6-9.6 9.6-5.3019335 0-9.59999978-4.298066-9.6-9.6.00000022-5.3019335 4.2980665-9.59999978 9.6-9.6zm0 2.56c-3.8880846 0-7.04 3.1519154-7.04 7.04 0 3.888085 3.1519154 7.04 7.04 7.04 3.888085 0 7.04-3.151915 7.04-7.04 0-3.8880846-3.151915-7.04-7.04-7.04z" fill="#3a3a38" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c4.948472 0 8.96 4.0115287 8.96 8.96 0 4.948471-4.011528 8.96-8.96 8.96-4.948471 0-8.96-4.011529-8.96-8.96 0-4.9484713 4.011529-8.96 8.96-8.96zm0 1.2799999c-4.241546 0-7.679999 3.4384531-7.679999 7.6800001s3.438453 7.68 7.679999 7.68c4.241547 0 7.68-3.438453 7.68-7.68s-3.438453-7.6800001-7.68-7.6800001z" fill="#fafafa" stroke-width=".639999"/><g stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"><path d="m5.7597656 8.3203125c-1.0050969.000552-1.9193696.914825-1.9199218 1.9199215.0005518 1.005098.9148247 1.91937 1.9199218 1.919922 1.0050972-.000552 1.91937-.914824 1.9199219-1.919922-.0005523-1.0050966-.9148249-1.9193696-1.9199219-1.9199215zm4.4804684 0c-1.0050964.0005523-1.9193692.9148251-1.9199215 1.9199215.0005519 1.005097.9148249 1.91937 1.9199215 1.919922 1.005098-.000552 1.91937-.914824 1.919922-1.919922-.000552-1.0050966-.914825-1.9193696-1.919922-1.9199215zm4.480469 0c-1.006074-.0009826-1.921322.9138477-1.921875 1.9199215.000552 1.006075.915801 1.920905 1.921875 1.919922 1.005097-.000552 1.91937-.914824 1.919922-1.919922-.000552-1.0050966-.914825-1.9193696-1.919922-1.9199215z" fill="#3a3a38"/><path d="m5.76 8.96a1.28 1.28 0 0 0 -1.28 1.28 1.28 1.28 0 0 0 1.28 1.28 1.28 1.28 0 0 0 1.28-1.28 1.28 1.28 0 0 0 -1.28-1.28zm4.48 0a1.28 1.28 0 0 0 -1.28 1.28 1.28 1.28 0 0 0 1.28 1.28 1.28 1.28 0 0 0 1.28-1.28 1.28 1.28 0 0 0 -1.28-1.28zm4.48 0a1.28 1.28 0 0 0 -1.28 1.28 1.28 1.28 0 0 0 1.28 1.28 1.28 1.28 0 0 0 1.28-1.28 1.28 1.28 0 0 0 -1.28-1.28z" fill="#fafafa"/></g></svg>
\ No newline at end of file diff --git a/icon-themes/colibre_dark_svg/sd/res/slideshowmenu_mouseover.svg b/icon-themes/colibre_dark_svg/sd/res/slideshowmenu_mouseover.svg new file mode 100644 index 000000000000..8a87f9821870 --- /dev/null +++ b/icon-themes/colibre_dark_svg/sd/res/slideshowmenu_mouseover.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64c5.301934.00000022 9.6 4.2980665 9.6 9.6 0 5.301934-4.298066 9.6-9.6 9.6-5.3019335 0-9.59999978-4.298066-9.6-9.6.00000022-5.3019335 4.2980665-9.59999978 9.6-9.6z" fill="#3a3a38" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c-4.9484661 0-8.96 4.0115336-8.96 8.96 0 4.948466 4.0115339 8.96 8.96 8.96 4.948467 0 8.96-4.011534 8.96-8.96 0-4.9484664-4.011533-8.96-8.96-8.96zm-4.48 7.68a1.28 1.28 0 0 1 1.28 1.28 1.28 1.28 0 0 1 -1.28 1.28 1.28 1.28 0 0 1 -1.28-1.28 1.28 1.28 0 0 1 1.28-1.28zm4.48 0a1.28 1.28 0 0 1 1.28 1.28 1.28 1.28 0 0 1 -1.28 1.28 1.28 1.28 0 0 1 -1.28-1.28 1.28 1.28 0 0 1 1.28-1.28zm4.48 0a1.28 1.28 0 0 1 1.28 1.28 1.28 1.28 0 0 1 -1.28 1.28 1.28 1.28 0 0 1 -1.28-1.28 1.28 1.28 0 0 1 1.28-1.28z" fill="#fafafa"/></svg>
\ No newline at end of file diff --git a/icon-themes/colibre_svg/sd/res/nextslide.svg b/icon-themes/colibre_svg/sd/res/nextslide.svg new file mode 100644 index 000000000000..b860207b2b6e --- /dev/null +++ b/icon-themes/colibre_svg/sd/res/nextslide.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64a9.6000004 9.6000004 0 0 0 -9.6 9.6 9.6000004 9.6000004 0 0 0 9.6 9.6 9.6000004 9.6000004 0 0 0 9.6-9.6 9.6000004 9.6000004 0 0 0 -9.6-9.6zm0 2.56a7.04 7.04 0 0 1 7.04 7.04 7.04 7.04 0 0 1 -7.04 7.04 7.04 7.04 0 0 1 -7.04-7.04 7.04 7.04 0 0 1 7.04-7.04zm-3.1875 1.27875a.63920524.63920524 0 0 0 -.32625.08125.63920524.63920524 0 0 0 -.32625.55875v.64125a.63920524.63920524 0 0 0 .0375.215l1.52375 4.265-1.52375 4.26625a.63920524.63920524 0 0 0 -.0375.215v.6375a.63920524.63920524 0 0 0 .9725.545l8.32125-5.11875a.63920524.63920524 0 0 0 .00125-1.09l-8.32-5.12125a.63920524.63920524 0 0 0 -.3225-.095z" fill="#fafafa" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c-4.9484715 0-8.96 4.0115287-8.96 8.96 0 4.948471 4.0115285 8.96 8.96 8.96 4.948471 0 8.96-4.011529 8.96-8.96 0-4.9484713-4.011529-8.96-8.96-8.96zm0 1.2799999c4.241546 0 7.679999 3.4384531 7.679999 7.6800001s-3.438453 7.68-7.679999 7.68c-4.241547 0-7.6800001-3.438453-7.6800001-7.68s3.4384531-7.6800001 7.6800001-7.6800001zm-3.2000002 2.5599999v.6399999l1.6000004 4.4800003-1.6000004 4.48v.64l8.3200002-5.12z" fill="#3a3a38" stroke-width=".639999"/></svg>
\ No newline at end of file diff --git a/icon-themes/colibre_svg/sd/res/nextslide_mouseover.svg b/icon-themes/colibre_svg/sd/res/nextslide_mouseover.svg new file mode 100644 index 000000000000..710af1886222 --- /dev/null +++ b/icon-themes/colibre_svg/sd/res/nextslide_mouseover.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64c-5.301934.00000022-9.6 4.2980665-9.6 9.6 0 5.301934 4.298066 9.6 9.6 9.6 5.301933 0 9.6-4.298066 9.6-9.6 0-5.3019335-4.298067-9.59999978-9.6-9.6z" fill="#fafafa" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c4.948466 0 8.96 4.0115336 8.96 8.96 0 4.948466-4.011534 8.96-8.96 8.96-4.948467 0-8.96-4.011534-8.96-8.96 0-4.9484664 4.011533-8.96 8.96-8.96zm-3.2 3.84v.64l1.6 4.48-1.6 4.48v.64l8.32-5.12z" fill="#3a3a38"/></svg>
\ No newline at end of file diff --git a/icon-themes/colibre_svg/sd/res/prevslide.svg b/icon-themes/colibre_svg/sd/res/prevslide.svg new file mode 100644 index 000000000000..41f76dec28a3 --- /dev/null +++ b/icon-themes/colibre_svg/sd/res/prevslide.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64a9.6000004 9.6000004 0 0 1 9.6 9.6 9.6000004 9.6000004 0 0 1 -9.6 9.6 9.6000004 9.6000004 0 0 1 -9.6-9.6 9.6000004 9.6000004 0 0 1 9.6-9.6zm0 2.56a7.04 7.04 0 0 0 -7.04 7.04 7.04 7.04 0 0 0 7.04 7.04 7.04 7.04 0 0 0 7.04-7.04 7.04 7.04 0 0 0 -7.04-7.04zm3.1875 1.27875a.63920524.63920524 0 0 1 .32625.08125.63920524.63920524 0 0 1 .32625.55875v.64125a.63920524.63920524 0 0 1 -.0375.215l-1.52375 4.265 1.52375 4.26625a.63920524.63920524 0 0 1 .0375.215v.6375a.63920524.63920524 0 0 1 -.9725.545l-8.32125-5.11875a.63920524.63920524 0 0 1 -.00125-1.09l8.32-5.12125a.63920524.63920524 0 0 1 .3225-.095z" fill="#fafafa" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c4.948472 0 8.96 4.0115287 8.96 8.96 0 4.948471-4.011528 8.96-8.96 8.96-4.948471 0-8.96-4.011529-8.96-8.96 0-4.9484713 4.011529-8.96 8.96-8.96zm0 1.2799999c-4.241546 0-7.679999 3.4384531-7.679999 7.6800001s3.438453 7.68 7.679999 7.68c4.241547 0 7.68-3.438453 7.68-7.68s-3.438453-7.6800001-7.68-7.6800001zm3.2 2.5599999v.6399999l-1.6 4.4800003 1.6 4.48v.64l-8.32-5.12z" fill="#3a3a38" stroke-width=".639999"/></svg>
\ No newline at end of file diff --git a/icon-themes/colibre_svg/sd/res/prevslide_mouseover.svg b/icon-themes/colibre_svg/sd/res/prevslide_mouseover.svg new file mode 100644 index 000000000000..7d5f7edd1980 --- /dev/null +++ b/icon-themes/colibre_svg/sd/res/prevslide_mouseover.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64c5.301934.00000022 9.6 4.2980665 9.6 9.6 0 5.301934-4.298066 9.6-9.6 9.6-5.3019335 0-9.59999978-4.298066-9.6-9.6.00000022-5.3019335 4.2980665-9.59999978 9.6-9.6z" fill="#fafafa" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c-4.9484661 0-8.96 4.0115336-8.96 8.96 0 4.948466 4.0115339 8.96 8.96 8.96 4.948467 0 8.96-4.011534 8.96-8.96 0-4.9484664-4.011533-8.96-8.96-8.96zm3.2 3.84v.64l-1.6 4.48 1.6 4.48v.64l-8.32-5.12z" fill="#3a3a38"/></svg>
\ No newline at end of file diff --git a/icon-themes/colibre_svg/sd/res/slideshowmenu.svg b/icon-themes/colibre_svg/sd/res/slideshowmenu.svg new file mode 100644 index 000000000000..21785ef384a2 --- /dev/null +++ b/icon-themes/colibre_svg/sd/res/slideshowmenu.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64c5.301934.00000022 9.6 4.2980665 9.6 9.6 0 5.301934-4.298066 9.6-9.6 9.6-5.3019335 0-9.59999978-4.298066-9.6-9.6.00000022-5.3019335 4.2980665-9.59999978 9.6-9.6zm0 2.56c-3.8880846 0-7.04 3.1519154-7.04 7.04 0 3.888085 3.1519154 7.04 7.04 7.04 3.888085 0 7.04-3.151915 7.04-7.04 0-3.8880846-3.151915-7.04-7.04-7.04z" fill="#fafafa" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c4.948472 0 8.96 4.0115287 8.96 8.96 0 4.948471-4.011528 8.96-8.96 8.96-4.948471 0-8.96-4.011529-8.96-8.96 0-4.9484713 4.011529-8.96 8.96-8.96zm0 1.2799999c-4.241546 0-7.679999 3.4384531-7.679999 7.6800001s3.438453 7.68 7.679999 7.68c4.241547 0 7.68-3.438453 7.68-7.68s-3.438453-7.6800001-7.68-7.6800001z" fill="#3a3a38" stroke-width=".639999"/><g stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"><path d="m5.7597656 8.3203125c-1.0050969.000552-1.9193696.914825-1.9199218 1.9199215.0005518 1.005098.9148247 1.91937 1.9199218 1.919922 1.0050972-.000552 1.91937-.914824 1.9199219-1.919922-.0005523-1.0050966-.9148249-1.9193696-1.9199219-1.9199215zm4.4804684 0c-1.0050964.0005523-1.9193692.9148251-1.9199215 1.9199215.0005519 1.005097.9148249 1.91937 1.9199215 1.919922 1.005098-.000552 1.91937-.914824 1.919922-1.919922-.000552-1.0050966-.914825-1.9193696-1.919922-1.9199215zm4.480469 0c-1.006074-.0009826-1.921322.9138477-1.921875 1.9199215.000552 1.006075.915801 1.920905 1.921875 1.919922 1.005097-.000552 1.91937-.914824 1.919922-1.919922-.000552-1.0050966-.914825-1.9193696-1.919922-1.9199215z" fill="#fafafa"/><path d="m5.76 8.96a1.28 1.28 0 0 0 -1.28 1.28 1.28 1.28 0 0 0 1.28 1.28 1.28 1.28 0 0 0 1.28-1.28 1.28 1.28 0 0 0 -1.28-1.28zm4.48 0a1.28 1.28 0 0 0 -1.28 1.28 1.28 1.28 0 0 0 1.28 1.28 1.28 1.28 0 0 0 1.28-1.28 1.28 1.28 0 0 0 -1.28-1.28zm4.48 0a1.28 1.28 0 0 0 -1.28 1.28 1.28 1.28 0 0 0 1.28 1.28 1.28 1.28 0 0 0 1.28-1.28 1.28 1.28 0 0 0 -1.28-1.28z" fill="#3a3a38"/></g></svg>
\ No newline at end of file diff --git a/icon-themes/colibre_svg/sd/res/slideshowmenu_mouseover.svg b/icon-themes/colibre_svg/sd/res/slideshowmenu_mouseover.svg new file mode 100644 index 000000000000..68c74478bd1b --- /dev/null +++ b/icon-themes/colibre_svg/sd/res/slideshowmenu_mouseover.svg @@ -0,0 +1 @@ +<svg height="32" viewBox="0 0 20.48 20.48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m10.24.64c5.301934.00000022 9.6 4.2980665 9.6 9.6 0 5.301934-4.298066 9.6-9.6 9.6-5.3019335 0-9.59999978-4.298066-9.6-9.6.00000022-5.3019335 4.2980665-9.59999978 9.6-9.6z" fill="#fafafa" stroke-linecap="square" stroke-opacity=".566502" stroke-width=".64"/><path d="m10.24 1.28c-4.9484661 0-8.96 4.0115336-8.96 8.96 0 4.948466 4.0115339 8.96 8.96 8.96 4.948467 0 8.96-4.011534 8.96-8.96 0-4.9484664-4.011533-8.96-8.96-8.96zm-4.48 7.68a1.28 1.28 0 0 1 1.28 1.28 1.28 1.28 0 0 1 -1.28 1.28 1.28 1.28 0 0 1 -1.28-1.28 1.28 1.28 0 0 1 1.28-1.28zm4.48 0a1.28 1.28 0 0 1 1.28 1.28 1.28 1.28 0 0 1 -1.28 1.28 1.28 1.28 0 0 1 -1.28-1.28 1.28 1.28 0 0 1 1.28-1.28zm4.48 0a1.28 1.28 0 0 1 1.28 1.28 1.28 1.28 0 0 1 -1.28 1.28 1.28 1.28 0 0 1 -1.28-1.28 1.28 1.28 0 0 1 1.28-1.28z" fill="#3a3a38"/></svg>
\ No newline at end of file diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk index bdae567ce601..96ed8e6e943a 100644 --- a/offapi/UnoApi_offapi.mk +++ b/offapi/UnoApi_offapi.mk @@ -2983,6 +2983,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/presentation,\ XSlideShow \ XSlideShowController \ XSlideShowListener \ + XSlideShowNavigationListener \ XSlideShowView \ XTransition \ XTransitionFactory \ diff --git a/offapi/com/sun/star/presentation/XSlideShowNavigationListener.idl b/offapi/com/sun/star/presentation/XSlideShowNavigationListener.idl new file mode 100644 index 000000000000..683c1b6c6336 --- /dev/null +++ b/offapi/com/sun/star/presentation/XSlideShowNavigationListener.idl @@ -0,0 +1,28 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +module com { module sun { module star { module presentation { + +/** Listener interface with navigation support to receive global slide show events.<p> + + @see XSlideShowListener + + @since LibreOffice 7.6 + */ +interface XSlideShowNavigationListener : com::sun::star::presentation::XSlideShowListener +{ + /** Notify that the context menu has been requested + @param point point to show the context menu + */ + void contextMenuShow( [in] com::sun::star::awt::Point point ); +}; + +}; }; }; }; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sd/inc/bitmaps.hlst b/sd/inc/bitmaps.hlst index 32e81ced59fa..3ec2ba28965e 100644 --- a/sd/inc/bitmaps.hlst +++ b/sd/inc/bitmaps.hlst @@ -208,6 +208,13 @@ inline constexpr OUStringLiteral BMP_MENU_PREV = u"cmd/sc_prevrecord.png"; inline constexpr OUStringLiteral BMP_MENU_FIRST = u"cmd/sc_firstrecord.png"; inline constexpr OUStringLiteral BMP_MENU_LAST = u"cmd/sc_lastrecord.png"; +inline constexpr OUStringLiteral BMP_PREV_SLIDE = u"sd/res/prevslide.png"; +inline constexpr OUStringLiteral BMP_PREV_SLIDE_MOUSE_OVER = u"sd/res/prevslide_mouseover.png"; +inline constexpr OUStringLiteral BMP_NEXT_SLIDE = u"sd/res/nextslide.png"; +inline constexpr OUStringLiteral BMP_NEXT_SLIDE_MOUSE_OVER = u"sd/res/nextslide_mouseover.png"; +inline constexpr OUStringLiteral BMP_MENU_SLIDE = u"sd/res/slideshowmenu.png"; +inline constexpr OUStringLiteral BMP_MENU_SLIDE_MOUSE_OVER = u"sd/res/slideshowmenu_mouseover.png"; + inline constexpr OUStringLiteral SFX_BMP_CLOSE_DOC = u"sfx2/res/closedoc.png"; /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sd/inc/drawdoc.hxx b/sd/inc/drawdoc.hxx index 9637e8f26cc2..c0a01c548be0 100644 --- a/sd/inc/drawdoc.hxx +++ b/sd/inc/drawdoc.hxx @@ -104,6 +104,7 @@ namespace sd bool mbMouseAsPen; bool mbLockedPages; bool mbAlwaysOnTop; + bool mbUseNavigation; bool mbFullScreen; bool mbAnimationAllowed; sal_Int32 mnPauseTimeout; diff --git a/sd/inc/sdattr.hrc b/sd/inc/sdattr.hrc index 17f8d8761fd1..73ba06f69a60 100644 --- a/sd/inc/sdattr.hrc +++ b/sd/inc/sdattr.hrc @@ -36,23 +36,25 @@ class XColorItem; #define ATTR_LAYER_END ATTR_LAYER_DESC // presentation attributes -#define ATTR_PRESENT_START ATTR_LAYER_END + 1 -#define ATTR_PRESENT_ALL ATTR_PRESENT_START -#define ATTR_PRESENT_CUSTOMSHOW ATTR_PRESENT_START + 1 -#define ATTR_PRESENT_DIANAME ATTR_PRESENT_START + 2 -#define ATTR_PRESENT_ENDLESS ATTR_PRESENT_START + 3 -#define ATTR_PRESENT_MANUEL ATTR_PRESENT_START + 4 -#define ATTR_PRESENT_MOUSE ATTR_PRESENT_START + 5 -#define ATTR_PRESENT_PEN ATTR_PRESENT_START + 6 -#define ATTR_PRESENT_NAVIGATOR ATTR_PRESENT_START + 7 -#define ATTR_PRESENT_CHANGE_PAGE ATTR_PRESENT_START + 8 -#define ATTR_PRESENT_ALWAYS_ON_TOP ATTR_PRESENT_START + 9 -#define ATTR_PRESENT_FULLSCREEN ATTR_PRESENT_START + 10 -#define ATTR_PRESENT_ANIMATION_ALLOWED ATTR_PRESENT_START + 12 -#define ATTR_PRESENT_PAUSE_TIMEOUT ATTR_PRESENT_START + 13 -#define ATTR_PRESENT_SHOW_PAUSELOGO ATTR_PRESENT_START + 14 -#define ATTR_PRESENT_DISPLAY ATTR_PRESENT_START + 15 -#define ATTR_PRESENT_END ATTR_PRESENT_DISPLAY +#define ATTR_PRESENT_START ATTR_LAYER_END + 1 +#define ATTR_PRESENT_ALL ATTR_PRESENT_START +#define ATTR_PRESENT_CUSTOMSHOW ATTR_PRESENT_START + 1 +#define ATTR_PRESENT_DIANAME ATTR_PRESENT_START + 2 +#define ATTR_PRESENT_ENDLESS ATTR_PRESENT_START + 3 +#define ATTR_PRESENT_MANUEL ATTR_PRESENT_START + 4 +#define ATTR_PRESENT_MOUSE ATTR_PRESENT_START + 5 +#define ATTR_PRESENT_PEN ATTR_PRESENT_START + 6 +#define ATTR_PRESENT_NAVIGATOR ATTR_PRESENT_START + 7 +#define ATTR_PRESENT_CHANGE_PAGE ATTR_PRESENT_START + 8 +#define ATTR_PRESENT_ALWAYS_ON_TOP ATTR_PRESENT_START + 9 +#define ATTR_PRESENT_FULLSCREEN ATTR_PRESENT_START + 10 +#define ATTR_PRESENT_ANIMATION_ALLOWED ATTR_PRESENT_START + 12 +#define ATTR_PRESENT_PAUSE_TIMEOUT ATTR_PRESENT_START + 13 +#define ATTR_PRESENT_SHOW_PAUSELOGO ATTR_PRESENT_START + 14 +#define ATTR_PRESENT_DISPLAY ATTR_PRESENT_START + 15 +#define ATTR_PRESENT_SHOW_NAVIGATION_BUTTONS ATTR_PRESENT_START + 16 + +#define ATTR_PRESENT_END ATTR_PRESENT_SHOW_NAVIGATION_BUTTONS // animation attributes #define ATTR_ANIMATION_START ATTR_PRESENT_END + 1 diff --git a/sd/inc/strings.hrc b/sd/inc/strings.hrc index 187a411dc38e..bf5372b2ad33 100644 --- a/sd/inc/strings.hrc +++ b/sd/inc/strings.hrc @@ -29,6 +29,9 @@ #define STR_UNDO_SLIDE_PARAMS NC_("STR_UNDO_SLIDE_PARAMS", "Slide parameter") #define STR_UNDO_CUT NC_("STR_UNDO_CUT", "Cut") #define STR_UNDO_REPLACE NC_("STR_UNDO_REPLACE", "Replace") +#define STR_NEXT_SLIDE NC_("STR_NEXT_SLIDE", "Next slide") +#define STR_PREV_SLIDE NC_("STR_PREV_SLIDE", "Previous slide") +#define STR_MENU_SLIDE NC_("STR_MENU_SLIDE", "Menu slide") #define STR_UNDO_DRAGDROP NC_("STR_UNDO_DRAGDROP", "Drag and Drop") #define STR_INSERTGRAPHIC NC_("STR_INSERTGRAPHIC", "Insert Image") #define STR_UNDO_BEZCLOSE NC_("STR_UNDO_BEZCLOSE", "Close Polygon") diff --git a/sd/qa/unit/dialogs-test.cxx b/sd/qa/unit/dialogs-test.cxx index c6e90419869d..eb8aa7be3c2f 100644 --- a/sd/qa/unit/dialogs-test.cxx +++ b/sd/qa/unit/dialogs-test.cxx @@ -417,6 +417,7 @@ VclPtr<VclAbstractDialog> SdDialogsTest::createDialogByID(sal_uInt32 nID) aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_ANIMATION_ALLOWED, rPresentationSettings.mbAnimationAllowed)); aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_CHANGE_PAGE, !rPresentationSettings.mbLockedPages)); aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_ALWAYS_ON_TOP, rPresentationSettings.mbAlwaysOnTop)); + aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_SHOW_NAVIGATION_BUTTONS, rPresentationSettings.mbUseNavigation)); aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_FULLSCREEN, rPresentationSettings.mbFullScreen)); aDlgSet.Put(SfxUInt32Item(ATTR_PRESENT_PAUSE_TIMEOUT, rPresentationSettings.mnPauseTimeout)); aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_SHOW_PAUSELOGO, rPresentationSettings.mbShowPauseLogo)); diff --git a/sd/source/core/drawdoc.cxx b/sd/source/core/drawdoc.cxx index 98ba2126b6ba..89d5bdefa714 100644 --- a/sd/source/core/drawdoc.cxx +++ b/sd/source/core/drawdoc.cxx @@ -105,6 +105,7 @@ PresentationSettings::PresentationSettings() mbMouseAsPen( false ), mbLockedPages( false ), mbAlwaysOnTop( false ), + mbUseNavigation( false ), mbFullScreen( true ), mbAnimationAllowed( true ), mnPauseTimeout( 0 ), diff --git a/sd/source/ui/dlg/present.cxx b/sd/source/ui/dlg/present.cxx index 73932ba622bd..cb5c7d871b36 100644 --- a/sd/source/ui/dlg/present.cxx +++ b/sd/source/ui/dlg/present.cxx @@ -54,6 +54,7 @@ SdStartPresentationDlg::SdStartPresentationDlg(weld::Window* pWindow, const SfxI , m_xCbxAnimationAllowed(m_xBuilder->weld_check_button("animationsallowed")) , m_xCbxChangePage(m_xBuilder->weld_check_button("changeslidesbyclick")) , m_xCbxAlwaysOnTop(m_xBuilder->weld_check_button("alwaysontop")) + , m_xCbxShowNavigationButton(m_xBuilder->weld_check_button("shownavigationbutton")) , m_xFtMonitor(m_xBuilder->weld_label("presdisplay_label")) , m_xLBMonitor(m_xBuilder->weld_combo_box("presdisplay_cb")) , m_xMonitor(m_xBuilder->weld_label("monitor_str")) @@ -112,6 +113,7 @@ SdStartPresentationDlg::SdStartPresentationDlg(weld::Window* pWindow, const SfxI m_xCbxAnimationAllowed->set_active( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_ANIMATION_ALLOWED ) ).GetValue() ); m_xCbxChangePage->set_active( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_CHANGE_PAGE ) ).GetValue() ); m_xCbxAlwaysOnTop->set_active( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_ALWAYS_ON_TOP ) ).GetValue() ); + m_xCbxShowNavigationButton->set_active( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_SHOW_NAVIGATION_BUTTONS) ).GetValue() ); const bool bEndless = static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_ENDLESS ) ).GetValue(); const bool bWindow = !static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_FULLSCREEN ) ).GetValue(); @@ -260,6 +262,7 @@ void SdStartPresentationDlg::GetAttr( SfxItemSet& rAttr ) rAttr.Put( SfxBoolItem ( ATTR_PRESENT_ANIMATION_ALLOWED, m_xCbxAnimationAllowed->get_active() ) ); rAttr.Put( SfxBoolItem ( ATTR_PRESENT_CHANGE_PAGE, m_xCbxChangePage->get_active() ) ); rAttr.Put( SfxBoolItem ( ATTR_PRESENT_ALWAYS_ON_TOP, m_xCbxAlwaysOnTop->get_active() ) ); + rAttr.Put( SfxBoolItem ( ATTR_PRESENT_SHOW_NAVIGATION_BUTTONS, m_xCbxShowNavigationButton->get_active() ) ); rAttr.Put( SfxBoolItem ( ATTR_PRESENT_FULLSCREEN, !m_xRbtWindow->get_active() ) ); rAttr.Put( SfxBoolItem ( ATTR_PRESENT_ENDLESS, m_xRbtAuto->get_active() ) ); rAttr.Put( SfxUInt32Item ( ATTR_PRESENT_PAUSE_TIMEOUT, m_xFormatter->GetTime().GetMSFromTime() / 1000 ) ); diff --git a/sd/source/ui/func/fusldlg.cxx b/sd/source/ui/func/fusldlg.cxx index c0269b08a362..f609da1a9631 100644 --- a/sd/source/ui/func/fusldlg.cxx +++ b/sd/source/ui/func/fusldlg.cxx @@ -99,6 +99,7 @@ void FuSlideShowDlg::DoExecute( SfxRequest& ) aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_ANIMATION_ALLOWED, rPresentationSettings.mbAnimationAllowed ) ); aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_CHANGE_PAGE, !rPresentationSettings.mbLockedPages ) ); aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_ALWAYS_ON_TOP, rPresentationSettings.mbAlwaysOnTop ) ); + aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_SHOW_NAVIGATION_BUTTONS, rPresentationSettings.mbUseNavigation ) ); aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_FULLSCREEN, rPresentationSettings.mbFullScreen ) ); aDlgSet.Put( SfxUInt32Item( ATTR_PRESENT_PAUSE_TIMEOUT, rPresentationSettings.mnPauseTimeout ) ); aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_SHOW_PAUSELOGO, rPresentationSettings.mbShowPauseLogo ) ); @@ -193,6 +194,13 @@ void FuSlideShowDlg::DoExecute( SfxRequest& ) rPresentationSettings.mbAlwaysOnTop = bValue; } + bValue = ITEMVALUE(aDlgSet, ATTR_PRESENT_SHOW_NAVIGATION_BUTTONS, SfxBoolItem); + if (bValue != rPresentationSettings.mbUseNavigation) + { + bValuesChanged = true; + rPresentationSettings.mbUseNavigation = bValue; + } + bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_FULLSCREEN, SfxBoolItem ); if ( bValue != rPresentationSettings.mbFullScreen ) { diff --git a/sd/source/ui/inc/present.hxx b/sd/source/ui/inc/present.hxx index 00c78ac79328..aba8839bdfd2 100644 --- a/sd/source/ui/inc/present.hxx +++ b/sd/source/ui/inc/present.hxx @@ -54,6 +54,7 @@ private: std::unique_ptr<weld::CheckButton> m_xCbxAnimationAllowed; std::unique_ptr<weld::CheckButton> m_xCbxChangePage; std::unique_ptr<weld::CheckButton> m_xCbxAlwaysOnTop; + std::unique_ptr<weld::CheckButton> m_xCbxShowNavigationButton; std::unique_ptr<weld::Label> m_xFtMonitor; std::unique_ptr<weld::ComboBox> m_xLBMonitor; diff --git a/sd/source/ui/slideshow/slideshow.cxx b/sd/source/ui/slideshow/slideshow.cxx index ec070d0919c7..348bc606b800 100644 --- a/sd/source/ui/slideshow/slideshow.cxx +++ b/sd/source/ui/slideshow/slideshow.cxx @@ -109,21 +109,22 @@ static o3tl::span<const SfxItemPropertyMapEntry> ImplGetPresentationPropertyMap( // NOTE: First member must be sorted static const SfxItemPropertyMapEntry aPresentationPropertyMap_Impl[] = { - { u"AllowAnimations", ATTR_PRESENT_ANIMATION_ALLOWED, cppu::UnoType<bool>::get(), 0, 0 }, - { u"CustomShow", ATTR_PRESENT_CUSTOMSHOW, ::cppu::UnoType<OUString>::get(), 0, 0 }, - { u"Display", ATTR_PRESENT_DISPLAY, ::cppu::UnoType<sal_Int32>::get(), 0, 0 }, - { u"FirstPage", ATTR_PRESENT_DIANAME, ::cppu::UnoType<OUString>::get(), 0, 0 }, - { u"IsAlwaysOnTop", ATTR_PRESENT_ALWAYS_ON_TOP, cppu::UnoType<bool>::get(), 0, 0 }, - { u"IsAutomatic", ATTR_PRESENT_MANUEL, cppu::UnoType<bool>::get(), 0, 0 }, - { u"IsEndless", ATTR_PRESENT_ENDLESS, cppu::UnoType<bool>::get(), 0, 0 }, - { u"IsFullScreen", ATTR_PRESENT_FULLSCREEN, cppu::UnoType<bool>::get(), 0, 0 }, - { u"IsShowAll", ATTR_PRESENT_ALL, cppu::UnoType<bool>::get(), 0, 0 }, - { u"IsMouseVisible", ATTR_PRESENT_MOUSE, cppu::UnoType<bool>::get(), 0, 0 }, - { u"IsShowLogo", ATTR_PRESENT_SHOW_PAUSELOGO, cppu::UnoType<bool>::get(), 0, 0 }, - { u"IsTransitionOnClick", ATTR_PRESENT_CHANGE_PAGE, cppu::UnoType<bool>::get(), 0, 0 }, - { u"Pause", ATTR_PRESENT_PAUSE_TIMEOUT, ::cppu::UnoType<sal_Int32>::get(), 0, 0 }, - { u"StartWithNavigator", ATTR_PRESENT_NAVIGATOR, cppu::UnoType<bool>::get(), 0, 0 }, - { u"UsePen", ATTR_PRESENT_PEN, cppu::UnoType<bool>::get(), 0, 0 }, + { u"AllowAnimations", ATTR_PRESENT_ANIMATION_ALLOWED, cppu::UnoType<bool>::get(), 0, 0 }, + { u"CustomShow", ATTR_PRESENT_CUSTOMSHOW, ::cppu::UnoType<OUString>::get(), 0, 0 }, + { u"Display", ATTR_PRESENT_DISPLAY, ::cppu::UnoType<sal_Int32>::get(), 0, 0 }, + { u"FirstPage", ATTR_PRESENT_DIANAME, ::cppu::UnoType<OUString>::get(), 0, 0 }, + { u"IsAlwaysOnTop", ATTR_PRESENT_ALWAYS_ON_TOP, cppu::UnoType<bool>::get(), 0, 0 }, + { u"IsShowNavigationButtons", ATTR_PRESENT_SHOW_NAVIGATION_BUTTONS, cppu::UnoType<bool>::get(), 0, 0 }, + { u"IsAutomatic", ATTR_PRESENT_MANUEL, cppu::UnoType<bool>::get(), 0, 0 }, + { u"IsEndless", ATTR_PRESENT_ENDLESS, cppu::UnoType<bool>::get(), 0, 0 }, + { u"IsFullScreen", ATTR_PRESENT_FULLSCREEN, cppu::UnoType<bool>::get(), 0, 0 }, + { u"IsShowAll", ATTR_PRESENT_ALL, cppu::UnoType<bool>::get(), 0, 0 }, + { u"IsMouseVisible", ATTR_PRESENT_MOUSE, cppu::UnoType<bool>::get(), 0, 0 }, + { u"IsShowLogo", ATTR_PRESENT_SHOW_PAUSELOGO, cppu::UnoType<bool>::get(), 0, 0 }, + { u"IsTransitionOnClick", ATTR_PRESENT_CHANGE_PAGE, cppu::UnoType<bool>::get(), 0, 0 }, + { u"Pause", ATTR_PRESENT_PAUSE_TIMEOUT, ::cppu::UnoType<sal_Int32>::get(), 0, 0 }, + { u"StartWithNavigator", ATTR_PRESENT_NAVIGATOR, cppu::UnoType<bool>::get(), 0, 0 }, + { u"UsePen", ATTR_PRESENT_PEN, cppu::UnoType<bool>::get(), 0, 0 }, }; return aPresentationPropertyMap_Impl; @@ -439,6 +440,22 @@ void SAL_CALL SlideShow::setPropertyValue( const OUString& aPropertyName, const } break; } + case ATTR_PRESENT_SHOW_NAVIGATION_BUTTONS: + { + bool bVal = false; + + if (aValue >>= bVal) + { + bIllegalArgument = false; + + if (rPresSettings.mbUseNavigation != bVal) + { + bValuesChanged = true; + rPresSettings.mbUseNavigation = bVal; + } + } + break; + } case ATTR_PRESENT_NAVIGATOR: bIllegalArgument = false; //ignored, but exists in some older documents @@ -565,6 +582,8 @@ Any SAL_CALL SlideShow::getPropertyValue( const OUString& PropertyName ) return Any( rPresSettings.mbMouseVisible ); case ATTR_PRESENT_ALWAYS_ON_TOP: return Any( rPresSettings.mbAlwaysOnTop ); + case ATTR_PRESENT_SHOW_NAVIGATION_BUTTONS: + return Any(rPresSettings.mbUseNavigation); case ATTR_PRESENT_NAVIGATOR: return Any( false ); case ATTR_PRESENT_PEN: diff --git a/sd/source/ui/slideshow/slideshowimpl.cxx b/sd/source/ui/slideshow/slideshowimpl.cxx index 73517ff87c0e..a9f16b86b8d4 100644 --- a/sd/source/ui/slideshow/slideshowimpl.cxx +++ b/sd/source/ui/slideshow/slideshowimpl.cxx @@ -756,6 +756,7 @@ bool SlideshowImpl::startPreview( maPresSettings.mbMouseAsPen = false; maPresSettings.mbLockedPages = false; maPresSettings.mbAlwaysOnTop = false; + maPresSettings.mbUseNavigation = false; maPresSettings.mbFullScreen = false; maPresSettings.mbAnimationAllowed = true; maPresSettings.mnPauseTimeout = 0; @@ -876,6 +877,7 @@ bool SlideshowImpl::startShow( PresentationSettingsEx const * pPresSettings ) maPresSettings.mbMouseAsPen = false; maPresSettings.mnPauseTimeout = 0; maPresSettings.mbShowPauseLogo = false; + maPresSettings.mbUseNavigation = false; } if( pStartPage ) @@ -1077,6 +1079,37 @@ bool SlideshowImpl::startShowImpl( const Sequence< beans::PropertyValue >& aProp Any( xPointerBitmap ), beans::PropertyState_DIRECT_VALUE ) ); } + + if (maPresSettings.mbUseNavigation) + { + BitmapEx prevSlideBm(BMP_PREV_SLIDE); + const Reference<rendering::XBitmap> xPrevSBitmap( + vcl::unotools::xBitmapFromBitmapEx(prevSlideBm)); + if (xPrevSBitmap.is()) + { + mxShow->setProperty(beans::PropertyValue("NavigationSlidePrev", -1, + Any(xPrevSBitmap), + beans::PropertyState_DIRECT_VALUE)); + } + BitmapEx menuSlideBm(BMP_MENU_SLIDE); + const Reference<rendering::XBitmap> xMenuSBitmap( + vcl::unotools::xBitmapFromBitmapEx(menuSlideBm)); + if (xMenuSBitmap.is()) + { + mxShow->setProperty(beans::PropertyValue("NavigationSlideMenu", -1, + Any(xMenuSBitmap), + beans::PropertyState_DIRECT_VALUE)); + } + BitmapEx nextSlideBm(BMP_NEXT_SLIDE); + const Reference<rendering::XBitmap> xNextSBitmap( + vcl::unotools::xBitmapFromBitmapEx(nextSlideBm)); + if (xNextSBitmap.is()) + { + mxShow->setProperty(beans::PropertyValue("NavigationSlideNext", -1, + Any(xNextSBitmap), + beans::PropertyState_DIRECT_VALUE)); + } + } } for( const auto& rProp : aProperties ) @@ -1579,6 +1612,12 @@ sal_Int32 SlideshowImpl::getSlideNumberForBookmark( const OUString& rStrBookmark return ( nPgNum - 1) >> 1; } +void SlideshowImpl::contextMenuShow(const css::awt::Point& point) +{ + maPopupMousePos = { point.X, point.Y }; + mnContextMenuEvent = Application::PostUserEvent(LINK(this, SlideshowImpl, ContextMenuHdl)); +} + void SlideshowImpl::hyperLinkClicked( OUString const& aHyperLink ) { OUString aBookmark( aHyperLink ); @@ -3346,6 +3385,13 @@ void SAL_CALL SlideShowListenerProxy::click( const Reference< XShape >& xShape, mxController->click(xShape ); } +void SAL_CALL SlideShowListenerProxy::contextMenuShow(const css::awt::Point& point) +{ + SolarMutexGuard aSolarGuard; + if (mxController.is()) + mxController->contextMenuShow(point); +} + } // namespace ::sd /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/slideshow/slideshowimpl.hxx b/sd/source/ui/slideshow/slideshowimpl.hxx index 27c755318c8d..48802ba54499 100644 --- a/sd/source/ui/slideshow/slideshowimpl.hxx +++ b/sd/source/ui/slideshow/slideshowimpl.hxx @@ -25,7 +25,7 @@ #include <cppuhelper/implbase.hxx> #include <comphelper/interfacecontainer4.hxx> #include <com/sun/star/presentation/ClickAction.hpp> -#include <com/sun/star/presentation/XSlideShowListener.hpp> +#include <com/sun/star/presentation/XSlideShowNavigationListener.hpp> #include <com/sun/star/presentation/XSlideShowController.hpp> #include <com/sun/star/presentation/XShapeEventListener.hpp> @@ -80,7 +80,7 @@ struct WrappedShapeEventImpl typedef std::shared_ptr< WrappedShapeEventImpl > WrappedShapeEventImplPtr; class SlideShowListenerProxy : - public ::cppu::WeakImplHelper< css::presentation::XSlideShowListener, css::presentation::XShapeEventListener > + public ::cppu::WeakImplHelper< css::presentation::XSlideShowNavigationListener, css::presentation::XShapeEventListener > { public: SlideShowListenerProxy( rtl::Reference< SlideshowImpl > xController, css::uno::Reference< css::presentation::XSlideShow > xSlideShow ); @@ -109,6 +109,9 @@ public: virtual void SAL_CALL slideEnded(sal_Bool bReverse) override; virtual void SAL_CALL hyperLinkClicked(const OUString & hyperLink) override; + // css::presentation::XSlideShowNavigationListener: + virtual void SAL_CALL contextMenuShow(const css::awt::Point& point) override; + // css::lang::XEventListener: virtual void SAL_CALL disposing(const css::lang::EventObject & Source) override; @@ -182,6 +185,7 @@ public: // will be called from the SlideShowListenerProxy when this event is fired from the XSlideShow void slideEnded(const bool bReverse); + void contextMenuShow(const css::awt::Point& point); /// @throws css::uno::RuntimeException void hyperLinkClicked(const OUString & hyperLink); void click(const css::uno::Reference< css::drawing::XShape > & xShape); diff --git a/sd/uiconfig/simpress/ui/presentationdialog.ui b/sd/uiconfig/simpress/ui/presentationdialog.ui index 1cfb4fcb87bc..2c2d191b8ddf 100644 --- a/sd/uiconfig/simpress/ui/presentationdialog.ui +++ b/sd/uiconfig/simpress/ui/presentationdialog.ui @@ -662,6 +662,25 @@ </packing> </child> <child> + <object class="GtkCheckButton" id="shownavigationbutton"> + <property name="label" translatable="yes" context="presentationdialog|shownavigationbutton">Show navigation panel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="shownavigationbutton-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|shownavigationbutton">Test scroll</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">7</property> + </packing> + </child> + <child> <placeholder/> </child> </object> diff --git a/slideshow/Library_slideshow.mk b/slideshow/Library_slideshow.mk index 580a7ae60df3..a55ec61b0770 100644 --- a/slideshow/Library_slideshow.mk +++ b/slideshow/Library_slideshow.mk @@ -151,6 +151,7 @@ $(eval $(call gb_Library_add_exception_objects,slideshow,\ slideshow/source/engine/unoviewcontainer \ slideshow/source/engine/usereventqueue \ slideshow/source/engine/waitsymbol \ + slideshow/source/engine/slideoverlaybutton \ slideshow/source/engine/pointersymbol \ slideshow/source/engine/wakeupevent \ )) diff --git a/slideshow/source/engine/eventmultiplexer.cxx b/slideshow/source/engine/eventmultiplexer.cxx index 4921f6aff8fb..80c4c13d9f46 100644 --- a/slideshow/source/engine/eventmultiplexer.cxx +++ b/slideshow/source/engine/eventmultiplexer.cxx @@ -321,6 +321,10 @@ struct EventMultiplexerImpl /// Schedules tick events, if mbIsAutoMode is true void handleTicks(); + basegfx::B2DPoint toMatrixPoint(uno::Reference<presentation::XSlideShowView> xView, + basegfx::B2DPoint pnt); + basegfx::B2DPoint toNormalPoint(uno::Reference<presentation::XSlideShowView> xView, + basegfx::B2DPoint pnt); EventQueue& mrEventQueue; UnoViewContainer const& mrViewContainer; @@ -573,6 +577,54 @@ void EventMultiplexerImpl::handleTicks() scheduleTick(); } +basegfx::B2DPoint +EventMultiplexerImpl::toNormalPoint(uno::Reference<presentation::XSlideShowView> xView, + basegfx::B2DPoint pnt) +{ + UnoViewVector::const_iterator aIter; + const UnoViewVector::const_iterator aEnd(mrViewContainer.end()); + if ((aIter = std::find_if( + mrViewContainer.begin(), aEnd, + [&xView](const UnoViewSharedPtr& pView) { return xView == pView->getUnoView(); })) + == aEnd) + { + return pnt; + } + + basegfx::B2DPoint aPosition(pnt.getX(), pnt.getY()); + basegfx::B2DHomMatrix aMatrix((*aIter)->getTransformation()); + aPosition *= aMatrix; + + aPosition.setX(basegfx::fround(aPosition.getX())); + aPosition.setY(basegfx::fround(aPosition.getY())); + return aPosition; +} + +basegfx::B2DPoint +EventMultiplexerImpl::toMatrixPoint(uno::Reference<presentation::XSlideShowView> xView, + basegfx::B2DPoint pnt) +{ + UnoViewVector::const_iterator aIter; + const UnoViewVector::const_iterator aEnd(mrViewContainer.end()); + if ((aIter = std::find_if( + mrViewContainer.begin(), aEnd, + [&xView](const UnoViewSharedPtr& pView) { return xView == pView->getUnoView(); })) + == aEnd) + { + return pnt; + } + + basegfx::B2DPoint aPosition(pnt.getX(), pnt.getY()); + basegfx::B2DHomMatrix aMatrix((*aIter)->getTransformation()); + if (!aMatrix.invert()) + ENSURE_OR_THROW(false, "EventMultiplexer::notifyHandlers():" + " view matrix singular"); + aPosition *= aMatrix; + + aPosition.setX(basegfx::fround(aPosition.getX())); + aPosition.setY(basegfx::fround(aPosition.getY())); + return aPosition; +} void EventMultiplexerImpl::clear() { @@ -1233,6 +1285,20 @@ void EventMultiplexer::notifyHyperlinkClicked( { return pHandler.getHandler()->handleHyperlink( hyperLink ); } ); } +basegfx::B2DPoint EventMultiplexer::toMatrixPoint(uno::Reference<uno::XInterface> xInterface, + basegfx::B2DPoint pnt) +{ + uno::Reference<presentation::XSlideShowView> xView(xInterface, uno::UNO_QUERY_THROW); + return mpImpl->toMatrixPoint(xView, pnt); +} + +basegfx::B2DPoint EventMultiplexer::toNormalPoint(uno::Reference<uno::XInterface> xInterface, + basegfx::B2DPoint pnt) +{ + uno::Reference<presentation::XSlideShowView> xView(xInterface, uno::UNO_QUERY_THROW); + return mpImpl->toNormalPoint(xView, pnt); +} + } // namespace presentation /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/slideshow/source/engine/slideoverlaybutton.cxx b/slideshow/source/engine/slideoverlaybutton.cxx new file mode 100644 index 000000000000..c6b92aa975f2 --- /dev/null +++ b/slideshow/source/engine/slideoverlaybutton.cxx @@ -0,0 +1,187 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <sal/config.h> + +#include <eventmultiplexer.hxx> +#include "slideoverlaybutton.hxx" + +#include <canvas/canvastools.hxx> +#include <cppcanvas/customsprite.hxx> +#include <basegfx/vector/b2dvector.hxx> +#include <comphelper/diagnose_ex.hxx> + +#include <com/sun/star/presentation/XSlideShowView.hpp> +#include <com/sun/star/rendering/XCanvas.hpp> + +#include <algorithm> +#include <utility> + +namespace slideshow::internal +{ +SlideOverlayButtonSharedPtr SlideOverlayButton::create( + const css::uno::Reference<css::rendering::XBitmap>& xIconBitmap, css::awt::Point pPosition, + std::function<void(basegfx::B2DPoint)> clickHandler, ScreenUpdater& rScreenUpdater, + EventMultiplexer& rEventMultiplexer, const UnoViewContainer& rViewContainer) +{ + SlideOverlayButtonSharedPtr pRet(new SlideOverlayButton( + xIconBitmap, pPosition, clickHandler, rScreenUpdater, rEventMultiplexer, rViewContainer)); + + rEventMultiplexer.addViewHandler(pRet); + // Set priority to 1000 so that the handler fires before the click handler on the slide + rEventMultiplexer.addClickHandler(pRet, 1000); + return pRet; +} + +SlideOverlayButton::SlideOverlayButton(css::uno::Reference<css::rendering::XBitmap> xIconBitmap, + css::awt::Point pPosition, + std::function<void(basegfx::B2DPoint)> clickHandler, + ScreenUpdater& rScreenUpdater, + EventMultiplexer& rEventMultiplexer, + const UnoViewContainer& rViewContainer) + : mxIconBitmap(std::move(xIconBitmap)) + , mrEventMultiplexer(rEventMultiplexer) + , mpPosition(pPosition) + , mClickHandler(clickHandler) + , mrScreenUpdater(rScreenUpdater) +{ + for (const auto& pView : rViewContainer) + viewAdded(pView); +} + +void SlideOverlayButton::setVisible(const bool bVisible) +{ + if (mbVisible == bVisible) + return; + + mbVisible = bVisible; + + for (const auto& rView : maViews) + if (rView.second) + rView.second->show(); + + // sprites changed, need a screen update for this frame. + mrScreenUpdater.requestImmediateUpdate(); +} + +css::geometry::IntegerSize2D SlideOverlayButton::getSize() const { return mxIconBitmap->getSize(); } + +basegfx::B2DPoint SlideOverlayButton::calcSpritePos(UnoViewSharedPtr const& rView) const +{ + const css::awt::Rectangle aViewArea(rView->getUnoView()->getCanvasArea()); + return basegfx::B2DPoint( + aViewArea.X + std::min(aViewArea.Width, mpPosition.X), + aViewArea.Y + + std::max(sal_Int32(0), + aViewArea.Height - mxIconBitmap->getSize().Height - mpPosition.Y)); +} + +void SlideOverlayButton::viewAdded(const UnoViewSharedPtr& rView) +{ + cppcanvas::CustomSpriteSharedPtr sprite; + + try + { + const css::geometry::IntegerSize2D spriteSize(mxIconBitmap->getSize()); + sprite = rView->createSprite(basegfx::B2DSize(spriteSize.Width, spriteSize.Height), + 1000.0); // sprite should be in front of all + // other sprites + css::rendering::ViewState viewState; + canvas::tools::initViewState(viewState); + css::rendering::RenderState renderState; + canvas::tools::initRenderState(renderState); + sprite->getContentCanvas()->getUNOCanvas()->drawBitmap(mxIconBitmap, viewState, + renderState); + + sprite->setAlpha(0.9); + sprite->movePixel(calcSpritePos(rView)); + sprite->show(); + } + catch (css::uno::Exception&) + { + TOOLS_WARN_EXCEPTION("slideshow", ""); + } + + maViews.emplace_back(rView, sprite); +} + +void SlideOverlayButton::viewRemoved(const UnoViewSharedPtr& rView) +{ + maViews.erase( + std::remove_if(maViews.begin(), maViews.end(), + [&rView](const ViewsVecT::value_type& cp) { return rView == cp.first; }), + maViews.end()); +} + +void SlideOverlayButton::viewChanged(const UnoViewSharedPtr& rView) +{ + // find entry corresponding to modified view + ViewsVecT::iterator aModifiedEntry( + std::find_if(maViews.begin(), maViews.end(), + [&rView](const ViewsVecT::value_type& cp) { return rView == cp.first; })); + + assert(aModifiedEntry != maViews.end()); + if (aModifiedEntry == maViews.end()) + return; + + if (aModifiedEntry->second) + aModifiedEntry->second->movePixel(calcSpritePos(aModifiedEntry->first)); +} + +void SlideOverlayButton::viewsChanged() +{ + // reposition sprites on all views + for (const auto& rView : maViews) + { + if (rView.second) + rView.second->movePixel(calcSpritePos(rView.first)); + } +} + +bool SlideOverlayButton::handleMousePressed(const css::awt::MouseEvent& /*e*/) { return false; } + +bool SlideOverlayButton::handleMouseReleased(const css::awt::MouseEvent& e) +{ + css::uno::Reference<css::presentation::XSlideShowView> view(e.Source, + css::uno::UNO_QUERY_THROW); + const basegfx::B2DPoint btnPnt( + view->getCanvasArea().X + std::min(view->getCanvasArea().Width, mpPosition.X), + view->getCanvasArea().Y + + std::max(sal_Int32(0), view->getCanvasArea().Height - mxIconBitmap->getSize().Height + - mpPosition.Y)); + const basegfx::B2DPoint clickPnt + = mrEventMultiplexer.toNormalPoint(e.Source, basegfx::B2DPoint(e.X, e.Y)); + if (clickPnt.getX() > btnPnt.getX() + && clickPnt.getX() < btnPnt.getX() + mxIconBitmap->getSize().Width + && clickPnt.getY() > btnPnt.getY() + && clickPnt.getY() < btnPnt.getY() + mxIconBitmap->getSize().Height) + { + mClickHandler(clickPnt); + return true; + } + return false; +} + +bool SlideOverlayButton::handleMouseDragged(const css::awt::MouseEvent& /*e*/) { return false; } + +bool SlideOverlayButton::handleMouseMoved(const css::awt::MouseEvent& /*e*/) { return false; } + +} // namespace slideshow::internal + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/slideshow/source/engine/slideoverlaybutton.hxx b/slideshow/source/engine/slideoverlaybutton.hxx new file mode 100644 index 000000000000..db733a2b2cd4 --- /dev/null +++ b/slideshow/source/engine/slideoverlaybutton.hxx @@ -0,0 +1,102 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <sal/config.h> + +#include <eventmultiplexer.hxx> +#include <mouseeventhandler.hxx> +#include <screenupdater.hxx> +#include <unoview.hxx> +#include <vieweventhandler.hxx> + +#include <basegfx/point/b2dpoint.hxx> +#include <cppcanvas/sprite.hxx> + +#include <com/sun/star/rendering/XBitmap.hpp> +#include <com/sun/star/awt/Point.hpp> + +#include <functional> +#include <memory> +#include <vector> + +namespace slideshow::internal +{ +class EventMultiplexer; +typedef std::shared_ptr<class SlideOverlayButton> SlideOverlayButtonSharedPtr; + +class SlideOverlayButton : public ViewEventHandler, public MouseEventHandler +{ +public: + SlideOverlayButton(const SlideOverlayButton&) = delete; + SlideOverlayButton& operator=(const SlideOverlayButton&) = delete; + + static SlideOverlayButtonSharedPtr + create(const css::uno::Reference<css::rendering::XBitmap>& xIconBitmap, + css::awt::Point pPosition, std::function<void(basegfx::B2DPoint)> clickHandler, + ScreenUpdater& rScreenUpdater, EventMultiplexer& rEventMultiplexer, + const UnoViewContainer& rViewContainer); + + /** Shows button icon. + */ + void show() { setVisible(true); } + + /** Hides button icon. + */ + void hide() { setVisible(false); } + + css::geometry::IntegerSize2D getSize() const; + basegfx::B2DPoint calcSpritePos(UnoViewSharedPtr const& rView) const; + +private: + SlideOverlayButton(css::uno::Reference<css::rendering::XBitmap> xIconBitmap, + css::awt::Point pPosition, + std::function<void(basegfx::B2DPoint)> clickHandler, + ScreenUpdater& rScreenUpdater, EventMultiplexer& rEventMultiplexer, + const UnoViewContainer& rViewContainer); + + // ViewEventHandler + virtual void viewAdded(const UnoViewSharedPtr& rView) override; + virtual void viewRemoved(const UnoViewSharedPtr& rView) override; + virtual void viewChanged(const UnoViewSharedPtr& rView) override; + virtual void viewsChanged() override; + + // MouseEventHandler + virtual bool handleMousePressed(const css::awt::MouseEvent& e) override; + virtual bool handleMouseReleased(const css::awt::MouseEvent& e) override; + virtual bool handleMouseDragged(const css::awt::MouseEvent& e) override; + virtual bool handleMouseMoved(const css::awt::MouseEvent& e) override; + + void setVisible(const bool bVisible); + + typedef std::vector<std::pair<UnoViewSharedPtr, cppcanvas::CustomSpriteSharedPtr>> ViewsVecT; + + css::uno::Reference<css::rendering::XBitmap> mxIconBitmap; + EventMultiplexer& mrEventMultiplexer; + css::awt::Point mpPosition; + std::function<void(basegfx::B2DPoint)> mClickHandler; + + ViewsVecT maViews; + ScreenUpdater& mrScreenUpdater; + bool mbVisible = false; +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/slideshow/source/engine/slideshowimpl.cxx b/slideshow/source/engine/slideshowimpl.cxx index 1d739ded44c7..473791bb620f 100644 --- a/slideshow/source/engine/slideshowimpl.cxx +++ b/slideshow/source/engine/slideshowimpl.cxx @@ -44,7 +44,7 @@ #include <com/sun/star/util/XUpdatable.hpp> #include <com/sun/star/awt/SystemPointer.hpp> #include <com/sun/star/presentation/XSlideShow.hpp> -#include <com/sun/star/presentation/XSlideShowListener.hpp> +#include <com/sun/star/presentation/XSlideShowNavigationListener.hpp> #include <com/sun/star/lang/NoSupportException.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> @@ -80,6 +80,7 @@ #include "effectrewinder.hxx" #include <framerate.hxx> #include "pointersymbol.hxx" +#include "slideoverlaybutton.hxx" #include <map> #include <thread> @@ -437,6 +438,11 @@ private: std::shared_ptr<RehearseTimingsActivity> mpRehearseTimingsActivity; std::shared_ptr<WaitSymbol> mpWaitSymbol; + // navigation buttons + std::shared_ptr<SlideOverlayButton> mpNavigationPrev; + std::shared_ptr<SlideOverlayButton> mpNavigationMenu; + std::shared_ptr<SlideOverlayButton> mpNavigationNext; + std::shared_ptr<PointerSymbol> mpPointerSymbol; /// the current slide transition sound object: @@ -1727,6 +1733,56 @@ sal_Bool SlideShowImpl::setProperty( beans::PropertyValue const& rProperty ) return true; } + if (rProperty.Name == "NavigationSlidePrev") + { + uno::Reference<rendering::XBitmap> xBitmap; + if (!(rProperty.Value >>= xBitmap)) + return false; + + mpNavigationPrev = SlideOverlayButton::create( + xBitmap, { 20, 10 }, [this](basegfx::B2DPoint) { notifySlideEnded(true); }, + maScreenUpdater, maEventMultiplexer, maViewContainer); + + return true; + } + + if (rProperty.Name == "NavigationSlideMenu") + { + uno::Reference<rendering::XBitmap> xBitmap; + if (!(rProperty.Value >>= xBitmap)) + return false; + + mpNavigationMenu = SlideOverlayButton::create( + xBitmap, { 80, 10 }, + [this](basegfx::B2DPoint pos) { + maListenerContainer.forEach( + [pos](const uno::Reference<presentation::XSlideShowListener>& xListener) { + uno::Reference<presentation::XSlideShowNavigationListener> xNavListener( + xListener, uno::UNO_QUERY); + if (xNavListener.is()) + xNavListener->contextMenuShow( + css::awt::Point(static_cast<sal_Int32>(floor(pos.getX())), + static_cast<sal_Int32>(floor(pos.getY())))); + }); + }, + maScreenUpdater, maEventMultiplexer, maViewContainer); + + return true; + } + + if (rProperty.Name == "NavigationSlideNext") + { + uno::Reference<rendering::XBitmap> xBitmap; + if (!(rProperty.Value >>= xBitmap)) + return false; + + mpNavigationNext = SlideOverlayButton::create( + xBitmap, { 140, 10 }, [this](basegfx::B2DPoint) { notifySlideEnded(false); }, + maScreenUpdater, maEventMultiplexer, maViewContainer); + + return true; + } + if ( rProperty.Name == "PointerSymbolBitmap" ) { uno::Reference<rendering::XBitmap> xBitmap; diff --git a/slideshow/source/inc/eventmultiplexer.hxx b/slideshow/source/inc/eventmultiplexer.hxx index e0dd6fd31eb5..21fa333cd109 100644 --- a/slideshow/source/inc/eventmultiplexer.hxx +++ b/slideshow/source/inc/eventmultiplexer.hxx @@ -31,6 +31,8 @@ #include "unoview.hxx" +namespace basegfx { class B2DPoint; } + namespace com::sun::star::drawing { class XShape; } namespace slideshow::internal { @@ -648,6 +650,12 @@ public: */ void notifyHyperlinkClicked( OUString const& hyperLink ); + basegfx::B2DPoint toMatrixPoint(css::uno::Reference<css::uno::XInterface> xInterface, + basegfx::B2DPoint pnt); + + basegfx::B2DPoint toNormalPoint(css::uno::Reference<css::uno::XInterface> xInterface, + basegfx::B2DPoint pnt); + private: std::unique_ptr<EventMultiplexerImpl> mpImpl; }; |