26 #include <QApplication> 30 #include <QGridLayout> 31 #include <QHBoxLayout> 34 #include <QResizeEvent> 36 #include <QTextStream> 37 #include <QWheelEvent> 40 #include <KLocalizedString> 41 #include <KMessageBox> 68 #define CASE_COMMAND(x) } else if (parser.command() == _(x)) { 74 #define MINIMUM_SAMPLES_PER_SCREEN 5 80 #define DEFAULT_DISPLAY_TIME (5 * 60.0) 85 #define LABEL_LIST_EXT _("*.label") 90 #define LABEL_LIST_FILTER \ 91 LABEL_LIST_EXT + _("|") + \ 92 i18n("Kwave label list") + \ 93 _(" (") + LABEL_LIST_EXT + _(")") 97 const QSize &preferred_size)
101 m_context(context), m_upper_dock(), m_lower_dock(),
102 m_scroll_area(this), m_horizontal_scrollbar(Q_NULLPTR),
105 context.signalManager(),
109 m_overview(Q_NULLPTR), m_offset(0), m_zoom(1.0),
110 m_preferred_size(preferred_size),
111 m_delayed_update_timer(this)
115 setAcceptDrops(
true);
118 Q_ASSERT(signal_manager);
119 if (!signal_manager)
return;
122 Q_ASSERT(plugin_manager);
123 if (!plugin_manager)
return;
132 QVBoxLayout *topLayout =
new QVBoxLayout(
this);
134 if (!topLayout)
return;
136 topLayout->setSpacing(0);
143 QSizePolicy::Expanding,
144 QSizePolicy::Expanding
147 m_scroll_area.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
148 m_scroll_area.setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
164 QSizePolicy::MinimumExpanding, QSizePolicy::Fixed
190 connect(&playback, SIGNAL(sigPlaybackStopped()),
220 setLayout(topLayout);
233 Q_ASSERT(plugin_manager);
240 QWidget::resizeEvent(event);
260 if ((event->proposedAction() != Qt::MoveAction) &&
261 (event->proposedAction() != Qt::CopyAction))
265 event->acceptProposedAction();
272 if (!event->mimeData())
return;
275 Q_ASSERT(signal_manager);
276 if (!signal_manager)
return;
278 if (signal_manager->
isEmpty() &&
285 *signal_manager, pos)))
289 event->acceptProposedAction();
291 QStringList formats =
event->mimeData()->formats();
292 QString fmt = (!formats.isEmpty()) ? formats.first() : QString();
293 qWarning(
"MainWidget::dropEvent(%s): failed !",
DBG(fmt));
307 !
m_overview->geometry().contains(event->pos()) )
313 switch (event->modifiers()) {
314 case Qt::NoModifier: {
316 if (event->delta() > 0)
318 else if (event->delta() < 0)
323 case Qt::ShiftModifier:
325 if (event->delta() > 0)
327 else if (event->delta() < 0)
331 case Qt::ControlModifier: {
334 if (event->delta() > 0)
336 else if (event->delta() < 0)
363 bool first_track = (signal_manager && (signal_manager->
tracks() == 1));
392 Q_ASSERT(signal_manager);
393 if (!signal_manager)
return -EINVAL;
394 if (!command.length())
return -EINVAL;
419 setOffset((offset > (visible_samples / 2)) ?
420 (offset - (visible_samples / 2)) : 0);
432 if (signal_length >= visible_samples)
433 setOffset(signal_length - visible_samples);
443 if (ofs > signal_length)
444 ofs = signal_length - 1;
445 setOffset((ofs > (visible_samples / 2)) ?
446 (ofs - (visible_samples / 2)) : 0);
451 setOffset((ofs > (visible_samples / 2)) ?
452 (ofs - (visible_samples / 2)) : 0);
466 if (len > ofs) len = ofs;
484 QString description = parser.
nextParam();
485 signal_manager->
addLabel(pos, description);
491 int index = parser.
toInt();
493 if ((index >= labels.count()) || (index < 0))
512 return (signal_manager) ?
537 if (visible > length) visible = length;
563 int single = qMax(1, (page / (10 * qApp->wheelScrollLines())));
564 if (page < single) page = single;
626 Q_ASSERT(signal_manager);
627 if (!signal_manager)
return 0;
630 rint(ms * signal_manager->
rate() / 1E3));
636 if ((pixels == 0) || (
m_zoom <= 0.0))
return 0;
644 if (
m_zoom <= 0.0)
return 0;
664 if (width <= 0)
return 0.0;
667 Q_ASSERT(signal_manager);
668 if (!signal_manager)
return 0.0;
669 if (signal_manager->
isEmpty())
return 0.0;
679 length += length / 10;
685 signal_manager->
rate()));
688 if (!length)
return 0;
695 if (length < static_cast<sample_index_t>(width) * 2) {
697 return (static_cast<double>(length) - 1.0) /
698 static_cast<double>(width - 1);
701 return (static_cast<double>(length) - 0.5) /
702 static_cast<double>(width - 1);
713 const double old_zoom =
m_zoom;
722 Q_ASSERT(signal_manager);
723 if (!signal_manager)
return;
726 length = signal_manager->
length();
742 static_cast<double>(width);
745 min_zoom = qMax(min_zoom, static_cast<double>(length) /
double(INT_MAX));
774 if ((
m_offset != old_offset) || !qFuzzyCompare(
m_zoom, old_zoom)) {
797 if ( (pos < (
m_offset + (visible / 10))) ||
798 (pos > (
m_offset + (visible / 2))) )
802 pos = (pos > offset) ? (pos - offset) : 0;
817 Q_ASSERT(signal_manager);
818 if (!signal_manager)
return;
826 setZoom((static_cast<double>(len)) / static_cast<double>(width - 1));
890 Q_ASSERT(signal_manager);
891 if (!signal_manager)
return;
894 bool was_modified = signal_manager->
isModified();
903 if (!was_modified) signal_manager->
setModified(
false);
910 int index = signal_manager->
labelIndex(label);
913 if (!was_modified) signal_manager->
setModified(
false);
921 Q_ASSERT(signal_manager);
922 if (!signal_manager)
return -1;
925 if (!filename.length()) {
926 QString
name(filename);
929 _(
"kfiledialog:///kwave_label_dir"),
933 dlg->setWindowTitle(i18n(
"Load Labels"));
934 if (dlg->exec() != QDialog::Accepted) {
942 url = QUrl::fromUserInput(filename);
955 Q_ASSERT(signal_manager);
956 if (!signal_manager)
return false;
961 if (!filename.length()) {
962 QString
name(filename);
965 _(
"kfiledialog:///kwave_label_dir"),
969 dlg->setWindowTitle(i18n(
"Save Labels"));
970 if (dlg->exec() != QDialog::Accepted) {
983 if (!QFileInfo(name).suffix().length()) {
984 url.setPath(name +
_(
".label"));
990 if (QFileInfo(name).exists())
993 i18n(
"The file '%1' already exists.\n" 994 "Do you really want to overwrite it?", name)) !=
1001 url = QUrl::fromUserInput(filename);
1006 _(
"saving labels to '") + url.toDisplayString() +
_(
"'"));
1008 QFile file(url.path());
1009 file.open(QIODevice::WriteOnly);
1010 QTextStream out(&file);
1016 out <<
_(
"label:add(") << pos;
1017 if (name.length()) out <<
_(
", ") <<
name;
1018 out <<
_(
")") << endl;
1029 Q_ASSERT(signal_manager);
1030 if (!signal_manager)
return false;
1032 if (label.
isNull())
return false;
1033 int index = signal_manager->
labelIndex(label);
1034 Q_ASSERT(index >= 0);
1035 if (index < 0)
return false;
1043 QString new_name = label.
name();
1050 if (!dlg)
return false;
1053 signal_manager->
rate());
1057 accepted = (dlg->exec() == QDialog::Accepted);
1072 if ((new_pos != label.
pos()) &&
1076 "There already is a label at the position you have chosen.\n"\
1077 "Do you want to replace it?"));
1078 if (res == KMessageBox::Yes) {
1084 if (res == KMessageBox::No) {
1100 if ((new_name == label.
name()) && (new_pos == label.
pos()))
1106 if (old_index >= 0) {
1113 if (!signal_manager->
modifyLabel(index, new_pos, new_name,
true)) {
sample_index_t toSampleIndex()
virtual void closeEvent(QCloseEvent *e) Q_DECL_OVERRIDE
int loadBatch(const QUrl &url)
void selectRange(sample_index_t offset, sample_index_t length)
sample_index_t first() const
static sample_index_t decode(QWidget *widget, const QMimeData *e, Kwave::SignalManager &sig, sample_index_t pos)
QTimer m_delayed_update_timer
void sigZoomChanged(double zoom)
void registerViewManager(Kwave::ViewManager *view_manager)
sample_index_t last() const
Kwave::MetaDataList & metaData()
virtual void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE
QVariant get(FileProperty key) const
void slotTrackInserted(unsigned int index, Kwave::Track *track)
int loadLabels(const QString &filename)
virtual void moveTo(sample_index_t position)
Kwave::Selection & selection()
void deleteLabel(int index, bool with_undo)
virtual sample_index_t pos() const
void abortUndoTransaction()
virtual void scrollTo(sample_index_t pos) Q_DECL_OVERRIDE
Kwave::PlaybackController & playbackController()
static bool canDecode(const QMimeData *data)
sample_index_t ms2samples(double ms)
virtual int visibleWidth() const Q_DECL_OVERRIDE
#define LABEL_LIST_FILTER
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
void setModified(bool mod)
sample_index_t length() const
QString signalName() const
bool labelProperties(Kwave::Label &label)
Kwave::OverViewWidget * m_overview
int labelIndex(const Kwave::Label &label) const
virtual sample_index_t visibleSamples() const Q_DECL_OVERRIDE
virtual QString name() const
virtual void rename(const QString &name)
Kwave::SignalWidget m_signal_widget
virtual ~MainWidget() Q_DECL_OVERRIDE
static int warningYesNoCancel(QWidget *widget, QString message, QString caption=QString(), const QString buttonYes=QString(), const QString buttonNo=QString(), const QString &dontAskAgainName=QString())
MainWidget(QWidget *parent, Kwave::FileContext &context, const QSize &preferred_size)
void sigVisibleRangeChanged(sample_index_t offset, sample_index_t visible, sample_index_t total)
#define DEFAULT_DISPLAY_TIME
static int warningYesNo(QWidget *widget, QString message, QString caption=QString(), const QString buttonYes=QString(), const QString buttonNo=QString(), const QString &dontAskAgainName=QString())
virtual void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE
int executeCommand(const QString &command)
int saveLabels(const QString &filename)
Kwave::Label addLabel(sample_index_t pos, const QString &name)
virtual void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE
void setOffset(sample_index_t new_offset)
Kwave::FileContext & m_context
static bool canDecode(const QMimeData *source)
Kwave::Label findLabel(sample_index_t pos)
sample_index_t pixels2samples(unsigned int pixels) const
bool modifyLabel(int index, sample_index_t pos, const QString &name, bool with_undo)
void sigCommand(const QString &command)
QScrollBar * m_horizontal_scrollbar
static void Q_DECL_EXPORT log(const QObject *sender, LogLevel level, const QString &msg)
virtual void setZoom(double new_zoom) Q_DECL_OVERRIDE
Kwave::PluginManager * pluginManager() const
void addLabel(sample_index_t pos, const QString &description)
virtual double zoom() const Q_DECL_OVERRIDE
Kwave::SignalManager * signalManager() const
static QString escape(const QString &text)
void fixZoomAndOffset(double zoom, sample_index_t offset)
int samples2pixels(sample_index_t samples) const
void slotTrackDeleted(unsigned int index, Kwave::Track *track)
virtual int executeCommand(const QString &command) Q_DECL_OVERRIDE
void refreshHorizontalScrollBar()
#define MINIMUM_SAMPLES_PER_SCREEN
void horizontalScrollBarMoved(int newval)
sample_index_t offset() const
const QString & nextParam()
QScrollArea m_scroll_area
virtual void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE