kwave  18.07.70
SelectionItem.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * SelectionItem.cpp - selection item within a SignalView
3  * -------------------
4  * begin : Sun Mar 12 2017
5  * copyright : (C) 2017 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 <QAction>
21 #include <QList>
22 
23 #include "libkwave/Drag.h"
25 #include "libkwave/SignalManager.h"
26 #include "libkwave/String.h"
27 #include "libkwave/Utils.h"
29 
30 #include "libgui/SelectionItem.h"
31 #include "libgui/SignalView.h"
32 
33 //***************************************************************************
35  Kwave::SignalView &view,
36  Kwave::SignalManager &signal_manager
37 )
38  :Kwave::ViewItem(view, signal_manager),
39  m_first(signal_manager.selection().first()),
40  m_last(signal_manager.selection().last())
41 {
42 }
43 
44 //***************************************************************************
46 {
47 }
48 
49 //***************************************************************************
50 Kwave::ViewItem::Flags Kwave::SelectionItem::flags() const
51 {
53 }
54 
55 //***************************************************************************
57 {
59  if (!length) return;
60 
61  Kwave::Drag *d = new(std::nothrow) Kwave::Drag(&m_view);
62  Q_ASSERT(d);
63  if (!d) return;
64 
67  const double rate = m_signal_manager.rate();
68  const unsigned int bits = m_signal_manager.bits();
69 
71  m_signal_manager.selectedTracks(), first, last);
72 
73  // create the file info
76  Kwave::FileInfo info(meta);
77  info.setLength(last - first + 1);
78  info.setRate(rate);
79  info.setBits(bits);
80  info.setTracks(src.tracks());
81  meta.replace(Kwave::MetaDataList(info));
82 
83  if (!d->encode(&m_view, src, meta)) {
84  delete d;
85  return;
86  }
87 
88  // start drag&drop, mode is determined automatically
89  Kwave::UndoTransactionGuard undo(m_signal_manager, i18n("Drag and Drop"));
90  Qt::DropAction drop = d->exec(Qt::CopyAction | Qt::MoveAction);
91 
92  if (drop == Qt::MoveAction) {
93  // deleting also affects the selection !
96  const sample_index_t len = l - f + 1;
97 
98  // special case: when dropping into the same widget, before
99  // the previous selection, the previous range has already
100  // been moved to the right !
101  sample_index_t src_pos = first;
102 
103  SignalView *target = qobject_cast<Kwave::SignalView *>(d->target());
104  if ( (f < src_pos) && target &&
105  (target->signalManager() == m_view.signalManager()) ) {
106  src_pos += len;
107  }
108 
109  m_signal_manager.deleteRange(src_pos, len,
111 
112  // restore the new selection
113  m_signal_manager.selectRange((first < f) ? (f - len) : f, len);
114  }
115 }
116 
117 //***************************************************************************
118 //***************************************************************************
void selectRange(sample_index_t offset, sample_index_t length)
sample_index_t first() const
Definition: Selection.h:71
Definition: App.h:33
virtual MetaDataList selectByTracks(const QList< unsigned int > &tracks) const
sample_index_t last() const
Definition: Selection.h:76
Kwave::MetaDataList & metaData()
virtual Kwave::ViewItem::Flags flags() const Q_DECL_OVERRIDE
SelectionItem(SignalView &view, Kwave::SignalManager &signal_manager)
Kwave::Selection & selection()
quint64 sample_index_t
Definition: Sample.h:28
bool deleteRange(sample_index_t offset, sample_index_t length, const QList< unsigned int > &track_list)
Kwave::SignalManager & m_signal_manager
Definition: ViewItem.h:119
Kwave::SignalView & m_view
Definition: ViewItem.h:116
virtual ~SelectionItem() Q_DECL_OVERRIDE
virtual void startDragging() Q_DECL_OVERRIDE
sample_index_t length() const
Definition: Selection.h:66
void setRate(double rate)
Definition: FileInfo.cpp:424
void setLength(sample_index_t length)
Definition: FileInfo.cpp:409
double rate() const
void setTracks(unsigned int tracks)
Definition: FileInfo.cpp:454
bool encode(QWidget *widget, Kwave::MultiTrackReader &src, const Kwave::MetaDataList &meta_data)
Definition: Drag.cpp:51
void setBits(unsigned int bits)
Definition: FileInfo.cpp:439
unsigned int bits() const
Kwave::SignalManager * signalManager() const
Definition: SignalView.h:100
const QList< unsigned int > selectedTracks()