kwave  18.07.70
Kwave::VolumeDialog Class Reference

#include <VolumeDialog.h>

Inheritance diagram for Kwave::VolumeDialog:
Inheritance graph
Collaboration diagram for Kwave::VolumeDialog:
Collaboration graph

Public Member Functions

 VolumeDialog (QWidget *parent, Kwave::OverViewCache *overview_cache)
 
virtual ~VolumeDialog ()
 
QStringList params ()
 
void setParams (QStringList &params)
 

Protected Types

enum  Mode { MODE_FACTOR = 0, MODE_PERCENT = 1, MODE_DECIBEL = 2 }
 

Protected Slots

void modeChanged (bool)
 
void sliderChanged (int pos)
 
void spinboxChanged (int pos)
 

Protected Member Functions

void setMode (Mode mode)
 
void updateDisplay (double value)
 

Private Slots

void invokeHelp ()
 

Private Attributes

double m_factor
 
Mode m_mode
 
bool m_enable_updates
 
Kwave::OverViewCachem_overview_cache
 

Detailed Description

Definition at line 36 of file VolumeDialog.h.

Member Enumeration Documentation

◆ Mode

enum Kwave::VolumeDialog::Mode
protected

Mode for amplification selection by factor (x1, x2, x5,...), by percentage or by decibel

Enumerator
MODE_FACTOR 
MODE_PERCENT 
MODE_DECIBEL 

Definition at line 76 of file VolumeDialog.h.

Constructor & Destructor Documentation

◆ VolumeDialog()

Kwave::VolumeDialog::VolumeDialog ( QWidget *  parent,
Kwave::OverViewCache overview_cache 
)

Constructor

Definition at line 43 of file VolumeDialog.cpp.

References Kwave::connect(), m_mode, modeChanged(), setMode(), sliderChanged(), spinboxChanged(), and updateDisplay().

45  :QDialog(parent), Ui::VolumeDlg(), m_factor(1.0), m_mode(MODE_DECIBEL),
46  m_enable_updates(true), m_overview_cache(overview_cache)
47 {
48  setupUi(this);
49  setModal(true);
50 
51  // process changed in mode selection
52  connect(rbFactor, SIGNAL(toggled(bool)),
53  this, SLOT(modeChanged(bool)));
54  connect(rbPercentage, SIGNAL(toggled(bool)),
55  this, SLOT(modeChanged(bool)));
56  connect(rbLogarithmic, SIGNAL(toggled(bool)),
57  this, SLOT(modeChanged(bool)));
58 
59  // changes in the slider or spinbox
60  connect(slider, SIGNAL(valueChanged(int)),
61  this, SLOT(sliderChanged(int)));
62  connect(spinbox, SIGNAL(valueChanged(int)),
63  this, SLOT(spinboxChanged(int)));
64 
65  // force activation of the layout
66  layout()->activate();
67 
68  // give the preview image a odd height, for better symmetry
69  int h = preview->height();
70  if (~h & 1) h++;
71  preview->setFixedHeight(h);
72 
73  // set the initial size of the dialog
74  h = (sizeHint().height() * 12) / 10;
75  int w = (3 * h) / 4;
76  if (sizeHint().width() > w) w = sizeHint().width();
77  setFixedSize(w, h);
78 
79  // set default: +3dB
80  setMode(m_mode);
81  updateDisplay(+1.412538);
82 
83  // set the focus onto the "OK" button
84  buttonBox->button(QDialogButtonBox::Ok)->setFocus();
85 }
void sliderChanged(int pos)
void updateDisplay(double value)
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
Definition: Connect.cpp:48
void setMode(Mode mode)
Kwave::OverViewCache * m_overview_cache
Definition: VolumeDialog.h:102
void spinboxChanged(int pos)
Here is the call graph for this function:

◆ ~VolumeDialog()

Kwave::VolumeDialog::~VolumeDialog ( )
virtual

Destructor

Definition at line 88 of file VolumeDialog.cpp.

89 {
90 }

Member Function Documentation

◆ invokeHelp

void Kwave::VolumeDialog::invokeHelp ( )
privateslot

invoke the online help

Definition at line 379 of file VolumeDialog.cpp.

References _.

380 {
381  KHelpClient::invokeHelp(_("plugin_sect_volume"));
382 }
#define _(m)
Definition: memcpy.c:66

