annotate view/ViewManager.cpp @ 317:e251c3599ea8

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