LibreOffice Module avmedia (master) 1
mediacontrol.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <mediacontrol.hxx>
21#include <strings.hrc>
22#include <mediamisc.hxx>
24#include <helpids.h>
25#include <vcl/weld.hxx>
27
28namespace avmedia
29{
30
32 // MediaControlStyle::MultiLine is the normal docking windows of tools->media player
33 // MediaControlStyle::SingleLine is the toolbar of view->toolbar->media playback
34 InterimItemWindow(pParent, eControlStyle == MediaControlStyle::MultiLine ?
35 OUString("svx/ui/mediawindow.ui") :
36 OUString("svx/ui/medialine.ui"),
37 "MediaWindow"),
38 maIdle( "avmedia MediaControl Idle" ),
39 maChangeTimeIdle( "avmedia MediaControl Change Time Idle" ),
40 maItem( 0, AVMediaSetMask::ALL ),
41 mbLocked( false ),
42 meControlStyle( eControlStyle )
43{
44 mxPlayToolBox = m_xBuilder->weld_toolbar("playtoolbox");
45 mxTimeSlider = m_xBuilder->weld_scale("timeslider");
46 mxMuteToolBox = m_xBuilder->weld_toolbar("mutetoolbox");
47 mxVolumeSlider = m_xBuilder->weld_scale("volumeslider");
48 mxZoomListBox = m_xBuilder->weld_combo_box("zoombox");
49 mxTimeEdit = m_xBuilder->weld_entry("timeedit");
50 mxMediaPath = m_xBuilder->weld_label("url");
51
53
54 mxPlayToolBox->connect_clicked( LINK( this, MediaControl, implSelectHdl ) );
55
56 mxTimeSlider->connect_value_changed( LINK( this, MediaControl, implTimeHdl ) );
57 // when changing the time, use this to do the time change after active scrolling
58 // has stopped for a little which
59 maChangeTimeIdle.SetPriority( TaskPriority::LOWEST );
60 maChangeTimeIdle.SetInvokeHandler( LINK( this, MediaControl, implTimeEndHdl ) );
61
62 mxTimeEdit->set_text(" 00:00:00/00:00:00 ");
63 Size aTextSize = mxTimeEdit->get_preferred_size();
64 mxTimeEdit->set_size_request(aTextSize.Width(), aTextSize.Height());
65 mxTimeEdit->set_text(OUString());
66
67 mxMuteToolBox->connect_clicked( LINK( this, MediaControl, implSelectHdl ) );
68 mxVolumeSlider->connect_value_changed( LINK( this, MediaControl, implVolumeHdl ) );
69
70 mxZoomListBox->connect_changed( LINK( this, MediaControl, implZoomSelectHdl ) );
71 mxZoomListBox->set_help_id(HID_AVMEDIA_ZOOMLISTBOX);
72
73 const OUString aMediaPath( AvmResId( AVMEDIA_MEDIA_PATH_DEFAULT ) );
74 mxMediaPath->set_label(aMediaPath);
76 mxMediaPath->set_size_request(mxMediaPath->get_preferred_size().Width() + 400, -1); // maybe extend the no. 400 to span the screen width
77
78 // we want time field + progress slider to update as the media plays
79 // give this task a lower prio than REPAINT so that UI updates are not starved
80 maIdle.SetPriority( TaskPriority::POST_PAINT );
81 maIdle.SetInvokeHandler( LINK( this, MediaControl, implTimeoutHdl ) );
82}
83
85{
87 {
88 mxPlayToolBox->set_item_help_id("open", HID_AVMEDIA_TOOLBOXITEM_OPEN);
89 mxPlayToolBox->set_item_help_id("apply", HID_AVMEDIA_TOOLBOXITEM_INSERT);
90 }
91 avmedia::MediaControlBase::InitializeWidgets();
92}
93
95{
97}
98
100{
101 disposeWidgets();
102 mxMediaPath.reset();
104}
105
107{
108 const OUString aURL( AvmResId(AVMEDIA_MEDIA_PATH) + ": " + tempItem.getURL() ) ;
109 mxMediaPath->set_label(aURL);
110}
111
113{
114 if (mbLocked)
115 return;
116 bool bChanged = maItem.merge(rItem);
117 if (bChanged)
118 {
119 if( rItem.getURL().isEmpty() && meControlStyle == MediaControlStyle::SingleLine )
120 mxPlayToolBox->set_sensitive(false);
121 UpdateToolBoxes( maItem );
122 UpdateTimeSlider( maItem );
123 UpdateVolumeSlider( maItem );
124 UpdateTimeField( maItem, maItem.getTime() );
126 }
127}
128
129IMPL_LINK( MediaControl, implTimeHdl, weld::Scale&, rSlider, void )
130{
131 mbLocked = true;
132 maIdle.Stop();
133 UpdateTimeField(maItem, rSlider.get_value() * maItem.getDuration() / AVMEDIA_TIME_RANGE);
134 maChangeTimeIdle.Start();
135}
136
137IMPL_LINK_NOARG(MediaControl, implTimeEndHdl, Timer*, void)
138{
139 MediaItem aExecItem;
140
141 aExecItem.setTime( mxTimeSlider->get_value() * maItem.getDuration() / AVMEDIA_TIME_RANGE );
142 // keep state (if the media was playing, keep it playing)
143 aExecItem.setState(maItem.getState());
144 execute( aExecItem );
145 update();
146 maIdle.Start();
147 mbLocked = false;
148}
149
150IMPL_LINK( MediaControl, implVolumeHdl, weld::Scale&, rSlider, void )
151{
152 MediaItem aExecItem;
153
154 aExecItem.setVolumeDB(rSlider.get_value());
155 execute( aExecItem );
156 update();
157}
158
159IMPL_LINK( MediaControl, implSelectHdl, const OUString&, rIdent, void )
160{
161 MediaItem aExecItem;
162 if (rIdent == "open")
163 {
164 OUString aURL;
166 {
167 if( !MediaWindow::isMediaURL( aURL, ""/*TODO?*/, true ) )
169 else
170 {
171 aExecItem.setURL( aURL, "", ""/*TODO?*/ );
172 aExecItem.setState( MediaState::Play );
173 }
174 }
175 }
176 else
177 SelectPlayToolBoxItem( aExecItem, maItem, rIdent );
178
179 if (aExecItem.getState() == MediaState::Play)
180 maIdle.Start();
181 else if (aExecItem.getState() == MediaState::Pause ||
182 aExecItem.getState() == MediaState::Stop)
183 maIdle.Stop();
184
185 if( aExecItem.getMaskSet() != AVMediaSetMask::NONE )
186 execute( aExecItem );
187
188 update();
189}
190
191IMPL_LINK( MediaControl, implZoomSelectHdl, weld::ComboBox&, rBox, void )
192{
193 bool bCurrentlySettingZoom = mbCurrentlySettingZoom;
194 mbCurrentlySettingZoom = true;
195
196 MediaItem aExecItem;
197 css::media::ZoomLevel eLevel;
198
199 switch (rBox.get_active())
200 {
201 case AVMEDIA_ZOOMLEVEL_50: eLevel = css::media::ZoomLevel_ZOOM_1_TO_2; break;
202 case AVMEDIA_ZOOMLEVEL_100: eLevel = css::media::ZoomLevel_ORIGINAL; break;
203 case AVMEDIA_ZOOMLEVEL_200: eLevel = css::media::ZoomLevel_ZOOM_2_TO_1; break;
204 case AVMEDIA_ZOOMLEVEL_FIT: eLevel = css::media::ZoomLevel_FIT_TO_WINDOW_FIXED_ASPECT; break;
205 case AVMEDIA_ZOOMLEVEL_SCALED: eLevel = css::media::ZoomLevel_FIT_TO_WINDOW; break;
206
207 default: eLevel = css::media::ZoomLevel_NOT_AVAILABLE; break;
208 }
209
210 aExecItem.setZoom( eLevel );
211 execute( aExecItem );
212 update();
213
214 mbCurrentlySettingZoom = bCurrentlySettingZoom;
215}
216
217IMPL_LINK_NOARG(MediaControl, implTimeoutHdl, Timer *, void)
218{
219 update();
220 maIdle.Start();
221}
222
223} // namespace avmedia
224
225/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
#define AVMEDIA_ZOOMLEVEL_FIT
#define AVMEDIA_TIME_RANGE
#define AVMEDIA_ZOOMLEVEL_50
#define AVMEDIA_ZOOMLEVEL_SCALED
#define AVMEDIA_ZOOMLEVEL_100
#define AVMEDIA_ZOOMLEVEL_200
virtual void dispose() override
std::unique_ptr< weld::Builder > m_xBuilder
constexpr tools::Long Height() const
constexpr tools::Long Width() const
void SetPriority(TaskPriority ePriority)
void SetInvokeHandler(const Link< Timer *, void > &rLink)
MediaControl(vcl::Window *pParent, MediaControlStyle eControlStyle)
std::unique_ptr< weld::Label > mxMediaPath
void setState(const MediaItem &rItem)
virtual void InitializeWidgets() override
MediaControlStyle meControlStyle
virtual ~MediaControl() override
void UpdateURLField(MediaItem const &maItem)
virtual void dispose() override
bool setState(MediaState eState)
Definition: mediaitem.cxx:297
bool setURL(const OUString &rURL, const OUString &rTempURL, const OUString &rReferer)
Definition: mediaitem.cxx:232
bool setZoom(css::media::ZoomLevel eZoom)
Definition: mediaitem.cxx:381
MediaState getState() const
Definition: mediaitem.cxx:306
bool setTime(double fTime)
Definition: mediaitem.cxx:325
bool setVolumeDB(sal_Int16 nDB)
Definition: mediaitem.cxx:367
double getTime() const
Definition: mediaitem.cxx:334
AVMediaSetMask getMaskSet() const
Definition: mediaitem.cxx:227
const OUString & getURL() const
Definition: mediaitem.cxx:246
bool merge(const MediaItem &rMediaItem)
Definition: mediaitem.cxx:185
static bool executeMediaURLDialog(weld::Window *pParent, OUString &rURL, bool *const o_pbLink)
static bool isMediaURL(std::u16string_view rURL, const OUString &rReferer, bool bDeep=false, rtl::Reference< PlayerListener > xPreferredPixelSizeListener=nullptr)
static void executeFormatErrorBox(weld::Window *pParent)
weld::Window * GetFrameWeld(const SfxFrame *pFrame)
URL aURL
constexpr OUStringLiteral HID_AVMEDIA_TOOLBOXITEM_INSERT
Definition: helpids.h:30
constexpr OUStringLiteral HID_AVMEDIA_ZOOMLISTBOX
Definition: helpids.h:31
constexpr OUStringLiteral HID_AVMEDIA_TOOLBOXITEM_OPEN
Definition: helpids.h:29
AVMediaSetMask
Definition: mediaitem.hxx:39
OUString AvmResId(TranslateId aId)
Definition: mediamisc.hxx:36
IMPL_LINK_NOARG(MediaControl, implTimeEndHdl, Timer *, void)
IMPL_LINK(MediaControl, implTimeHdl, weld::Scale &, rSlider, void)
bool update()