◆ modeChanged

void Kwave::VolumeDialog::modeChanged ( bool  )
protectedslot

called when the mode radio buttons changed

Definition at line 141 of file VolumeDialog.cpp.

References m_enable_updates, MODE_DECIBEL, MODE_FACTOR, MODE_PERCENT, and setMode().

Referenced by VolumeDialog().

142 {
143  bool old_enable_updates = m_enable_updates;
144  m_enable_updates = false;
145 
146  if (rbFactor->isChecked()) setMode(MODE_FACTOR);
147  if (rbPercentage->isChecked()) setMode(MODE_PERCENT);
148  if (rbLogarithmic->isChecked()) setMode(MODE_DECIBEL);
149 
150  m_enable_updates = old_enable_updates;
151 }
void setMode(Mode mode)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ params()

QStringList Kwave::VolumeDialog::params ( )

Returns the parameters as string list

Definition at line 349 of file VolumeDialog.cpp.

References m_factor, and m_mode.

Referenced by Kwave::VolumePlugin::setup().

350 {
351  QStringList list;
352  list << QString::number(m_factor);
353  list << QString::number(static_cast<int>(m_mode));
354  return list;
355 }
Here is the caller graph for this function:

◆ setMode()

void Kwave::VolumeDialog::setMode ( Mode  mode)
protected

Sets a new volume selection mode

Definition at line 93 of file VolumeDialog.cpp.

References m_enable_updates, m_factor, m_mode, MODE_DECIBEL, MODE_FACTOR, MODE_PERCENT, and updateDisplay().

Referenced by modeChanged(), setParams(), and VolumeDialog().

94 {
95  double value = m_factor;
96  m_mode = mode;
97  bool old_enable_updates = m_enable_updates;
98  m_enable_updates = false;
99 
100  switch (m_mode) {
101  case MODE_FACTOR: {
102  rbFactor->setChecked(true);
103  slider->setMinimum(-9);
104  slider->setMaximum(+9);
105  slider->setPageStep(1);
106  slider->setTickInterval(1);
107  spinbox->setMinimum(-10);
108  spinbox->setMaximum(+10);
109  break;
110  }
111  case MODE_PERCENT: {
112  rbPercentage->setChecked(true);
113 
114  slider->setMinimum(1);
115  slider->setMaximum(10*100);
116  slider->setPageStep(100);
117  slider->setTickInterval(1*100);
118  spinbox->setMinimum(1);
119  spinbox->setMaximum(+10*100);
120  break;
121  }
122  case MODE_DECIBEL: {
123  rbLogarithmic->setChecked(true);
124 
125  slider->setMinimum(-21);
126  slider->setMaximum(+21);
127  slider->setPageStep(6);
128  slider->setTickInterval(6);
129  spinbox->setMinimum(-21);
130  spinbox->setMaximum(+21);
131  break;
132  }
133  }
134 
135  // update the value in the display
136  updateDisplay(value);
137  m_enable_updates = old_enable_updates;
138 }
void updateDisplay(double value)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ setParams()

void Kwave::VolumeDialog::setParams ( QStringList &  params)

Sets the from a list of parameters

Definition at line 358 of file VolumeDialog.cpp.

References m_factor, m_mode, MODE_DECIBEL, MODE_FACTOR, MODE_PERCENT, setMode(), and updateDisplay().

Referenced by Kwave::VolumePlugin::setup().

359 {
360  // evaluate the parameter list
361  double factor = params[0].toDouble();
362  switch (params[1].toUInt()) {
363  case 0: m_mode = MODE_FACTOR; break;
364  case 1: m_mode = MODE_PERCENT; break;
365  case 2: m_mode = MODE_DECIBEL; break;
366  default: m_mode = MODE_DECIBEL;
367  }
368 
369  // update mode, using default factor 1.0
370  m_factor = 1.0; // works with every mode
371  setMode(m_mode);
372 
373  // update factor
374  updateDisplay(factor);
375 }
void updateDisplay(double value)
void setMode(Mode mode)
QStringList params()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ sliderChanged

void Kwave::VolumeDialog::sliderChanged ( int  pos)
protectedslot

called when the slider's position has changed

Definition at line 279 of file VolumeDialog.cpp.

