annotate view/Pane.cpp @ 127:89c625dda204

* Reorganising code base. This revision will not compile.
author Chris Cannam
date Mon, 31 Jul 2006 11:44:37 +0000
parents
children 33929e0c3c6b
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@127 7 This file copyright 2006 Chris Cannam.
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 "widgets/Pane.h"
Chris@127 17 #include "base/Layer.h"
Chris@127 18 #include "base/Model.h"
Chris@127 19 #include "base/ZoomConstraint.h"
Chris@127 20 #include "base/RealTime.h"
Chris@127 21 #include "base/Profiler.h"
Chris@127 22 #include "base/ViewManager.h"
Chris@127 23 #include "base/CommandHistory.h"
Chris@127 24 #include "layer/WaveformLayer.h"
Chris@127 25
Chris@127 26 #include <QPaintEvent>
Chris@127 27 #include <QPainter>
Chris@127 28 #include <iostream>
Chris@127 29 #include <cmath>
Chris@127 30
Chris@127 31 using std::cerr;
Chris@127 32 using std::endl;
Chris@127 33
Chris@127 34 Pane::Pane(QWidget *w) :
Chris@127 35 View(w, true),
Chris@127 36 m_identifyFeatures(false),
Chris@127 37 m_clickedInRange(false),
Chris@127 38 m_shiftPressed(false),
Chris@127 39 m_ctrlPressed(false),
Chris@127 40 m_navigating(false),
Chris@127 41 m_resizing(false),
Chris@127 42 m_centreLineVisible(true)
Chris@127 43 {
Chris@127 44 setObjectName("Pane");
Chris@127 45 setMouseTracking(true);
Chris@127 46 }
Chris@127 47
Chris@127 48 bool
Chris@127 49 Pane::shouldIlluminateLocalFeatures(const Layer *layer, QPoint &pos) const
Chris@127 50 {
Chris@127 51 QPoint discard;
Chris@127 52 bool b0, b1;
Chris@127 53
Chris@127 54 if (layer == getSelectedLayer() &&
Chris@127 55 !shouldIlluminateLocalSelection(discard, b0, b1)) {
Chris@127 56
Chris@127 57 pos = m_identifyPoint;
Chris@127 58 return m_identifyFeatures;
Chris@127 59 }
Chris@127 60
Chris@127 61 return false;
Chris@127 62 }
Chris@127 63
Chris@127 64 bool
Chris@127 65 Pane::shouldIlluminateLocalSelection(QPoint &pos,
Chris@127 66 bool &closeToLeft,
Chris@127 67 bool &closeToRight) const
Chris@127 68 {
Chris@127 69 if (m_identifyFeatures &&
Chris@127 70 m_manager &&
Chris@127 71 m_manager->getToolMode() == ViewManager::EditMode &&
Chris@127 72 !m_manager->getSelections().empty() &&
Chris@127 73 !selectionIsBeingEdited()) {
Chris@127 74
Chris@127 75 Selection s(getSelectionAt(m_identifyPoint.x(),
Chris@127 76 closeToLeft, closeToRight));
Chris@127 77
Chris@127 78 if (!s.isEmpty()) {
Chris@127 79 if (getSelectedLayer() && getSelectedLayer()->isLayerEditable()) {
Chris@127 80
Chris@127 81 pos = m_identifyPoint;
Chris@127 82 return true;
Chris@127 83 }
Chris@127 84 }
Chris@127 85 }
Chris@127 86
Chris@127 87 return false;
Chris@127 88 }
Chris@127 89
Chris@127 90 bool
Chris@127 91 Pane::selectionIsBeingEdited() const
Chris@127 92 {
Chris@127 93 if (!m_editingSelection.isEmpty()) {
Chris@127 94 if (m_mousePos != m_clickPos &&
Chris@127 95 getFrameForX(m_mousePos.x()) != getFrameForX(m_clickPos.x())) {
Chris@127 96 return true;
Chris@127 97 }
Chris@127 98 }
Chris@127 99 return false;
Chris@127 100 }
Chris@127 101
Chris@127 102 void
Chris@127 103 Pane::setCentreLineVisible(bool visible)
Chris@127 104 {
Chris@127 105 m_centreLineVisible = visible;
Chris@127 106 update();
Chris@127 107 }
Chris@127 108
Chris@127 109 void
Chris@127 110 Pane::paintEvent(QPaintEvent *e)
Chris@127 111 {
Chris@127 112 // Profiler profiler("Pane::paintEvent", true);
Chris@127 113
Chris@127 114 QPainter paint;
Chris@127 115
Chris@127 116 QRect r(rect());
Chris@127 117
Chris@127 118 if (e) {
Chris@127 119 r = e->rect();
Chris@127 120 }
Chris@127 121 /*
Chris@127 122 paint.begin(this);
Chris@127 123 paint.setClipRect(r);
Chris@127 124
Chris@127 125 if (hasLightBackground()) {
Chris@127 126 paint.setPen(Qt::white);
Chris@127 127 paint.setBrush(Qt::white);
Chris@127 128 } else {
Chris@127 129 paint.setPen(Qt::black);
Chris@127 130 paint.setBrush(Qt::black);
Chris@127 131 }
Chris@127 132 paint.drawRect(r);
Chris@127 133
Chris@127 134 paint.end();
Chris@127 135 */
Chris@127 136 View::paintEvent(e);
Chris@127 137
Chris@127 138 paint.begin(this);
Chris@127 139
Chris@127 140 if (e) {
Chris@127 141 paint.setClipRect(r);
Chris@127 142 }
Chris@127 143
Chris@127 144 const Model *waveformModel = 0; // just for reporting purposes
Chris@127 145 int verticalScaleWidth = 0;
Chris@127 146
Chris@127 147 int fontHeight = paint.fontMetrics().height();
Chris@127 148 int fontAscent = paint.fontMetrics().ascent();
Chris@127 149
Chris@127 150 if (m_manager &&
Chris@127 151 !m_manager->isPlaying() &&
Chris@127 152 m_manager->getToolMode() == ViewManager::SelectMode) {
Chris@127 153
Chris@127 154 for (LayerList::iterator vi = m_layers.end(); vi != m_layers.begin(); ) {
Chris@127 155 --vi;
Chris@127 156
Chris@127 157 std::vector<QRect> crosshairExtents;
Chris@127 158
Chris@127 159 if ((*vi)->getCrosshairExtents(this, paint, m_identifyPoint,
Chris@127 160 crosshairExtents)) {
Chris@127 161 (*vi)->paintCrosshairs(this, paint, m_identifyPoint);
Chris@127 162 break;
Chris@127 163 } else if ((*vi)->isLayerOpaque()) {
Chris@127 164 break;
Chris@127 165 }
Chris@127 166 }
Chris@127 167 }
Chris@127 168
Chris@127 169 for (LayerList::iterator vi = m_layers.end(); vi != m_layers.begin(); ) {
Chris@127 170 --vi;
Chris@127 171
Chris@127 172 if (dynamic_cast<WaveformLayer *>(*vi)) {
Chris@127 173 waveformModel = (*vi)->getModel();
Chris@127 174 }
Chris@127 175
Chris@127 176 if (!m_manager ||
Chris@127 177 m_manager->getOverlayMode() == ViewManager::NoOverlays) {
Chris@127 178 break;
Chris@127 179 }
Chris@127 180
Chris@127 181 verticalScaleWidth = (*vi)->getVerticalScaleWidth(this, paint);
Chris@127 182
Chris@127 183 if (verticalScaleWidth > 0 && r.left() < verticalScaleWidth) {
Chris@127 184
Chris@127 185 // Profiler profiler("Pane::paintEvent - painting vertical scale", true);
Chris@127 186
Chris@127 187 // std::cerr << "Pane::paintEvent: calling paint.save() in vertical scale block" << std::endl;
Chris@127 188 paint.save();
Chris@127 189
Chris@127 190 paint.setPen(Qt::black);
Chris@127 191 paint.setBrush(Qt::white);
Chris@127 192 paint.drawRect(0, -1, verticalScaleWidth, height()+1);
Chris@127 193
Chris@127 194 paint.setBrush(Qt::NoBrush);
Chris@127 195 (*vi)->paintVerticalScale
Chris@127 196 (this, paint, QRect(0, 0, verticalScaleWidth, height()));
Chris@127 197
Chris@127 198 paint.restore();
Chris@127 199 }
Chris@127 200
Chris@127 201 if (m_identifyFeatures) {
Chris@127 202
Chris@127 203 QPoint pos = m_identifyPoint;
Chris@127 204 QString desc = (*vi)->getFeatureDescription(this, pos);
Chris@127 205
Chris@127 206 if (desc != "") {
Chris@127 207
Chris@127 208 paint.save();
Chris@127 209
Chris@127 210 int tabStop =
Chris@127 211 paint.fontMetrics().width(tr("Some lengthy prefix:"));
Chris@127 212
Chris@127 213 QRect boundingRect =
Chris@127 214 paint.fontMetrics().boundingRect
Chris@127 215 (rect(),
Chris@127 216 Qt::AlignRight | Qt::AlignTop | Qt::TextExpandTabs,
Chris@127 217 desc, tabStop);
Chris@127 218
Chris@127 219 if (hasLightBackground()) {
Chris@127 220 paint.setPen(Qt::NoPen);
Chris@127 221 paint.setBrush(QColor(250, 250, 250, 200));
Chris@127 222 } else {
Chris@127 223 paint.setPen(Qt::NoPen);
Chris@127 224 paint.setBrush(QColor(50, 50, 50, 200));
Chris@127 225 }
Chris@127 226
Chris@127 227 int extra = paint.fontMetrics().descent();
Chris@127 228 paint.drawRect(width() - boundingRect.width() - 10 - extra,
Chris@127 229 10 - extra,
Chris@127 230 boundingRect.width() + 2 * extra,
Chris@127 231 boundingRect.height() + extra);
Chris@127 232
Chris@127 233 if (hasLightBackground()) {
Chris@127 234 paint.setPen(QColor(150, 20, 0));
Chris@127 235 } else {
Chris@127 236 paint.setPen(QColor(255, 150, 100));
Chris@127 237 }
Chris@127 238
Chris@127 239 QTextOption option;
Chris@127 240 option.setWrapMode(QTextOption::NoWrap);
Chris@127 241 option.setAlignment(Qt::AlignRight | Qt::AlignTop);
Chris@127 242 option.setTabStop(tabStop);
Chris@127 243 paint.drawText(QRectF(width() - boundingRect.width() - 10, 10,
Chris@127 244 boundingRect.width(),
Chris@127 245 boundingRect.height()),
Chris@127 246 desc,
Chris@127 247 option);
Chris@127 248
Chris@127 249 paint.restore();
Chris@127 250 }
Chris@127 251 }
Chris@127 252
Chris@127 253 break;
Chris@127 254 }
Chris@127 255
Chris@127 256 int sampleRate = getModelsSampleRate();
Chris@127 257 paint.setBrush(Qt::NoBrush);
Chris@127 258
Chris@127 259 if (m_centreLineVisible) {
Chris@127 260
Chris@127 261 if (hasLightBackground()) {
Chris@127 262 paint.setPen(QColor(50, 50, 50));
Chris@127 263 } else {
Chris@127 264 paint.setPen(QColor(200, 200, 200));
Chris@127 265 }
Chris@127 266 paint.drawLine(width() / 2, 0, width() / 2, height() - 1);
Chris@127 267
Chris@127 268 paint.setPen(QColor(50, 50, 50));
Chris@127 269
Chris@127 270 int y = height() - fontHeight
Chris@127 271 + fontAscent - 6;
Chris@127 272
Chris@127 273 LayerList::iterator vi = m_layers.end();
Chris@127 274
Chris@127 275 if (vi != m_layers.begin()) {
Chris@127 276
Chris@127 277 switch ((*--vi)->getPreferredFrameCountPosition()) {
Chris@127 278
Chris@127 279 case Layer::PositionTop:
Chris@127 280 y = fontAscent + 6;
Chris@127 281 break;
Chris@127 282
Chris@127 283 case Layer::PositionMiddle:
Chris@127 284 y = (height() - fontHeight) / 2
Chris@127 285 + fontAscent;
Chris@127 286 break;
Chris@127 287
Chris@127 288 case Layer::PositionBottom:
Chris@127 289 // y already set correctly
Chris@127 290 break;
Chris@127 291 }
Chris@127 292 }
Chris@127 293
Chris@127 294 if (m_manager &&
Chris@127 295 m_manager->getOverlayMode() != ViewManager::NoOverlays) {
Chris@127 296
Chris@127 297 if (sampleRate) {
Chris@127 298
Chris@127 299 QString text(QString::fromStdString
Chris@127 300 (RealTime::frame2RealTime
Chris@127 301 (m_centreFrame, sampleRate).toText(true)));
Chris@127 302
Chris@127 303 int tw = paint.fontMetrics().width(text);
Chris@127 304 int x = width()/2 - 4 - tw;
Chris@127 305
Chris@127 306 drawVisibleText(paint, x, y, text, OutlinedText);
Chris@127 307 }
Chris@127 308
Chris@127 309 QString text = QString("%1").arg(m_centreFrame);
Chris@127 310
Chris@127 311 int tw = paint.fontMetrics().width(text);
Chris@127 312 int x = width()/2 + 4;
Chris@127 313
Chris@127 314 drawVisibleText(paint, x, y, text, OutlinedText);
Chris@127 315 }
Chris@127 316
Chris@127 317 } else {
Chris@127 318
Chris@127 319 paint.setPen(QColor(50, 50, 50));
Chris@127 320 }
Chris@127 321
Chris@127 322 if (waveformModel &&
Chris@127 323 m_manager &&
Chris@127 324 m_manager->getOverlayMode() != ViewManager::NoOverlays &&
Chris@127 325 r.y() + r.height() >= height() - fontHeight - 6) {
Chris@127 326
Chris@127 327 size_t mainModelRate = m_manager->getMainModelSampleRate();
Chris@127 328 size_t playbackRate = m_manager->getPlaybackSampleRate();
Chris@127 329
Chris@127 330 QString srNote = "";
Chris@127 331
Chris@127 332 // Show (R) for waveform models that will be resampled on
Chris@127 333 // playback, and (X) for waveform models that will be played
Chris@127 334 // at the wrong rate because their rate differs from that of
Chris@127 335 // the main model.
Chris@127 336
Chris@127 337 if (sampleRate == mainModelRate) {
Chris@127 338 if (sampleRate != playbackRate) srNote = " " + tr("(R)");
Chris@127 339 } else {
Chris@127 340 std::cerr << "Sample rate = " << sampleRate << ", main model rate = " << mainModelRate << std::endl;
Chris@127 341 srNote = " " + tr("(X)");
Chris@127 342 }
Chris@127 343
Chris@127 344 QString desc = tr("%1 / %2Hz%3")
Chris@127 345 .arg(RealTime::frame2RealTime(waveformModel->getEndFrame(),
Chris@127 346 sampleRate)
Chris@127 347 .toText(false).c_str())
Chris@127 348 .arg(sampleRate)
Chris@127 349 .arg(srNote);
Chris@127 350
Chris@127 351 if (r.x() < verticalScaleWidth + 5 + paint.fontMetrics().width(desc)) {
Chris@127 352 drawVisibleText(paint, verticalScaleWidth + 5,
Chris@127 353 height() - fontHeight + fontAscent - 6,
Chris@127 354 desc, OutlinedText);
Chris@127 355 }
Chris@127 356 }
Chris@127 357
Chris@127 358 if (m_manager &&
Chris@127 359 m_manager->getOverlayMode() == ViewManager::AllOverlays &&
Chris@127 360 r.y() + r.height() >= height() - m_layers.size() * fontHeight - 6) {
Chris@127 361
Chris@127 362 std::vector<QString> texts;
Chris@127 363 int maxTextWidth = 0;
Chris@127 364
Chris@127 365 for (LayerList::iterator i = m_layers.begin(); i != m_layers.end(); ++i) {
Chris@127 366
Chris@127 367 QString text = (*i)->getLayerPresentationName();
Chris@127 368 int tw = paint.fontMetrics().width(text);
Chris@127 369 bool reduced = false;
Chris@127 370 while (tw > width() / 3 && text.length() > 4) {
Chris@127 371 if (!reduced && text.length() > 8) {
Chris@127 372 text = text.left(text.length() - 4);
Chris@127 373 } else {
Chris@127 374 text = text.left(text.length() - 2);
Chris@127 375 }
Chris@127 376 reduced = true;
Chris@127 377 tw = paint.fontMetrics().width(text + "...");
Chris@127 378 }
Chris@127 379 if (reduced) {
Chris@127 380 texts.push_back(text + "...");
Chris@127 381 } else {
Chris@127 382 texts.push_back(text);
Chris@127 383 }
Chris@127 384 if (tw > maxTextWidth) maxTextWidth = tw;
Chris@127 385 }
Chris@127 386
Chris@127 387 int lly = height() - 6;
Chris@127 388
Chris@127 389 if (r.x() + r.width() >= width() - maxTextWidth - 5) {
Chris@127 390
Chris@127 391 for (int i = 0; i < texts.size(); ++i) {
Chris@127 392
Chris@127 393 if (i == texts.size() - 1) {
Chris@127 394 paint.setPen(Qt::black);
Chris@127 395 }
Chris@127 396
Chris@127 397 drawVisibleText(paint, width() - maxTextWidth - 5,
Chris@127 398 lly - fontHeight + fontAscent,
Chris@127 399 texts[i], OutlinedText);
Chris@127 400
Chris@127 401 lly -= fontHeight;
Chris@127 402 }
Chris@127 403 }
Chris@127 404 }
Chris@127 405
Chris@127 406 if (m_clickedInRange && m_shiftPressed) {
Chris@127 407 if (m_manager && (m_manager->getToolMode() == ViewManager::NavigateMode)) {
Chris@127 408 //!!! be nice if this looked a bit more in keeping with the
Chris@127 409 //selection block
Chris@127 410 paint.setPen(Qt::blue);
Chris@127 411 paint.drawRect(m_clickPos.x(), m_clickPos.y(),
Chris@127 412 m_mousePos.x() - m_clickPos.x(),
Chris@127 413 m_mousePos.y() - m_clickPos.y());
Chris@127 414 }
Chris@127 415 }
Chris@127 416
Chris@127 417 if (selectionIsBeingEdited()) {
Chris@127 418
Chris@127 419 int offset = m_mousePos.x() - m_clickPos.x();
Chris@127 420 int p0 = getXForFrame(m_editingSelection.getStartFrame()) + offset;
Chris@127 421 int p1 = getXForFrame(m_editingSelection.getEndFrame()) + offset;
Chris@127 422
Chris@127 423 if (m_editingSelectionEdge < 0) {
Chris@127 424 p1 = getXForFrame(m_editingSelection.getEndFrame());
Chris@127 425 } else if (m_editingSelectionEdge > 0) {
Chris@127 426 p0 = getXForFrame(m_editingSelection.getStartFrame());
Chris@127 427 }
Chris@127 428
Chris@127 429 paint.save();
Chris@127 430 if (hasLightBackground()) {
Chris@127 431 paint.setPen(QPen(Qt::black, 2));
Chris@127 432 } else {
Chris@127 433 paint.setPen(QPen(Qt::white, 2));
Chris@127 434 }
Chris@127 435
Chris@127 436 //!!! duplicating display policy with View::drawSelections
Chris@127 437
Chris@127 438 if (m_editingSelectionEdge < 0) {
Chris@127 439 paint.drawLine(p0, 1, p1, 1);
Chris@127 440 paint.drawLine(p0, 0, p0, height());
Chris@127 441 paint.drawLine(p0, height() - 1, p1, height() - 1);
Chris@127 442 } else if (m_editingSelectionEdge > 0) {
Chris@127 443 paint.drawLine(p0, 1, p1, 1);
Chris@127 444 paint.drawLine(p1, 0, p1, height());
Chris@127 445 paint.drawLine(p0, height() - 1, p1, height() - 1);
Chris@127 446 } else {
Chris@127 447 paint.setBrush(Qt::NoBrush);
Chris@127 448 paint.drawRect(p0, 1, p1 - p0, height() - 2);
Chris@127 449 }
Chris@127 450 paint.restore();
Chris@127 451 }
Chris@127 452
Chris@127 453 paint.end();
Chris@127 454 }
Chris@127 455
Chris@127 456 Selection
Chris@127 457 Pane::getSelectionAt(int x, bool &closeToLeftEdge, bool &closeToRightEdge) const
Chris@127 458 {
Chris@127 459 closeToLeftEdge = closeToRightEdge = false;
Chris@127 460
Chris@127 461 if (!m_manager) return Selection();
Chris@127 462
Chris@127 463 long testFrame = getFrameForX(x - 5);
Chris@127 464 if (testFrame < 0) {
Chris@127 465 testFrame = getFrameForX(x);
Chris@127 466 if (testFrame < 0) return Selection();
Chris@127 467 }
Chris@127 468
Chris@127 469 Selection selection = m_manager->getContainingSelection(testFrame, true);
Chris@127 470 if (selection.isEmpty()) return selection;
Chris@127 471
Chris@127 472 int lx = getXForFrame(selection.getStartFrame());
Chris@127 473 int rx = getXForFrame(selection.getEndFrame());
Chris@127 474
Chris@127 475 int fuzz = 2;
Chris@127 476 if (x < lx - fuzz || x > rx + fuzz) return Selection();
Chris@127 477
Chris@127 478 int width = rx - lx;
Chris@127 479 fuzz = 3;
Chris@127 480 if (width < 12) fuzz = width / 4;
Chris@127 481 if (fuzz < 1) fuzz = 1;
Chris@127 482
Chris@127 483 if (x < lx + fuzz) closeToLeftEdge = true;
Chris@127 484 if (x > rx - fuzz) closeToRightEdge = true;
Chris@127 485
Chris@127 486 return selection;
Chris@127 487 }
Chris@127 488
Chris@127 489 void
Chris@127 490 Pane::mousePressEvent(QMouseEvent *e)
Chris@127 491 {
Chris@127 492 if (e->buttons() & Qt::RightButton) {
Chris@127 493 emit rightButtonMenuRequested(mapToGlobal(e->pos()));
Chris@127 494 return;
Chris@127 495 }
Chris@127 496
Chris@127 497 m_clickPos = e->pos();
Chris@127 498 m_clickedInRange = true;
Chris@127 499 m_editingSelection = Selection();
Chris@127 500 m_editingSelectionEdge = 0;
Chris@127 501 m_shiftPressed = (e->modifiers() & Qt::ShiftModifier);
Chris@127 502 m_ctrlPressed = (e->modifiers() & Qt::ControlModifier);
Chris@127 503
Chris@127 504 ViewManager::ToolMode mode = ViewManager::NavigateMode;
Chris@127 505 if (m_manager) mode = m_manager->getToolMode();
Chris@127 506
Chris@127 507 m_navigating = false;
Chris@127 508
Chris@127 509 if (mode == ViewManager::NavigateMode || (e->buttons() & Qt::MidButton)) {
Chris@127 510
Chris@127 511 if (mode != ViewManager::NavigateMode) {
Chris@127 512 setCursor(Qt::PointingHandCursor);
Chris@127 513 }
Chris@127 514
Chris@127 515 m_navigating = true;
Chris@127 516 m_dragCentreFrame = m_centreFrame;
Chris@127 517
Chris@127 518 } else if (mode == ViewManager::SelectMode) {
Chris@127 519
Chris@127 520 bool closeToLeft = false, closeToRight = false;
Chris@127 521 Selection selection = getSelectionAt(e->x(), closeToLeft, closeToRight);
Chris@127 522
Chris@127 523 if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) {
Chris@127 524
Chris@127 525 m_manager->removeSelection(selection);
Chris@127 526
Chris@127 527 if (closeToLeft) {
Chris@127 528 m_selectionStartFrame = selection.getEndFrame();
Chris@127 529 } else {
Chris@127 530 m_selectionStartFrame = selection.getStartFrame();
Chris@127 531 }
Chris@127 532
Chris@127 533 m_manager->setInProgressSelection(selection, false);
Chris@127 534 m_resizing = true;
Chris@127 535
Chris@127 536 } else {
Chris@127 537
Chris@127 538 int mouseFrame = getFrameForX(e->x());
Chris@127 539 size_t resolution = 1;
Chris@127 540 int snapFrame = mouseFrame;
Chris@127 541
Chris@127 542 Layer *layer = getSelectedLayer();
Chris@127 543 if (layer && !m_shiftPressed) {
Chris@127 544 layer->snapToFeatureFrame(this, snapFrame,
Chris@127 545 resolution, Layer::SnapLeft);
Chris@127 546 }
Chris@127 547
Chris@127 548 if (snapFrame < 0) snapFrame = 0;
Chris@127 549 m_selectionStartFrame = snapFrame;
Chris@127 550 if (m_manager) {
Chris@127 551 m_manager->setInProgressSelection(Selection(snapFrame,
Chris@127 552 snapFrame + resolution),
Chris@127 553 !m_ctrlPressed);
Chris@127 554 }
Chris@127 555
Chris@127 556 m_resizing = false;
Chris@127 557 }
Chris@127 558
Chris@127 559 update();
Chris@127 560
Chris@127 561 } else if (mode == ViewManager::DrawMode) {
Chris@127 562
Chris@127 563 Layer *layer = getSelectedLayer();
Chris@127 564 if (layer && layer->isLayerEditable()) {
Chris@127 565 layer->drawStart(this, e);
Chris@127 566 }
Chris@127 567
Chris@127 568 } else if (mode == ViewManager::EditMode) {
Chris@127 569
Chris@127 570 if (!editSelectionStart(e)) {
Chris@127 571 Layer *layer = getSelectedLayer();
Chris@127 572 if (layer && layer->isLayerEditable()) {
Chris@127 573 layer->editStart(this, e);
Chris@127 574 }
Chris@127 575 }
Chris@127 576 }
Chris@127 577
Chris@127 578 emit paneInteractedWith();
Chris@127 579 }
Chris@127 580
Chris@127 581 void
Chris@127 582 Pane::mouseReleaseEvent(QMouseEvent *e)
Chris@127 583 {
Chris@127 584 if (e->buttons() & Qt::RightButton) {
Chris@127 585 return;
Chris@127 586 }
Chris@127 587
Chris@127 588 ViewManager::ToolMode mode = ViewManager::NavigateMode;
Chris@127 589 if (m_manager) mode = m_manager->getToolMode();
Chris@127 590
Chris@127 591 if (m_clickedInRange) {
Chris@127 592 mouseMoveEvent(e);
Chris@127 593 }
Chris@127 594
Chris@127 595 if (m_navigating || mode == ViewManager::NavigateMode) {
Chris@127 596
Chris@127 597 m_navigating = false;
Chris@127 598
Chris@127 599 if (mode != ViewManager::NavigateMode) {
Chris@127 600 // restore cursor
Chris@127 601 toolModeChanged();
Chris@127 602 }
Chris@127 603
Chris@127 604 if (m_shiftPressed) {
Chris@127 605
Chris@127 606 int x0 = std::min(m_clickPos.x(), m_mousePos.x());
Chris@127 607 int x1 = std::max(m_clickPos.x(), m_mousePos.x());
Chris@127 608 int w = x1 - x0;
Chris@127 609
Chris@127 610 int y0 = std::min(m_clickPos.y(), m_mousePos.y());
Chris@127 611 int y1 = std::max(m_clickPos.y(), m_mousePos.y());
Chris@127 612 // int h = y1 - y0;
Chris@127 613
Chris@127 614 long newStartFrame = getFrameForX(x0);
Chris@127 615
Chris@127 616 long visibleFrames = getEndFrame() - getStartFrame();
Chris@127 617 if (newStartFrame <= -visibleFrames) {
Chris@127 618 newStartFrame = -visibleFrames + 1;
Chris@127 619 }
Chris@127 620
Chris@127 621 if (newStartFrame >= long(getModelsEndFrame())) {
Chris@127 622 newStartFrame = getModelsEndFrame() - 1;
Chris@127 623 }
Chris@127 624
Chris@127 625 float ratio = float(w) / float(width());
Chris@127 626 // std::cerr << "ratio: " << ratio << std::endl;
Chris@127 627 size_t newZoomLevel = (size_t)nearbyint(m_zoomLevel * ratio);
Chris@127 628 if (newZoomLevel < 1) newZoomLevel = 1;
Chris@127 629
Chris@127 630 // std::cerr << "start: " << m_startFrame << ", level " << m_zoomLevel << std::endl;
Chris@127 631 setZoomLevel(getZoomConstraintBlockSize(newZoomLevel));
Chris@127 632 setStartFrame(newStartFrame);
Chris@127 633
Chris@127 634 //!!! lots of faff, shouldn't be here
Chris@127 635
Chris@127 636 QString unit;
Chris@127 637 float min, max;
Chris@127 638 bool log;
Chris@127 639 Layer *layer = 0;
Chris@127 640 for (LayerList::const_iterator i = m_layers.begin();
Chris@127 641 i != m_layers.end(); ++i) {
Chris@127 642 if ((*i)->getValueExtents(min, max, log, unit) &&
Chris@127 643 (*i)->getDisplayExtents(min, max)) {
Chris@127 644 layer = *i;
Chris@127 645 break;
Chris@127 646 }
Chris@127 647 }
Chris@127 648
Chris@127 649 if (layer) {
Chris@127 650 if (log) {
Chris@127 651 min = (min < 0.0) ? -log10f(-min) : (min == 0.0) ? 0.0 : log10f(min);
Chris@127 652 max = (max < 0.0) ? -log10f(-max) : (max == 0.0) ? 0.0 : log10f(max);
Chris@127 653 }
Chris@127 654 float rmin = min + ((max - min) * (height() - y1)) / height();
Chris@127 655 float rmax = min + ((max - min) * (height() - y0)) / height();
Chris@127 656 std::cerr << "min: " << min << ", max: " << max << ", y0: " << y0 << ", y1: " << y1 << ", h: " << height() << ", rmin: " << rmin << ", rmax: " << rmax << std::endl;
Chris@127 657 if (log) {
Chris@127 658 rmin = powf(10, rmin);
Chris@127 659 rmax = powf(10, rmax);
Chris@127 660 }
Chris@127 661 std::cerr << "finally: rmin: " << rmin << ", rmax: " << rmax << " " << unit.toStdString() << std::endl;
Chris@127 662
Chris@127 663 layer->setDisplayExtents(rmin, rmax);
Chris@127 664 }
Chris@127 665
Chris@127 666 //cerr << "mouseReleaseEvent: start frame now " << m_startFrame << endl;
Chris@127 667 // update();
Chris@127 668 }
Chris@127 669
Chris@127 670 } else if (mode == ViewManager::SelectMode) {
Chris@127 671
Chris@127 672 if (m_manager && m_manager->haveInProgressSelection()) {
Chris@127 673
Chris@127 674 bool exclusive;
Chris@127 675 Selection selection = m_manager->getInProgressSelection(exclusive);
Chris@127 676
Chris@127 677 if (selection.getEndFrame() < selection.getStartFrame() + 2) {
Chris@127 678 selection = Selection();
Chris@127 679 }
Chris@127 680
Chris@127 681 m_manager->clearInProgressSelection();
Chris@127 682
Chris@127 683 if (exclusive) {
Chris@127 684 m_manager->setSelection(selection);
Chris@127 685 } else {
Chris@127 686 m_manager->addSelection(selection);
Chris@127 687 }
Chris@127 688 }
Chris@127 689
Chris@127 690 update();
Chris@127 691
Chris@127 692 } else if (mode == ViewManager::DrawMode) {
Chris@127 693
Chris@127 694 Layer *layer = getSelectedLayer();
Chris@127 695 if (layer && layer->isLayerEditable()) {
Chris@127 696 layer->drawEnd(this, e);
Chris@127 697 update();
Chris@127 698 }
Chris@127 699
Chris@127 700 } else if (mode == ViewManager::EditMode) {
Chris@127 701
Chris@127 702 if (!editSelectionEnd(e)) {
Chris@127 703 Layer *layer = getSelectedLayer();
Chris@127 704 if (layer && layer->isLayerEditable()) {
Chris@127 705 layer->editEnd(this, e);
Chris@127 706 update();
Chris@127 707 }
Chris@127 708 }
Chris@127 709 }
Chris@127 710
Chris@127 711 m_clickedInRange = false;
Chris@127 712
Chris@127 713 emit paneInteractedWith();
Chris@127 714 }
Chris@127 715
Chris@127 716 void
Chris@127 717 Pane::mouseMoveEvent(QMouseEvent *e)
Chris@127 718 {
Chris@127 719 if (e->buttons() & Qt::RightButton) {
Chris@127 720 return;
Chris@127 721 }
Chris@127 722
Chris@127 723 ViewManager::ToolMode mode = ViewManager::NavigateMode;
Chris@127 724 if (m_manager) mode = m_manager->getToolMode();
Chris@127 725
Chris@127 726 QPoint prevPoint = m_identifyPoint;
Chris@127 727 m_identifyPoint = e->pos();
Chris@127 728
Chris@127 729 if (!m_clickedInRange) {
Chris@127 730
Chris@127 731 if (mode == ViewManager::SelectMode) {
Chris@127 732 bool closeToLeft = false, closeToRight = false;
Chris@127 733 getSelectionAt(e->x(), closeToLeft, closeToRight);
Chris@127 734 if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) {
Chris@127 735 setCursor(Qt::SizeHorCursor);
Chris@127 736 } else {
Chris@127 737 setCursor(Qt::ArrowCursor);
Chris@127 738 }
Chris@127 739 }
Chris@127 740
Chris@127 741 //!!! if (mode != ViewManager::DrawMode) {
Chris@127 742
Chris@127 743 if (!m_manager->isPlaying()) {
Chris@127 744
Chris@127 745 if (getSelectedLayer()) {
Chris@127 746
Chris@127 747 bool previouslyIdentifying = m_identifyFeatures;
Chris@127 748 m_identifyFeatures = true;
Chris@127 749
Chris@127 750 if (m_identifyFeatures != previouslyIdentifying ||
Chris@127 751 m_identifyPoint != prevPoint) {
Chris@127 752 update();
Chris@127 753 }
Chris@127 754 }
Chris@127 755
Chris@127 756 }
Chris@127 757
Chris@127 758 // }
Chris@127 759
Chris@127 760 return;
Chris@127 761 }
Chris@127 762
Chris@127 763 if (m_navigating || mode == ViewManager::NavigateMode) {
Chris@127 764
Chris@127 765 if (m_shiftPressed) {
Chris@127 766
Chris@127 767 m_mousePos = e->pos();
Chris@127 768 update();
Chris@127 769
Chris@127 770 } else {
Chris@127 771
Chris@127 772 long frameOff = getFrameForX(e->x()) - getFrameForX(m_clickPos.x());
Chris@127 773
Chris@127 774 size_t newCentreFrame = m_dragCentreFrame;
Chris@127 775
Chris@127 776 if (frameOff < 0) {
Chris@127 777 newCentreFrame -= frameOff;
Chris@127 778 } else if (newCentreFrame >= size_t(frameOff)) {
Chris@127 779 newCentreFrame -= frameOff;
Chris@127 780 } else {
Chris@127 781 newCentreFrame = 0;
Chris@127 782 }
Chris@127 783
Chris@127 784 if (newCentreFrame >= getModelsEndFrame()) {
Chris@127 785 newCentreFrame = getModelsEndFrame();
Chris@127 786 if (newCentreFrame > 0) --newCentreFrame;
Chris@127 787 }
Chris@127 788
Chris@127 789 if (getXForFrame(m_centreFrame) != getXForFrame(newCentreFrame)) {
Chris@127 790 setCentreFrame(newCentreFrame);
Chris@127 791 }
Chris@127 792 }
Chris@127 793
Chris@127 794 } else if (mode == ViewManager::SelectMode) {
Chris@127 795
Chris@127 796 int mouseFrame = getFrameForX(e->x());
Chris@127 797 size_t resolution = 1;
Chris@127 798 int snapFrameLeft = mouseFrame;
Chris@127 799 int snapFrameRight = mouseFrame;
Chris@127 800
Chris@127 801 Layer *layer = getSelectedLayer();
Chris@127 802 if (layer && !m_shiftPressed) {
Chris@127 803 layer->snapToFeatureFrame(this, snapFrameLeft,
Chris@127 804 resolution, Layer::SnapLeft);
Chris@127 805 layer->snapToFeatureFrame(this, snapFrameRight,
Chris@127 806 resolution, Layer::SnapRight);
Chris@127 807 }
Chris@127 808
Chris@127 809 // std::cerr << "snap: frame = " << mouseFrame << ", start frame = " << m_selectionStartFrame << ", left = " << snapFrameLeft << ", right = " << snapFrameRight << std::endl;
Chris@127 810
Chris@127 811 if (snapFrameLeft < 0) snapFrameLeft = 0;
Chris@127 812 if (snapFrameRight < 0) snapFrameRight = 0;
Chris@127 813
Chris@127 814 size_t min, max;
Chris@127 815
Chris@127 816 if (m_selectionStartFrame > snapFrameLeft) {
Chris@127 817 min = snapFrameLeft;
Chris@127 818 max = m_selectionStartFrame;
Chris@127 819 } else if (snapFrameRight > m_selectionStartFrame) {
Chris@127 820 min = m_selectionStartFrame;
Chris@127 821 max = snapFrameRight;
Chris@127 822 } else {
Chris@127 823 min = snapFrameLeft;
Chris@127 824 max = snapFrameRight;
Chris@127 825 }
Chris@127 826
Chris@127 827 if (m_manager) {
Chris@127 828 m_manager->setInProgressSelection(Selection(min, max),
Chris@127 829 !m_resizing && !m_ctrlPressed);
Chris@127 830 }
Chris@127 831
Chris@127 832 bool doScroll = false;
Chris@127 833 if (!m_manager) doScroll = true;
Chris@127 834 if (!m_manager->isPlaying()) doScroll = true;
Chris@127 835 if (m_followPlay != PlaybackScrollContinuous) doScroll = true;
Chris@127 836
Chris@127 837 if (doScroll) {
Chris@127 838 int offset = mouseFrame - getStartFrame();
Chris@127 839 int available = getEndFrame() - getStartFrame();
Chris@127 840 if (offset >= available * 0.95) {
Chris@127 841 int move = int(offset - available * 0.95) + 1;
Chris@127 842 setCentreFrame(m_centreFrame + move);
Chris@127 843 } else if (offset <= available * 0.10) {
Chris@127 844 int move = int(available * 0.10 - offset) + 1;
Chris@127 845 if (m_centreFrame > move) {
Chris@127 846 setCentreFrame(m_centreFrame - move);
Chris@127 847 } else {
Chris@127 848 setCentreFrame(0);
Chris@127 849 }
Chris@127 850 }
Chris@127 851 }
Chris@127 852
Chris@127 853 update();
Chris@127 854
Chris@127 855 } else if (mode == ViewManager::DrawMode) {
Chris@127 856
Chris@127 857 Layer *layer = getSelectedLayer();
Chris@127 858 if (layer && layer->isLayerEditable()) {
Chris@127 859 layer->drawDrag(this, e);
Chris@127 860 }
Chris@127 861
Chris@127 862 } else if (mode == ViewManager::EditMode) {
Chris@127 863
Chris@127 864 if (!editSelectionDrag(e)) {
Chris@127 865 Layer *layer = getSelectedLayer();
Chris@127 866 if (layer && layer->isLayerEditable()) {
Chris@127 867 layer->editDrag(this, e);
Chris@127 868 }
Chris@127 869 }
Chris@127 870 }
Chris@127 871 }
Chris@127 872
Chris@127 873 void
Chris@127 874 Pane::mouseDoubleClickEvent(QMouseEvent *e)
Chris@127 875 {
Chris@127 876 if (e->buttons() & Qt::RightButton) {
Chris@127 877 return;
Chris@127 878 }
Chris@127 879
Chris@127 880 // std::cerr << "mouseDoubleClickEvent" << std::endl;
Chris@127 881
Chris@127 882 m_clickPos = e->pos();
Chris@127 883 m_clickedInRange = true;
Chris@127 884 m_shiftPressed = (e->modifiers() & Qt::ShiftModifier);
Chris@127 885 m_ctrlPressed = (e->modifiers() & Qt::ControlModifier);
Chris@127 886
Chris@127 887 ViewManager::ToolMode mode = ViewManager::NavigateMode;
Chris@127 888 if (m_manager) mode = m_manager->getToolMode();
Chris@127 889
Chris@127 890 if (mode == ViewManager::NavigateMode ||
Chris@127 891 mode == ViewManager::EditMode) {
Chris@127 892
Chris@127 893 Layer *layer = getSelectedLayer();
Chris@127 894 if (layer && layer->isLayerEditable()) {
Chris@127 895 layer->editOpen(this, e);
Chris@127 896 }
Chris@127 897 }
Chris@127 898 }
Chris@127 899
Chris@127 900 void
Chris@127 901 Pane::leaveEvent(QEvent *)
Chris@127 902 {
Chris@127 903 bool previouslyIdentifying = m_identifyFeatures;
Chris@127 904 m_identifyFeatures = false;
Chris@127 905 if (previouslyIdentifying) update();
Chris@127 906 }
Chris@127 907
Chris@127 908 void
Chris@127 909 Pane::wheelEvent(QWheelEvent *e)
Chris@127 910 {
Chris@127 911 //std::cerr << "wheelEvent, delta " << e->delta() << std::endl;
Chris@127 912
Chris@127 913 int count = e->delta();
Chris@127 914
Chris@127 915 if (count > 0) {
Chris@127 916 if (count >= 120) count /= 120;
Chris@127 917 else count = 1;
Chris@127 918 }
Chris@127 919
Chris@127 920 if (count < 0) {
Chris@127 921 if (count <= -120) count /= 120;
Chris@127 922 else count = -1;
Chris@127 923 }
Chris@127 924
Chris@127 925 if (e->modifiers() & Qt::ControlModifier) {
Chris@127 926
Chris@127 927 // Scroll left or right, rapidly
Chris@127 928
Chris@127 929 if (getStartFrame() < 0 &&
Chris@127 930 getEndFrame() >= getModelsEndFrame()) return;
Chris@127 931
Chris@127 932 long delta = ((width() / 2) * count * m_zoomLevel);
Chris@127 933
Chris@127 934 if (int(m_centreFrame) < delta) {
Chris@127 935 setCentreFrame(0);
Chris@127 936 } else if (int(m_centreFrame) - delta >= int(getModelsEndFrame())) {
Chris@127 937 setCentreFrame(getModelsEndFrame());
Chris@127 938 } else {
Chris@127 939 setCentreFrame(m_centreFrame - delta);
Chris@127 940 }
Chris@127 941
Chris@127 942 } else {
Chris@127 943
Chris@127 944 // Zoom in or out
Chris@127 945
Chris@127 946 int newZoomLevel = m_zoomLevel;
Chris@127 947
Chris@127 948 while (count > 0) {
Chris@127 949 if (newZoomLevel <= 2) {
Chris@127 950 newZoomLevel = 1;
Chris@127 951 break;
Chris@127 952 }
Chris@127 953 newZoomLevel = getZoomConstraintBlockSize(newZoomLevel - 1,
Chris@127 954 ZoomConstraint::RoundDown);
Chris@127 955 --count;
Chris@127 956 }
Chris@127 957
Chris@127 958 while (count < 0) {
Chris@127 959 newZoomLevel = getZoomConstraintBlockSize(newZoomLevel + 1,
Chris@127 960 ZoomConstraint::RoundUp);
Chris@127 961 ++count;
Chris@127 962 }
Chris@127 963
Chris@127 964 if (newZoomLevel != m_zoomLevel) {
Chris@127 965 setZoomLevel(newZoomLevel);
Chris@127 966 }
Chris@127 967 }
Chris@127 968
Chris@127 969 emit paneInteractedWith();
Chris@127 970 }
Chris@127 971
Chris@127 972 bool
Chris@127 973 Pane::editSelectionStart(QMouseEvent *e)
Chris@127 974 {
Chris@127 975 if (!m_identifyFeatures ||
Chris@127 976 !m_manager ||
Chris@127 977 m_manager->getToolMode() != ViewManager::EditMode) {
Chris@127 978 return false;
Chris@127 979 }
Chris@127 980
Chris@127 981 bool closeToLeft, closeToRight;
Chris@127 982 Selection s(getSelectionAt(e->x(), closeToLeft, closeToRight));
Chris@127 983 if (s.isEmpty()) return false;
Chris@127 984 m_editingSelection = s;
Chris@127 985 m_editingSelectionEdge = (closeToLeft ? -1 : closeToRight ? 1 : 0);
Chris@127 986 m_mousePos = e->pos();
Chris@127 987 return true;
Chris@127 988 }
Chris@127 989
Chris@127 990 bool
Chris@127 991 Pane::editSelectionDrag(QMouseEvent *e)
Chris@127 992 {
Chris@127 993 if (m_editingSelection.isEmpty()) return false;
Chris@127 994 m_mousePos = e->pos();
Chris@127 995 update();
Chris@127 996 return true;
Chris@127 997 }
Chris@127 998
Chris@127 999 bool
Chris@127 1000 Pane::editSelectionEnd(QMouseEvent *e)
Chris@127 1001 {
Chris@127 1002 if (m_editingSelection.isEmpty()) return false;
Chris@127 1003
Chris@127 1004 int offset = m_mousePos.x() - m_clickPos.x();
Chris@127 1005 Layer *layer = getSelectedLayer();
Chris@127 1006
Chris@127 1007 if (offset == 0 || !layer) {
Chris@127 1008 m_editingSelection = Selection();
Chris@127 1009 return true;
Chris@127 1010 }
Chris@127 1011
Chris@127 1012 int p0 = getXForFrame(m_editingSelection.getStartFrame()) + offset;
Chris@127 1013 int p1 = getXForFrame(m_editingSelection.getEndFrame()) + offset;
Chris@127 1014
Chris@127 1015 long f0 = getFrameForX(p0);
Chris@127 1016 long f1 = getFrameForX(p1);
Chris@127 1017
Chris@127 1018 Selection newSelection(f0, f1);
Chris@127 1019
Chris@127 1020 if (m_editingSelectionEdge == 0) {
Chris@127 1021
Chris@127 1022 CommandHistory::getInstance()->startCompoundOperation
Chris@127 1023 (tr("Drag Selection"), true);
Chris@127 1024
Chris@127 1025 layer->moveSelection(m_editingSelection, f0);
Chris@127 1026
Chris@127 1027 } else {
Chris@127 1028
Chris@127 1029 CommandHistory::getInstance()->startCompoundOperation
Chris@127 1030 (tr("Resize Selection"), true);
Chris@127 1031
Chris@127 1032 if (m_editingSelectionEdge < 0) {
Chris@127 1033 f1 = m_editingSelection.getEndFrame();
Chris@127 1034 } else {
Chris@127 1035 f0 = m_editingSelection.getStartFrame();
Chris@127 1036 }
Chris@127 1037
Chris@127 1038 newSelection = Selection(f0, f1);
Chris@127 1039 layer->resizeSelection(m_editingSelection, newSelection);
Chris@127 1040 }
Chris@127 1041
Chris@127 1042 m_manager->removeSelection(m_editingSelection);
Chris@127 1043 m_manager->addSelection(newSelection);
Chris@127 1044
Chris@127 1045 CommandHistory::getInstance()->endCompoundOperation();
Chris@127 1046
Chris@127 1047 m_editingSelection = Selection();
Chris@127 1048 return true;
Chris@127 1049 }
Chris@127 1050
Chris@127 1051 void
Chris@127 1052 Pane::toolModeChanged()
Chris@127 1053 {
Chris@127 1054 ViewManager::ToolMode mode = m_manager->getToolMode();
Chris@127 1055 // std::cerr << "Pane::toolModeChanged(" << mode << ")" << std::endl;
Chris@127 1056
Chris@127 1057 switch (mode) {
Chris@127 1058
Chris@127 1059 case ViewManager::NavigateMode:
Chris@127 1060 setCursor(Qt::PointingHandCursor);
Chris@127 1061 break;
Chris@127 1062
Chris@127 1063 case ViewManager::SelectMode:
Chris@127 1064 setCursor(Qt::ArrowCursor);
Chris@127 1065 break;
Chris@127 1066
Chris@127 1067 case ViewManager::EditMode:
Chris@127 1068 setCursor(Qt::UpArrowCursor);
Chris@127 1069 break;
Chris@127 1070
Chris@127 1071 case ViewManager::DrawMode:
Chris@127 1072 setCursor(Qt::CrossCursor);
Chris@127 1073 break;
Chris@127 1074 /*
Chris@127 1075 case ViewManager::TextMode:
Chris@127 1076 setCursor(Qt::IBeamCursor);
Chris@127 1077 break;
Chris@127 1078 */
Chris@127 1079 }
Chris@127 1080 }
Chris@127 1081
Chris@127 1082 QString
Chris@127 1083 Pane::toXmlString(QString indent, QString extraAttributes) const
Chris@127 1084 {
Chris@127 1085 return View::toXmlString
Chris@127 1086 (indent,
Chris@127 1087 QString("type=\"pane\" centreLineVisible=\"%1\" height=\"%2\" %3")
Chris@127 1088 .arg(m_centreLineVisible).arg(height()).arg(extraAttributes));
Chris@127 1089 }
Chris@127 1090
Chris@127 1091
Chris@127 1092 #ifdef INCLUDE_MOCFILES
Chris@127 1093 #include "Pane.moc.cpp"
Chris@127 1094 #endif
Chris@127 1095