Mercurial > hg > svgui
comparison view/Pane.cpp @ 1588:0f36e0eca6b0
Add right-button context menu to panner widget
| author | Chris Cannam |
|---|---|
| date | Mon, 30 Mar 2020 11:29:16 +0100 |
| parents | e6362cf5ff1d |
| children | 4739a1b2266f |
comparison
equal
deleted
inserted
replaced
| 1587:2108af725460 | 1588:0f36e0eca6b0 |
|---|---|
| 30 | 30 |
| 31 // GF: added so we can propagate the mouse move event to the note layer for context handling. | 31 // GF: added so we can propagate the mouse move event to the note layer for context handling. |
| 32 #include "layer/LayerFactory.h" | 32 #include "layer/LayerFactory.h" |
| 33 #include "layer/FlexiNoteLayer.h" | 33 #include "layer/FlexiNoteLayer.h" |
| 34 | 34 |
| 35 #include "widgets/MenuTitle.h" | |
| 35 | 36 |
| 36 //!!! ugh | 37 //!!! ugh |
| 37 #include "data/model/WaveFileModel.h" | 38 #include "data/model/WaveFileModel.h" |
| 38 #include "data/model/AlignmentModel.h" | 39 #include "data/model/AlignmentModel.h" |
| 39 | 40 |
| 44 #include <QDropEvent> | 45 #include <QDropEvent> |
| 45 #include <QCursor> | 46 #include <QCursor> |
| 46 #include <QTextStream> | 47 #include <QTextStream> |
| 47 #include <QMimeData> | 48 #include <QMimeData> |
| 48 #include <QApplication> | 49 #include <QApplication> |
| 50 #include <QMenu> | |
| 49 | 51 |
| 50 #include <iostream> | 52 #include <iostream> |
| 51 #include <cmath> | 53 #include <cmath> |
| 52 | 54 |
| 53 //!!! for HUD -- pull out into a separate class | 55 //!!! for HUD -- pull out into a separate class |
| 54 #include <QFrame> | 56 #include <QFrame> |
| 55 #include <QGridLayout> | 57 #include <QGridLayout> |
| 56 #include <QPushButton> | 58 #include <QPushButton> |
| 59 | |
| 57 #include "widgets/Thumbwheel.h" | 60 #include "widgets/Thumbwheel.h" |
| 58 #include "widgets/Panner.h" | 61 #include "widgets/Panner.h" |
| 59 #include "widgets/RangeInputDialog.h" | 62 #include "widgets/RangeInputDialog.h" |
| 60 #include "widgets/NotifyingPushButton.h" | 63 #include "widgets/NotifyingPushButton.h" |
| 61 | 64 |
| 84 m_headsUpDisplay(nullptr), | 87 m_headsUpDisplay(nullptr), |
| 85 m_vpan(nullptr), | 88 m_vpan(nullptr), |
| 86 m_hthumb(nullptr), | 89 m_hthumb(nullptr), |
| 87 m_vthumb(nullptr), | 90 m_vthumb(nullptr), |
| 88 m_reset(nullptr), | 91 m_reset(nullptr), |
| 92 m_lastVerticalPannerContextMenu(nullptr), | |
| 89 m_mouseInWidget(false), | 93 m_mouseInWidget(false), |
| 90 m_playbackFrameMoveScheduled(false), | 94 m_playbackFrameMoveScheduled(false), |
| 91 m_playbackFrameMoveTo(0) | 95 m_playbackFrameMoveTo(0) |
| 92 { | 96 { |
| 93 setObjectName("Pane"); | 97 setObjectName("Pane"); |
| 98 | 102 |
| 99 connect(this, SIGNAL(regionOutlined(QRect)), | 103 connect(this, SIGNAL(regionOutlined(QRect)), |
| 100 this, SLOT(zoomToRegion(QRect))); | 104 this, SLOT(zoomToRegion(QRect))); |
| 101 | 105 |
| 102 cerr << "Pane::Pane(" << this << ") returning" << endl; | 106 cerr << "Pane::Pane(" << this << ") returning" << endl; |
| 107 } | |
| 108 | |
| 109 Pane::~Pane() | |
| 110 { | |
| 111 delete m_lastVerticalPannerContextMenu; | |
| 103 } | 112 } |
| 104 | 113 |
| 105 void | 114 void |
| 106 Pane::updateHeadsUpDisplay() | 115 Pane::updateHeadsUpDisplay() |
| 107 { | 116 { |
| 146 this, SLOT(verticalPannerMoved(float, float, float, float))); | 155 this, SLOT(verticalPannerMoved(float, float, float, float))); |
| 147 connect(m_vpan, SIGNAL(doubleClicked()), | 156 connect(m_vpan, SIGNAL(doubleClicked()), |
| 148 this, SLOT(editVerticalPannerExtents())); | 157 this, SLOT(editVerticalPannerExtents())); |
| 149 connect(m_vpan, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); | 158 connect(m_vpan, SIGNAL(mouseEntered()), this, SLOT(mouseEnteredWidget())); |
| 150 connect(m_vpan, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); | 159 connect(m_vpan, SIGNAL(mouseLeft()), this, SLOT(mouseLeftWidget())); |
| 160 | |
| 161 // Panner doesn't provide its own context menu | |
| 162 m_vpan->setContextMenuPolicy(Qt::CustomContextMenu); | |
| 163 connect(m_vpan, SIGNAL(customContextMenuRequested(const QPoint &)), | |
| 164 this, SLOT(verticalPannerContextMenuRequested(const QPoint &))); | |
| 151 | 165 |
| 152 m_vthumb = new Thumbwheel(Qt::Vertical); | 166 m_vthumb = new Thumbwheel(Qt::Vertical); |
| 153 m_vthumb->setObjectName(tr("Vertical Zoom")); | 167 m_vthumb->setObjectName(tr("Vertical Zoom")); |
| 154 m_vthumb->setCursor(Qt::ArrowCursor); | 168 m_vthumb->setCursor(Qt::ArrowCursor); |
| 155 layout->addWidget(m_vthumb, 0, 2); | 169 layout->addWidget(m_vthumb, 0, 2); |
| 2538 // << "," << h << ") -> (" << newmin << "," << newmax << ")" << endl; | 2552 // << "," << h << ") -> (" << newmin << "," << newmax << ")" << endl; |
| 2539 setTopLayerDisplayExtents(newmin, newmax); | 2553 setTopLayerDisplayExtents(newmin, newmax); |
| 2540 } | 2554 } |
| 2541 | 2555 |
| 2542 void | 2556 void |
| 2557 Pane::verticalPannerContextMenuRequested(const QPoint &pos) | |
| 2558 { | |
| 2559 Panner *panner = qobject_cast<Panner *>(sender()); | |
| 2560 if (!panner) { | |
| 2561 return; | |
| 2562 } | |
| 2563 | |
| 2564 double vmin, vmax, dmin, dmax; | |
| 2565 QString unit; | |
| 2566 if (!getTopLayerDisplayExtents(vmin, vmax, dmin, dmax, &unit)) { | |
| 2567 return; | |
| 2568 } | |
| 2569 | |
| 2570 delete m_lastVerticalPannerContextMenu; | |
| 2571 QMenu *m = new QMenu; | |
| 2572 m_lastVerticalPannerContextMenu = m; | |
| 2573 | |
| 2574 MenuTitle::addTitle(m, tr("Vertical Range: %1 - %2 %3") | |
| 2575 .arg(dmin).arg(dmax).arg(unit)); | |
| 2576 | |
| 2577 m->addAction(tr("&Edit..."), | |
| 2578 [=]() { | |
| 2579 editVerticalPannerExtents(); | |
| 2580 }); | |
| 2581 m->addAction(tr("&Reset to Default"), | |
| 2582 [=]() { | |
| 2583 if (m_vthumb) { | |
| 2584 // This determines the "size" of the panner box | |
| 2585 m_vthumb->resetToDefault(); | |
| 2586 } | |
| 2587 panner->resetToDefault(); | |
| 2588 }); | |
| 2589 | |
| 2590 m->popup(panner->mapToGlobal(pos)); | |
| 2591 m_lastVerticalPannerContextMenu = m; | |
| 2592 } | |
| 2593 | |
| 2594 void | |
| 2543 Pane::editVerticalPannerExtents() | 2595 Pane::editVerticalPannerExtents() |
| 2544 { | 2596 { |
| 2545 if (!m_vpan || !m_manager || !m_manager->getZoomWheelsEnabled()) return; | 2597 if (!m_vpan || !m_manager || !m_manager->getZoomWheelsEnabled()) return; |
| 2546 | 2598 |
| 2547 double vmin, vmax, dmin, dmax; | 2599 double vmin, vmax, dmin, dmax; |
| 2550 || vmax == vmin) { | 2602 || vmax == vmin) { |
| 2551 return; | 2603 return; |
| 2552 } | 2604 } |
| 2553 | 2605 |
| 2554 RangeInputDialog dialog(tr("Enter new range"), | 2606 RangeInputDialog dialog(tr("Enter new range"), |
| 2555 tr("New vertical display range, from %1 to %2 %4:") | 2607 tr("New vertical display range, from %1 to %2 %3:") |
| 2556 .arg(vmin).arg(vmax).arg(unit), | 2608 .arg(vmin).arg(vmax).arg(unit), |
| 2557 unit, float(vmin), float(vmax), this); | 2609 unit, float(vmin), float(vmax), this); |
| 2558 dialog.setRange(float(dmin), float(dmax)); | 2610 dialog.setRange(float(dmin), float(dmax)); |
| 2559 | 2611 |
| 2560 if (dialog.exec() == QDialog::Accepted) { | 2612 if (dialog.exec() == QDialog::Accepted) { |