References m_enable_updates, m_factor, m_mode, MODE_DECIBEL, MODE_FACTOR, MODE_PERCENT, spinboxChanged(), and updateDisplay().

Referenced by VolumeDialog().

280 {
281  if (!m_enable_updates) return;
282 
283  int sv = slider->maximum() + slider->minimum() - pos;
284 // qDebug("sliderChanged(%d), sv=%d",pos,sv); // ###
285  switch (m_mode) {
286  case MODE_FACTOR: {
287  double factor = m_factor;
288  // -1 <=> /2
289  // 0 <=> x1
290  // +1 <=> x2
291  if (sv >= 0) {
292  factor = (sv + 1);
293  } else {
294  factor = -1.0 / static_cast<double>(sv - 1);
295  }
296 // qDebug("factor=%g, sv=%d",factor, sv);
297  updateDisplay(factor);
298  break;
299  }
300  case MODE_PERCENT:
301  spinboxChanged(sv);
302  break;
303  case MODE_DECIBEL:
304  spinboxChanged(sv);
305  break;
306  }
307 
308 }
void updateDisplay(double value)
void spinboxChanged(int pos)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ spinboxChanged

void Kwave::VolumeDialog::spinboxChanged ( int  pos)
protectedslot

called when the spinbox value has changed

Definition at line 311 of file VolumeDialog.cpp.

References m_enable_updates, m_factor, m_mode, MODE_DECIBEL, MODE_FACTOR, MODE_PERCENT, and updateDisplay().

Referenced by sliderChanged(), and VolumeDialog().

312 {
313  if (!m_enable_updates) return;
314 // qDebug("spinboxChanged(%d)",pos); // ###
315 
316  int sv = spinbox->value();
317  double factor = m_factor;
318 
319  switch (m_mode) {
320  case MODE_FACTOR: {
321  // multiply or divide by factor
322  // -1 <=> /2
323  // 0 <=> x1
324  // +1 <=> x2
325  if (factor >= 1) {
326  factor = sv ? sv : 0.5;
327  } else {
328  if (!sv) sv = 1;
329  factor = 1.0 / static_cast<double>(sv);
330  }
331  break;
332  }
333  case MODE_PERCENT: {
334  // percentage
335  factor = static_cast<double>(pos) / 100.0;
336  break;
337  }
338  case MODE_DECIBEL: {
339  // decibel
340  factor = pow(10.0, pos / 20.0);
341  break;
342  }
343  }
344 
345  updateDisplay(factor);
346 }
void updateDisplay(double value)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ updateDisplay()

void Kwave::VolumeDialog::updateDisplay ( double  value)
protected

Update the slider position and the spinbox value

Definition at line 154 of file VolumeDialog.cpp.

References _, Kwave::OverViewCache::getOverView(), m_enable_updates, m_factor, m_mode, m_overview_cache, MODE_DECIBEL, MODE_FACTOR, MODE_PERCENT, and Kwave::toInt().

Referenced by setMode(), setParams(), sliderChanged(), spinboxChanged(), and VolumeDialog().

