annotate main/OSCHandler.cpp @ 497:e583f57f1311

Give a dedicated key to toggling the centre line, and move it out of the overlay level setting -- reducing number of overlay levels to 3. Introduce two distinct vertical scale types (so that we can hide the spectrogram colour scale part easily)
author Chris Cannam
date Mon, 30 Jan 2012 16:01:21 +0000
parents 868f73825b37
children ba338234c001 17fe7e0c23a1
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 {
Chris@216 354 m_viewManager->setOverlayMode(ViewManager::AllOverlays);
Chris@216 355 }
Chris@216 356 } else if (property == "zoomwheels") {
Chris@216 357 m_viewManager->setZoomWheelsEnabled(value > 0.5);
Chris@216 358 } else if (property == "propertyboxes") {
Chris@216 359 bool toggle = ((value < 0.5) !=
Chris@216 360 (m_paneStack->getLayoutStyle() == PaneStack::NoPropertyStacks));
Chris@216 361 if (toggle) togglePropertyBoxes();
Chris@216 362 }
Chris@216 363
Chris@216 364 } else {
Chris@216 365 PropertyContainer *container = 0;
Chris@216 366 Pane *pane = m_paneStack->getCurrentPane();
Chris@216 367 if (pane &&
Chris@216 368 message.getArgCount() == 3 &&
Chris@216 369 message.getArg(0).canConvert(QVariant::String) &&
Chris@216 370 message.getArg(1).canConvert(QVariant::String) &&
Chris@216 371 message.getArg(2).canConvert(QVariant::String)) {
Chris@216 372 if (message.getArg(0).toString() == "pane") {
Chris@216 373 container = pane->getPropertyContainer(0);
Chris@216 374 } else if (message.getArg(0).toString() == "layer") {
Chris@216 375 container = pane->getSelectedLayer();
Chris@216 376 }
Chris@216 377 }
Chris@216 378 if (container) {
Chris@216 379 QString nameString = message.getArg(1).toString();
Chris@216 380 QString valueString = message.getArg(2).toString();
Chris@248 381 Command *c = container->getSetPropertyCommand
Chris@248 382 (nameString, valueString);
Chris@248 383 if (c) CommandHistory::getInstance()->addCommand(c, true, true);
Chris@216 384 }
Chris@216 385 }
Chris@216 386
Chris@216 387 } else if (message.getMethod() == "setcurrent") {
Chris@216 388
Chris@216 389 int paneIndex = -1, layerIndex = -1;
Chris@216 390 bool wantLayer = false;
Chris@216 391
Chris@216 392 if (message.getArgCount() >= 1 &&
Chris@216 393 message.getArg(0).canConvert(QVariant::Int)) {
Chris@216 394
Chris@216 395 paneIndex = message.getArg(0).toInt() - 1;
Chris@216 396
Chris@216 397 if (message.getArgCount() >= 2 &&
Chris@216 398 message.getArg(1).canConvert(QVariant::Int)) {
Chris@216 399 wantLayer = true;
Chris@216 400 layerIndex = message.getArg(1).toInt() - 1;
Chris@216 401 }
Chris@216 402 }
Chris@216 403
Chris@216 404 if (paneIndex >= 0 && paneIndex < m_paneStack->getPaneCount()) {
Chris@216 405 Pane *pane = m_paneStack->getPane(paneIndex);
Chris@216 406 m_paneStack->setCurrentPane(pane);
Chris@216 407 if (layerIndex >= 0 && layerIndex < pane->getLayerCount()) {
Chris@216 408 Layer *layer = pane->getLayer(layerIndex);
Chris@216 409 m_paneStack->setCurrentLayer(pane, layer);
Chris@216 410 } else if (wantLayer && layerIndex == -1) {
Chris@216 411 m_paneStack->setCurrentLayer(pane, 0);
Chris@216 412 }
Chris@216 413 }
Chris@216 414
Chris@216 415 } else if (message.getMethod() == "delete") {
Chris@216 416
Chris@216 417 if (message.getArgCount() == 1 &&
Chris@216 418 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 419
Chris@216 420 QString target = message.getArg(0).toString();
Chris@216 421
Chris@216 422 if (target == "pane") {
Chris@216 423
Chris@216 424 deleteCurrentPane();
Chris@216 425
Chris@216 426 } else if (target == "layer") {
Chris@216 427
Chris@216 428 deleteCurrentLayer();
Chris@216 429
Chris@216 430 } else {
Chris@216 431
Chris@432 432 std::cerr << "WARNING: MainWindow::handleOSCMessage: Unknown delete target " << target << std::endl;
Chris@216 433 }
Chris@216 434 }
Chris@216 435
Chris@216 436 } else if (message.getMethod() == "zoom") {
Chris@216 437
Chris@216 438 if (message.getArgCount() == 1) {
Chris@216 439 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 440 message.getArg(0).toString() == "in") {
Chris@216 441 zoomIn();
Chris@216 442 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 443 message.getArg(0).toString() == "out") {
Chris@216 444 zoomOut();
Chris@216 445 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 446 message.getArg(0).toString() == "default") {
Chris@216 447 zoomDefault();
Chris@312 448 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@312 449 message.getArg(0).toString() == "fit") {
Chris@312 450 zoomToFit();
Chris@216 451 } else if (message.getArg(0).canConvert(QVariant::Double)) {
Chris@216 452 double level = message.getArg(0).toDouble();
Chris@216 453 Pane *currentPane = m_paneStack->getCurrentPane();
Chris@216 454 if (level < 1.0) level = 1.0;
Chris@216 455 if (currentPane) currentPane->setZoomLevel(lrint(level));
Chris@216 456 }
Chris@216 457 }
Chris@216 458
Chris@216 459 } else if (message.getMethod() == "zoomvertical") {
Chris@216 460
Chris@216 461 Pane *pane = m_paneStack->getCurrentPane();
Chris@216 462 Layer *layer = 0;
Chris@216 463 if (pane && pane->getLayerCount() > 0) {
Chris@216 464 layer = pane->getLayer(pane->getLayerCount() - 1);
Chris@216 465 }
Chris@216 466 int defaultStep = 0;
Chris@216 467 int steps = 0;
Chris@216 468 if (layer) {
Chris@216 469 steps = layer->getVerticalZoomSteps(defaultStep);
Chris@216 470 if (message.getArgCount() == 1 && steps > 0) {
Chris@216 471 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 472 message.getArg(0).toString() == "in") {
Chris@216 473 int step = layer->getCurrentVerticalZoomStep() + 1;
Chris@216 474 if (step < steps) layer->setVerticalZoomStep(step);
Chris@216 475 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 476 message.getArg(0).toString() == "out") {
Chris@216 477 int step = layer->getCurrentVerticalZoomStep() - 1;
Chris@216 478 if (step >= 0) layer->setVerticalZoomStep(step);
Chris@216 479 } else if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 480 message.getArg(0).toString() == "default") {
Chris@216 481 layer->setVerticalZoomStep(defaultStep);
Chris@216 482 }
Chris@216 483 } else if (message.getArgCount() == 2) {
Chris@216 484 if (message.getArg(0).canConvert(QVariant::Double) &&
Chris@216 485 message.getArg(1).canConvert(QVariant::Double)) {
Chris@216 486 double min = message.getArg(0).toDouble();
Chris@216 487 double max = message.getArg(1).toDouble();
Chris@216 488 layer->setDisplayExtents(min, max);
Chris@216 489 }
Chris@216 490 }
Chris@216 491 }
Chris@216 492
Chris@216 493 } else if (message.getMethod() == "quit") {
Chris@216 494
Chris@216 495 m_abandoning = true;
Chris@216 496 close();
Chris@216 497
Chris@216 498 } else if (message.getMethod() == "resize") {
Chris@216 499
Chris@216 500 if (message.getArgCount() == 2) {
Chris@216 501
Chris@216 502 int width = 0, height = 0;
Chris@216 503
Chris@216 504 if (message.getArg(1).canConvert(QVariant::Int)) {
Chris@216 505
Chris@216 506 height = message.getArg(1).toInt();
Chris@216 507
Chris@216 508 if (message.getArg(0).canConvert(QVariant::String) &&
Chris@216 509 message.getArg(0).toString() == "pane") {
Chris@216 510
Chris@216 511 Pane *pane = m_paneStack->getCurrentPane();
Chris@216 512 if (pane) pane->resize(pane->width(), height);
Chris@216 513
Chris@216 514 } else if (message.getArg(0).canConvert(QVariant::Int)) {
Chris@216 515
Chris@216 516 width = message.getArg(0).toInt();
Chris@216 517 resize(width, height);
Chris@216 518 }
Chris@216 519 }
Chris@216 520 }
Chris@216 521
Chris@216 522 } else if (message.getMethod() == "transform") {
Chris@216 523
Chris@216 524 Pane *pane = m_paneStack->getCurrentPane();
Chris@216 525
Chris@216 526 if (getMainModel() &&
Chris@216 527 pane &&
Chris@216 528 message.getArgCount() == 1 &&
Chris@216 529 message.getArg(0).canConvert(QVariant::String)) {
Chris@216 530
Chris@224 531 TransformId transformId = message.getArg(0).toString();
Chris@216 532
Chris@224 533 Transform transform = TransformFactory::getInstance()->
Chris@224 534 getDefaultTransformFor(transformId);
Chris@224 535
Chris@216 536 Layer *newLayer = m_document->createDerivedLayer
Chris@224 537 (transform, getMainModel());
Chris@216 538
Chris@216 539 if (newLayer) {
Chris@216 540 m_document->addLayerToView(pane, newLayer);
Chris@224 541 m_recentTransforms.add(transformId);
Chris@216 542 m_paneStack->setCurrentLayer(pane, newLayer);
Chris@216 543 }
Chris@216 544 }
Chris@216 545
Chris@216 546 } else {
Chris@216 547 std::cerr << "WARNING: MainWindow::handleOSCMessage: Unknown or unsupported "
Chris@216 548 << "method \"" << message.getMethod().toStdString()
Chris@216 549 << "\"" << std::endl;
Chris@216 550 }
Chris@216 551
Chris@216 552 }