annotate main/OSCHandler.cpp @ 490:bc04d651f8a4

Ensure all windows are closed when the main one is (thus exiting the application even if some other windows were still open)
author Chris Cannam
date Thu, 19 Jan 2012 15:36:59 +0000
parents 868f73825b37
children e583f57f1311
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@216 25 #include "audioio/AudioCallbackPlaySource.h"
Chris@216 26 #include "audioio/AudioCallbackPlayTarget.h"
Chris@216 27 #include "framework/Document.h"
Chris@216 28 #include "data/fileio/WavFileWriter.h"
Chris@249 29 #include "transform/TransformFactory.h"
Chris@216 30 #include "widgets/Fader.h"
Chris@216 31 #include "widgets/AudioDial.h"
Chris@216 32
Chris@216 33 #include <QFileInfo>
Chris@216 34
Chris@216 35 void
Chris@216 36 MainWindow::handleOSCMessage(const OSCMessage &message)
Chris@216 37 {
Chris@438 38 SVDEBUG << "MainWindow::handleOSCMessage: thread id = "
Chris@433 39 << QThread::currentThreadId() << endl;
Chris@216 40
Chris@216 41 // This large function should really be abstracted out.
Chris@216 42
Chris@216 43 if (message.getMethod() == "open") {
Chris@216 44
Chris@216 45 if (message.getArgCount() == 1 &&
Chris@216 46 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 47 QString path = message.getArg(0).toString();
Chris@216 48 if (open(path, ReplaceMainModel) != FileOpenSucceeded) {
Chris@216 49 std::cerr << "MainWindow::handleOSCMessage: File open failed for path \""
Chris@432 50 << path << "\"" << std::endl;
Chris@216 51 }
Chris@216 52 //!!! we really need to spin here and not return until the
Chris@216 53 // file has been completely decoded...
Chris@216 54 }
Chris@216 55
Chris@216 56 } else if (message.getMethod() == "openadditional") {
Chris@216 57
Chris@216 58 if (message.getArgCount() == 1 &&
Chris@216 59 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 60 QString path = message.getArg(0).toString();
Chris@216 61 if (open(path, CreateAdditionalModel) != FileOpenSucceeded) {
Chris@216 62 std::cerr << "MainWindow::handleOSCMessage: File open failed for path \""
Chris@432 63 << path << "\"" << std::endl;
Chris@216 64 }
Chris@216 65 }
Chris@216 66
Chris@216 67 } else if (message.getMethod() == "recent" ||
Chris@216 68 message.getMethod() == "last") {
Chris@216 69
Chris@216 70 int n = 0;
Chris@216 71 if (message.getMethod() == "recent" &&
Chris@216 72 message.getArgCount() == 1 &&
Chris@216 73 message.getArg(0).canConvert(QVariant::Int)) {
Chris@216 74 n = message.getArg(0).toInt() - 1;
Chris@216 75 }
Chris@216 76 std::vector<QString> recent = m_recentFiles.getRecent();
Chris@216 77 if (n >= 0 && n < int(recent.size())) {
Chris@216 78 if (open(recent[n], ReplaceMainModel) != FileOpenSucceeded) {
Chris@216 79 std::cerr << "MainWindow::handleOSCMessage: File open failed for path \""
Chris@432 80 << recent[n] << "\"" << std::endl;
Chris@216 81 }
Chris@216 82 }
Chris@216 83
Chris@216 84 } else if (message.getMethod() == "save") {
Chris@216 85
Chris@216 86 QString path;
Chris@216 87 if (message.getArgCount() == 1 &&
Chris@216 88 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 89 path = message.getArg(0).toString();
Chris@216 90 if (QFileInfo(path).exists()) {
Chris@438 91 SVDEBUG << "MainWindow::handleOSCMessage: Refusing to overwrite existing file in save" << endl;
Chris@216 92 } else {
Chris@216 93 saveSessionFile(path);
Chris@216 94 }
Chris@216 95 }
Chris@216 96
Chris@216 97 } else if (message.getMethod() == "export") {
Chris@216 98
Chris@216 99 QString path;
Chris@216 100 if (getMainModel()) {
Chris@216 101 if (message.getArgCount() == 1 &&
Chris@216 102 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 103 path = message.getArg(0).toString();
Chris@216 104 if (QFileInfo(path).exists()) {
Chris@438 105 SVDEBUG << "MainWindow::handleOSCMessage: Refusing to overwrite existing file in export" << endl;
Chris@216 106 } else {
Chris@216 107 WavFileWriter writer(path,
Chris@216 108 getMainModel()->getSampleRate(),
Chris@428 109 getMainModel()->getChannelCount(),
Chris@428 110 WavFileWriter::WriteToTemporary);
Chris@216 111 MultiSelection ms = m_viewManager->getSelection();
Chris@216 112 if (!ms.getSelections().empty()) {
Chris@216 113 writer.writeModel(getMainModel(), &ms);
Chris@216 114 } else {
Chris@216 115 writer.writeModel(getMainModel());
Chris@216 116 }
Chris@216 117 }
Chris@216 118 }
Chris@216 119 }
Chris@216 120
Chris@216 121 } else if (message.getMethod() == "jump" ||
Chris@216 122 message.getMethod() == "play") {
Chris@216 123
Chris@216 124 if (getMainModel()) {
Chris@216 125
Chris@216 126 unsigned long frame = m_viewManager->getPlaybackFrame();
Chris@216 127 bool selection = false;
Chris@216 128 bool play = (message.getMethod() == "play");
Chris@216 129
Chris@216 130 if (message.getArgCount() == 1) {
Chris@216 131
Chris@216 132 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 133 message.getArg(0).toString() == "selection") {
Chris@216 134
Chris@216 135 selection = true;
Chris@216 136
Chris@216 137 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 138 message.getArg(0).toString() == "end") {
Chris@216 139
Chris@216 140 frame = getMainModel()->getEndFrame();
Chris@216 141
Chris@216 142 } else if (message.getArg(0).canConvert(QVariant::Double)) {
Chris@216 143
Chris@216 144 double time = message.getArg(0).toDouble();
Chris@216 145 if (time < 0.0) time = 0.0;
Chris@216 146
Chris@216 147 frame = lrint(time * getMainModel()->getSampleRate());
Chris@216 148 }
Chris@216 149 }
Chris@216 150
Chris@216 151 if (frame > getMainModel()->getEndFrame()) {
Chris@216 152 frame = getMainModel()->getEndFrame();
Chris@216 153 }
Chris@216 154
Chris@216 155 if (play) {
Chris@216 156 m_viewManager->setPlaySelectionMode(selection);
Chris@216 157 }
Chris@216 158
Chris@216 159 if (selection) {
Chris@216 160 MultiSelection::SelectionList sl = m_viewManager->getSelections();
Chris@216 161 if (!sl.empty()) {
Chris@216 162 frame = sl.begin()->getStartFrame();
Chris@216 163 }
Chris@216 164 }
Chris@216 165
Chris@216 166 m_viewManager->setPlaybackFrame(frame);
Chris@216 167
Chris@216 168 if (play && !m_playSource->isPlaying()) {
Chris@216 169 m_playSource->play(frame);
Chris@216 170 }
Chris@216 171 }
Chris@216 172
Chris@313 173 } else if (message.getMethod() == "ffwd") {
Chris@313 174
Chris@313 175 if (message.getArgCount() == 1) {
Chris@313 176
Chris@313 177 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@313 178 message.getArg(0).toString() == "similar") {
Chris@313 179
Chris@313 180 ffwdSimilar();
Chris@313 181 }
Chris@313 182 } else {
Chris@313 183
Chris@313 184 ffwd();
Chris@313 185 }
Chris@313 186
Chris@313 187 } else if (message.getMethod() == "rewind") {
Chris@313 188
Chris@313 189 if (message.getArgCount() == 1) {
Chris@313 190
Chris@313 191 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@313 192 message.getArg(0).toString() == "similar") {
Chris@313 193
Chris@313 194 rewindSimilar();
Chris@313 195 }
Chris@313 196 } else {
Chris@313 197
Chris@313 198 rewind();
Chris@313 199 }
Chris@313 200
Chris@216 201 } else if (message.getMethod() == "stop") {
Chris@216 202
Chris@216 203 if (m_playSource->isPlaying()) m_playSource->stop();
Chris@216 204
Chris@216 205 } else if (message.getMethod() == "loop") {
Chris@216 206
Chris@216 207 if (message.getArgCount() == 1 &&
Chris@216 208 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 209
Chris@216 210 QString str = message.getArg(0).toString();
Chris@216 211 if (str == "on") {
Chris@216 212 m_viewManager->setPlayLoopMode(true);
Chris@216 213 } else if (str == "off") {
Chris@216 214 m_viewManager->setPlayLoopMode(false);
Chris@216 215 }
Chris@216 216 }
Chris@216 217
Chris@216 218 } else if (message.getMethod() == "solo") {
Chris@216 219
Chris@216 220 if (message.getArgCount() == 1 &&
Chris@216 221 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 222
Chris@216 223 QString str = message.getArg(0).toString();
Chris@216 224 if (str == "on") {
Chris@216 225 m_viewManager->setPlaySoloMode(true);
Chris@216 226 } else if (str == "off") {
Chris@216 227 m_viewManager->setPlaySoloMode(false);
Chris@216 228 }
Chris@216 229 }
Chris@216 230
Chris@216 231 } else if (message.getMethod() == "select" ||
Chris@216 232 message.getMethod() == "addselect") {
Chris@216 233
Chris@216 234 if (getMainModel()) {
Chris@216 235
Chris@216 236 int f0 = getMainModel()->getStartFrame();
Chris@216 237 int f1 = getMainModel()->getEndFrame();
Chris@216 238
Chris@216 239 bool done = false;
Chris@216 240
Chris@216 241 if (message.getArgCount() == 2 &&
Chris@216 242 message.getArg(0).canConvert(QVariant::Double) &&
Chris@216 243 message.getArg(1).canConvert(QVariant::Double)) {
Chris@216 244
Chris@216 245 double t0 = message.getArg(0).toDouble();
Chris@216 246 double t1 = message.getArg(1).toDouble();
Chris@216 247 if (t1 < t0) { double temp = t0; t0 = t1; t1 = temp; }
Chris@216 248 if (t0 < 0.0) t0 = 0.0;
Chris@216 249 if (t1 < 0.0) t1 = 0.0;
Chris@216 250
Chris@216 251 f0 = lrint(t0 * getMainModel()->getSampleRate());
Chris@216 252 f1 = lrint(t1 * getMainModel()->getSampleRate());
Chris@216 253
Chris@216 254 Pane *pane = m_paneStack->getCurrentPane();
Chris@216 255 Layer *layer = 0;
Chris@216 256 if (pane) layer = pane->getSelectedLayer();
Chris@216 257 if (layer) {
Chris@216 258 size_t resolution;
Chris@216 259 layer->snapToFeatureFrame(pane, f0, resolution,
Chris@216 260 Layer::SnapLeft);
Chris@216 261 layer->snapToFeatureFrame(pane, f1, resolution,
Chris@216 262 Layer::SnapRight);
Chris@216 263 }
Chris@216 264
Chris@216 265 } else if (message.getArgCount() == 1 &&
Chris@216 266 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 267
Chris@216 268 QString str = message.getArg(0).toString();
Chris@216 269 if (str == "none") {
Chris@216 270 m_viewManager->clearSelections();
Chris@216 271 done = true;
Chris@216 272 }
Chris@216 273 }
Chris@216 274
Chris@216 275 if (!done) {
Chris@216 276 if (message.getMethod() == "select") {
Chris@216 277 m_viewManager->setSelection(Selection(f0, f1));
Chris@216 278 } else {
Chris@216 279 m_viewManager->addSelection(Selection(f0, f1));
Chris@216 280 }
Chris@216 281 }
Chris@216 282 }
Chris@216 283
Chris@216 284 } else if (message.getMethod() == "add") {
Chris@216 285
Chris@216 286 if (getMainModel()) {
Chris@216 287
Chris@216 288 if (message.getArgCount() >= 1 &&
Chris@216 289 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 290
Chris@216 291 int channel = -1;
Chris@216 292 if (message.getArgCount() == 2 &&
Chris@216 293 message.getArg(0).canConvert(QVariant::Int)) {
Chris@216 294 channel = message.getArg(0).toInt();
Chris@216 295 if (channel < -1 ||
Chris@216 296 channel > int(getMainModel()->getChannelCount())) {
Chris@216 297 std::cerr << "WARNING: MainWindow::handleOSCMessage: channel "
Chris@216 298 << channel << " out of range" << std::endl;
Chris@216 299 channel = -1;
Chris@216 300 }
Chris@216 301 }
Chris@216 302
Chris@216 303 QString str = message.getArg(0).toString();
Chris@216 304
Chris@216 305 LayerFactory::LayerType type =
Chris@216 306 LayerFactory::getInstance()->getLayerTypeForName(str);
Chris@216 307
Chris@216 308 if (type == LayerFactory::UnknownLayer) {
Chris@216 309 std::cerr << "WARNING: MainWindow::handleOSCMessage: unknown layer "
Chris@432 310 << "type " << str << std::endl;
Chris@216 311 } else {
Chris@216 312
Chris@232 313 LayerConfiguration configuration(type,
Chris@232 314 getMainModel(),
Chris@232 315 channel);
Chris@216 316
Chris@216 317 addPane(configuration,
Chris@216 318 tr("Add %1 Pane")
Chris@216 319 .arg(LayerFactory::getInstance()->
Chris@216 320 getLayerPresentationName(type)));
Chris@216 321 }
Chris@216 322 }
Chris@216 323 }
Chris@216 324
Chris@216 325 } else if (message.getMethod() == "undo") {
Chris@216 326
Chris@216 327 CommandHistory::getInstance()->undo();
Chris@216 328
Chris@216 329 } else if (message.getMethod() == "redo") {
Chris@216 330
Chris@216 331 CommandHistory::getInstance()->redo();
Chris@216 332
Chris@216 333 } else if (message.getMethod() == "set") {
Chris@216 334
Chris@216 335 if (message.getArgCount() == 2 &&
Chris@216 336 message.getArg(0).canConvert(QVariant::String) &&
Chris@216 337 message.getArg(1).canConvert(QVariant::Double)) {
Chris@216 338
Chris@216 339 QString property = message.getArg(0).toString();
Chris@216 340 float value = (float)message.getArg(1).toDouble();
Chris@216 341
Chris@216 342 if (property == "gain") {
Chris@216 343 if (value < 0.0) value = 0.0;
Chris@216 344 m_fader->setValue(value);
Chris@216 345 if (m_playTarget) m_playTarget->setOutputGain(value);
Chris@216 346 } else if (property == "speedup") {
Chris@216 347 m_playSpeed->setMappedValue(value);
Chris@216 348 } else if (property == "overlays") {
Chris@216 349 if (value < 0.5) {
Chris@216 350 m_viewManager->setOverlayMode(ViewManager::NoOverlays);
Chris@216 351 } else if (value < 1.5) {
Chris@216 352 m_viewManager->setOverlayMode(ViewManager::MinimalOverlays);
Chris@216 353 } else if (value < 2.5) {
Chris@216 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@432 434 std::cerr << "WARNING: MainWindow::handleOSCMessage: Unknown delete target " << target << std::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@216 457 if (currentPane) currentPane->setZoomLevel(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@216 549 std::cerr << "WARNING: MainWindow::handleOSCMessage: Unknown or unsupported "
Chris@216 550 << "method \"" << message.getMethod().toStdString()
Chris@216 551 << "\"" << std::endl;
Chris@216 552 }
Chris@216 553
Chris@216 554 }