1 /* smplayer, GUI front-end for mplayer.
2 Copyright (C) 2006-2021 Ricardo Villalba <ricardo@smplayer.info>
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18
19 #include "widgetactions.h"
20 #include "colorutils.h"
21 #include "helper.h"
22 #include <QLabel>
23 #include <QDebug>
24
25 #if MINI_ARROW_BUTTONS
26 #include <QToolButton>
27 #endif
28
MyWidgetAction(QWidget * parent)29 MyWidgetAction::MyWidgetAction( QWidget * parent )
30 : QWidgetAction(parent)
31 {
32 custom_style = 0;
33 custom_stylesheet = "";
34 }
35
~MyWidgetAction()36 MyWidgetAction::~MyWidgetAction() {
37 }
38
enable()39 void MyWidgetAction::enable() {
40 propagate_enabled(true);
41 }
42
disable()43 void MyWidgetAction::disable() {
44 propagate_enabled(false);
45 }
46
propagate_enabled(bool b)47 void MyWidgetAction::propagate_enabled(bool b) {
48 QList<QWidget *> l = createdWidgets();
49 for (int n=0; n < l.count(); n++) {
50 l[n]->setEnabled(b);
51 }
52 setEnabled(b);
53 }
54
55
TimeSliderAction(QWidget * parent)56 TimeSliderAction::TimeSliderAction( QWidget * parent )
57 : MyWidgetAction(parent)
58 {
59 #if ENABLE_DELAYED_DRAGGING
60 drag_delay = 200;
61 #endif
62 }
63
~TimeSliderAction()64 TimeSliderAction::~TimeSliderAction() {
65 }
66
setPos(int v)67 void TimeSliderAction::setPos(int v) {
68 QList<QWidget *> l = createdWidgets();
69 for (int n=0; n < l.count(); n++) {
70 TimeSlider *s = (TimeSlider*) l[n];
71 bool was_blocked= s->blockSignals(true);
72 s->setPos(v);
73 s->blockSignals(was_blocked);
74 }
75 }
76
pos()77 int TimeSliderAction::pos() {
78 QList<QWidget *> l = createdWidgets();
79 if (l.count() >= 1) {
80 TimeSlider *s = (TimeSlider*) l[0];
81 return s->pos();
82 } else {
83 return -1;
84 }
85 }
86
setDuration(double t)87 void TimeSliderAction::setDuration(double t) {
88 qDebug() << "TimeSliderAction::setDuration:" << t;
89 total_time = t;
90 QList<QWidget *> l = createdWidgets();
91 for (int n=0; n < l.count(); n++) {
92 TimeSlider *s = (TimeSlider*) l[n];
93 s->setDuration(t);
94 }
95 }
96
97 #if ENABLE_DELAYED_DRAGGING
setDragDelay(int d)98 void TimeSliderAction::setDragDelay(int d) {
99 drag_delay = d;
100
101 QList<QWidget *> l = createdWidgets();
102 for (int n=0; n < l.count(); n++) {
103 TimeSlider *s = (TimeSlider*) l[n];
104 s->setDragDelay(drag_delay);
105 }
106 }
107
dragDelay()108 int TimeSliderAction::dragDelay() {
109 return drag_delay;
110 }
111 #endif
112
createWidget(QWidget * parent)113 QWidget * TimeSliderAction::createWidget ( QWidget * parent ) {
114 TimeSlider *t = new TimeSlider(parent);
115 t->setEnabled( isEnabled() );
116
117 if (custom_style) t->setStyle(custom_style);
118 if (!custom_stylesheet.isEmpty()) t->setStyleSheet(custom_stylesheet);
119
120 connect( t, SIGNAL(posChanged(int)),
121 this, SIGNAL(posChanged(int)) );
122 connect( t, SIGNAL(draggingPos(int)),
123 this, SIGNAL(draggingPos(int)) );
124 #if ENABLE_DELAYED_DRAGGING
125 t->setDragDelay(drag_delay);
126
127 connect( t, SIGNAL(delayedDraggingPos(int)),
128 this, SIGNAL(delayedDraggingPos(int)) );
129 #endif
130
131 connect(t, SIGNAL(wheelUp()), this, SIGNAL(wheelUp()));
132 connect(t, SIGNAL(wheelDown()), this, SIGNAL(wheelDown()));
133
134 return t;
135 }
136
137
VolumeSliderAction(QWidget * parent)138 VolumeSliderAction::VolumeSliderAction( QWidget * parent )
139 : MyWidgetAction(parent)
140 {
141 tick_position = QSlider::TicksBelow;
142 }
143
~VolumeSliderAction()144 VolumeSliderAction::~VolumeSliderAction() {
145 }
146
setValue(int v)147 void VolumeSliderAction::setValue(int v) {
148 QList<QWidget *> l = createdWidgets();
149 for (int n=0; n < l.count(); n++) {
150 MySlider *s = (MySlider*) l[n];
151 bool was_blocked = s->blockSignals(true);
152 s->setValue(v);
153 s->blockSignals(was_blocked);
154 }
155 }
156
value()157 int VolumeSliderAction::value() {
158 QList<QWidget *> l = createdWidgets();
159 if (l.count() >= 1) {
160 MySlider *s = (MySlider*) l[0];
161 return s->value();
162 } else {
163 return -1;
164 }
165 }
166
setTickPosition(QSlider::TickPosition position)167 void VolumeSliderAction::setTickPosition(QSlider::TickPosition position) {
168 // For new widgets
169 tick_position = position;
170
171 // Propagate changes to all existing widgets
172 QList<QWidget *> l = createdWidgets();
173 for (int n=0; n < l.count(); n++) {
174 MySlider *s = (MySlider*) l[n];
175 s->setTickPosition(tick_position);
176 }
177 }
178
createWidget(QWidget * parent)179 QWidget * VolumeSliderAction::createWidget ( QWidget * parent ) {
180 MySlider *t = new MySlider(parent);
181
182 if (custom_style) t->setStyle(custom_style);
183 if (!custom_stylesheet.isEmpty()) t->setStyleSheet(custom_stylesheet);
184 if (fixed_size.isValid()) t->setFixedSize(fixed_size);
185
186 t->setMinimum(0);
187 t->setMaximum(100);
188 t->setValue(50);
189 t->setOrientation( Qt::Horizontal );
190 t->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
191 t->setFocusPolicy( Qt::NoFocus );
192 t->setTickPosition( tick_position );
193 t->setTickInterval( 10 );
194 t->setSingleStep( 1 );
195 t->setPageStep( 10 );
196 t->setToolTip( tr("Volume") );
197 t->setEnabled( isEnabled() );
198 t->setAttribute(Qt::WA_NoMousePropagation);
199
200 connect( t, SIGNAL(valueChanged(int)),
201 this, SIGNAL(valueChanged(int)) );
202 return t;
203 }
204
205
TimeLabelAction(TimeLabelType type,QWidget * parent)206 TimeLabelAction::TimeLabelAction(TimeLabelType type, QWidget * parent )
207 : MyWidgetAction(parent)
208 {
209 label_type = type;
210 current_time = 0;
211 total_time = 0;
212 updateText();
213 }
214
~TimeLabelAction()215 TimeLabelAction::~TimeLabelAction() {
216 }
217
setCurrentTime(double t)218 void TimeLabelAction::setCurrentTime(double t) {
219 current_time = t;
220 updateText();
221 }
222
setTotalTime(double t)223 void TimeLabelAction::setTotalTime(double t) {
224 total_time = t;
225 updateText();
226 }
227
updateText()228 void TimeLabelAction::updateText() {
229 QString ct = Helper::formatTime(current_time);
230 QString tt = Helper::formatTime(total_time);
231 QString rt;
232 if (total_time < 1) rt = "00:00:00"; else rt = Helper::formatTime(total_time - current_time);
233
234 switch (label_type) {
235 case CurrentTime: setText(ct); break;
236 case TotalTime: setText(tt); break;
237 case CurrentAndTotalTime: setText(ct + " / " + tt); break;
238 case RemainingTime: setText(rt); break;
239 }
240 }
241
setText(QString s)242 void TimeLabelAction::setText(QString s) {
243 current_text = s;
244 emit newText(s);
245 }
246
createWidget(QWidget * parent)247 QWidget * TimeLabelAction::createWidget ( QWidget * parent ) {
248 QLabel * time_label = new QLabel(parent);
249 time_label->setObjectName("time_label");
250 time_label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
251 //time_label->setAutoFillBackground(true);
252
253 //ColorUtils::setBackgroundColor( time_label, QColor(0,0,0) );
254 //ColorUtils::setForegroundColor( time_label, QColor(255,255,255) );
255
256 if (current_text.isEmpty()) current_text = "00:00:00 / 00:00:00";
257 time_label->setText(current_text);
258
259 //time_label->setFrameShape( QFrame::Panel );
260 //time_label->setFrameShadow( QFrame::Sunken );
261
262 connect( this, SIGNAL(newText(QString)),
263 time_label, SLOT(setText(QString)) );
264
265 return time_label;
266 }
267
268 #if MINI_ARROW_BUTTONS
SeekingButton(QList<QAction * > actions,QWidget * parent)269 SeekingButton::SeekingButton( QList<QAction*> actions, QWidget * parent )
270 : QWidgetAction(parent)
271 {
272 _actions = actions;
273 }
274
~SeekingButton()275 SeekingButton::~SeekingButton() {
276 }
277
createWidget(QWidget * parent)278 QWidget * SeekingButton::createWidget( QWidget * parent ) {
279 QToolButton * button = new QToolButton(parent);
280 button->setPopupMode(QToolButton::MenuButtonPopup);
281
282 if (_actions.count() > 0 ) {
283 button->setDefaultAction( _actions[0] );
284 }
285 for (int n = 1; n < _actions.count(); n++) {
286 button->addAction( _actions[n] );
287 }
288
289 return button;
290 }
291 #endif
292
293 #include "moc_widgetactions.cpp"
294