1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
/***************************************************************************
UndoModifyAction.h - UndoAction for modifications on samples
-------------------
begin : May 25 2001
copyright : (C) 2001 by Thomas Eschenbacher
email : Thomas Eschenbacher <thomas.eschenbacher@gmx.de>
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "config.h"
#include <KLocalizedString>
#include "libkwave/Sample.h"
#include "libkwave/SampleArray.h"
#include "libkwave/SampleReader.h"
#include "libkwave/SignalManager.h"
#include "libkwave/Writer.h"
#include "libkwave/undo/UndoModifyAction.h"
//***************************************************************************
Kwave::UndoModifyAction::UndoModifyAction(unsigned int track,
sample_index_t offset,
sample_index_t length)
:UndoAction(), m_track(track), m_offset(offset), m_length(length),
m_stripes()
{
}
//***************************************************************************
Kwave::UndoModifyAction::~UndoModifyAction()
{
}
//***************************************************************************
QString Kwave::UndoModifyAction::description()
{
return i18n("Modify Samples");
}
//***************************************************************************
qint64 Kwave::UndoModifyAction::undoSize()
{
return sizeof(*this) + (m_length * sizeof(sample_t));
}
//***************************************************************************
bool Kwave::UndoModifyAction::store(Kwave::SignalManager &manager)
{
if (!m_length) return true; // shortcut: this is an empty action
// fork off a multi track stripe list for the selected range
QVector<unsigned int> track_list;
track_list.append(m_track);
const sample_index_t left = m_offset;
const sample_index_t right = m_offset + m_length - 1;
m_stripes = manager.stripes(track_list, left, right);
if (m_stripes.isEmpty())
return false; // retrieving the stripes failed
return true;
}
//***************************************************************************
Kwave::UndoAction *Kwave::UndoModifyAction::undo(
Kwave::SignalManager &manager, bool with_redo)
{
const sample_index_t left = m_offset;
const sample_index_t right = m_offset + m_length - 1;
QList<Kwave::Stripe::List> redo_data;
QVector<unsigned int> track_list;
track_list.append(m_track);
bool ok = true;
if (m_length && with_redo) {
// save the current stripes for later redo
redo_data = manager.stripes(track_list, left, right);
ok &= !redo_data.isEmpty();
}
// merge the stripes back into the signal
if (m_length && ok) {
if (!manager.mergeStripes(m_stripes, track_list)) {
qWarning("UndoModifyAction::undo() FAILED [mergeStripes]");
return nullptr;
}
}
if (ok && with_redo) {
// now store the redo data in this object
m_stripes = redo_data;
}
return (with_redo && ok) ? this : nullptr;
}
//***************************************************************************
//***************************************************************************
|