1 /***************************************************************************
2   SelectRangePlugin.cpp  -  Plugin for selecting a range of samples
3                              -------------------
4     begin                : Sat Jun 15 2002
5     copyright            : (C) 2002 by Thomas Eschenbacher
6     email                : Thomas.Eschenbacher@gmx.de
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #include "config.h"
19 
20 #include <errno.h>
21 #include <math.h>
22 #include <new>
23 
24 #include <KLocalizedString>
25 #include <QString>
26 
27 #include "libkwave/Plugin.h"
28 #include "libkwave/PluginManager.h"
29 #include "libkwave/SignalManager.h"
30 #include "libkwave/String.h"
31 #include "libkwave/undo/UndoTransactionGuard.h"
32 
33 #include "SelectRangeDialog.h"
34 #include "SelectRangePlugin.h"
35 
KWAVE_PLUGIN(selectrange,SelectRangePlugin)36 KWAVE_PLUGIN(selectrange, SelectRangePlugin)
37 
38 //***************************************************************************
39 Kwave::SelectRangePlugin::SelectRangePlugin(QObject *parent,
40                                             const QVariantList &args)
41     :Kwave::Plugin(parent, args),
42      m_start_mode(Kwave::SelectTimeWidget::bySamples),
43      m_range_mode(Kwave::SelectTimeWidget::bySamples),
44      m_start(0), m_range(0)
45 {
46 }
47 
48 //***************************************************************************
~SelectRangePlugin()49 Kwave::SelectRangePlugin::~SelectRangePlugin()
50 {
51 }
52 
53 //***************************************************************************
setup(QStringList & previous_params)54 QStringList *Kwave::SelectRangePlugin::setup(QStringList &previous_params)
55 {
56     // try to interpret the previous parameters
57     interpreteParameters(previous_params);
58 
59     // create the setup dialog
60     double rate = signalRate();
61     sample_index_t offset = manager().selectionStart();
62     sample_index_t length = signalLength();
63 
64     QPointer<Kwave::SelectRangeDialog> dialog =
65 	new(std::nothrow) Kwave::SelectRangeDialog(parentWidget(),
66 	    m_start_mode, m_range_mode, m_range, rate, offset, length);
67     Q_ASSERT(dialog);
68     if (!dialog) return Q_NULLPTR;
69 
70     QStringList *list = new(std::nothrow) QStringList();
71     Q_ASSERT(list);
72     if (list && dialog->exec() && dialog) {
73 	// user has pressed "OK"
74 	*list << QString::number(dialog->startMode());
75 	*list << QString::number(dialog->rangeMode());
76 	*list << QString::number(dialog->start());
77 	*list << QString::number(dialog->range());
78 
79 	emitCommand(_("plugin:execute(selectrange,") +
80 	    QString::number(dialog->startMode()) + _(",") +
81 	    QString::number(dialog->rangeMode()) + _(",") +
82 	    QString::number(dialog->start()) + _(",") +
83 	    QString::number(dialog->range())+
84 	    _(")")
85 	);
86     } else {
87 	// user pressed "Cancel"
88 	if (list) delete list;
89         list = Q_NULLPTR;
90     }
91 
92     if (dialog) delete dialog;
93     return list;
94 }
95 
96 //***************************************************************************
start(QStringList & params)97 int Kwave::SelectRangePlugin::start(QStringList &params)
98 {
99     // interprete the parameters
100     int result = interpreteParameters(params);
101     if (result) return result;
102 
103     const sample_index_t signal_length = signalLength();
104 
105     // get current offset of the signal
106     sample_index_t offset = Kwave::SelectTimeWidget::timeToSamples(
107 	m_start_mode, m_start, signalRate(), signal_length);
108 
109     // transform into offset and length [samples]
110     sample_index_t length = Kwave::SelectTimeWidget::timeToSamples(
111 	m_range_mode, m_range, signalRate(), signal_length);
112 
113     // limit selection to end of signal
114     if (length > signal_length)
115 	length = signal_length;
116     if ((offset + length) >= signal_length)
117 	length = signal_length - offset;
118 
119     // change the selection through the signal manager
120     {
121 	Kwave::UndoTransactionGuard undo_guard(*this, i18n("Select Range"));
122 	selectRange(offset, length);
123     }
124 
125     return result;
126 }
127 
128 //***************************************************************************
interpreteParameters(QStringList & params)129 int Kwave::SelectRangePlugin::interpreteParameters(QStringList &params)
130 {
131     bool ok;
132     QString param;
133     int mode;
134 
135     // evaluate the parameter list
136     if (params.count() != 4) {
137 	return -EINVAL;
138     }
139 
140     // selection mode for start
141     param = params[0];
142     mode = param.toInt(&ok);
143     Q_ASSERT(ok);
144     if (!ok) return -EINVAL;
145     Q_ASSERT(
146         (mode == static_cast<int>(Kwave::SelectTimeWidget::byTime)) ||
147         (mode == static_cast<int>(Kwave::SelectTimeWidget::bySamples)) ||
148         (mode == static_cast<int>(Kwave::SelectTimeWidget::byPercents))
149     );
150     if ((mode != static_cast<int>(Kwave::SelectTimeWidget::byTime)) &&
151         (mode != static_cast<int>(Kwave::SelectTimeWidget::bySamples)) &&
152         (mode != static_cast<int>(Kwave::SelectTimeWidget::byPercents)))
153     {
154 	return -EINVAL;
155     }
156     m_start_mode = static_cast<Kwave::SelectTimeWidget::Mode>(mode);
157 
158 
159     // selection mode
160     param = params[1];
161     mode = param.toInt(&ok);
162     Q_ASSERT(ok);
163     if (!ok) return -EINVAL;
164     Q_ASSERT(
165         (mode == static_cast<int>(Kwave::SelectTimeWidget::byTime)) ||
166         (mode == static_cast<int>(Kwave::SelectTimeWidget::bySamples)) ||
167         (mode == static_cast<int>(Kwave::SelectTimeWidget::byPercents))
168     );
169     if ((mode != static_cast<int>(Kwave::SelectTimeWidget::byTime)) &&
170         (mode != static_cast<int>(Kwave::SelectTimeWidget::bySamples)) &&
171         (mode != static_cast<int>(Kwave::SelectTimeWidget::byPercents)))
172     {
173 	return -EINVAL;
174     }
175     m_range_mode = static_cast<Kwave::SelectTimeWidget::Mode>(mode);
176 
177     // offset in ms, samples or percent
178     param = params[2];
179     m_start = param.toUInt(&ok);
180     if (!ok) return -EINVAL;
181 
182     // range in ms, samples or percent
183     param = params[3];
184     m_range = param.toUInt(&ok);
185     if (!ok) return -EINVAL;
186 
187     return 0;
188 }
189 
190 //***************************************************************************
191 #include "SelectRangePlugin.moc"
192 //***************************************************************************
193 //***************************************************************************
194