annotate view/ViewManager.cpp @ 607:5b72899d692b

Give a dedicated key to toggling the centre line, and move it out of the overlay level setting -- reducing number of overlay levels to 3. Introduce two distinct vertical scale types (so that we can hide the spectrogram colour scale part easily)
author Chris Cannam
date Mon, 30 Jan 2012 16:01:59 +0000
parents 4806715f7a19
children 2c35737cd3f8 c8f45afb83d5
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@182 7 This file copyright 2006 Chris Cannam and QMUL.
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@502 18 #include "base/RealTime.h"
Chris@128 19 #include "data/model/Model.h"
Chris@376 20 #include "widgets/CommandHistory.h"
Chris@211 21 #include "View.h"
Chris@503 22 #include "Overview.h"
Chris@127 23
Chris@133 24 #include <QSettings>
Chris@292 25 #include <QApplication>
Chris@133 26
Chris@127 27 #include <iostream>
Chris@127 28
Chris@363 29 //#define DEBUG_VIEW_MANAGER 1
Chris@127 30
Chris@127 31 ViewManager::ViewManager() :
Chris@127 32 m_playSource(0),
Chris@127 33 m_globalCentreFrame(0),
Chris@127 34 m_globalZoom(1024),
Chris@127 35 m_playbackFrame(0),
Chris@301 36 m_playbackModel(0),
Chris@127 37 m_mainModelSampleRate(0),
Chris@127 38 m_lastLeft(0),
Chris@127 39 m_lastRight(0),
Chris@127 40 m_inProgressExclusive(true),
Chris@127 41 m_toolMode(NavigateMode),
Chris@127 42 m_playLoopMode(false),
Chris@127 43 m_playSelectionMode(false),
Chris@301 44 m_playSoloMode(false),
Chris@314 45 m_alignMode(false),
Chris@607 46 m_overlayMode(MinimalOverlays),
Chris@292 47 m_zoomWheelsEnabled(true),
Chris@607 48 m_showCentreLine(true),
Chris@326 49 m_illuminateLocalFeatures(true),
Chris@326 50 m_showWorkTitle(false),
Chris@292 51 m_lightPalette(QApplication::palette()),
Chris@292 52 m_darkPalette(QApplication::palette())
Chris@127 53 {
Chris@133 54 QSettings settings;
Chris@133 55 settings.beginGroup("MainWindow");
Chris@133 56 m_overlayMode = OverlayMode
Chris@133 57 (settings.value("overlay-mode", int(m_overlayMode)).toInt());
Chris@607 58
Chris@607 59 if (m_overlayMode != NoOverlays &&
Chris@607 60 m_overlayMode != MinimalOverlays &&
Chris@607 61 m_overlayMode != AllOverlays) {
Chris@607 62 m_overlayMode = MinimalOverlays;
Chris@607 63 }
Chris@607 64
Chris@133 65 m_zoomWheelsEnabled =
Chris@133 66 settings.value("zoom-wheels-enabled", m_zoomWheelsEnabled).toBool();
Chris@607 67 m_showCentreLine =
Chris@607 68 settings.value("show-centre-line", m_showCentreLine).toBool();
Chris@133 69 settings.endGroup();
Chris@292 70
Chris@292 71 if (getGlobalDarkBackground()) {
Chris@343 72 /*
Chris@293 73 std::cerr << "dark palette:" << std::endl;
Chris@584 74 std::cerr << "window = " << QApplication::palette().color(QPalette::Window).name() << std::endl;
Chris@584 75 std::cerr << "windowtext = " << QApplication::palette().color(QPalette::WindowText).name() << std::endl;
Chris@584 76 std::cerr << "base = " << QApplication::palette().color(QPalette::Base).name() << std::endl;
Chris@584 77 std::cerr << "alternatebase = " << QApplication::palette().color(QPalette::AlternateBase).name() << std::endl;
Chris@584 78 std::cerr << "text = " << QApplication::palette().color(QPalette::Text).name() << std::endl;
Chris@584 79 std::cerr << "button = " << QApplication::palette().color(QPalette::Button).name() << std::endl;
Chris@584 80 std::cerr << "buttontext = " << QApplication::palette().color(QPalette::ButtonText).name() << std::endl;
Chris@584 81 std::cerr << "brighttext = " << QApplication::palette().color(QPalette::BrightText).name() << std::endl;
Chris@584 82 std::cerr << "light = " << QApplication::palette().color(QPalette::Light).name() << std::endl;
Chris@584 83 std::cerr << "dark = " << QApplication::palette().color(QPalette::Dark).name() << std::endl;
Chris@584 84 std::cerr << "mid = " << QApplication::palette().color(QPalette::Mid).name() << std::endl;
Chris@343 85 */
Chris@293 86 m_lightPalette = QPalette(QColor("#000000"), // WindowText
Chris@293 87 QColor("#dddfe4"), // Button
Chris@293 88 QColor("#ffffff"), // Light
Chris@293 89 QColor("#555555"), // Dark
Chris@293 90 QColor("#c7c7c7"), // Mid
Chris@293 91 QColor("#000000"), // Text
Chris@293 92 QColor("#ffffff"), // BrightText
Chris@293 93 QColor("#ffffff"), // Base
Chris@293 94 QColor("#efefef")); // Window
Chris@293 95
Chris@293 96
Chris@292 97 } else {
Chris@343 98 /*
Chris@293 99 std::cerr << "light palette:" << std::endl;
Chris@584 100 std::cerr << "window = " << QApplication::palette().color(QPalette::Window).name() << std::endl;
Chris@584 101 std::cerr << "windowtext = " << QApplication::palette().color(QPalette::WindowText).name() << std::endl;
Chris@584 102 std::cerr << "base = " << QApplication::palette().color(QPalette::Base).name() << std::endl;
Chris@584 103 std::cerr << "alternatebase = " << QApplication::palette().color(QPalette::AlternateBase).name() << std::endl;
Chris@584 104 std::cerr << "text = " << QApplication::palette().color(QPalette::Text).name() << std::endl;
Chris@584 105 std::cerr << "button = " << QApplication::palette().color(QPalette::Button).name() << std::endl;
Chris@584 106 std::cerr << "buttontext = " << QApplication::palette().color(QPalette::ButtonText).name() << std::endl;
Chris@584 107 std::cerr << "brighttext = " << QApplication::palette().color(QPalette::BrightText).name() << std::endl;
Chris@584 108 std::cerr << "light = " << QApplication::palette().color(QPalette::Light).name() << std::endl;
Chris@584 109 std::cerr << "dark = " << QApplication::palette().color(QPalette::Dark).name() << std::endl;
Chris@584 110 std::cerr << "mid = " << QApplication::palette().color(QPalette::Mid).name() << std::endl;
Chris@343 111 */
Chris@293 112 m_darkPalette = QPalette(QColor("#ffffff"), // WindowText
Chris@293 113 QColor("#3e3e3e"), // Button
Chris@293 114 QColor("#808080"), // Light
Chris@293 115 QColor("#1e1e1e"), // Dark
Chris@293 116 QColor("#404040"), // Mid
Chris@293 117 QColor("#ffffff"), // Text
Chris@293 118 QColor("#ffffff"), // BrightText
Chris@293 119 QColor("#000000"), // Base
Chris@293 120 QColor("#202020")); // Window
Chris@292 121 }
Chris@127 122 }
Chris@127 123
Chris@127 124 ViewManager::~ViewManager()
Chris@127 125 {
Chris@127 126 }
Chris@127 127
Chris@127 128 unsigned long
Chris@127 129 ViewManager::getGlobalCentreFrame() const
Chris@127 130 {
Chris@127 131 #ifdef DEBUG_VIEW_MANAGER
Chris@127 132 std::cout << "ViewManager::getGlobalCentreFrame: returning " << m_globalCentreFrame << std::endl;
Chris@127 133 #endif
Chris@127 134 return m_globalCentreFrame;
Chris@127 135 }
Chris@127 136
Chris@180 137 void
Chris@180 138 ViewManager::setGlobalCentreFrame(unsigned long f)
Chris@180 139 {
Chris@180 140 #ifdef DEBUG_VIEW_MANAGER
Chris@180 141 std::cout << "ViewManager::setGlobalCentreFrame to " << f << std::endl;
Chris@180 142 #endif
Chris@180 143 m_globalCentreFrame = f;
Chris@211 144 emit globalCentreFrameChanged(f);
Chris@180 145 }
Chris@180 146
Chris@127 147 unsigned long
Chris@127 148 ViewManager::getGlobalZoom() const
Chris@127 149 {
Chris@127 150 #ifdef DEBUG_VIEW_MANAGER
Chris@127 151 std::cout << "ViewManager::getGlobalZoom: returning " << m_globalZoom << std::endl;
Chris@127 152 #endif
Chris@127 153 return m_globalZoom;
Chris@127 154 }
Chris@127 155
Chris@127 156 unsigned long
Chris@127 157 ViewManager::getPlaybackFrame() const
Chris@127 158 {
Chris@127 159 if (m_playSource && m_playSource->isPlaying()) {
Chris@127 160 m_playbackFrame = m_playSource->getCurrentPlayingFrame();
Chris@127 161 }
Chris@127 162 return m_playbackFrame;
Chris@127 163 }
Chris@127 164
Chris@127 165 void
Chris@127 166 ViewManager::setPlaybackFrame(unsigned long f)
Chris@127 167 {
Chris@127 168 if (m_playbackFrame != f) {
Chris@127 169 m_playbackFrame = f;
Chris@127 170 emit playbackFrameChanged(f);
Chris@127 171 if (m_playSource && m_playSource->isPlaying()) {
Chris@127 172 m_playSource->play(f);
Chris@127 173 }
Chris@127 174 }
Chris@127 175 }
Chris@127 176
Chris@301 177 Model *
Chris@301 178 ViewManager::getPlaybackModel() const
Chris@301 179 {
Chris@301 180 return m_playbackModel;
Chris@301 181 }
Chris@301 182
Chris@301 183 void
Chris@301 184 ViewManager::setPlaybackModel(Model *model)
Chris@301 185 {
Chris@301 186 m_playbackModel = model;
Chris@301 187 }
Chris@301 188
Chris@333 189 size_t
Chris@333 190 ViewManager::alignPlaybackFrameToReference(size_t frame) const
Chris@333 191 {
Chris@333 192 if (!m_playbackModel) return frame;
Chris@333 193 else return m_playbackModel->alignToReference(frame);
Chris@333 194 }
Chris@333 195
Chris@333 196 size_t
Chris@333 197 ViewManager::alignReferenceToPlaybackFrame(size_t frame) const
Chris@333 198 {
Chris@333 199 if (!m_playbackModel) return frame;
Chris@333 200 else return m_playbackModel->alignFromReference(frame);
Chris@333 201 }
Chris@333 202
Chris@127 203 bool
Chris@127 204 ViewManager::haveInProgressSelection() const
Chris@127 205 {
Chris@127 206 return !m_inProgressSelection.isEmpty();
Chris@127 207 }
Chris@127 208
Chris@127 209 const Selection &
Chris@127 210 ViewManager::getInProgressSelection(bool &exclusive) const
Chris@127 211 {
Chris@127 212 exclusive = m_inProgressExclusive;
Chris@127 213 return m_inProgressSelection;
Chris@127 214 }
Chris@127 215
Chris@127 216 void
Chris@127 217 ViewManager::setInProgressSelection(const Selection &selection, bool exclusive)
Chris@127 218 {
Chris@127 219 m_inProgressExclusive = exclusive;
Chris@127 220 m_inProgressSelection = selection;
Chris@127 221 if (exclusive) clearSelections();
Chris@127 222 emit inProgressSelectionChanged();
Chris@127 223 }
Chris@127 224
Chris@127 225 void
Chris@127 226 ViewManager::clearInProgressSelection()
Chris@127 227 {
Chris@127 228 m_inProgressSelection = Selection();
Chris@127 229 emit inProgressSelectionChanged();
Chris@127 230 }
Chris@127 231
Chris@127 232 const MultiSelection &
Chris@127 233 ViewManager::getSelection() const
Chris@127 234 {
Chris@127 235 return m_selections;
Chris@127 236 }
Chris@127 237
Chris@127 238 const MultiSelection::SelectionList &
Chris@127 239 ViewManager::getSelections() const
Chris@127 240 {
Chris@127 241 return m_selections.getSelections();
Chris@127 242 }
Chris@127 243
Chris@127 244 void
Chris@127 245 ViewManager::setSelection(const Selection &selection)
Chris@127 246 {
Chris@127 247 MultiSelection ms(m_selections);
Chris@127 248 ms.setSelection(selection);
Chris@127 249 setSelections(ms);
Chris@127 250 }
Chris@127 251
Chris@127 252 void
Chris@127 253 ViewManager::addSelection(const Selection &selection)
Chris@127 254 {
Chris@127 255 MultiSelection ms(m_selections);
Chris@127 256 ms.addSelection(selection);
Chris@127 257 setSelections(ms);
Chris@127 258 }
Chris@127 259
Chris@127 260 void
Chris@127 261 ViewManager::removeSelection(const Selection &selection)
Chris@127 262 {
Chris@127 263 MultiSelection ms(m_selections);
Chris@127 264 ms.removeSelection(selection);
Chris@127 265 setSelections(ms);
Chris@127 266 }
Chris@127 267
Chris@127 268 void
Chris@127 269 ViewManager::clearSelections()
Chris@127 270 {
Chris@127 271 MultiSelection ms(m_selections);
Chris@127 272 ms.clearSelections();
Chris@127 273 setSelections(ms);
Chris@127 274 }
Chris@127 275
Chris@127 276 void
Chris@127 277 ViewManager::setSelections(const MultiSelection &ms)
Chris@127 278 {
Chris@127 279 if (m_selections.getSelections() == ms.getSelections()) return;
Chris@127 280 SetSelectionCommand *command = new SetSelectionCommand(this, ms);
Chris@127 281 CommandHistory::getInstance()->addCommand(command);
Chris@127 282 }
Chris@127 283
Chris@271 284 size_t
Chris@271 285 ViewManager::constrainFrameToSelection(size_t frame) const
Chris@271 286 {
Chris@271 287 MultiSelection::SelectionList sl = getSelections();
Chris@271 288 if (sl.empty()) return frame;
Chris@271 289
Chris@368 290 for (MultiSelection::SelectionList::const_iterator i = sl.begin();
Chris@368 291 i != sl.end(); ++i) {
Chris@368 292
Chris@368 293 if (frame < i->getEndFrame()) {
Chris@368 294 if (frame < i->getStartFrame()) {
Chris@368 295 return i->getStartFrame();
Chris@368 296 } else {
Chris@368 297 return frame;
Chris@368 298 }
Chris@368 299 }
Chris@271 300 }
Chris@271 301
Chris@368 302 return sl.begin()->getStartFrame();
Chris@271 303 }
Chris@271 304
Chris@127 305 void
Chris@127 306 ViewManager::signalSelectionChange()
Chris@127 307 {
Chris@127 308 emit selectionChanged();
Chris@127 309 }
Chris@127 310
Chris@127 311 ViewManager::SetSelectionCommand::SetSelectionCommand(ViewManager *vm,
Chris@127 312 const MultiSelection &ms) :
Chris@127 313 m_vm(vm),
Chris@127 314 m_oldSelection(vm->m_selections),
Chris@127 315 m_newSelection(ms)
Chris@127 316 {
Chris@127 317 }
Chris@127 318
Chris@127 319 ViewManager::SetSelectionCommand::~SetSelectionCommand() { }
Chris@127 320
Chris@127 321 void
Chris@127 322 ViewManager::SetSelectionCommand::execute()
Chris@127 323 {
Chris@127 324 m_vm->m_selections = m_newSelection;
Chris@127 325 m_vm->signalSelectionChange();
Chris@127 326 }
Chris@127 327
Chris@127 328 void
Chris@127 329 ViewManager::SetSelectionCommand::unexecute()
Chris@127 330 {
Chris@127 331 m_vm->m_selections = m_oldSelection;
Chris@127 332 m_vm->signalSelectionChange();
Chris@127 333 }
Chris@127 334
Chris@127 335 QString
Chris@127 336 ViewManager::SetSelectionCommand::getName() const
Chris@127 337 {
Chris@127 338 if (m_newSelection.getSelections().empty()) return tr("Clear Selection");
Chris@502 339 if (m_newSelection.getSelections().size() > 1) return tr("Select Multiple Regions");
Chris@502 340 else return tr("Select Region");
Chris@127 341 }
Chris@127 342
Chris@127 343 Selection
Chris@127 344 ViewManager::getContainingSelection(size_t frame, bool defaultToFollowing) const
Chris@127 345 {
Chris@127 346 return m_selections.getContainingSelection(frame, defaultToFollowing);
Chris@127 347 }
Chris@127 348
Chris@127 349 void
Chris@127 350 ViewManager::setToolMode(ToolMode mode)
Chris@127 351 {
Chris@127 352 m_toolMode = mode;
Chris@127 353
Chris@127 354 emit toolModeChanged();
Chris@502 355
Chris@502 356 switch (mode) {
Chris@502 357 case NavigateMode: emit activity(tr("Enter Navigate mode")); break;
Chris@502 358 case SelectMode: emit activity(tr("Enter Select mode")); break;
Chris@502 359 case EditMode: emit activity(tr("Enter Edit mode")); break;
Chris@502 360 case DrawMode: emit activity(tr("Enter Draw mode")); break;
Chris@502 361 case EraseMode: emit activity(tr("Enter Erase mode")); break;
Chris@502 362 case MeasureMode: emit activity(tr("Enter Measure mode")); break;
Chris@502 363 };
Chris@127 364 }
Chris@127 365
Chris@127 366 void
Chris@127 367 ViewManager::setPlayLoopMode(bool mode)
Chris@127 368 {
Chris@177 369 if (m_playLoopMode != mode) {
Chris@127 370
Chris@177 371 m_playLoopMode = mode;
Chris@177 372
Chris@177 373 emit playLoopModeChanged();
Chris@177 374 emit playLoopModeChanged(mode);
Chris@502 375
Chris@502 376 if (mode) emit activity(tr("Switch on Loop mode"));
Chris@502 377 else emit activity(tr("Switch off Loop mode"));
Chris@177 378 }
Chris@127 379 }
Chris@127 380
Chris@127 381 void
Chris@127 382 ViewManager::setPlaySelectionMode(bool mode)
Chris@127 383 {
Chris@177 384 if (m_playSelectionMode != mode) {
Chris@127 385
Chris@177 386 m_playSelectionMode = mode;
Chris@177 387
Chris@177 388 emit playSelectionModeChanged();
Chris@177 389 emit playSelectionModeChanged(mode);
Chris@502 390
Chris@502 391 if (mode) emit activity(tr("Switch on Play Selection mode"));
Chris@502 392 else emit activity(tr("Switch off Play Selection mode"));
Chris@177 393 }
Chris@127 394 }
Chris@127 395
Chris@301 396 void
Chris@301 397 ViewManager::setPlaySoloMode(bool mode)
Chris@301 398 {
Chris@301 399 if (m_playSoloMode != mode) {
Chris@301 400
Chris@301 401 m_playSoloMode = mode;
Chris@301 402
Chris@301 403 emit playSoloModeChanged();
Chris@301 404 emit playSoloModeChanged(mode);
Chris@502 405
Chris@502 406 if (mode) emit activity(tr("Switch on Play Solo mode"));
Chris@502 407 else emit activity(tr("Switch off Play Solo mode"));
Chris@301 408 }
Chris@301 409 }
Chris@301 410
Chris@314 411 void
Chris@314 412 ViewManager::setAlignMode(bool mode)
Chris@314 413 {
Chris@314 414 if (m_alignMode != mode) {
Chris@314 415
Chris@314 416 m_alignMode = mode;
Chris@314 417
Chris@314 418 emit alignModeChanged();
Chris@314 419 emit alignModeChanged(mode);
Chris@502 420
Chris@502 421 if (mode) emit activity(tr("Switch on Alignment mode"));
Chris@502 422 else emit activity(tr("Switch off Alignment mode"));
Chris@314 423 }
Chris@314 424 }
Chris@314 425
Chris@224 426 size_t
Chris@224 427 ViewManager::getPlaybackSampleRate() const
Chris@224 428 {
Chris@224 429 if (m_playSource) {
Chris@224 430 return m_playSource->getSourceSampleRate();
Chris@224 431 }
Chris@224 432 return 0;
Chris@224 433 }
Chris@224 434
Chris@127 435 size_t
Chris@224 436 ViewManager::getOutputSampleRate() const
Chris@127 437 {
Chris@127 438 if (m_playSource) {
Chris@127 439 return m_playSource->getTargetSampleRate();
Chris@127 440 }
Chris@127 441 return 0;
Chris@127 442 }
Chris@127 443
Chris@127 444 void
Chris@127 445 ViewManager::setAudioPlaySource(AudioPlaySource *source)
Chris@127 446 {
Chris@127 447 if (!m_playSource) {
Chris@127 448 QTimer::singleShot(100, this, SLOT(checkPlayStatus()));
Chris@127 449 }
Chris@127 450 m_playSource = source;
Chris@127 451 }
Chris@127 452
Chris@127 453 void
Chris@248 454 ViewManager::playStatusChanged(bool /* playing */)
Chris@127 455 {
Chris@127 456 checkPlayStatus();
Chris@127 457 }
Chris@127 458
Chris@127 459 void
Chris@127 460 ViewManager::checkPlayStatus()
Chris@127 461 {
Chris@127 462 if (m_playSource && m_playSource->isPlaying()) {
Chris@127 463
Chris@127 464 float left = 0, right = 0;
Chris@127 465 if (m_playSource->getOutputLevels(left, right)) {
Chris@127 466 if (left != m_lastLeft || right != m_lastRight) {
Chris@127 467 emit outputLevelsChanged(left, right);
Chris@127 468 m_lastLeft = left;
Chris@127 469 m_lastRight = right;
Chris@127 470 }
Chris@127 471 }
Chris@127 472
Chris@127 473 m_playbackFrame = m_playSource->getCurrentPlayingFrame();
Chris@127 474
Chris@127 475 #ifdef DEBUG_VIEW_MANAGER
Chris@127 476 std::cout << "ViewManager::checkPlayStatus: Playing, frame " << m_playbackFrame << ", levels " << m_lastLeft << "," << m_lastRight << std::endl;
Chris@127 477 #endif
Chris@127 478
Chris@127 479 emit playbackFrameChanged(m_playbackFrame);
Chris@127 480
Chris@127 481 QTimer::singleShot(20, this, SLOT(checkPlayStatus()));
Chris@127 482
Chris@127 483 } else {
Chris@127 484
Chris@127 485 QTimer::singleShot(100, this, SLOT(checkPlayStatus()));
Chris@127 486
Chris@127 487 if (m_lastLeft != 0.0 || m_lastRight != 0.0) {
Chris@127 488 emit outputLevelsChanged(0.0, 0.0);
Chris@127 489 m_lastLeft = 0.0;
Chris@127 490 m_lastRight = 0.0;
Chris@127 491 }
Chris@127 492
Chris@127 493 #ifdef DEBUG_VIEW_MANAGER
Chris@127 494 // std::cout << "ViewManager::checkPlayStatus: Not playing" << std::endl;
Chris@127 495 #endif
Chris@127 496 }
Chris@127 497 }
Chris@127 498
Chris@127 499 bool
Chris@127 500 ViewManager::isPlaying() const
Chris@127 501 {
Chris@127 502 return m_playSource && m_playSource->isPlaying();
Chris@127 503 }
Chris@127 504
Chris@127 505 void
Chris@211 506 ViewManager::viewCentreFrameChanged(unsigned long f, bool locked,
Chris@211 507 PlaybackFollowMode mode)
Chris@127 508 {
Chris@211 509 View *v = dynamic_cast<View *>(sender());
Chris@211 510
Chris@398 511 #ifdef DEBUG_VIEW_MANAGER
Chris@587 512 SVDEBUG << "ViewManager::viewCentreFrameChanged(" << f << ", " << locked << ", " << mode << "), view is " << v << endl;
Chris@398 513 #endif
Chris@394 514
Chris@127 515 if (locked) {
Chris@211 516 m_globalCentreFrame = f;
Chris@211 517 emit globalCentreFrameChanged(f);
Chris@211 518 } else {
Chris@211 519 if (v) emit viewCentreFrameChanged(v, f);
Chris@127 520 }
Chris@127 521
Chris@503 522 if (!dynamic_cast<Overview *>(v) || (mode != PlaybackIgnore)) {
Chris@527 523 if (m_mainModelSampleRate != 0) {
Chris@527 524 emit activity(tr("Scroll to %1")
Chris@527 525 .arg(RealTime::frame2RealTime
Chris@527 526 (f, m_mainModelSampleRate).toText().c_str()));
Chris@527 527 }
Chris@503 528 }
Chris@502 529
Chris@211 530 if (mode == PlaybackIgnore) {
Chris@211 531 return;
Chris@211 532 }
Chris@211 533
Chris@211 534 seek(f);
Chris@211 535 }
Chris@211 536
Chris@211 537 void
Chris@211 538 ViewManager::seek(unsigned long f)
Chris@211 539 {
Chris@127 540 #ifdef DEBUG_VIEW_MANAGER
Chris@211 541 std::cout << "ViewManager::seek(" << f << ")" << std::endl;
Chris@127 542 #endif
Chris@127 543
Chris@127 544 if (m_playSource && m_playSource->isPlaying()) {
Chris@127 545 unsigned long playFrame = m_playSource->getCurrentPlayingFrame();
Chris@127 546 unsigned long diff = std::max(f, playFrame) - std::min(f, playFrame);
Chris@127 547 if (diff > 20000) {
Chris@127 548 m_playbackFrame = f;
Chris@127 549 m_playSource->play(f);
Chris@127 550 #ifdef DEBUG_VIEW_MANAGER
Chris@127 551 std::cout << "ViewManager::considerSeek: reseeking from " << playFrame << " to " << f << std::endl;
Chris@127 552 #endif
Chris@211 553 emit playbackFrameChanged(f);
Chris@127 554 }
Chris@127 555 } else {
Chris@211 556 if (m_playbackFrame != f) {
Chris@211 557 m_playbackFrame = f;
Chris@211 558 emit playbackFrameChanged(f);
Chris@211 559 }
Chris@127 560 }
Chris@127 561 }
Chris@127 562
Chris@127 563 void
Chris@222 564 ViewManager::viewZoomLevelChanged(unsigned long z, bool locked)
Chris@127 565 {
Chris@222 566 View *v = dynamic_cast<View *>(sender());
Chris@222 567
Chris@222 568 if (!v) {
Chris@587 569 SVDEBUG << "ViewManager::viewZoomLevelChanged: WARNING: sender is not a view" << endl;
Chris@222 570 return;
Chris@222 571 }
Chris@222 572
Chris@222 573 //!!! emit zoomLevelChanged();
Chris@133 574
Chris@127 575 if (locked) {
Chris@127 576 m_globalZoom = z;
Chris@127 577 }
Chris@127 578
Chris@127 579 #ifdef DEBUG_VIEW_MANAGER
Chris@222 580 std::cout << "ViewManager::viewZoomLevelChanged(" << v << ", " << z << ", " << locked << ")" << std::endl;
Chris@127 581 #endif
Chris@222 582
Chris@222 583 emit viewZoomLevelChanged(v, z, locked);
Chris@503 584
Chris@503 585 if (!dynamic_cast<Overview *>(v)) {
Chris@503 586 emit activity(tr("Zoom to %n sample(s) per pixel", "", z));
Chris@503 587 }
Chris@127 588 }
Chris@127 589
Chris@127 590 void
Chris@127 591 ViewManager::setOverlayMode(OverlayMode mode)
Chris@127 592 {
Chris@127 593 if (m_overlayMode != mode) {
Chris@127 594 m_overlayMode = mode;
Chris@127 595 emit overlayModeChanged();
Chris@502 596 emit activity(tr("Change overlay level"));
Chris@127 597 }
Chris@133 598
Chris@133 599 QSettings settings;
Chris@133 600 settings.beginGroup("MainWindow");
Chris@133 601 settings.setValue("overlay-mode", int(m_overlayMode));
Chris@133 602 settings.endGroup();
Chris@127 603 }
Chris@127 604
Chris@133 605 void
Chris@133 606 ViewManager::setZoomWheelsEnabled(bool enabled)
Chris@133 607 {
Chris@133 608 if (m_zoomWheelsEnabled != enabled) {
Chris@133 609 m_zoomWheelsEnabled = enabled;
Chris@133 610 emit zoomWheelsEnabledChanged();
Chris@502 611 if (enabled) emit activity("Show zoom wheels");
Chris@502 612 else emit activity("Hide zoom wheels");
Chris@133 613 }
Chris@127 614
Chris@133 615 QSettings settings;
Chris@133 616 settings.beginGroup("MainWindow");
Chris@133 617 settings.setValue("zoom-wheels-enabled", m_zoomWheelsEnabled);
Chris@133 618 settings.endGroup();
Chris@133 619 }
Chris@133 620
Chris@292 621 void
Chris@607 622 ViewManager::setShowCentreLine(bool show)
Chris@607 623 {
Chris@607 624 if (m_showCentreLine != show) {
Chris@607 625 m_showCentreLine = show;
Chris@607 626 emit showCentreLineChanged();
Chris@607 627 if (show) emit activity("Show centre line");
Chris@607 628 else emit activity("Hide centre line");
Chris@607 629 }
Chris@607 630
Chris@607 631 QSettings settings;
Chris@607 632 settings.beginGroup("MainWindow");
Chris@607 633 settings.setValue("show-centre-line", int(m_showCentreLine));
Chris@607 634 settings.endGroup();
Chris@607 635 }
Chris@607 636
Chris@607 637 void
Chris@292 638 ViewManager::setGlobalDarkBackground(bool dark)
Chris@292 639 {
Chris@292 640 // also save the current palette, in case the user has changed it
Chris@292 641 // since construction
Chris@292 642 if (getGlobalDarkBackground()) {
Chris@292 643 m_darkPalette = QApplication::palette();
Chris@292 644 } else {
Chris@292 645 m_lightPalette = QApplication::palette();
Chris@292 646 }
Chris@292 647
Chris@292 648 if (dark) {
Chris@292 649 QApplication::setPalette(m_darkPalette);
Chris@292 650 } else {
Chris@292 651 QApplication::setPalette(m_lightPalette);
Chris@292 652 }
Chris@292 653 }
Chris@292 654
Chris@292 655 bool
Chris@292 656 ViewManager::getGlobalDarkBackground() const
Chris@292 657 {
Chris@292 658 bool dark = false;
Chris@292 659 QColor windowBg = QApplication::palette().color(QPalette::Window);
Chris@292 660 if (windowBg.red() + windowBg.green() + windowBg.blue() < 384) {
Chris@292 661 dark = true;
Chris@292 662 }
Chris@292 663 return dark;
Chris@292 664 }
Chris@292 665