annotate view/ViewManager.cpp @ 583:4c484636d5ec

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