155 {
156  int new_spinbox_value = 0;
157  int new_slider_value = 0;
158  bool old_enable_updates = m_enable_updates;
159  m_enable_updates = false;
160 
161  if (!qFuzzyCompare(m_factor, value)) {
162  // take over the new factor
163  m_factor = value;
164 
165  // update the preview widget
166  if (m_overview_cache && preview) {
167  int width = preview->width();
168  int height = preview->height();
169  QColor fg = Qt::white;
170  QColor bg = Qt::black;
171 
172  // get the raw preview image
173  QImage image = m_overview_cache->getOverView(
174  width, height, fg, bg, m_factor);
175 
176  // color transformation: mark the peaks in light red
177  int middle = height >> 1;
178  int red = Kwave::toInt(middle * 0.841); // -1.5dB
179  int orange = Kwave::toInt(middle * 0.707); // -3.0dB
180 
181  QPainter p;
182  p.begin(&image);
183  for (int y = 0; y < height; y++) {
184  QColor color;
185 
186  if (y == middle) {
187  // zero line
188  p.setCompositionMode(QPainter::CompositionMode_SourceOver);
189  color = Qt::green;
190  } else {
191  p.setCompositionMode(QPainter::CompositionMode_Multiply);
192  if ((y < middle - red) || (y > middle + red))
193  // "red" level, -1.5dB from border
194  color = Qt::red;
195  else if ((y < middle - orange) || (y > middle + orange))
196  // "orange" level, -3.0dB from border
197  color = Qt::yellow;
198  else
199  // "normal" level
200  color = preview->palette().light().color();
201  }
202 
203  p.setPen(color);
204  p.drawLine(0, y, width-1, y);
205  }
206  p.end();
207 
208  // update the image view
209  preview->setImage(image);
210  }
211  }
212 
213  switch (m_mode) {
214  case MODE_FACTOR: {
215  // -1 => /2
216  // 0 => x1
217  // +1 => x2
218  if (Kwave::toInt(rint(m_factor)) >= 1) {
219  // greater or equal to one -> multiply
220  int new_value = Kwave::toInt(rint(value));
221  spinbox->setPrefix(_("x "));
222  spinbox->setSuffix(_(""));
223  spinbox->setInverse(false);
224 
225  new_spinbox_value = new_value;
226  new_slider_value = new_value-1;
227  } else {
228  // less than one -> divide
229  int new_value = Kwave::toInt(rint(-1.0 / value));
230 
231  spinbox->setPrefix(_("1/"));
232  spinbox->setSuffix(_(""));
233  spinbox->setInverse(true);
234 
235  new_spinbox_value = -1*new_value;
236  new_slider_value = (new_value+1);
237  }
238 
239  m_enable_updates = old_enable_updates;
240  break;
241  // return;
242  }
243  case MODE_PERCENT: {
244  // factor 1.0 means 100%
245  new_spinbox_value = Kwave::toInt(rint(value * 100.0));
246  new_slider_value = new_spinbox_value;
247  spinbox->setPrefix(_(""));
248  spinbox->setSuffix(_("%"));
249  spinbox->setInverse(false);
250  break;
251  }
252  case MODE_DECIBEL: {
253  // factor 1.0 means 0dB
254  new_slider_value = Kwave::toInt(rint(20.0 * log10(value)));
255  new_spinbox_value = new_slider_value;
256  if (new_spinbox_value >= 0) {
257  spinbox->setPrefix(new_spinbox_value ? _("+") : _("+/- "));
258  } else {
259  // negative value
260  spinbox->setPrefix(_(""));
261  }
262  spinbox->setSuffix(_(" ") + i18n("dB"));
263  spinbox->setInverse(false);
264  break;
265  }
266  }
267 
268  // update the spinbox
269  if (spinbox->value() != new_spinbox_value) spinbox->setValue(new_spinbox_value);
270 
271  // update the slider, it's inverse => top=maximum, bottom=minimum !
272  int sv = slider->maximum() + slider->minimum() - new_slider_value;
273  if (slider->value() != sv) slider->setValue(sv);
274 
275  m_enable_updates = old_enable_updates;
276 }
virtual QImage getOverView(int width, int height, const QColor &fg, const QColor &bg, double gain=1.0)
int toInt(T x)
Definition: Utils.h:127
#define _(m)
Definition: memcpy.c:66
Kwave::OverViewCache * m_overview_cache
Definition: VolumeDialog.h:102
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ m_enable_updates

bool Kwave::VolumeDialog::m_enable_updates
private

if false, ignore the signals of slider and spinbox

Definition at line 99 of file VolumeDialog.h.

Referenced by modeChanged(), setMode(), sliderChanged(), spinboxChanged(), and updateDisplay().

◆ m_factor

double Kwave::VolumeDialog::m_factor
private

amplification factor

Definition at line 91 of file VolumeDialog.h.

Referenced by params(), setMode(), setParams(), sliderChanged(), spinboxChanged(), and updateDisplay().

◆ m_mode

Mode Kwave::VolumeDialog::m_mode
private

current mode for amplification selection

Definition at line 96 of file VolumeDialog.h.

Referenced by params(), setMode(), setParams(), sliderChanged(), spinboxChanged(), updateDisplay(), and VolumeDialog().

◆ m_overview_cache

Kwave::OverViewCache* Kwave::VolumeDialog::m_overview_cache
private

overview cache for calculating the preview image

Definition at line 102 of file VolumeDialog.h.

Referenced by updateDisplay().


The documentation for this class was generated from the following files: