annotate view/ViewManager.cpp @ 150:b1a3a9400284

* Add a bit of resistance to pane dragging so as to make it harder to inadvertently drag in the other axis from the one you intended
author Chris Cannam
date Fri, 22 Sep 2006 16:46:10 +0000
parents 9e6b3e239b9d
children dbd34ff746c7
rev   line source
Chris@127 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@127 2
Chris@127 3 /*
Chris@127 4 Sonic Visualiser
Chris@127 5 An audio file viewer and annotation editor.
Chris@127 6 Centre for Digital Music, Queen Mary, University of London.
Chris@127 7 This file copyright 2006 Chris Cannam.
Chris@127 8
Chris@127 9 This program is free software; you can redistribute it and/or
Chris@127 10 modify it under the terms of the GNU General Public License as
Chris@127 11 published by the Free Software Foundation; either version 2 of the
Chris@127 12 License, or (at your option) any later version. See the file
Chris@127 13 COPYING included with this distribution for more information.
Chris@127 14 */
Chris@127 15
Chris@127 16 #include "ViewManager.h"
Chris@128 17 #include "base/AudioPlaySource.h"
Chris@128 18 #include "data/model/Model.h"
Chris@128 19 #include "base/CommandHistory.h"
Chris@127 20
Chris@133 21 #include <QSettings>
Chris@133 22
Chris@127 23 #include <iostream>
Chris@127 24
Chris@127 25 // #define DEBUG_VIEW_MANAGER 1
Chris@127 26
Chris@127 27 ViewManager::ViewManager() :
Chris@127 28 m_playSource(0),
Chris@127 29 m_globalCentreFrame(0),
Chris@127 30 m_globalZoom(1024),
Chris@127 31 m_playbackFrame(0),
Chris@127 32 m_mainModelSampleRate(0),
Chris@127 33 m_lastLeft(0),
Chris@127 34 m_lastRight(0),
Chris@127 35 m_inProgressExclusive(true),
Chris@127 36 m_toolMode(NavigateMode),
Chris@127 37 m_playLoopMode(false),
Chris@127 38 m_playSelectionMode(false),
Chris@133 39 m_overlayMode(BasicOverlays),
Chris@133 40 m_zoomWheelsEnabled(true)
Chris@127 41 {
Chris@133 42 QSettings settings;
Chris@133 43 settings.beginGroup("MainWindow");
Chris@133 44 m_overlayMode = OverlayMode
Chris@133 45 (settings.value("overlay-mode", int(m_overlayMode)).toInt());
Chris@133 46 m_zoomWheelsEnabled =
Chris@133 47 settings.value("zoom-wheels-enabled", m_zoomWheelsEnabled).toBool();
Chris@133 48 settings.endGroup();
Chris@133 49
Chris@127 50 connect(this,
Chris@127 51 SIGNAL(centreFrameChanged(void *, unsigned long, bool)),
Chris@127 52 SLOT(considerSeek(void *, unsigned long, bool)));
Chris@127 53
Chris@127 54 connect(this,
Chris@127 55 SIGNAL(zoomLevelChanged(void *, unsigned long, bool)),
Chris@127 56 SLOT(considerZoomChange(void *, unsigned long, bool)));
Chris@127 57 }
Chris@127 58
Chris@127 59 ViewManager::~ViewManager()
Chris@127 60 {
Chris@127 61 }
Chris@127 62
Chris@127 63 unsigned long
Chris@127 64 ViewManager::getGlobalCentreFrame() const
Chris@127 65 {
Chris@127 66 #ifdef DEBUG_VIEW_MANAGER
Chris@127 67 std::cout << "ViewManager::getGlobalCentreFrame: returning " << m_globalCentreFrame << std::endl;
Chris@127 68 #endif
Chris@127 69 return m_globalCentreFrame;
Chris@127 70 }
Chris@127 71
Chris@127 72 unsigned long
Chris@127 73 ViewManager::getGlobalZoom() const
Chris@127 74 {
Chris@127 75 #ifdef DEBUG_VIEW_MANAGER
Chris@127 76 std::cout << "ViewManager::getGlobalZoom: returning " << m_globalZoom << std::endl;
Chris@127 77 #endif
Chris@127 78 return m_globalZoom;
Chris@127 79 }
Chris@127 80
Chris@127 81 unsigned long
Chris@127 82 ViewManager::getPlaybackFrame() const
Chris@127 83 {
Chris@127 84 if (m_playSource && m_playSource->isPlaying()) {
Chris@127 85 m_playbackFrame = m_playSource->getCurrentPlayingFrame();
Chris@127 86 }
Chris@127 87 return m_playbackFrame;
Chris@127 88 }
Chris@127 89
Chris@127 90 void
Chris@127 91 ViewManager::setPlaybackFrame(unsigned long f)
Chris@127 92 {
Chris@127 93 if (m_playbackFrame != f) {
Chris@127 94 m_playbackFrame = f;
Chris@127 95 emit playbackFrameChanged(f);
Chris@127 96 if (m_playSource && m_playSource->isPlaying()) {
Chris@127 97 m_playSource->play(f);
Chris@127 98 }
Chris@127 99 }
Chris@127 100 }
Chris@127 101
Chris@127 102 bool
Chris@127 103 ViewManager::haveInProgressSelection() const
Chris@127 104 {
Chris@127 105 return !m_inProgressSelection.isEmpty();
Chris@127 106 }
Chris@127 107
Chris@127 108 const Selection &
Chris@127 109 ViewManager::getInProgressSelection(bool &exclusive) const
Chris@127 110 {
Chris@127 111 exclusive = m_inProgressExclusive;
Chris@127 112 return m_inProgressSelection;
Chris@127 113 }
Chris@127 114
Chris@127 115 void
Chris@127 116 ViewManager::setInProgressSelection(const Selection &selection, bool exclusive)
Chris@127 117 {
Chris@127 118 m_inProgressExclusive = exclusive;
Chris@127 119 m_inProgressSelection = selection;
Chris@127 120 if (exclusive) clearSelections();
Chris@127 121 emit inProgressSelectionChanged();
Chris@127 122 }
Chris@127 123
Chris@127 124 void
Chris@127 125 ViewManager::clearInProgressSelection()
Chris@127 126 {
Chris@127 127 m_inProgressSelection = Selection();
Chris@127 128 emit inProgressSelectionChanged();
Chris@127 129 }
Chris@127 130
Chris@127 131 const MultiSelection &
Chris@127 132 ViewManager::getSelection() const
Chris@127 133 {
Chris@127 134 return m_selections;
Chris@127 135 }
Chris@127 136
Chris@127 137 const MultiSelection::SelectionList &
Chris@127 138 ViewManager::getSelections() const
Chris@127 139 {
Chris@127 140 return m_selections.getSelections();
Chris@127 141 }
Chris@127 142
Chris@127 143 void
Chris@127 144 ViewManager::setSelection(const Selection &selection)
Chris@127 145 {
Chris@127 146 MultiSelection ms(m_selections);
Chris@127 147 ms.setSelection(selection);
Chris@127 148 setSelections(ms);
Chris@127 149 }
Chris@127 150
Chris@127 151 void
Chris@127 152 ViewManager::addSelection(const Selection &selection)
Chris@127 153 {
Chris@127 154 MultiSelection ms(m_selections);
Chris@127 155 ms.addSelection(selection);
Chris@127 156 setSelections(ms);
Chris@127 157 }
Chris@127 158
Chris@127 159 void
Chris@127 160 ViewManager::removeSelection(const Selection &selection)
Chris@127 161 {
Chris@127 162 MultiSelection ms(m_selections);
Chris@127 163 ms.removeSelection(selection);
Chris@127 164 setSelections(ms);
Chris@127 165 }
Chris@127 166
Chris@127 167 void
Chris@127 168 ViewManager::clearSelections()
Chris@127 169 {
Chris@127 170 MultiSelection ms(m_selections);
Chris@127 171 ms.clearSelections();
Chris@127 172 setSelections(ms);
Chris@127 173 }
Chris@127 174
Chris@127 175 void
Chris@127 176 ViewManager::setSelections(const MultiSelection &ms)
Chris@127 177 {
Chris@127 178 if (m_selections.getSelections() == ms.getSelections()) return;
Chris@127 179 SetSelectionCommand *command = new SetSelectionCommand(this, ms);
Chris@127 180 CommandHistory::getInstance()->addCommand(command);
Chris@127 181 }
Chris@127 182
Chris@127 183 void
Chris@127 184 ViewManager::signalSelectionChange()
Chris@127 185 {
Chris@127 186 emit selectionChanged();
Chris@127 187 }
Chris@127 188
Chris@127 189 ViewManager::SetSelectionCommand::SetSelectionCommand(ViewManager *vm,
Chris@127 190 const MultiSelection &ms) :
Chris@127 191 m_vm(vm),
Chris@127 192 m_oldSelection(vm->m_selections),
Chris@127 193 m_newSelection(ms)
Chris@127 194 {
Chris@127 195 }
Chris@127 196
Chris@127 197 ViewManager::SetSelectionCommand::~SetSelectionCommand() { }
Chris@127 198
Chris@127 199 void
Chris@127 200 ViewManager::SetSelectionCommand::execute()
Chris@127 201 {
Chris@127 202 m_vm->m_selections = m_newSelection;
Chris@127 203 m_vm->signalSelectionChange();
Chris@127 204 }
Chris@127 205
Chris@127 206 void
Chris@127 207 ViewManager::SetSelectionCommand::unexecute()
Chris@127 208 {
Chris@127 209 m_vm->m_selections = m_oldSelection;
Chris@127 210 m_vm->signalSelectionChange();
Chris@127 211 }
Chris@127 212
Chris@127 213 QString
Chris@127 214 ViewManager::SetSelectionCommand::getName() const
Chris@127 215 {
Chris@127 216 if (m_newSelection.getSelections().empty()) return tr("Clear Selection");
Chris@127 217 else return tr("Select");
Chris@127 218 }
Chris@127 219
Chris@127 220 Selection
Chris@127 221 ViewManager::getContainingSelection(size_t frame, bool defaultToFollowing) const
Chris@127 222 {
Chris@127 223 return m_selections.getContainingSelection(frame, defaultToFollowing);
Chris@127 224 }
Chris@127 225
Chris@127 226 void
Chris@127 227 ViewManager::setToolMode(ToolMode mode)
Chris@127 228 {
Chris@127 229 m_toolMode = mode;
Chris@127 230
Chris@127 231 emit toolModeChanged();
Chris@127 232 }
Chris@127 233
Chris@127 234 void
Chris@127 235 ViewManager::setPlayLoopMode(bool mode)
Chris@127 236 {
Chris@127 237 m_playLoopMode = mode;
Chris@127 238
Chris@127 239 emit playLoopModeChanged();
Chris@127 240 }
Chris@127 241
Chris@127 242 void
Chris@127 243 ViewManager::setPlaySelectionMode(bool mode)
Chris@127 244 {
Chris@127 245 m_playSelectionMode = mode;
Chris@127 246
Chris@127 247 emit playSelectionModeChanged();
Chris@127 248 }
Chris@127 249
Chris@127 250 size_t
Chris@127 251 ViewManager::getPlaybackSampleRate() const
Chris@127 252 {
Chris@127 253 if (m_playSource) {
Chris@127 254 return m_playSource->getTargetSampleRate();
Chris@127 255 }
Chris@127 256 return 0;
Chris@127 257 }
Chris@127 258
Chris@127 259 void
Chris@127 260 ViewManager::setAudioPlaySource(AudioPlaySource *source)
Chris@127 261 {
Chris@127 262 if (!m_playSource) {
Chris@127 263 QTimer::singleShot(100, this, SLOT(checkPlayStatus()));
Chris@127 264 }
Chris@127 265 m_playSource = source;
Chris@127 266 }
Chris@127 267
Chris@127 268 void
Chris@127 269 ViewManager::playStatusChanged(bool playing)
Chris@127 270 {
Chris@127 271 checkPlayStatus();
Chris@127 272 }
Chris@127 273
Chris@127 274 void
Chris@127 275 ViewManager::checkPlayStatus()
Chris@127 276 {
Chris@127 277 if (m_playSource && m_playSource->isPlaying()) {
Chris@127 278
Chris@127 279 float left = 0, right = 0;
Chris@127 280 if (m_playSource->getOutputLevels(left, right)) {
Chris@127 281 if (left != m_lastLeft || right != m_lastRight) {
Chris@127 282 emit outputLevelsChanged(left, right);
Chris@127 283 m_lastLeft = left;
Chris@127 284 m_lastRight = right;
Chris@127 285 }
Chris@127 286 }
Chris@127 287
Chris@127 288 m_playbackFrame = m_playSource->getCurrentPlayingFrame();
Chris@127 289
Chris@127 290 #ifdef DEBUG_VIEW_MANAGER
Chris@127 291 std::cout << "ViewManager::checkPlayStatus: Playing, frame " << m_playbackFrame << ", levels " << m_lastLeft << "," << m_lastRight << std::endl;
Chris@127 292 #endif
Chris@127 293
Chris@127 294 emit playbackFrameChanged(m_playbackFrame);
Chris@127 295
Chris@127 296 QTimer::singleShot(20, this, SLOT(checkPlayStatus()));
Chris@127 297
Chris@127 298 } else {
Chris@127 299
Chris@127 300 QTimer::singleShot(100, this, SLOT(checkPlayStatus()));
Chris@127 301
Chris@127 302 if (m_lastLeft != 0.0 || m_lastRight != 0.0) {
Chris@127 303 emit outputLevelsChanged(0.0, 0.0);
Chris@127 304 m_lastLeft = 0.0;
Chris@127 305 m_lastRight = 0.0;
Chris@127 306 }
Chris@127 307
Chris@127 308 #ifdef DEBUG_VIEW_MANAGER
Chris@127 309 // std::cout << "ViewManager::checkPlayStatus: Not playing" << std::endl;
Chris@127 310 #endif
Chris@127 311 }
Chris@127 312 }
Chris@127 313
Chris@127 314 bool
Chris@127 315 ViewManager::isPlaying() const
Chris@127 316 {
Chris@127 317 return m_playSource && m_playSource->isPlaying();
Chris@127 318 }
Chris@127 319
Chris@127 320 void
Chris@127 321 ViewManager::considerSeek(void *p, unsigned long f, bool locked)
Chris@127 322 {
Chris@127 323 if (locked) {
Chris@127 324 m_globalCentreFrame = f;
Chris@127 325 }
Chris@127 326
Chris@127 327 #ifdef DEBUG_VIEW_MANAGER
Chris@127 328 std::cout << "ViewManager::considerSeek(" << p << ", " << f << ", " << locked << ")" << std::endl;
Chris@127 329 #endif
Chris@127 330
Chris@127 331 if (p == this || !locked) return;
Chris@127 332
Chris@127 333 if (m_playSource && m_playSource->isPlaying()) {
Chris@127 334 unsigned long playFrame = m_playSource->getCurrentPlayingFrame();
Chris@127 335 unsigned long diff = std::max(f, playFrame) - std::min(f, playFrame);
Chris@127 336 if (diff > 20000) {
Chris@127 337 m_playbackFrame = f;
Chris@127 338 m_playSource->play(f);
Chris@127 339 #ifdef DEBUG_VIEW_MANAGER
Chris@127 340 std::cout << "ViewManager::considerSeek: reseeking from " << playFrame << " to " << f << std::endl;
Chris@127 341 #endif
Chris@127 342 }
Chris@127 343 } else {
Chris@127 344 m_playbackFrame = f; //!!! only if that view is in scroll mode?
Chris@127 345 }
Chris@127 346 }
Chris@127 347
Chris@127 348 void
Chris@127 349 ViewManager::considerZoomChange(void *p, unsigned long z, bool locked)
Chris@127 350 {
Chris@133 351 emit zoomLevelChanged();
Chris@133 352
Chris@127 353 if (locked) {
Chris@127 354 m_globalZoom = z;
Chris@127 355 }
Chris@127 356
Chris@127 357 #ifdef DEBUG_VIEW_MANAGER
Chris@127 358 std::cout << "ViewManager::considerZoomChange(" << p << ", " << z << ", " << locked << ")" << std::endl;
Chris@127 359 #endif
Chris@127 360 }
Chris@127 361
Chris@127 362 void
Chris@127 363 ViewManager::setOverlayMode(OverlayMode mode)
Chris@127 364 {
Chris@127 365 if (m_overlayMode != mode) {
Chris@127 366 m_overlayMode = mode;
Chris@127 367 emit overlayModeChanged();
Chris@127 368 }
Chris@133 369
Chris@133 370 QSettings settings;
Chris@133 371 settings.beginGroup("MainWindow");
Chris@133 372 settings.setValue("overlay-mode", int(m_overlayMode));
Chris@133 373 settings.endGroup();
Chris@127 374 }
Chris@127 375
Chris@133 376 void
Chris@133 377 ViewManager::setZoomWheelsEnabled(bool enabled)
Chris@133 378 {
Chris@133 379 if (m_zoomWheelsEnabled != enabled) {
Chris@133 380 m_zoomWheelsEnabled = enabled;
Chris@133 381 emit zoomWheelsEnabledChanged();
Chris@133 382 }
Chris@127 383
Chris@133 384 QSettings settings;
Chris@133 385 settings.beginGroup("MainWindow");
Chris@133 386 settings.setValue("zoom-wheels-enabled", m_zoomWheelsEnabled);
Chris@133 387 settings.endGroup();
Chris@133 388 }
Chris@133 389