File: UndoModifyAction.cpp

package info (click to toggle)
kwave 25.04.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 23,272 kB
  • sloc: cpp: 56,173; xml: 817; perl: 688; sh: 57; makefile: 11
file content (105 lines) | stat: -rw-r--r-- 3,952 bytes parent folder | download
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;
}

//***************************************************************************
//***************************************************************************