annotate view/ViewManager.cpp @ 333:e74b56f07c73

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