kwave  18.07.70
SignalView.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  SignalView.cpp - base class for widgets for views to a signal
3  -------------------
4  begin : Mon Jan 18 2010
5  copyright : (C) 2010 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 <math.h>
21 
22 #include <QApplication>
23 #include <QBitmap>
24 #include <QBrush>
25 #include <QEvent>
26 #include <QKeyEvent>
27 #include <QMimeData>
28 #include <QMouseEvent>
29 #include <QPainter>
30 #include <QThread>
31 #include <QToolTip>
32 #include <QUrl>
33 
34 #include "libkwave/CodecManager.h"
35 #include "libkwave/Drag.h"
36 #include "libkwave/FileDrag.h"
37 #include "libkwave/Parser.h"
38 #include "libkwave/SignalManager.h"
39 #include "libkwave/String.h"
40 #include "libkwave/Utils.h"
42 
43 #include "libgui/MouseMark.h"
44 #include "libgui/SignalView.h"
45 #include "libgui/ViewItem.h"
46 
48 #define POSITION_WIDGET_TIME 5000
49 
50 //***************************************************************************
51 //***************************************************************************
52 Kwave::SignalView::SignalView(QWidget *parent, QWidget *controls,
53  Kwave::SignalManager *signal_manager,
54  Location preferred_location,
55  int track)
56  :QWidget(parent),
57  m_controls(controls),
58  m_signal_manager(signal_manager),
59  m_preferred_location(preferred_location),
60  m_track_index(track),
61  m_offset(0),
62  m_zoom(1.0),
63  m_vertical_zoom(1.0),
64  m_mouse_mode(MouseNormal),
65  m_mouse_selection(),
66  m_mouse_down_x(0),
67  m_position_widget(this),
68  m_position_widget_timer(this),
69  m_siblings(),
70  m_selected_item(Q_NULLPTR)
71 {
72  // connect the timer of the position widget
73  connect(&m_position_widget_timer, SIGNAL(timeout()),
74  &m_position_widget, SLOT(hide()));
75 
76  setMouseTracking(true);
77  setAcceptDrops(true); // enable drag&drop
78  setFocusPolicy(Qt::StrongFocus); // enabled keyboard events
79 }
80 
81 //***************************************************************************
83 {
85  setCursor(Qt::ArrowCursor);
86  hidePosition();
87  m_selected_item.clear();
88 
89  if (!m_siblings.isEmpty()) {
90  QMutableListIterator<QPointer<QWidget> > it(m_siblings);
91  it.toBack();
92  while (it.hasPrevious()) {
93  QWidget *widget = it.previous();
94  it.remove();
95  if (widget) delete widget;
96  }
97  }
98 }
99 
100 //***************************************************************************
102 {
103  repaint();
104 }
105 
106 //***************************************************************************
107 void Kwave::SignalView::addSibling(QWidget *widget)
108 {
109  m_siblings.append(QPointer<QWidget>(widget));
110 }
111 
112 //***************************************************************************
114 {
115  m_track_index = (track >= 0) ? track : -1;
116 }
117 
118 //***************************************************************************
120 {
121  if (qFuzzyCompare(zoom, m_zoom) && (offset == m_offset)) return;
122  m_zoom = zoom;
123  m_offset = offset;
124 
125 // sample_index_t visible = ((width() - 1) * zoom) + 1;
126 // sample_index_t last = offset + visible - 1;
127 // qDebug("SignalView::setZoomAndOffset(%g, %lu), last visible=%lu",
128 // zoom,
129 // static_cast<unsigned long int>(offset),
130 // static_cast<unsigned long int>(last));
131 
132  // the relation to the position widget has become invalid
133  hidePosition();
134 }
135 
136 //***************************************************************************
138 {
140 }
141 
142 //***************************************************************************
144 {
145  Q_UNUSED(pos);
146 }
147 
148 //***************************************************************************
150 {
151  return Kwave::toInt((m_zoom > 0.0) ? (samples / m_zoom) : 0);
152 }
153 
154 //***************************************************************************
156 {
157  if ((pixels <= 0) || (m_zoom <= 0.0)) return 0;
158  return static_cast<sample_index_t>(static_cast<double>(pixels) * m_zoom);
159 }
160 
161 //***************************************************************************
163 {
164  Q_ASSERT(m_signal_manager);
165  if (!m_signal_manager) return 0.0;
166 
167  double rate = m_signal_manager->rate();
168  if (rate == 0.0) return 0.0;
169  return static_cast<double>(samples) * 1E3 / rate;
170 }
171 
172 //***************************************************************************
173 Kwave::SignalView::SelectionPos Kwave::SignalView::selectionPosition(int x)
174 {
175  // shortcut: if this view can't handle selection...
176  if (!canHandleSelection()) return Q_NULLPTR;
177 
178  Q_ASSERT(m_signal_manager);
179  if (!m_signal_manager) return None;
180 
181  const double p = (m_zoom * x) + m_offset;
182  const double tol = m_zoom * selectionTolerance();
183  const double first = m_signal_manager->selection().first();
184  const double last = m_signal_manager->selection().last();
185  Q_ASSERT(first <= last);
186 
187  // get distance to left/right selection border
188  double d_left = (p > first) ? (p - first) : (first - p);
189  double d_right = (p > last) ? (p - last) : (last - p);
190 
191  // the simple cases...
192  Kwave::SignalView::SelectionPos pos = None;
193  if ((d_left <= tol) && (p < last)) pos |= LeftBorder;
194  if ((d_right <= tol) && (p > first)) pos |= RightBorder;
195  if ((p >= first) && (p <= last)) pos |= Selection;
196 
197  if ((pos & LeftBorder) && (pos & RightBorder)) {
198  // special case: determine which border is nearer
199  if (d_left < d_right)
200  pos &= ~RightBorder; // more on the left
201  else
202  pos &= ~LeftBorder; // more on the right
203  }
204 
205  return pos;
206 }
207 
208 //***************************************************************************
210 {
211  return (selectionPosition(x) & Selection) != 0;
212 }
213 
214 //***************************************************************************
215 QSharedPointer<Kwave::ViewItem> Kwave::SignalView::findItem(const QPoint &pos)
216 {
217  Q_UNUSED(pos);
218  return QSharedPointer<Kwave::ViewItem>(Q_NULLPTR);
219 }
220 
221 //***************************************************************************
222 void Kwave::SignalView::showPosition(const QString &text, sample_index_t pos,
223  const QPoint &mouse)
224 {
225  // check: showPosition() must be called from the GUI thread only!
226  Q_ASSERT(this->thread() == QThread::currentThread());
227  Q_ASSERT(this->thread() == qApp->thread());
228 
229  int x = mouse.x();
230  int y = mouse.y();
231 
232  // x/y == -1/-1 or empty text -> reset/hide the position
233  if (((x < 0) && (y < 0)) || !text.length()) {
235  m_position_widget.hide();
236  return;
237  }
238 
239  setUpdatesEnabled(false);
240  m_position_widget.hide();
241 
242  switch (selectionPosition(mouse.x()) & ~Selection) {
243  case LeftBorder:
244  m_position_widget.setText(text, Qt::AlignRight);
245  x = samples2pixels(pos - m_offset) - m_position_widget.width();
246  if (x < 0) {
247  // switch to left aligned mode
248  m_position_widget.setText(text, Qt::AlignLeft);
249  x = samples2pixels(pos - m_offset);
250  }
251  break;
252  case RightBorder:
253  default:
254  m_position_widget.setText(text, Qt::AlignLeft);
255  x = samples2pixels(pos - m_offset);
256  if (x + m_position_widget.width() > width()) {
257  // switch to right aligned mode
258  m_position_widget.setText(text, Qt::AlignRight);
259  x = samples2pixels(pos - m_offset) - m_position_widget.width();
260  }
261  break;
262  }
263 
264  // adjust the position to avoid vertical clipping
265  int lh = m_position_widget.height();
266  if (y - lh/2 < 0) {
267  y = 0;
268  } else if (y + lh/2 > height()) {
269  y = height() - lh;
270  } else {
271  y -= lh/2;
272  }
273 
274  m_position_widget.move(x, y);
275 
276  if (!m_position_widget.isVisible())
277  m_position_widget.show();
278 
280  m_position_widget_timer.setSingleShot(true);
282 
283  setUpdatesEnabled(true);
284 }
285 
286 //***************************************************************************
287 void Kwave::SignalView::findNewItem(const QPoint &mouse_pos, bool active)
288 {
289  m_selected_item = QSharedPointer<Kwave::ViewItem>(Q_NULLPTR);
290  if (!active) m_mouse_mode = MouseNormal;
291 
292  m_selected_item = findItem(mouse_pos);
293  if (m_selected_item) {
294  // we have an item to show, activate the position window
295  sample_index_t item_pos = m_offset + pixels2samples(mouse_pos.x());
296  QString item_text = m_selected_item->toolTip(item_pos);
297  showPosition(item_text, item_pos, mouse_pos);
298 
299  // update the mouse cursor
300  Kwave::ViewItem::Flags flags = m_selected_item->flags();
302  setCursor(active ? Qt::ClosedHandCursor : Qt::ArrowCursor);
303  else if (flags & Kwave::ViewItem::CanGrabAndMove)
304  setCursor(m_selected_item->mouseCursor());
305  else
306  setCursor(Qt::ArrowCursor);
307 
308  if (active) m_mouse_mode = MouseMoveItem;
309  } else {
310  // out of scope
311  hidePosition();
313  setCursor(Qt::ArrowCursor);
314  }
315 }
316 
317 //***************************************************************************
319 {
320  Q_ASSERT(e);
321  if (!e) return;
322 
323  // abort if no signal is loaded
324  Q_ASSERT(m_signal_manager);
326  e->ignore();
327  return;
328  }
329 
330  // there seems to be a BUG in Qt, sometimes e->pos() produces flicker/wrong
331  // coordinates on the start of a fast move!?
332  // globalPos() seems not to have this effect
333  const QPoint mouse_pos(
334  qBound(0, mapFromGlobal(e->globalPos()).x(), width() - 1),
335  qBound(0, mapFromGlobal(e->globalPos()).y(), height() - 1)
336  );
337 
338  // bail out if the position did not change
339  static QPoint last_pos = QPoint(-1, -1);
340  if (mouse_pos == last_pos) {
341  e->ignore();
342  return;
343  }
344 
345  switch (m_mouse_mode) {
346  case MouseDragItem: /* FALLTHROUGH */
347  case MouseMoveItem: {
348  // move mode
349 
350  if (m_selected_item.isNull()) {
351  hidePosition();
352  break;
353  }
354 
355  bool hide_position = true;
356  Kwave::ViewItem::Flags flags = m_selected_item->flags();
357  if (flags & Kwave::ViewItem::CanDragAndDrop) {
358  const int dmin = QApplication::startDragDistance();
359  if ((e->buttons() & Qt::LeftButton) &&
360  ((mouse_pos.x() < (m_mouse_down_x - dmin)) ||
361  (mouse_pos.x() > (m_mouse_down_x + dmin))) )
362  {
363  m_selected_item->startDragging();
364  }
365  }
366 
367  if (flags & Kwave::ViewItem::CanGrabAndMove) {
368  // update the position of the item
369  m_selected_item->moveTo(mouse_pos);
370 
371  // show the position window, so that we see the coordinates
372  // where we move the item to
373  sample_index_t pos = m_offset + pixels2samples(mouse_pos.x());
374  QString item_text = m_selected_item->toolTip(pos);
375  showPosition(item_text, pos, mouse_pos);
376  hide_position = false;
377  }
378 
379  if (hide_position) hidePosition();
380  break;
381  }
382  case MouseNormal: /* FALLTHROUGH */
383  default:
384  findNewItem(mouse_pos, false);
385  break;
386  }
387  e->accept();
388 }
389 
390 //***************************************************************************
392 {
393  Q_ASSERT(e);
394  Q_ASSERT(m_signal_manager);
395  if (!e) return;
396 
397  // abort if no signal is loaded
399  e->ignore();
400  return;
401  }
402 
403  // ignore all mouse press events in playback mode
405  e->ignore();
406  return;
407  }
408 
409  const QPoint mouse_pos(
410  qBound(0, mapFromGlobal(e->globalPos()).x(), width() - 1),
411  qBound(0, mapFromGlobal(e->globalPos()).y(), height() - 1)
412  );
413 
414  findNewItem(mouse_pos, false);
415 
416  if (e->button() == Qt::LeftButton) {
417  sample_index_t ofs = m_offset + pixels2samples(mouse_pos.x());
418  sample_index_t selection_first = m_signal_manager->selection().first();
419  sample_index_t selection_last = m_signal_manager->selection().last();
420 
421  switch (e->modifiers()) {
422  case Qt::ShiftModifier: {
423  // expand the selection to "here"
424  m_mouse_selection.set(selection_first, selection_last);
425  m_mouse_selection.grep(ofs);
429  );
430 
431  // this probably changes to "adjust selection border"
432  findNewItem(mouse_pos, true);
433  break;
434  }
435  case Qt::NoModifier: {
436  // check whether there is some object near this position
437  if (m_selected_item) {
438  // we have an item here:
440 
441  Kwave::ViewItem::Flags flags = m_selected_item->flags();
442  if (flags & Kwave::ViewItem::CanDragAndDrop) {
443  // store the x position for later drag&drop
444  m_mouse_down_x = mouse_pos.x();
445  setCursor(Qt::DragMoveCursor);
446  }
447  } else if (canHandleSelection()) {
448  // start a new selection
449  m_mouse_selection.set(ofs, ofs);
450  m_signal_manager->selectRange(ofs, 0);
451 
452  // this probably changes to "adjust selection border"
453  findNewItem(mouse_pos, true);
454  }
455  break;
456  }
457  default:
458  break;
459  }
460  }
461  e->accept();
462 }
463 
464 //***************************************************************************
466 {
467  Q_ASSERT(e);
468  Q_ASSERT(m_signal_manager);
469  if (!e) return;
470 
471  // abort if no signal is loaded
473  e->ignore();
474  return;
475  }
476 
477  // ignore all mouse release events in playback mode
479  e->ignore();
480  return;
481  }
482 
483  const QPoint mouse_pos(
484  qBound(0, mapFromGlobal(e->globalPos()).x(), width() - 1),
485  qBound(0, mapFromGlobal(e->globalPos()).y(), height() - 1)
486  );
487 
488  switch (m_mouse_mode) {
489  case MouseDragItem:
490  // released after dragging
491  if (m_selected_item) m_selected_item->done();
492  findNewItem(mouse_pos, false);
493  break;
494  case MouseMoveItem:
495  if (m_selected_item) {
496  // released after move
498  m_selected_item->done();
499  else if (canHandleSelection()) {
500  // maybe started dragging, but released before reaching
501  // the minimum drag distance -> start a new selection
502  sample_index_t ofs = m_offset +
503  pixels2samples(mouse_pos.x());
504  m_mouse_selection.set(ofs, ofs);
505  m_signal_manager->selectRange(ofs, 0);
506  }
507  }
508  findNewItem(mouse_pos, false);
509  break;
510  default:
511  break;
512  }
513 
514  e->accept();
515 }
516 
517 //***************************************************************************
519 {
521  setCursor(Qt::ArrowCursor);
522  hidePosition();
523  QWidget::leaveEvent(e);
524 }
525 
526 //***************************************************************************
528 {
529  if (!e) return;
530  if (e->matches(QKeySequence::Cancel)) {
531  // Cancel key (Escape) -> reset all view item operations
533  setCursor(Qt::ArrowCursor);
534  m_selected_item = QSharedPointer<Kwave::ViewItem>(Q_NULLPTR);
535  } else {
536  QWidget::keyPressEvent(e);
537  }
538  hidePosition();
539 }
540 
541 //***************************************************************************
543 {
544  return (2 * QApplication::startDragDistance());
545 }
546 
547 //***************************************************************************
548 void Kwave::SignalView::handleContextMenu(const QPoint &pos, QMenu *menu)
549 {
550  Q_UNUSED(pos);
551  Q_UNUSED(menu);
552 }
553 
554 //***************************************************************************
555 void Kwave::SignalView::dragEnterEvent(QDragEnterEvent *event)
556 {
557  if (!event) return;
558  if ((event->proposedAction() != Qt::MoveAction) &&
559  (event->proposedAction() != Qt::CopyAction))
560  return; /* unsupported action */
561 
562  if (Kwave::FileDrag::canDecode(event->mimeData()))
563  event->acceptProposedAction();
565 }
566 
567 //***************************************************************************
568 void Kwave::SignalView::dragLeaveEvent(QDragLeaveEvent *event)
569 {
570  Q_UNUSED(event);
572  setCursor(Qt::ArrowCursor);
574 }
575 
576 //***************************************************************************
577 void Kwave::SignalView::dropEvent(QDropEvent *event)
578 {
579  if (!event) return;
580  const QMimeData *mime_data = event->mimeData();
581  if (!mime_data) return;
582  Q_ASSERT(m_signal_manager);
583  if (!m_signal_manager) return;
584 
585  if (Kwave::Drag::canDecode(mime_data)) {
587  i18n("Drag and Drop"));
588  sample_index_t pos = m_offset + pixels2samples(event->pos().x());
589  sample_index_t len = 0;
590 
591  if ((len = Kwave::Drag::decode(this, mime_data,
592  *m_signal_manager, pos)))
593  {
594  // set selection to the new area where the drop was done
595  m_signal_manager->selectRange(pos, len);
596  event->acceptProposedAction();
597  } else {
598  QStringList formats = mime_data->formats();
599  qWarning("SignalView::dropEvent(%s): failed !",
600  DBG(formats.join(_("; "))));
601  }
602  } else if (mime_data->hasUrls()) {
603  bool first = true;
604  foreach (const QUrl &url, mime_data->urls()) {
605  QString filename = url.toLocalFile();
606  QString mimetype = Kwave::CodecManager::mimeTypeOf(url);
607  if (Kwave::CodecManager::canDecode(mimetype)) {
608  if (first) {
609  // first dropped URL -> open in this window
610  emit sigCommand(_("open(") +
611  Kwave::Parser::escape(filename) +
612  _(")"));
613  first = false;
614  event->acceptProposedAction();
615  } else {
616  // all others -> open a new window
617  emit sigCommand(_("newwindow(") +
618  Kwave::Parser::escape(filename) +
619  _(")"));
620  }
621  }
622  }
623  }
624 
625  qDebug("SignalView::dropEvent(): done");
627  setCursor(Qt::ArrowCursor);
629 
630  if (!event->isAccepted()) event->ignore();
631 }
632 
633 //***************************************************************************
634 void Kwave::SignalView::dragMoveEvent(QDragMoveEvent *event)
635 {
636  if (!event) return;
637  const int x = event->pos().x();
638 
639  if ((event->source() == this) && isInSelection(x)) {
640  // disable drag&drop into the selection itself
641  // this would be nonsense
642 
643  Q_ASSERT(m_signal_manager);
644  if (!m_signal_manager) {
645  event->ignore();
647  return;
648  }
649 
652  const sample_index_t w = pixels2samples(width());
653  QRect rect(this->rect());
654 
655  // crop selection to widget borders
656  if (left < m_offset) left = m_offset;
657  if (right > m_offset + w) right = m_offset + w - 1;
658 
659  // transform to pixel coordinates
660  int l = qMin(samples2pixels(left - m_offset), width() - 1);
661  int r = qMin(samples2pixels(right - m_offset), l);
662  rect.setLeft(l);
663  rect.setRight(r);
664  event->ignore(rect);
666  } else if (Kwave::Drag::canDecode(event->mimeData())) {
667  // accept if it is decodeable within the
668  // current range (if it's outside our own selection)
669  event->acceptProposedAction();
670 
671  // show a cursor at the possible drop location
672  sample_index_t item_pos = m_offset + pixels2samples(x);
673  emit sigCursorChanged(item_pos);
674  } else if (Kwave::FileDrag::canDecode(event->mimeData())) {
675  // file drag
676  event->accept();
678  } else {
679  event->ignore();
681  }
682 }
683 
684 //***************************************************************************
685 //***************************************************************************
687  :QWidget(parent), m_label(Q_NULLPTR), m_alignment(Q_NULLPTR),
688  m_radius(10), m_arrow_length(30), m_last_alignment(Qt::AlignHCenter),
689  m_last_size(QSize(0,0)), m_polygon()
690 {
691  hide();
692 
693  m_label = new QLabel(this);
694  Q_ASSERT(m_label);
695  if (!m_label) return;
696 
697  m_label->setFrameStyle(QFrame::Panel | QFrame::Plain);
698  m_label->setPalette(QToolTip::palette()); // use same colors as a QToolTip
699  m_label->setFocusPolicy(Qt::NoFocus);
700  m_label->setMouseTracking(true);
701  m_label->setLineWidth(0);
702 
703  setPalette(QToolTip::palette()); // use same colors as a QToolTip
704  setMouseTracking(false);
705  setFocusPolicy(Qt::NoFocus);
706  setAttribute(Qt::WA_TransparentForMouseEvents);
707 }
708 
709 //***************************************************************************
711 {
712  if (m_label) delete m_label;
713  m_label = Q_NULLPTR;
714 }
715 
716 //***************************************************************************
718  Qt::Alignment alignment)
719 {
720  if (!m_label) return;
721 
722  m_alignment = alignment;
723 
724  m_label->setText(text);
725  m_label->setAlignment(m_alignment);
726  m_label->resize(m_label->sizeHint());
727 
728  switch (m_alignment) {
729  case Qt::AlignLeft:
730  resize(m_arrow_length + m_radius + m_label->width() + m_radius,
731  m_radius + m_label->height() + m_radius);
733  break;
734  case Qt::AlignRight:
735  resize(m_radius + m_label->width() + m_radius + m_arrow_length,
736  m_radius + m_label->height() + m_radius);
737  m_label->move(m_radius, m_radius);
738  break;
739  case Qt::AlignHCenter:
740  resize(m_radius + m_label->width() + m_radius,
741  m_arrow_length + m_radius + m_label->height() + m_radius);
742  m_label->move(m_radius, m_arrow_length + m_radius);
743  break;
744  default:
745  ;
746  }
747 
748  updateMask();
749 }
750 
751 //***************************************************************************
753 {
754  // bail out if nothing has changed
755  if ((size() == m_last_size) && (m_alignment == m_last_alignment))
756  return;
757 
758  QPainter p;
759  QBitmap bmp(size());
760  bmp.fill(Qt::color0);
761  p.begin(&bmp);
762 
763  QBrush brush(Qt::color1);
764  p.setBrush(brush);
765  p.setPen(Qt::color1);
766 
767  const int h = height();
768  const int w = width();
769 
770  // re-create the polygon, depending on alignment
771  switch (m_alignment) {
772  case Qt::AlignLeft:
773  m_polygon.setPoints(8,
774  m_arrow_length, 0,
775  w - 1, 0,
776  w - 1, h - 1,
777  m_arrow_length, h - 1,
778  m_arrow_length, (2 * h) / 3,
779  0, h / 2,
780  m_arrow_length, h / 3,
781  m_arrow_length, 0
782  );
783  break;
784  case Qt::AlignRight:
785  m_polygon.setPoints(8,
786  0, 0,
787  w - 1 - m_arrow_length, 0,
788  w - 1 - m_arrow_length, h / 3,
789  w - 1, h/2,
790  w - 1 - m_arrow_length, (2 * h) / 3,
791  w - 1 - m_arrow_length, h - 1,
792  0, h - 1,
793  0, 0
794  );
795  break;
796  case Qt::AlignHCenter:
797  break;
798  default:
799  ;
800  }
801 
802  p.drawPolygon(m_polygon);
803  p.end();
804 
805  // activate the new widget mask
806  clearMask();
807  setMask(bmp);
808 
809  // remember size/alignment for detecting changes
811  m_last_size = size();
812 }
813 
814 //***************************************************************************
816 {
817  QPainter p(this);
818  p.setBrush(palette().background().color());
819  p.drawPolygon(m_polygon);
820 }
821 
822 //***************************************************************************
823 //***************************************************************************
void sigCommand(const QString &command)
void selectRange(sample_index_t offset, sample_index_t length)
SignalView(QWidget *parent, QWidget *controls, Kwave::SignalManager *signal_manager, Location preferred_location, int track=-1)
Definition: SignalView.cpp:52
sample_index_t m_offset
Definition: SignalView.h:348
sample_index_t first() const
Definition: Selection.h:71
double m_vertical_zoom
Definition: SignalView.h:410
static sample_index_t decode(QWidget *widget, const QMimeData *e, Kwave::SignalManager &sig, sample_index_t pos)
Definition: Drag.cpp:76
void set(sample_index_t l, sample_index_t r)
Definition: MouseMark.cpp:36
virtual int selectionTolerance() const
Definition: SignalView.cpp:542
virtual void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE
Definition: SignalView.cpp:555
sample_index_t last() const
Definition: Selection.h:76
virtual void dragMoveEvent(QDragMoveEvent *event) Q_DECL_OVERRIDE
Definition: SignalView.cpp:634
virtual ~SignalView() Q_DECL_OVERRIDE
Definition: SignalView.cpp:82
PositionWidget m_position_widget
Definition: SignalView.h:429
virtual void setText(const QString &text, Qt::Alignment alignment)
Definition: SignalView.cpp:717
QList< QPointer< QWidget > > m_siblings
Definition: SignalView.h:435
QTimer m_position_widget_timer
Definition: SignalView.h:432
virtual void addSibling(QWidget *widget)
Definition: SignalView.cpp:107
Kwave::Selection & selection()
void grep(sample_index_t x)
Definition: MouseMark.cpp:55
quint64 sample_index_t
Definition: Sample.h:28
Kwave::PlaybackController & playbackController()
sample_index_t offset() const
Definition: SignalView.h:110
static bool canDecode(const QMimeData *data)
Definition: Drag.cpp:42
static QString mimeTypeOf(const QUrl &url)
virtual void setVerticalZoom(double zoom)
Definition: SignalView.cpp:137
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
Definition: Connect.cpp:48
QSharedPointer< Kwave::ViewItem > m_selected_item
Definition: SignalView.h:438
double samples2ms(sample_index_t samples)
Definition: SignalView.cpp:162
enum Kwave::SignalView::@0 m_mouse_mode
virtual bool canHandleSelection() const
Definition: SignalView.h:164
sample_index_t length()
static const char * background[]
int toInt(T x)
Definition: Utils.h:127
double rate() const
SelectionPos selectionPosition(int x)
Definition: SignalView.cpp:173
virtual void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE
Definition: SignalView.cpp:577
bool isInSelection(int x)
Definition: SignalView.cpp:209
virtual void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE
Definition: SignalView.cpp:815
virtual void keyPressEvent(QKeyEvent *e) Q_DECL_OVERRIDE
Definition: SignalView.cpp:527
virtual void setTrack(int track)
Definition: SignalView.cpp:113
virtual QSharedPointer< Kwave::ViewItem > findItem(const QPoint &pos)
Definition: SignalView.cpp:215
virtual void hidePosition()
Definition: SignalView.h:272
sample_index_t pixels2samples(int pixels) const
Definition: SignalView.cpp:155
Kwave::SignalManager * m_signal_manager
Definition: SignalView.h:336
Kwave::MouseMark m_mouse_selection
Definition: SignalView.h:420
sample_index_t length() const
Definition: MouseMark.h:77
double zoom() const
Definition: SignalView.h:115
#define _(m)
Definition: memcpy.c:66
static bool canDecode(const QMimeData *source)
Definition: FileDrag.h:34
#define DBG(qs)
Definition: String.h:55
void findNewItem(const QPoint &mouse_pos, bool active)
Definition: SignalView.cpp:287
virtual ~PositionWidget() Q_DECL_OVERRIDE
Definition: SignalView.cpp:710
virtual void handleContextMenu(const QPoint &pos, QMenu *menu)
Definition: SignalView.cpp:548
#define POSITION_WIDGET_TIME
Definition: SignalView.cpp:48
int track() const
Definition: SignalView.h:105
virtual void setZoomAndOffset(double zoom, sample_index_t offset)
Definition: SignalView.cpp:119
virtual void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE
Definition: SignalView.cpp:391
static QString escape(const QString &text)
Definition: Parser.cpp:277
void sigCursorChanged(sample_index_t pos)
virtual void showCursor(sample_index_t pos=SAMPLE_INDEX_MAX)
Definition: SignalView.cpp:143
virtual void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE
Definition: SignalView.cpp:318
static bool canDecode(const QString &mimetype_name)
virtual void dragLeaveEvent(QDragLeaveEvent *event) Q_DECL_OVERRIDE
Definition: SignalView.cpp:568
virtual void leaveEvent(QEvent *e) Q_DECL_OVERRIDE
Definition: SignalView.cpp:518
#define SAMPLE_INDEX_MAX
Definition: Sample.h:31
virtual void refresh()
Definition: SignalView.cpp:101
static double rect(double param)
Definition: Functions.cpp:29
virtual void showPosition(const QString &text, sample_index_t pos, const QPoint &mouse)
Definition: SignalView.cpp:222
sample_index_t left() const
Definition: MouseMark.cpp:43
int samples2pixels(sample_index_t samples) const
Definition: SignalView.cpp:149
virtual void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE
Definition: SignalView.cpp:465