annotate main/OSCHandler.cpp @ 1453:a9448d12d792 3.0-integration

Further PropertyBox layout overhaul: avoid crash (/ assertion failure) when property type changes from e.g. colour to colourmap, by replacing the existing widget within the layout rather than trying to repopulate it
author Chris Cannam
date Tue, 20 Dec 2016 10:49:24 +0000
parents f013210eeceb
children afe620d017d7
rev   line source
Chris@224 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@224 2
Chris@224 3 /*
Chris@224 4 Sonic Visualiser
Chris@224 5 An audio file viewer and annotation editor.
Chris@224 6 Centre for Digital Music, Queen Mary, University of London.
Chris@224 7 This file copyright 2006-2007 Chris Cannam and QMUL.
Chris@224 8
Chris@224 9 This program is free software; you can redistribute it and/or
Chris@224 10 modify it under the terms of the GNU General Public License as
Chris@224 11 published by the Free Software Foundation; either version 2 of the
Chris@224 12 License, or (at your option) any later version. See the file
Chris@224 13 COPYING included with this distribution for more information.
Chris@224 14 */
Chris@216 15
Chris@216 16 #include "MainWindow.h"
Chris@216 17 #include "data/osc/OSCQueue.h"
Chris@216 18
Chris@216 19 #include "layer/WaveformLayer.h"
Chris@216 20 #include "view/ViewManager.h"
Chris@216 21 #include "view/Pane.h"
Chris@216 22 #include "view/PaneStack.h"
Chris@216 23 #include "data/model/WaveFileModel.h"
Chris@248 24 #include "widgets/CommandHistory.h"
Chris@1035 25 #include "audio/AudioCallbackPlaySource.h"
Chris@216 26 #include "framework/Document.h"
Chris@216 27 #include "data/fileio/WavFileWriter.h"
Chris@249 28 #include "transform/TransformFactory.h"
Chris@1386 29 #include "widgets/LevelPanWidget.h"
Chris@1431 30 #include "widgets/LevelPanToolButton.h"
Chris@216 31 #include "widgets/AudioDial.h"
Chris@216 32
Chris@1035 33 #include <bqaudioio/SystemPlaybackTarget.h>
Chris@1035 34
Chris@216 35 #include <QFileInfo>
Chris@216 36
Chris@216 37 void
Chris@216 38 MainWindow::handleOSCMessage(const OSCMessage &message)
Chris@216 39 {
Chris@438 40 SVDEBUG << "MainWindow::handleOSCMessage: thread id = "
Chris@433 41 << QThread::currentThreadId() << endl;
Chris@216 42
Chris@216 43 // This large function should really be abstracted out.
Chris@216 44
Chris@216 45 if (message.getMethod() == "open") {
Chris@216 46
Chris@216 47 if (message.getArgCount() == 1 &&
Chris@216 48 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 49 QString path = message.getArg(0).toString();
Chris@216 50 if (open(path, ReplaceMainModel) != FileOpenSucceeded) {
Chris@665 51 cerr << "MainWindow::handleOSCMessage: File open failed for path \""
Chris@665 52 << path << "\"" << endl;
Chris@216 53 }
Chris@216 54 //!!! we really need to spin here and not return until the
Chris@216 55 // file has been completely decoded...
Chris@216 56 }
Chris@216 57
Chris@216 58 } else if (message.getMethod() == "openadditional") {
Chris@216 59
Chris@216 60 if (message.getArgCount() == 1 &&
Chris@216 61 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 62 QString path = message.getArg(0).toString();
Chris@216 63 if (open(path, CreateAdditionalModel) != FileOpenSucceeded) {
Chris@665 64 cerr << "MainWindow::handleOSCMessage: File open failed for path \""
Chris@665 65 << path << "\"" << endl;
Chris@216 66 }
Chris@216 67 }
Chris@216 68
Chris@216 69 } else if (message.getMethod() == "recent" ||
Chris@216 70 message.getMethod() == "last") {
Chris@216 71
Chris@216 72 int n = 0;
Chris@216 73 if (message.getMethod() == "recent" &&
Chris@216 74 message.getArgCount() == 1 &&
Chris@216 75 message.getArg(0).canConvert(QVariant::Int)) {
Chris@216 76 n = message.getArg(0).toInt() - 1;
Chris@216 77 }
Chris@216 78 std::vector<QString> recent = m_recentFiles.getRecent();
Chris@216 79 if (n >= 0 && n < int(recent.size())) {
Chris@216 80 if (open(recent[n], ReplaceMainModel) != FileOpenSucceeded) {
Chris@665 81 cerr << "MainWindow::handleOSCMessage: File open failed for path \""
Chris@665 82 << recent[n] << "\"" << endl;
Chris@216 83 }
Chris@216 84 }
Chris@216 85
Chris@216 86 } else if (message.getMethod() == "save") {
Chris@216 87
Chris@216 88 QString path;
Chris@216 89 if (message.getArgCount() == 1 &&
Chris@216 90 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 91 path = message.getArg(0).toString();
Chris@216 92 if (QFileInfo(path).exists()) {
Chris@438 93 SVDEBUG << "MainWindow::handleOSCMessage: Refusing to overwrite existing file in save" << endl;
Chris@216 94 } else {
Chris@216 95 saveSessionFile(path);
Chris@216 96 }
Chris@216 97 }
Chris@216 98
Chris@216 99 } else if (message.getMethod() == "export") {
Chris@216 100
Chris@216 101 QString path;
Chris@216 102 if (getMainModel()) {
Chris@216 103 if (message.getArgCount() == 1 &&
Chris@216 104 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 105 path = message.getArg(0).toString();
Chris@216 106 if (QFileInfo(path).exists()) {
Chris@438 107 SVDEBUG << "MainWindow::handleOSCMessage: Refusing to overwrite existing file in export" << endl;
Chris@216 108 } else {
Chris@216 109 WavFileWriter writer(path,
Chris@216 110 getMainModel()->getSampleRate(),
Chris@428 111 getMainModel()->getChannelCount(),
Chris@428 112 WavFileWriter::WriteToTemporary);
Chris@216 113 MultiSelection ms = m_viewManager->getSelection();
Chris@216 114 if (!ms.getSelections().empty()) {
Chris@216 115 writer.writeModel(getMainModel(), &ms);
Chris@216 116 } else {
Chris@216 117 writer.writeModel(getMainModel());
Chris@216 118 }
Chris@216 119 }
Chris@216 120 }
Chris@216 121 }
Chris@216 122
Chris@216 123 } else if (message.getMethod() == "jump" ||
Chris@216 124 message.getMethod() == "play") {
Chris@216 125
Chris@216 126 if (getMainModel()) {
Chris@216 127
Chris@922 128 sv_frame_t frame = m_viewManager->getPlaybackFrame();
Chris@216 129 bool selection = false;
Chris@216 130 bool play = (message.getMethod() == "play");
Chris@216 131
Chris@216 132 if (message.getArgCount() == 1) {
Chris@216 133
Chris@216 134 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 135 message.getArg(0).toString() == "selection") {
Chris@216 136
Chris@216 137 selection = true;
Chris@216 138
Chris@216 139 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 140 message.getArg(0).toString() == "end") {
Chris@216 141
Chris@216 142 frame = getMainModel()->getEndFrame();
Chris@216 143
Chris@216 144 } else if (message.getArg(0).canConvert(QVariant::Double)) {
Chris@216 145
Chris@216 146 double time = message.getArg(0).toDouble();
Chris@216 147 if (time < 0.0) time = 0.0;
Chris@216 148
Chris@216 149 frame = lrint(time * getMainModel()->getSampleRate());
Chris@216 150 }
Chris@216 151 }
Chris@216 152
Chris@216 153 if (frame > getMainModel()->getEndFrame()) {
Chris@216 154 frame = getMainModel()->getEndFrame();
Chris@216 155 }
Chris@216 156
Chris@216 157 if (play) {
Chris@216 158 m_viewManager->setPlaySelectionMode(selection);
Chris@216 159 }
Chris@216 160
Chris@216 161 if (selection) {
Chris@216 162 MultiSelection::SelectionList sl = m_viewManager->getSelections();
Chris@216 163 if (!sl.empty()) {
Chris@216 164 frame = sl.begin()->getStartFrame();
Chris@216 165 }
Chris@216 166 }
Chris@216 167
Chris@216 168 m_viewManager->setPlaybackFrame(frame);
Chris@216 169
Chris@216 170 if (play && !m_playSource->isPlaying()) {
Chris@216 171 m_playSource->play(frame);
Chris@216 172 }
Chris@216 173 }
Chris@216 174
Chris@313 175 } else if (message.getMethod() == "ffwd") {
Chris@313 176
Chris@313 177 if (message.getArgCount() == 1) {
Chris@313 178
Chris@313 179 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@313 180 message.getArg(0).toString() == "similar") {
Chris@313 181
Chris@313 182 ffwdSimilar();
Chris@313 183 }
Chris@313 184 } else {
Chris@313 185
Chris@313 186 ffwd();
Chris@313 187 }
Chris@313 188
Chris@313 189 } else if (message.getMethod() == "rewind") {
Chris@313 190
Chris@313 191 if (message.getArgCount() == 1) {
Chris@313 192
Chris@313 193 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@313 194 message.getArg(0).toString() == "similar") {
Chris@313 195
Chris@313 196 rewindSimilar();
Chris@313 197 }
Chris@313 198 } else {
Chris@313 199
Chris@313 200 rewind();
Chris@313 201 }
Chris@313 202
Chris@216 203 } else if (message.getMethod() == "stop") {
Chris@216 204
Chris@216 205 if (m_playSource->isPlaying()) m_playSource->stop();
Chris@216 206
Chris@216 207 } else if (message.getMethod() == "loop") {
Chris@216 208
Chris@216 209 if (message.getArgCount() == 1 &&
Chris@216 210 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 211
Chris@216 212 QString str = message.getArg(0).toString();
Chris@216 213 if (str == "on") {
Chris@216 214 m_viewManager->setPlayLoopMode(true);
Chris@216 215 } else if (str == "off") {
Chris@216 216 m_viewManager->setPlayLoopMode(false);
Chris@216 217 }
Chris@216 218 }
Chris@216 219
Chris@216 220 } else if (message.getMethod() == "solo") {
Chris@216 221
Chris@216 222 if (message.getArgCount() == 1 &&
Chris@216 223 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 224
Chris@216 225 QString str = message.getArg(0).toString();
Chris@216 226 if (str == "on") {
Chris@216 227 m_viewManager->setPlaySoloMode(true);
Chris@216 228 } else if (str == "off") {
Chris@216 229 m_viewManager->setPlaySoloMode(false);
Chris@216 230 }
Chris@216 231 }
Chris@216 232
Chris@216 233 } else if (message.getMethod() == "select" ||
Chris@216 234 message.getMethod() == "addselect") {
Chris@216 235
Chris@216 236 if (getMainModel()) {
Chris@216 237
Chris@920 238 sv_frame_t f0 = getMainModel()->getStartFrame();
Chris@920 239 sv_frame_t f1 = getMainModel()->getEndFrame();
Chris@216 240
Chris@216 241 bool done = false;
Chris@216 242
Chris@216 243 if (message.getArgCount() == 2 &&
Chris@216 244 message.getArg(0).canConvert(QVariant::Double) &&
Chris@216 245 message.getArg(1).canConvert(QVariant::Double)) {
Chris@216 246
Chris@216 247 double t0 = message.getArg(0).toDouble();
Chris@216 248 double t1 = message.getArg(1).toDouble();
Chris@216 249 if (t1 < t0) { double temp = t0; t0 = t1; t1 = temp; }
Chris@216 250 if (t0 < 0.0) t0 = 0.0;
Chris@216 251 if (t1 < 0.0) t1 = 0.0;
Chris@216 252
Chris@216 253 f0 = lrint(t0 * getMainModel()->getSampleRate());
Chris@216 254 f1 = lrint(t1 * getMainModel()->getSampleRate());
Chris@216 255
Chris@216 256 Pane *pane = m_paneStack->getCurrentPane();
Chris@216 257 Layer *layer = 0;
Chris@216 258 if (pane) layer = pane->getSelectedLayer();
Chris@216 259 if (layer) {
Chris@730 260 int resolution;
Chris@216 261 layer->snapToFeatureFrame(pane, f0, resolution,
Chris@216 262 Layer::SnapLeft);
Chris@216 263 layer->snapToFeatureFrame(pane, f1, resolution,
Chris@216 264 Layer::SnapRight);
Chris@216 265 }
Chris@216 266
Chris@216 267 } else if (message.getArgCount() == 1 &&
Chris@216 268 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 269
Chris@216 270 QString str = message.getArg(0).toString();
Chris@216 271 if (str == "none") {
Chris@216 272 m_viewManager->clearSelections();
Chris@216 273 done = true;
Chris@216 274 }
Chris@216 275 }
Chris@216 276
Chris@216 277 if (!done) {
Chris@216 278 if (message.getMethod() == "select") {
Chris@216 279 m_viewManager->setSelection(Selection(f0, f1));
Chris@216 280 } else {
Chris@216 281 m_viewManager->addSelection(Selection(f0, f1));
Chris@216 282 }
Chris@216 283 }
Chris@216 284 }
Chris@216 285
Chris@216 286 } else if (message.getMethod() == "add") {
Chris@216 287
Chris@216 288 if (getMainModel()) {
Chris@216 289
Chris@216 290 if (message.getArgCount() >= 1 &&
Chris@216 291 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 292
Chris@216 293 int channel = -1;
Chris@216 294 if (message.getArgCount() == 2 &&
Chris@216 295 message.getArg(0).canConvert(QVariant::Int)) {
Chris@216 296 channel = message.getArg(0).toInt();
Chris@216 297 if (channel < -1 ||
Chris@216 298 channel > int(getMainModel()->getChannelCount())) {
Chris@665 299 cerr << "WARNING: MainWindow::handleOSCMessage: channel "
Chris@665 300 << channel << " out of range" << endl;
Chris@216 301 channel = -1;
Chris@216 302 }
Chris@216 303 }
Chris@216 304
Chris@216 305 QString str = message.getArg(0).toString();
Chris@216 306
Chris@216 307 LayerFactory::LayerType type =
Chris@216 308 LayerFactory::getInstance()->getLayerTypeForName(str);
Chris@216 309
Chris@216 310 if (type == LayerFactory::UnknownLayer) {
Chris@665 311 cerr << "WARNING: MainWindow::handleOSCMessage: unknown layer "
Chris@665 312 << "type " << str << endl;
Chris@216 313 } else {
Chris@216 314
Chris@232 315 LayerConfiguration configuration(type,
Chris@232 316 getMainModel(),
Chris@232 317 channel);
Chris@216 318
Chris@216 319 addPane(configuration,
Chris@216 320 tr("Add %1 Pane")
Chris@216 321 .arg(LayerFactory::getInstance()->
Chris@216 322 getLayerPresentationName(type)));
Chris@216 323 }
Chris@216 324 }
Chris@216 325 }
Chris@216 326
Chris@216 327 } else if (message.getMethod() == "undo") {
Chris@216 328
Chris@216 329 CommandHistory::getInstance()->undo();
Chris@216 330
Chris@216 331 } else if (message.getMethod() == "redo") {
Chris@216 332
Chris@216 333 CommandHistory::getInstance()->redo();
Chris@216 334
Chris@216 335 } else if (message.getMethod() == "set") {
Chris@216 336
Chris@216 337 if (message.getArgCount() == 2 &&
Chris@216 338 message.getArg(0).canConvert(QVariant::String) &&
Chris@216 339 message.getArg(1).canConvert(QVariant::Double)) {
Chris@216 340
Chris@216 341 QString property = message.getArg(0).toString();
Chris@216 342 float value = (float)message.getArg(1).toDouble();
Chris@216 343
Chris@216 344 if (property == "gain") {
Chris@216 345 if (value < 0.0) value = 0.0;
Chris@1386 346 m_mainLevelPan->setLevel(value);
Chris@216 347 if (m_playTarget) m_playTarget->setOutputGain(value);
Chris@216 348 } else if (property == "speedup") {
Chris@216 349 m_playSpeed->setMappedValue(value);
Chris@216 350 } else if (property == "overlays") {
Chris@216 351 if (value < 0.5) {
Chris@216 352 m_viewManager->setOverlayMode(ViewManager::NoOverlays);
Chris@216 353 } else if (value < 1.5) {
Chris@701 354 m_viewManager->setOverlayMode(ViewManager::StandardOverlays);
Chris@216 355 } else {
Chris@216 356 m_viewManager->setOverlayMode(ViewManager::AllOverlays);
Chris@216 357 }
Chris@216 358 } else if (property == "zoomwheels") {
Chris@216 359 m_viewManager->setZoomWheelsEnabled(value > 0.5);
Chris@216 360 } else if (property == "propertyboxes") {
Chris@216 361 bool toggle = ((value < 0.5) !=
Chris@216 362 (m_paneStack->getLayoutStyle() == PaneStack::NoPropertyStacks));
Chris@216 363 if (toggle) togglePropertyBoxes();
Chris@216 364 }
Chris@216 365
Chris@216 366 } else {
Chris@216 367 PropertyContainer *container = 0;
Chris@216 368 Pane *pane = m_paneStack->getCurrentPane();
Chris@216 369 if (pane &&
Chris@216 370 message.getArgCount() == 3 &&
Chris@216 371 message.getArg(0).canConvert(QVariant::String) &&
Chris@216 372 message.getArg(1).canConvert(QVariant::String) &&
Chris@216 373 message.getArg(2).canConvert(QVariant::String)) {
Chris@216 374 if (message.getArg(0).toString() == "pane") {
Chris@216 375 container = pane->getPropertyContainer(0);
Chris@216 376 } else if (message.getArg(0).toString() == "layer") {
Chris@216 377 container = pane->getSelectedLayer();
Chris@216 378 }
Chris@216 379 }
Chris@216 380 if (container) {
Chris@216 381 QString nameString = message.getArg(1).toString();
Chris@216 382 QString valueString = message.getArg(2).toString();
Chris@248 383 Command *c = container->getSetPropertyCommand
Chris@248 384 (nameString, valueString);
Chris@248 385 if (c) CommandHistory::getInstance()->addCommand(c, true, true);
Chris@216 386 }
Chris@216 387 }
Chris@216 388
Chris@216 389 } else if (message.getMethod() == "setcurrent") {
Chris@216 390
Chris@216 391 int paneIndex = -1, layerIndex = -1;
Chris@216 392 bool wantLayer = false;
Chris@216 393
Chris@216 394 if (message.getArgCount() >= 1 &&
Chris@216 395 message.getArg(0).canConvert(QVariant::Int)) {
Chris@216 396
Chris@216 397 paneIndex = message.getArg(0).toInt() - 1;
Chris@216 398
Chris@216 399 if (message.getArgCount() >= 2 &&
Chris@216 400 message.getArg(1).canConvert(QVariant::Int)) {
Chris@216 401 wantLayer = true;
Chris@216 402 layerIndex = message.getArg(1).toInt() - 1;
Chris@216 403 }
Chris@216 404 }
Chris@216 405
Chris@216 406 if (paneIndex >= 0 && paneIndex < m_paneStack->getPaneCount()) {
Chris@216 407 Pane *pane = m_paneStack->getPane(paneIndex);
Chris@216 408 m_paneStack->setCurrentPane(pane);
Chris@216 409 if (layerIndex >= 0 && layerIndex < pane->getLayerCount()) {
Chris@216 410 Layer *layer = pane->getLayer(layerIndex);
Chris@216 411 m_paneStack->setCurrentLayer(pane, layer);
Chris@216 412 } else if (wantLayer && layerIndex == -1) {
Chris@216 413 m_paneStack->setCurrentLayer(pane, 0);
Chris@216 414 }
Chris@216 415 }
Chris@216 416
Chris@216 417 } else if (message.getMethod() == "delete") {
Chris@216 418
Chris@216 419 if (message.getArgCount() == 1 &&
Chris@216 420 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 421
Chris@216 422 QString target = message.getArg(0).toString();
Chris@216 423
Chris@216 424 if (target == "pane") {
Chris@216 425
Chris@216 426 deleteCurrentPane();
Chris@216 427
Chris@216 428 } else if (target == "layer") {
Chris@216 429
Chris@216 430 deleteCurrentLayer();
Chris@216 431
Chris@216 432 } else {
Chris@216 433
Chris@665 434 cerr << "WARNING: MainWindow::handleOSCMessage: Unknown delete target " << target << endl;
Chris@216 435 }
Chris@216 436 }
Chris@216 437
Chris@216 438 } else if (message.getMethod() == "zoom") {
Chris@216 439
Chris@216 440 if (message.getArgCount() == 1) {
Chris@216 441 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 442 message.getArg(0).toString() == "in") {
Chris@216 443 zoomIn();
Chris@216 444 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 445 message.getArg(0).toString() == "out") {
Chris@216 446 zoomOut();
Chris@216 447 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 448 message.getArg(0).toString() == "default") {
Chris@216 449 zoomDefault();
Chris@312 450 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@312 451 message.getArg(0).toString() == "fit") {
Chris@312 452 zoomToFit();
Chris@216 453 } else if (message.getArg(0).canConvert(QVariant::Double)) {
Chris@216 454 double level = message.getArg(0).toDouble();
Chris@216 455 Pane *currentPane = m_paneStack->getCurrentPane();
Chris@216 456 if (level < 1.0) level = 1.0;
Chris@922 457 if (currentPane) currentPane->setZoomLevel(int(lrint(level)));
Chris@216 458 }
Chris@216 459 }
Chris@216 460
Chris@216 461 } else if (message.getMethod() == "zoomvertical") {
Chris@216 462
Chris@216 463 Pane *pane = m_paneStack->getCurrentPane();
Chris@216 464 Layer *layer = 0;
Chris@216 465 if (pane && pane->getLayerCount() > 0) {
Chris@216 466 layer = pane->getLayer(pane->getLayerCount() - 1);
Chris@216 467 }
Chris@216 468 int defaultStep = 0;
Chris@216 469 int steps = 0;
Chris@216 470 if (layer) {
Chris@216 471 steps = layer->getVerticalZoomSteps(defaultStep);
Chris@216 472 if (message.getArgCount() == 1 && steps > 0) {
Chris@216 473 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 474 message.getArg(0).toString() == "in") {
Chris@216 475 int step = layer->getCurrentVerticalZoomStep() + 1;
Chris@216 476 if (step < steps) layer->setVerticalZoomStep(step);
Chris@216 477 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 478 message.getArg(0).toString() == "out") {
Chris@216 479 int step = layer->getCurrentVerticalZoomStep() - 1;
Chris@216 480 if (step >= 0) layer->setVerticalZoomStep(step);
Chris@216 481 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 482 message.getArg(0).toString() == "default") {
Chris@216 483 layer->setVerticalZoomStep(defaultStep);
Chris@216 484 }
Chris@216 485 } else if (message.getArgCount() == 2) {
Chris@216 486 if (message.getArg(0).canConvert(QVariant::Double) &&
Chris@216 487 message.getArg(1).canConvert(QVariant::Double)) {
Chris@216 488 double min = message.getArg(0).toDouble();
Chris@216 489 double max = message.getArg(1).toDouble();
Chris@216 490 layer->setDisplayExtents(min, max);
Chris@216 491 }
Chris@216 492 }
Chris@216 493 }
Chris@216 494
Chris@216 495 } else if (message.getMethod() == "quit") {
Chris@216 496
Chris@216 497 m_abandoning = true;
Chris@216 498 close();
Chris@216 499
Chris@216 500 } else if (message.getMethod() == "resize") {
Chris@216 501
Chris@216 502 if (message.getArgCount() == 2) {
Chris@216 503
Chris@216 504 int width = 0, height = 0;
Chris@216 505
Chris@216 506 if (message.getArg(1).canConvert(QVariant::Int)) {
Chris@216 507
Chris@216 508 height = message.getArg(1).toInt();
Chris@216 509
Chris@216 510 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 511 message.getArg(0).toString() == "pane") {
Chris@216 512
Chris@216 513 Pane *pane = m_paneStack->getCurrentPane();
Chris@216 514 if (pane) pane->resize(pane->width(), height);
Chris@216 515
Chris@216 516 } else if (message.getArg(0).canConvert(QVariant::Int)) {
Chris@216 517
Chris@216 518 width = message.getArg(0).toInt();
Chris@216 519 resize(width, height);
Chris@216 520 }
Chris@216 521 }
Chris@216 522 }
Chris@216 523
Chris@216 524 } else if (message.getMethod() == "transform") {
Chris@216 525
Chris@216 526 Pane *pane = m_paneStack->getCurrentPane();
Chris@216 527
Chris@216 528 if (getMainModel() &&
Chris@216 529 pane &&
Chris@216 530 message.getArgCount() == 1 &&
Chris@216 531 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 532
Chris@224 533 TransformId transformId = message.getArg(0).toString();
Chris@216 534
Chris@224 535 Transform transform = TransformFactory::getInstance()->
Chris@224 536 getDefaultTransformFor(transformId);
Chris@224 537
Chris@216 538 Layer *newLayer = m_document->createDerivedLayer
Chris@224 539 (transform, getMainModel());
Chris@216 540
Chris@216 541 if (newLayer) {
Chris@216 542 m_document->addLayerToView(pane, newLayer);
Chris@224 543 m_recentTransforms.add(transformId);
Chris@216 544 m_paneStack->setCurrentLayer(pane, newLayer);
Chris@216 545 }
Chris@216 546 }
Chris@216 547
Chris@216 548 } else {
Chris@665 549 cerr << "WARNING: MainWindow::handleOSCMessage: Unknown or unsupported "
Chris@665 550 << "method \"" << message.getMethod()
Chris@665 551 << "\"" << endl;
Chris@216 552 }
Chris@216 553
Chris@216 554 }