comparison view/Pane.cpp @ 771:a964151832a7

Merge from branch tony_integration
author Chris Cannam
date Wed, 14 May 2014 09:54:34 +0100
parents 410816717c2c
children 488add397d34 4c8ca536b54f
comparison
equal deleted inserted replaced
768:8b614632568c 771:a964151832a7
22 #include "ViewManager.h" 22 #include "ViewManager.h"
23 #include "widgets/CommandHistory.h" 23 #include "widgets/CommandHistory.h"
24 #include "widgets/TextAbbrev.h" 24 #include "widgets/TextAbbrev.h"
25 #include "base/Preferences.h" 25 #include "base/Preferences.h"
26 #include "layer/WaveformLayer.h" 26 #include "layer/WaveformLayer.h"
27
28 // GF: added so we can propagate the mouse move event to the note layer for context handling.
29 #include "layer/LayerFactory.h"
30 #include "layer/FlexiNoteLayer.h"
31
27 32
28 //!!! ugh 33 //!!! ugh
29 #include "data/model/WaveFileModel.h" 34 #include "data/model/WaveFileModel.h"
30 35
31 #include <QPaintEvent> 36 #include <QPaintEvent>
83 setMouseTracking(true); 88 setMouseTracking(true);
84 setAcceptDrops(true); 89 setAcceptDrops(true);
85 90
86 updateHeadsUpDisplay(); 91 updateHeadsUpDisplay();
87 92
93 connect(this, SIGNAL(regionOutlined(QRect)),
94 this, SLOT(zoomToRegion(QRect)));
95
88 cerr << "Pane::Pane(" << this << ") returning" << endl; 96 cerr << "Pane::Pane(" << this << ") returning" << endl;
89 } 97 }
90 98
91 void 99 void
92 Pane::updateHeadsUpDisplay() 100 Pane::updateHeadsUpDisplay()
165 RangeMapper *rm = layer->getNewVerticalZoomRangeMapper(); 173 RangeMapper *rm = layer->getNewVerticalZoomRangeMapper();
166 if (rm) m_vthumb->setRangeMapper(rm); 174 if (rm) m_vthumb->setRangeMapper(rm);
167 } 175 }
168 176
169 m_reset = new NotifyingPushButton; 177 m_reset = new NotifyingPushButton;
170 m_reset->setFlat(true); 178 m_reset->setFlat(true);
171 m_reset->setCursor(Qt::ArrowCursor); 179 m_reset->setCursor(Qt::ArrowCursor);
172 m_reset->setFixedHeight(16); 180 m_reset->setFixedHeight(16);
173 m_reset->setFixedWidth(16); 181 m_reset->setFixedWidth(16);
174 m_reset->setIcon(QPixmap(":/icons/zoom-reset.png")); 182 m_reset->setIcon(QPixmap(":/icons/zoom-reset.png"));
175 m_reset->setToolTip(tr("Reset zoom to default")); 183 m_reset->setToolTip(tr("Reset zoom to default"));
325 Pane::shouldIlluminateLocalFeatures(const Layer *layer, QPoint &pos) const 333 Pane::shouldIlluminateLocalFeatures(const Layer *layer, QPoint &pos) const
326 { 334 {
327 QPoint discard; 335 QPoint discard;
328 bool b0, b1; 336 bool b0, b1;
329 337
330 if (m_manager && m_manager->getToolMode() == ViewManager::MeasureMode) { 338 if (m_manager && m_manager->getToolModeFor(this) == ViewManager::MeasureMode) {
331 return false; 339 return false;
332 } 340 }
333 341
334 if (m_manager && !m_manager->shouldIlluminateLocalFeatures()) { 342 if (m_manager && !m_manager->shouldIlluminateLocalFeatures()) {
335 return false; 343 return false;
336 } 344 }
337 345
338 if (layer == getSelectedLayer() && 346 if (layer == getSelectedLayer() &&
339 !shouldIlluminateLocalSelection(discard, b0, b1)) { 347 !shouldIlluminateLocalSelection(discard, b0, b1)) {
340 348
341 pos = m_identifyPoint; 349 pos = m_identifyPoint;
342 return m_identifyFeatures; 350 return m_identifyFeatures;
343 } 351 }
344 352
345 return false; 353 return false;
346 } 354 }
347 355
348 bool 356 bool
349 Pane::shouldIlluminateLocalSelection(QPoint &pos, 357 Pane::shouldIlluminateLocalSelection(QPoint &pos,
350 bool &closeToLeft, 358 bool &closeToLeft,
351 bool &closeToRight) const 359 bool &closeToRight) const
352 { 360 {
353 if (m_identifyFeatures && 361 if (m_identifyFeatures &&
354 m_manager && 362 m_manager &&
355 m_manager->getToolMode() == ViewManager::EditMode && 363 m_manager->getToolModeFor(this) == ViewManager::EditMode &&
356 !m_manager->getSelections().empty() && 364 !m_manager->getSelections().empty() &&
357 !selectionIsBeingEdited()) { 365 !selectionIsBeingEdited()) {
358 366
359 Selection s(getSelectionAt(m_identifyPoint.x(), 367 Selection s(getSelectionAt(m_identifyPoint.x(),
360 closeToLeft, closeToRight)); 368 closeToLeft, closeToRight));
361 369
362 if (!s.isEmpty()) { 370 if (!s.isEmpty()) {
363 if (getSelectedLayer() && getSelectedLayer()->isLayerEditable()) { 371 if (getSelectedLayer() && getSelectedLayer()->isLayerEditable()) {
364 372
365 pos = m_identifyPoint; 373 pos = m_identifyPoint;
366 return true; 374 return true;
367 } 375 }
368 } 376 }
369 } 377 }
370 378
371 return false; 379 return false;
372 } 380 }
373 381
374 bool 382 bool
375 Pane::selectionIsBeingEdited() const 383 Pane::selectionIsBeingEdited() const
376 { 384 {
377 if (!m_editingSelection.isEmpty()) { 385 if (!m_editingSelection.isEmpty()) {
378 if (m_mousePos != m_clickPos && 386 if (m_mousePos != m_clickPos &&
379 getFrameForX(m_mousePos.x()) != getFrameForX(m_clickPos.x())) { 387 getFrameForX(m_mousePos.x()) != getFrameForX(m_clickPos.x())) {
380 return true; 388 return true;
381 } 389 }
382 } 390 }
383 return false; 391 return false;
384 } 392 }
385 393
386 void 394 void
405 paint.begin(this); 413 paint.begin(this);
406 setPaintFont(paint); 414 setPaintFont(paint);
407 415
408 if (e) paint.setClipRect(r); 416 if (e) paint.setClipRect(r);
409 417
410 ViewManager::ToolMode toolMode = m_manager->getToolMode(); 418 ViewManager::ToolMode toolMode = m_manager->getToolModeFor(this);
411 419
412 if (m_manager && 420 if (m_manager &&
413 // !m_manager->isPlaying() && 421 // !m_manager->isPlaying() &&
414 m_mouseInWidget && 422 m_mouseInWidget &&
415 toolMode == ViewManager::MeasureMode) { 423 toolMode == ViewManager::MeasureMode) {
454 462
455 if (waveformModel && workModel && haveSomeTimeXAxis) break; 463 if (waveformModel && workModel && haveSomeTimeXAxis) break;
456 } 464 }
457 465
458 m_scaleWidth = 0; 466 m_scaleWidth = 0;
467
468 if (workModel) {
469 drawModelTimeExtents(r, paint, workModel);
470 }
459 471
460 if (m_manager && m_manager->shouldShowVerticalScale() && topLayer) { 472 if (m_manager && m_manager->shouldShowVerticalScale() && topLayer) {
461 drawVerticalScale(r, topLayer, paint); 473 drawVerticalScale(r, topLayer, paint);
462 } 474 }
463 475
623 635
624 if (!scaleLayer) m_scaleWidth = 0; 636 if (!scaleLayer) m_scaleWidth = 0;
625 637
626 if (m_scaleWidth > 0 && r.left() < m_scaleWidth) { 638 if (m_scaleWidth > 0 && r.left() < m_scaleWidth) {
627 639
628 // Profiler profiler("Pane::paintEvent - painting vertical scale", true); 640 // Profiler profiler("Pane::paintEvent - painting vertical scale", true);
629 641
630 // SVDEBUG << "Pane::paintEvent: calling paint.save() in vertical scale block" << endl; 642 // SVDEBUG << "Pane::paintEvent: calling paint.save() in vertical scale block" << endl;
631 paint.save(); 643 paint.save();
632 644
633 paint.setPen(getForeground()); 645 paint.setPen(getForeground());
634 paint.setBrush(getBackground()); 646 paint.setBrush(getBackground());
635 paint.drawRect(0, -1, m_scaleWidth, height()+1); 647 paint.drawRect(0, -1, m_scaleWidth, height()+1);
646 void 658 void
647 Pane::drawFeatureDescription(Layer *topLayer, QPainter &paint) 659 Pane::drawFeatureDescription(Layer *topLayer, QPainter &paint)
648 { 660 {
649 QPoint pos = m_identifyPoint; 661 QPoint pos = m_identifyPoint;
650 QString desc = topLayer->getFeatureDescription(this, pos); 662 QString desc = topLayer->getFeatureDescription(this, pos);
651 663
652 if (desc != "") { 664 if (desc != "") {
653 665
654 paint.save(); 666 paint.save();
655 667
656 int tabStop = 668 int tabStop =
723 int y = height() - fontHeight + fontAscent - 6; 735 int y = height() - fontHeight + fontAscent - 6;
724 736
725 LayerList::iterator vi = m_layers.end(); 737 LayerList::iterator vi = m_layers.end();
726 738
727 if (vi != m_layers.begin()) { 739 if (vi != m_layers.begin()) {
728 740
729 switch ((*--vi)->getPreferredFrameCountPosition()) { 741 switch ((*--vi)->getPreferredFrameCountPosition()) {
730 742
731 case Layer::PositionTop: 743 case Layer::PositionTop:
732 y = fontAscent + 6; 744 y = fontAscent + 6;
733 break; 745 break;
765 drawVisibleText(paint, x, y, text, OutlinedText); 777 drawVisibleText(paint, x, y, text, OutlinedText);
766 } 778 }
767 } 779 }
768 780
769 void 781 void
782 Pane::drawModelTimeExtents(QRect r, QPainter &paint, const Model *model)
783 {
784 int x0 = getXForFrame(model->getStartFrame());
785 int x1 = getXForFrame(model->getEndFrame());
786
787 int lw = 10;
788
789 paint.save();
790
791 QBrush brush;
792
793 if (hasLightBackground()) {
794 brush = QBrush(QColor("#f8f8f8"));
795 paint.setPen(Qt::black);
796 } else {
797 brush = QBrush(QColor("#101010"));
798 paint.setPen(Qt::white);
799 }
800
801 if (x0 > r.x()) {
802 paint.fillRect(0, 0, x0, height(), brush);
803 paint.drawLine(x0, 0, x0, height());
804 }
805
806 if (x1 < r.x() + r.width()) {
807 paint.fillRect(x1, 0, width() - x1, height(), brush);
808 paint.drawLine(x1, 0, x1, height());
809 }
810
811 paint.restore();
812 }
813
814 void
770 Pane::drawAlignmentStatus(QRect r, QPainter &paint, const Model *model, 815 Pane::drawAlignmentStatus(QRect r, QPainter &paint, const Model *model,
771 bool down) 816 bool down)
772 { 817 {
773 const Model *reference = model->getAlignmentReference(); 818 const Model *reference = model->getAlignmentReference();
774 /* 819 /*
890 if (m_manager->getZoomWheelsEnabled()) { 935 if (m_manager->getZoomWheelsEnabled()) {
891 llx -= 36; 936 llx -= 36;
892 } 937 }
893 938
894 if (r.x() + r.width() >= llx - fontAscent - 3) { 939 if (r.x() + r.width() >= llx - fontAscent - 3) {
895 940
896 for (size_t i = 0; i < texts.size(); ++i) { 941 for (size_t i = 0; i < texts.size(); ++i) {
897 942
898 // cerr << "Pane "<< this << ": text " << i << ": " << texts[i] << endl; 943 // cerr << "Pane "<< this << ": text " << i << ": " << texts[i] << endl;
899 944
900 if (i + 1 == texts.size()) { 945 if (i + 1 == texts.size()) {
1144 1189
1145 if (!m_manager) return Selection(); 1190 if (!m_manager) return Selection();
1146 1191
1147 long testFrame = getFrameForX(x - 5); 1192 long testFrame = getFrameForX(x - 5);
1148 if (testFrame < 0) { 1193 if (testFrame < 0) {
1149 testFrame = getFrameForX(x); 1194 testFrame = getFrameForX(x);
1150 if (testFrame < 0) return Selection(); 1195 if (testFrame < 0) return Selection();
1151 } 1196 }
1152 1197
1153 Selection selection = m_manager->getContainingSelection(testFrame, true); 1198 Selection selection = m_manager->getContainingSelection(testFrame, true);
1154 if (selection.isEmpty()) return selection; 1199 if (selection.isEmpty()) return selection;
1155 1200
1223 tr("Click middle button and drag to navigate with any tool")); 1268 tr("Click middle button and drag to navigate with any tool"));
1224 kr.registerShortcut(tr("Relocate"), tr("Double-Click Middle"), 1269 kr.registerShortcut(tr("Relocate"), tr("Double-Click Middle"),
1225 tr("Double-click middle button to relocate with any tool")); 1270 tr("Double-click middle button to relocate with any tool"));
1226 kr.registerShortcut(tr("Menu"), tr("Right"), 1271 kr.registerShortcut(tr("Menu"), tr("Right"),
1227 tr("Show pane context menu")); 1272 tr("Show pane context menu"));
1228 1273 }
1229 kr.setCategory(tr("Navigate Tool Mouse Actions")); 1274
1230 1275 Layer *
1231 kr.registerShortcut(tr("Navigate"), tr("Left"), 1276 Pane::getTopFlexiNoteLayer()
1232 tr("Click left button and drag to move around")); 1277 {
1233 kr.registerShortcut(tr("Zoom to Area"), tr("Shift+Left"), 1278 for (int i = int(m_layers.size()) - 1; i >= 0; --i) {
1234 tr("Shift-click left button and drag to zoom to a rectangular area")); 1279 if (LayerFactory::getInstance()->getLayerType(m_layers[i]) ==
1235 kr.registerShortcut(tr("Relocate"), tr("Double-Click Left"), 1280 LayerFactory::FlexiNotes) {
1236 tr("Double-click left button to jump to clicked location")); 1281 return m_layers[i];
1237 kr.registerShortcut(tr("Edit"), tr("Double-Click Left"), 1282 }
1238 tr("Double-click left button on an item to edit it")); 1283 }
1239 1284 return 0;
1240 kr.setCategory(tr("Select Tool Mouse Actions"));
1241 kr.registerShortcut(tr("Select"), tr("Left"),
1242 tr("Click left button and drag to select region; drag region edge to resize"));
1243 kr.registerShortcut(tr("Multi Select"), tr("Ctrl+Left"),
1244 #ifdef Q_OS_MAC
1245 tr("Cmd-click left button and drag to select an additional region"));
1246 #else
1247 tr("Ctrl-click left button and drag to select an additional region"));
1248 #endif
1249 kr.registerShortcut(tr("Fine Select"), tr("Shift+Left"),
1250 tr("Shift-click left button and drag to select without snapping to items or grid"));
1251
1252 kr.setCategory(tr("Edit Tool Mouse Actions"));
1253 kr.registerShortcut(tr("Move"), tr("Left"),
1254 tr("Click left button on an item or selected region and drag to move"));
1255 kr.registerShortcut(tr("Edit"), tr("Double-Click Left"),
1256 tr("Double-click left button on an item to edit it"));
1257
1258 kr.setCategory(tr("Draw Tool Mouse Actions"));
1259 kr.registerShortcut(tr("Draw"), tr("Left"),
1260 tr("Click left button and drag to create new item"));
1261
1262 kr.setCategory(tr("Measure Tool Mouse Actions"));
1263 kr.registerShortcut(tr("Measure Area"), tr("Left"),
1264 tr("Click left button and drag to measure a rectangular area"));
1265 kr.registerShortcut(tr("Measure Item"), tr("Double-Click Left"),
1266 tr("Click left button and drag to measure extents of an item or shape"));
1267 kr.registerShortcut(tr("Zoom to Area"), tr("Shift+Left"),
1268 tr("Shift-click left button and drag to zoom to a rectangular area"));
1269 } 1285 }
1270 1286
1271 void 1287 void
1272 Pane::mousePressEvent(QMouseEvent *e) 1288 Pane::mousePressEvent(QMouseEvent *e)
1273 { 1289 {
1288 m_ctrlPressed = (e->modifiers() & Qt::ControlModifier); 1304 m_ctrlPressed = (e->modifiers() & Qt::ControlModifier);
1289 m_altPressed = (e->modifiers() & Qt::AltModifier); 1305 m_altPressed = (e->modifiers() & Qt::AltModifier);
1290 m_dragMode = UnresolvedDrag; 1306 m_dragMode = UnresolvedDrag;
1291 1307
1292 ViewManager::ToolMode mode = ViewManager::NavigateMode; 1308 ViewManager::ToolMode mode = ViewManager::NavigateMode;
1293 if (m_manager) mode = m_manager->getToolMode(); 1309 if (m_manager) mode = m_manager->getToolModeFor(this);
1294 1310
1295 m_navigating = false; 1311 m_navigating = false;
1296 m_resizing = false; 1312 m_resizing = false;
1297 m_editing = false; 1313 m_editing = false;
1298 m_releasing = false; 1314 m_releasing = false;
1300 if (mode == ViewManager::NavigateMode || 1316 if (mode == ViewManager::NavigateMode ||
1301 (e->buttons() & Qt::MidButton) || 1317 (e->buttons() & Qt::MidButton) ||
1302 (mode == ViewManager::MeasureMode && 1318 (mode == ViewManager::MeasureMode &&
1303 (e->buttons() & Qt::LeftButton) && m_shiftPressed)) { 1319 (e->buttons() & Qt::LeftButton) && m_shiftPressed)) {
1304 1320
1305 if (mode != ViewManager::NavigateMode) { 1321 if (mode != ViewManager::NavigateMode) {
1306 setCursor(Qt::PointingHandCursor); 1322 setCursor(Qt::PointingHandCursor);
1307 } 1323 }
1308 1324
1309 m_navigating = true; 1325 m_navigating = true;
1310 m_dragCentreFrame = m_centreFrame; 1326 m_dragCentreFrame = m_centreFrame;
1311 m_dragStartMinValue = 0; 1327 m_dragStartMinValue = 0;
1312 1328
1313 float vmin, vmax, dmin, dmax; 1329 float vmin, vmax, dmin, dmax;
1314 if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) { 1330 if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) {
1315 m_dragStartMinValue = dmin; 1331 m_dragStartMinValue = dmin;
1317 1333
1318 } else if (mode == ViewManager::SelectMode) { 1334 } else if (mode == ViewManager::SelectMode) {
1319 1335
1320 if (!hasTopLayerTimeXAxis()) return; 1336 if (!hasTopLayerTimeXAxis()) return;
1321 1337
1322 bool closeToLeft = false, closeToRight = false; 1338 bool closeToLeft = false, closeToRight = false;
1323 Selection selection = getSelectionAt(e->x(), closeToLeft, closeToRight); 1339 Selection selection = getSelectionAt(e->x(), closeToLeft, closeToRight);
1324 1340
1325 if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) { 1341 if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) {
1326 1342
1327 m_manager->removeSelection(selection); 1343 m_manager->removeSelection(selection);
1328 1344
1329 if (closeToLeft) { 1345 if (closeToLeft) {
1330 m_selectionStartFrame = selection.getEndFrame(); 1346 m_selectionStartFrame = selection.getEndFrame();
1331 } else { 1347 } else {
1332 m_selectionStartFrame = selection.getStartFrame(); 1348 m_selectionStartFrame = selection.getStartFrame();
1333 } 1349 }
1334 1350
1335 m_manager->setInProgressSelection(selection, false); 1351 m_manager->setInProgressSelection(selection, false);
1336 m_resizing = true; 1352 m_resizing = true;
1337 1353
1338 } else { 1354 } else {
1339 1355
1340 int mouseFrame = getFrameForX(e->x()); 1356 int mouseFrame = getFrameForX(e->x());
1341 size_t resolution = 1; 1357 size_t resolution = 1;
1342 int snapFrame = mouseFrame; 1358 int snapFrame = mouseFrame;
1343 1359
1344 Layer *layer = getSelectedLayer(); 1360 Layer *layer = getSelectedLayer();
1345 if (layer && !m_shiftPressed) { 1361 if (layer && !m_shiftPressed) {
1346 layer->snapToFeatureFrame(this, snapFrame, 1362 layer->snapToFeatureFrame(this, snapFrame,
1347 resolution, Layer::SnapLeft); 1363 resolution, Layer::SnapLeft);
1348 } 1364 }
1349 1365
1350 if (snapFrame < 0) snapFrame = 0; 1366 if (snapFrame < 0) snapFrame = 0;
1351 m_selectionStartFrame = snapFrame; 1367 m_selectionStartFrame = snapFrame;
1352 if (m_manager) { 1368 if (m_manager) {
1353 m_manager->setInProgressSelection 1369 m_manager->setInProgressSelection
1354 (Selection(alignToReference(snapFrame), 1370 (Selection(alignToReference(snapFrame),
1355 alignToReference(snapFrame + resolution)), 1371 alignToReference(snapFrame + resolution)),
1356 !m_ctrlPressed); 1372 !m_ctrlPressed);
1357 } 1373 }
1358 1374
1359 m_resizing = false; 1375 m_resizing = false;
1360 } 1376 }
1361 1377
1362 update(); 1378 update();
1363 1379
1364 } else if (mode == ViewManager::DrawMode) { 1380 } else if (mode == ViewManager::DrawMode) {
1365 1381
1366 Layer *layer = getSelectedLayer(); 1382 Layer *layer = getSelectedLayer();
1367 if (layer && layer->isLayerEditable()) { 1383 if (layer && layer->isLayerEditable()) {
1368 layer->drawStart(this, e); 1384 layer->drawStart(this, e);
1369 } 1385 }
1370 1386
1371 } else if (mode == ViewManager::EraseMode) { 1387 } else if (mode == ViewManager::EraseMode) {
1372 1388
1373 Layer *layer = getSelectedLayer(); 1389 Layer *layer = getSelectedLayer();
1374 if (layer && layer->isLayerEditable()) { 1390 if (layer && layer->isLayerEditable()) {
1375 layer->eraseStart(this, e); 1391 layer->eraseStart(this, e);
1376 } 1392 }
1393
1394 // GF: handle mouse press for NoteEditMode
1395 } else if (mode == ViewManager::NoteEditMode) {
1396
1397 std::cerr << "mouse pressed in note edit mode" << std::endl;
1398 Layer *layer = getTopFlexiNoteLayer();
1399 if (layer) {
1400 layer->splitStart(this, e);
1401 }
1377 1402
1378 } else if (mode == ViewManager::EditMode) { 1403 } else if (mode == ViewManager::EditMode) {
1379 1404
1380 // Do nothing here -- we'll do it in mouseMoveEvent when the 1405 // Do nothing here -- we'll do it in mouseMoveEvent when the
1381 // drag threshold has been passed 1406 // drag threshold has been passed
1398 } 1423 }
1399 1424
1400 // cerr << "mouseReleaseEvent" << endl; 1425 // cerr << "mouseReleaseEvent" << endl;
1401 1426
1402 ViewManager::ToolMode mode = ViewManager::NavigateMode; 1427 ViewManager::ToolMode mode = ViewManager::NavigateMode;
1403 if (m_manager) mode = m_manager->getToolMode(); 1428 if (m_manager) mode = m_manager->getToolModeFor(this);
1404 1429
1405 m_releasing = true; 1430 m_releasing = true;
1406 1431
1407 if (m_clickedInRange) { 1432 if (m_clickedInRange) {
1408 mouseMoveEvent(e); 1433 mouseMoveEvent(e);
1409 } 1434 }
1410 1435
1411 if (m_navigating || mode == ViewManager::NavigateMode) { 1436 if (m_navigating || mode == ViewManager::NavigateMode) {
1412 1437
1413 m_navigating = false; 1438 m_navigating = false;
1414 1439
1415 if (mode != ViewManager::NavigateMode) { 1440 if (mode != ViewManager::NavigateMode) {
1416 // restore cursor 1441 // restore cursor
1417 toolModeChanged(); 1442 toolModeChanged();
1418 } 1443 }
1419 1444
1420 if (m_shiftPressed) { 1445 if (m_shiftPressed) {
1421 1446
1422 int x0 = std::min(m_clickPos.x(), m_mousePos.x()); 1447 int x0 = std::min(m_clickPos.x(), m_mousePos.x());
1423 int x1 = std::max(m_clickPos.x(), m_mousePos.x()); 1448 int x1 = std::max(m_clickPos.x(), m_mousePos.x());
1424 1449
1425 int y0 = std::min(m_clickPos.y(), m_mousePos.y()); 1450 int y0 = std::min(m_clickPos.y(), m_mousePos.y());
1426 int y1 = std::max(m_clickPos.y(), m_mousePos.y()); 1451 int y1 = std::max(m_clickPos.y(), m_mousePos.y());
1427 1452
1428 zoomToRegion(x0, y0, x1, y1); 1453 emit regionOutlined(QRect(x0, y0, x1 - x0, y1 - y0));
1429 } 1454 }
1430 1455
1431 } else if (mode == ViewManager::SelectMode) { 1456 } else if (mode == ViewManager::SelectMode) {
1432 1457
1433 if (!hasTopLayerTimeXAxis()) { 1458 if (!hasTopLayerTimeXAxis()) {
1434 m_releasing = false; 1459 m_releasing = false;
1435 return; 1460 return;
1436 } 1461 }
1437 1462
1438 if (m_manager && m_manager->haveInProgressSelection()) { 1463 if (m_manager && m_manager->haveInProgressSelection()) {
1439 1464
1440 bool exclusive; 1465 //cerr << "JTEST: release with selection" << endl;
1441 Selection selection = m_manager->getInProgressSelection(exclusive); 1466 bool exclusive;
1442 1467 Selection selection = m_manager->getInProgressSelection(exclusive);
1443 if (selection.getEndFrame() < selection.getStartFrame() + 2) { 1468
1444 selection = Selection(); 1469 if (selection.getEndFrame() < selection.getStartFrame() + 2) {
1445 } 1470 selection = Selection();
1446 1471 }
1447 m_manager->clearInProgressSelection(); 1472
1448 1473 m_manager->clearInProgressSelection();
1449 if (exclusive) { 1474
1450 m_manager->setSelection(selection); 1475 if (exclusive) {
1451 } else { 1476 m_manager->setSelection(selection);
1452 m_manager->addSelection(selection); 1477 } else {
1453 } 1478 m_manager->addSelection(selection);
1454 } 1479 }
1455 1480 }
1456 update(); 1481 else if (m_manager && !m_manager->haveInProgressSelection()) {
1482
1483 //cerr << "JTEST: release without selection" << endl;
1484 // Get frame location of mouse
1485 int mouseFrame = getFrameForX(e->x());
1486 //cerr << "JTEST: frame location of click is " << mouseFrame << endl;
1487 // Move play head to that frame location
1488 int playbackFrame = fmax(0,mouseFrame);
1489 m_manager->setPlaybackFrame(playbackFrame);
1490 }
1491
1492 update();
1457 1493
1458 } else if (mode == ViewManager::DrawMode) { 1494 } else if (mode == ViewManager::DrawMode) {
1459 1495
1460 Layer *layer = getSelectedLayer(); 1496 Layer *layer = getSelectedLayer();
1461 if (layer && layer->isLayerEditable()) { 1497 if (layer && layer->isLayerEditable()) {
1462 layer->drawEnd(this, e); 1498 layer->drawEnd(this, e);
1463 update(); 1499 update();
1464 } 1500 }
1465 1501
1466 } else if (mode == ViewManager::EraseMode) { 1502 } else if (mode == ViewManager::EraseMode) {
1467 1503
1468 Layer *layer = getSelectedLayer(); 1504 Layer *layer = getSelectedLayer();
1469 if (layer && layer->isLayerEditable()) { 1505 if (layer && layer->isLayerEditable()) {
1470 layer->eraseEnd(this, e); 1506 layer->eraseEnd(this, e);
1471 update(); 1507 update();
1472 } 1508 }
1509
1510 } else if (mode == ViewManager::NoteEditMode) {
1511
1512 //GF: handle mouse release for NoteEditMode (note: works but will need to re-think this a bit later)
1513 Layer *layer = getTopFlexiNoteLayer();
1514
1515 if (layer) {
1516 layer->splitEnd(this, e);
1517 update();
1518
1519 if (m_editing) {
1520 if (!editSelectionEnd(e)) {
1521 layer->editEnd(this, e);
1522 update();
1523 }
1524 }
1525 }
1473 1526
1474 } else if (mode == ViewManager::EditMode) { 1527 } else if (mode == ViewManager::EditMode) {
1475 1528
1476 if (m_editing) { 1529 if (m_editing) {
1477 if (!editSelectionEnd(e)) { 1530 if (!editSelectionEnd(e)) {
1478 Layer *layer = getSelectedLayer(); 1531 Layer *layer = getSelectedLayer();
1479 if (layer && layer->isLayerEditable()) { 1532 if (layer && layer->isLayerEditable()) {
1480 layer->editEnd(this, e); 1533 layer->editEnd(this, e);
1481 update(); 1534 update();
1482 } 1535 }
1483 } 1536 }
1484 } 1537 }
1485 1538
1486 } else if (mode == ViewManager::MeasureMode) { 1539 } else if (mode == ViewManager::MeasureMode) {
1487 1540
1488 Layer *layer = getTopLayer(); 1541 Layer *layer = getTopLayer();
1489 if (layer) layer->measureEnd(this, e); 1542 if (layer) layer->measureEnd(this, e);
1522 return; 1575 return;
1523 } 1576 }
1524 } 1577 }
1525 1578
1526 ViewManager::ToolMode mode = ViewManager::NavigateMode; 1579 ViewManager::ToolMode mode = ViewManager::NavigateMode;
1527 if (m_manager) mode = m_manager->getToolMode(); 1580 if (m_manager) mode = m_manager->getToolModeFor(this);
1528 1581
1529 QPoint prevPoint = m_identifyPoint; 1582 QPoint prevPoint = m_identifyPoint;
1530 m_identifyPoint = e->pos(); 1583 m_identifyPoint = e->pos();
1531 1584
1532 if (!m_clickedInRange) { 1585 if (!m_clickedInRange) {
1533 1586
1534 if (mode == ViewManager::SelectMode && hasTopLayerTimeXAxis()) { 1587 // GF: handle mouse move for context sensitive cursor switching in NoteEditMode.
1535 bool closeToLeft = false, closeToRight = false; 1588 // GF: Propagate the event to FlexiNoteLayer. I somehow feel it's best handeled there rather than here, but perhaps not if this will be needed elsewhere too.
1536 getSelectionAt(e->x(), closeToLeft, closeToRight); 1589 if (mode == ViewManager::NoteEditMode) {
1537 if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) { 1590 FlexiNoteLayer *layer = qobject_cast<FlexiNoteLayer *>(getTopFlexiNoteLayer());
1538 setCursor(Qt::SizeHorCursor); 1591 if (layer) {
1539 } else { 1592 layer->mouseMoveEvent(this, e); //!!! ew
1540 setCursor(Qt::ArrowCursor); 1593 return;
1541 } 1594 }
1542 } 1595 }
1596
1597 if (mode == ViewManager::SelectMode && hasTopLayerTimeXAxis()) {
1598 bool closeToLeft = false, closeToRight = false;
1599 getSelectionAt(e->x(), closeToLeft, closeToRight);
1600 if ((closeToLeft || closeToRight) && !(closeToLeft && closeToRight)) {
1601 setCursor(Qt::SizeHorCursor);
1602 } else {
1603 setCursor(Qt::ArrowCursor);
1604 }
1605 }
1543 1606
1544 if (!m_manager->isPlaying()) { 1607 if (!m_manager->isPlaying()) {
1545 1608
1546 bool updating = false; 1609 bool updating = false;
1547 1610
1567 update(); 1630 update();
1568 } 1631 }
1569 } 1632 }
1570 } 1633 }
1571 1634
1572 return; 1635 return;
1573 } 1636 }
1574 1637
1575 if (m_navigating || mode == ViewManager::NavigateMode) { 1638 if (m_navigating || mode == ViewManager::NavigateMode) {
1576 1639
1577 if (m_shiftPressed) { 1640 if (m_shiftPressed) {
1578 1641
1579 m_mousePos = e->pos(); 1642 m_mousePos = e->pos();
1580 update(); 1643 update();
1581 1644
1582 } else { 1645 } else {
1583 1646
1584 dragTopLayer(e); 1647 dragTopLayer(e);
1585 } 1648 }
1586 1649
1587 } else if (mode == ViewManager::SelectMode) { 1650 } else if (mode == ViewManager::SelectMode) {
1590 1653
1591 dragExtendSelection(e); 1654 dragExtendSelection(e);
1592 1655
1593 } else if (mode == ViewManager::DrawMode) { 1656 } else if (mode == ViewManager::DrawMode) {
1594 1657
1595 Layer *layer = getSelectedLayer(); 1658 Layer *layer = getSelectedLayer();
1596 if (layer && layer->isLayerEditable()) { 1659 if (layer && layer->isLayerEditable()) {
1597 layer->drawDrag(this, e); 1660 layer->drawDrag(this, e);
1598 } 1661 }
1599 1662
1600 } else if (mode == ViewManager::EraseMode) { 1663 } else if (mode == ViewManager::EraseMode) {
1601 1664
1602 Layer *layer = getSelectedLayer(); 1665 Layer *layer = getSelectedLayer();
1603 if (layer && layer->isLayerEditable()) { 1666 if (layer && layer->isLayerEditable()) {
1604 layer->eraseDrag(this, e); 1667 layer->eraseDrag(this, e);
1605 } 1668 }
1606 1669
1607 } else if (mode == ViewManager::EditMode) { 1670 // GF: handling NoteEditMode dragging and boundary actions for mouseMoveEvent
1671 } else if (mode == ViewManager::NoteEditMode) {
1608 1672
1609 bool resist = true; 1673 bool resist = true;
1610 1674
1611 if ((e->modifiers() & Qt::ShiftModifier)) { 1675 if ((e->modifiers() & Qt::ShiftModifier)) {
1612 m_shiftPressed = true; 1676 m_shiftPressed = true;
1613 // ... but don't set it false if shift has been
1614 // released -- we want the state when we started
1615 // dragging to be used most of the time
1616 } 1677 }
1617 1678
1618 if (m_shiftPressed) resist = false; 1679 if (m_shiftPressed) resist = false;
1619 1680
1620 m_dragMode = updateDragMode 1681 m_dragMode = updateDragMode
1637 Qt::NoButton, 1698 Qt::NoButton,
1638 e->buttons(), 1699 e->buttons(),
1639 e->modifiers()); 1700 e->modifiers());
1640 1701
1641 if (!editSelectionStart(&clickEvent)) { 1702 if (!editSelectionStart(&clickEvent)) {
1703 Layer *layer = getTopFlexiNoteLayer();
1704 if (layer) {
1705 std::cerr << "calling edit start" << std::endl;
1706 layer->editStart(this, &clickEvent);
1707 }
1708 }
1709 }
1710
1711 } else {
1712
1713 if (!editSelectionDrag(e)) {
1714
1715 Layer *layer = getSelectedLayer();
1716
1717 if (layer && layer->isLayerEditable()) {
1718
1719 int x = e->x();
1720 int y = e->y();
1721 if (m_dragMode == VerticalDrag) x = m_clickPos.x();
1722 else if (m_dragMode == HorizontalDrag) y = m_clickPos.y();
1723
1724 QMouseEvent moveEvent(QEvent::MouseMove,
1725 QPoint(x, y),
1726 Qt::NoButton,
1727 e->buttons(),
1728 e->modifiers());
1729 std::cerr << "calling editDrag" << std::endl;
1730 layer->editDrag(this, &moveEvent);
1731 }
1732 }
1733 }
1734
1735 } else if (mode == ViewManager::EditMode) {
1736
1737 bool resist = true;
1738
1739 if ((e->modifiers() & Qt::ShiftModifier)) {
1740 m_shiftPressed = true;
1741 // ... but don't set it false if shift has been
1742 // released -- we want the state when we started
1743 // dragging to be used most of the time
1744 }
1745
1746 if (m_shiftPressed) resist = false;
1747
1748 m_dragMode = updateDragMode
1749 (m_dragMode,
1750 m_clickPos,
1751 e->pos(),
1752 true, // can move horiz
1753 true, // can move vert
1754 resist, // resist horiz
1755 resist); // resist vert
1756
1757 if (!m_editing) {
1758
1759 if (m_dragMode != UnresolvedDrag) {
1760
1761 m_editing = true;
1762
1763 QMouseEvent clickEvent(QEvent::MouseButtonPress,
1764 m_clickPos,
1765 Qt::NoButton,
1766 e->buttons(),
1767 e->modifiers());
1768
1769 if (!editSelectionStart(&clickEvent)) {
1642 Layer *layer = getSelectedLayer(); 1770 Layer *layer = getSelectedLayer();
1643 if (layer && layer->isLayerEditable()) { 1771 if (layer && layer->isLayerEditable()) {
1644 layer->editStart(this, &clickEvent); 1772 layer->editStart(this, &clickEvent);
1645 } 1773 }
1646 } 1774 }
1683 update(); 1811 update();
1684 } 1812 }
1685 } 1813 }
1686 1814
1687 void 1815 void
1688 Pane::zoomToRegion(int x0, int y0, int x1, int y1) 1816 Pane::zoomToRegion(QRect r)
1689 { 1817 {
1818 int x0 = r.x();
1819 int y0 = r.y();
1820 int x1 = r.x() + r.width();
1821 int y1 = r.y() + r.height();
1822
1690 int w = x1 - x0; 1823 int w = x1 - x0;
1691 1824
1692 long newStartFrame = getFrameForX(x0); 1825 long newStartFrame = getFrameForX(x0);
1693 1826
1694 long visibleFrames = getEndFrame() - getStartFrame(); 1827 long visibleFrames = getEndFrame() - getStartFrame();
1695 if (newStartFrame <= -visibleFrames) { 1828 if (newStartFrame <= -visibleFrames) {
1696 newStartFrame = -visibleFrames + 1; 1829 newStartFrame = -visibleFrames + 1;
1697 } 1830 }
1698 1831
1699 if (newStartFrame >= long(getModelsEndFrame())) { 1832 if (newStartFrame >= long(getModelsEndFrame())) {
1700 newStartFrame = getModelsEndFrame() - 1; 1833 newStartFrame = getModelsEndFrame() - 1;
1701 } 1834 }
1702 1835
1703 float ratio = float(w) / float(width()); 1836 float ratio = float(w) / float(width());
1704 // cerr << "ratio: " << ratio << endl; 1837 // cerr << "ratio: " << ratio << endl;
1705 size_t newZoomLevel = (size_t)nearbyint(m_zoomLevel * ratio); 1838 size_t newZoomLevel = (size_t)nearbyint(m_zoomLevel * ratio);
1706 if (newZoomLevel < 1) newZoomLevel = 1; 1839 if (newZoomLevel < 1) newZoomLevel = 1;
1707 1840
1782 m_dragMode == FreeDrag) { 1915 m_dragMode == FreeDrag) {
1783 1916
1784 long frameOff = getFrameForX(e->x()) - getFrameForX(m_clickPos.x()); 1917 long frameOff = getFrameForX(e->x()) - getFrameForX(m_clickPos.x());
1785 1918
1786 size_t newCentreFrame = m_dragCentreFrame; 1919 size_t newCentreFrame = m_dragCentreFrame;
1787 1920
1788 if (frameOff < 0) { 1921 if (frameOff < 0) {
1789 newCentreFrame -= frameOff; 1922 newCentreFrame -= frameOff;
1790 } else if (newCentreFrame >= size_t(frameOff)) { 1923 } else if (newCentreFrame >= size_t(frameOff)) {
1791 newCentreFrame -= frameOff; 1924 newCentreFrame -= frameOff;
1792 } else { 1925 } else {
1793 newCentreFrame = 0; 1926 newCentreFrame = 0;
1794 } 1927 }
1795 1928
1796 #ifdef DEBUG_PANE 1929 #ifdef DEBUG_PANE
1797 SVDEBUG << "Pane::dragTopLayer: newCentreFrame = " << newCentreFrame << 1930 SVDEBUG << "Pane::dragTopLayer: newCentreFrame = " << newCentreFrame <<
1798 ", models end frame = " << getModelsEndFrame() << endl; 1931 ", models end frame = " << getModelsEndFrame() << endl;
1799 #endif 1932 #endif
1800 1933
1801 if (newCentreFrame >= getModelsEndFrame()) { 1934 if (newCentreFrame >= getModelsEndFrame()) {
1910 { 2043 {
1911 int mouseFrame = getFrameForX(e->x()); 2044 int mouseFrame = getFrameForX(e->x());
1912 size_t resolution = 1; 2045 size_t resolution = 1;
1913 int snapFrameLeft = mouseFrame; 2046 int snapFrameLeft = mouseFrame;
1914 int snapFrameRight = mouseFrame; 2047 int snapFrameRight = mouseFrame;
1915 2048
1916 Layer *layer = getSelectedLayer(); 2049 Layer *layer = getSelectedLayer();
1917 if (layer && !m_shiftPressed) { 2050 if (layer && !m_shiftPressed) {
1918 layer->snapToFeatureFrame(this, snapFrameLeft, 2051 layer->snapToFeatureFrame(this, snapFrameLeft,
1919 resolution, Layer::SnapLeft); 2052 resolution, Layer::SnapLeft);
1920 layer->snapToFeatureFrame(this, snapFrameRight, 2053 layer->snapToFeatureFrame(this, snapFrameRight,
1923 2056
1924 // cerr << "snap: frame = " << mouseFrame << ", start frame = " << m_selectionStartFrame << ", left = " << snapFrameLeft << ", right = " << snapFrameRight << endl; 2057 // cerr << "snap: frame = " << mouseFrame << ", start frame = " << m_selectionStartFrame << ", left = " << snapFrameLeft << ", right = " << snapFrameRight << endl;
1925 2058
1926 if (snapFrameLeft < 0) snapFrameLeft = 0; 2059 if (snapFrameLeft < 0) snapFrameLeft = 0;
1927 if (snapFrameRight < 0) snapFrameRight = 0; 2060 if (snapFrameRight < 0) snapFrameRight = 0;
1928 2061
1929 size_t min, max; 2062 size_t min, max;
1930 2063
1931 if (m_selectionStartFrame > size_t(snapFrameLeft)) { 2064 if (m_selectionStartFrame > size_t(snapFrameLeft)) {
1932 min = snapFrameLeft; 2065 min = snapFrameLeft;
1933 max = m_selectionStartFrame; 2066 max = m_selectionStartFrame;
1934 } else if (size_t(snapFrameRight) > m_selectionStartFrame) { 2067 } else if (size_t(snapFrameRight) > m_selectionStartFrame) {
1935 min = m_selectionStartFrame; 2068 min = m_selectionStartFrame;
1991 m_shiftPressed = (e->modifiers() & Qt::ShiftModifier); 2124 m_shiftPressed = (e->modifiers() & Qt::ShiftModifier);
1992 m_ctrlPressed = (e->modifiers() & Qt::ControlModifier); 2125 m_ctrlPressed = (e->modifiers() & Qt::ControlModifier);
1993 m_altPressed = (e->modifiers() & Qt::AltModifier); 2126 m_altPressed = (e->modifiers() & Qt::AltModifier);
1994 2127
1995 ViewManager::ToolMode mode = ViewManager::NavigateMode; 2128 ViewManager::ToolMode mode = ViewManager::NavigateMode;
1996 if (m_manager) mode = m_manager->getToolMode(); 2129 if (m_manager) mode = m_manager->getToolModeFor(this);
1997 2130
1998 bool relocate = (mode == ViewManager::NavigateMode || 2131 bool relocate = (mode == ViewManager::NavigateMode ||
1999 (e->buttons() & Qt::MidButton)); 2132 (e->buttons() & Qt::MidButton));
2000 2133
2134 if (mode == ViewManager::SelectMode) {
2135 m_clickedInRange = false;
2136 m_manager->clearInProgressSelection();
2137 emit doubleClickSelectInvoked(getFrameForX(e->x()));
2138 return;
2139 }
2140
2001 if (mode == ViewManager::NavigateMode || 2141 if (mode == ViewManager::NavigateMode ||
2002 mode == ViewManager::EditMode) { 2142 mode == ViewManager::EditMode) {
2003 2143
2004 Layer *layer = getSelectedLayer(); 2144 Layer *layer = getSelectedLayer();
2005 if (layer && layer->isLayerEditable()) { 2145 if (layer && layer->isLayerEditable()) {
2006 if (layer->editOpen(this, e)) relocate = false; 2146 if (layer->editOpen(this, e)) relocate = false;
2007 } 2147 }
2008 2148
2009 } else if (mode == ViewManager::MeasureMode) { 2149 } else if (mode == ViewManager::MeasureMode) {
2010 2150
2011 Layer *layer = getTopLayer(); 2151 Layer *layer = getTopLayer();
2012 if (layer) layer->measureDoubleClick(this, e); 2152 if (layer) layer->measureDoubleClick(this, e);
2024 m_dragMode = UnresolvedDrag; 2164 m_dragMode = UnresolvedDrag;
2025 2165
2026 float vmin, vmax, dmin, dmax; 2166 float vmin, vmax, dmin, dmax;
2027 if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) { 2167 if (getTopLayerDisplayExtents(vmin, vmax, dmin, dmax)) {
2028 m_dragStartMinValue = dmin; 2168 m_dragStartMinValue = dmin;
2169 }
2170 }
2171
2172 if (mode == ViewManager::NoteEditMode) {
2173 std::cerr << "double click in note edit mode" << std::endl;
2174 Layer *layer = getSelectedLayer();
2175 if (layer && layer->isLayerEditable()) {
2176 layer->addNote(this, e);
2029 } 2177 }
2030 } 2178 }
2031 2179
2032 m_clickedInRange = false; // in case mouseReleaseEvent is not properly called 2180 m_clickedInRange = false; // in case mouseReleaseEvent is not properly called
2033 } 2181 }
2060 //cerr << "wheelEvent, delta " << e->delta() << endl; 2208 //cerr << "wheelEvent, delta " << e->delta() << endl;
2061 2209
2062 int count = e->delta(); 2210 int count = e->delta();
2063 2211
2064 if (count > 0) { 2212 if (count > 0) {
2065 if (count >= 120) count /= 120; 2213 if (count >= 120) count /= 120;
2066 else count = 1; 2214 else count = 1;
2067 } 2215 }
2068 2216
2069 if (count < 0) { 2217 if (count < 0) {
2070 if (count <= -120) count /= 120; 2218 if (count <= -120) count /= 120;
2071 else count = -1; 2219 else count = -1;
2072 } 2220 }
2073 2221
2074 if (e->modifiers() & Qt::ControlModifier) { 2222 if (e->modifiers() & Qt::ControlModifier) {
2075 2223
2076 // Scroll left or right, rapidly 2224 // Scroll left or right, rapidly
2077 2225
2078 if (getStartFrame() < 0 && 2226 if (getStartFrame() < 0 &&
2079 getEndFrame() >= getModelsEndFrame()) return; 2227 getEndFrame() >= getModelsEndFrame()) return;
2080 2228
2081 long delta = ((width() / 2) * count * m_zoomLevel); 2229 long delta = ((width() / 2) * count * m_zoomLevel);
2082 2230
2083 if (int(m_centreFrame) < delta) { 2231 if (int(m_centreFrame) < delta) {
2084 setCentreFrame(0); 2232 setCentreFrame(0);
2085 } else if (int(m_centreFrame) - delta >= int(getModelsEndFrame())) { 2233 } else if (int(m_centreFrame) - delta >= int(getModelsEndFrame())) {
2086 setCentreFrame(getModelsEndFrame()); 2234 setCentreFrame(getModelsEndFrame());
2087 } else { 2235 } else {
2088 setCentreFrame(m_centreFrame - delta); 2236 setCentreFrame(m_centreFrame - delta);
2089 } 2237 }
2090 2238
2091 } else if (e->modifiers() & Qt::ShiftModifier) { 2239 } else if (e->modifiers() & Qt::ShiftModifier) {
2092 2240
2093 // Zoom vertically 2241 // Zoom vertically
2094 2242
2104 m_vthumb->scroll(e->delta() > 0); 2252 m_vthumb->scroll(e->delta() > 0);
2105 } 2253 }
2106 2254
2107 } else { 2255 } else {
2108 2256
2109 // Zoom in or out 2257 // Zoom in or out
2110 2258
2111 int newZoomLevel = m_zoomLevel; 2259 int newZoomLevel = m_zoomLevel;
2112 2260
2113 while (count > 0) { 2261 while (count > 0) {
2114 if (newZoomLevel <= 2) { 2262 if (newZoomLevel <= 2) {
2115 newZoomLevel = 1; 2263 newZoomLevel = 1;
2116 break; 2264 break;
2117 } 2265 }
2118 newZoomLevel = getZoomConstraintBlockSize(newZoomLevel - 1, 2266 newZoomLevel = getZoomConstraintBlockSize(newZoomLevel - 1,
2119 ZoomConstraint::RoundDown); 2267 ZoomConstraint::RoundDown);
2120 --count; 2268 --count;
2121 } 2269 }
2122 2270
2123 while (count < 0) { 2271 while (count < 0) {
2124 newZoomLevel = getZoomConstraintBlockSize(newZoomLevel + 1, 2272 newZoomLevel = getZoomConstraintBlockSize(newZoomLevel + 1,
2125 ZoomConstraint::RoundUp); 2273 ZoomConstraint::RoundUp);
2126 ++count; 2274 ++count;
2127 } 2275 }
2128 2276
2129 if (newZoomLevel != m_zoomLevel) { 2277 if (newZoomLevel != m_zoomLevel) {
2130 setZoomLevel(newZoomLevel); 2278 setZoomLevel(newZoomLevel);
2131 } 2279 }
2132 } 2280 }
2133 2281
2134 emit paneInteractedWith(); 2282 emit paneInteractedWith();
2135 } 2283 }
2136 2284
2304 2452
2305 bool 2453 bool
2306 Pane::editSelectionStart(QMouseEvent *e) 2454 Pane::editSelectionStart(QMouseEvent *e)
2307 { 2455 {
2308 if (!m_identifyFeatures || 2456 if (!m_identifyFeatures ||
2309 !m_manager || 2457 !m_manager ||
2310 m_manager->getToolMode() != ViewManager::EditMode) { 2458 m_manager->getToolModeFor(this) != ViewManager::EditMode) {
2311 return false; 2459 return false;
2312 } 2460 }
2313 2461
2314 bool closeToLeft, closeToRight; 2462 bool closeToLeft, closeToRight;
2315 Selection s(getSelectionAt(e->x(), closeToLeft, closeToRight)); 2463 Selection s(getSelectionAt(e->x(), closeToLeft, closeToRight));
2316 if (s.isEmpty()) return false; 2464 if (s.isEmpty()) return false;
2336 2484
2337 int offset = m_mousePos.x() - m_clickPos.x(); 2485 int offset = m_mousePos.x() - m_clickPos.x();
2338 Layer *layer = getSelectedLayer(); 2486 Layer *layer = getSelectedLayer();
2339 2487
2340 if (offset == 0 || !layer) { 2488 if (offset == 0 || !layer) {
2341 m_editingSelection = Selection(); 2489 m_editingSelection = Selection();
2342 return true; 2490 return true;
2343 } 2491 }
2344 2492
2345 int p0 = getXForFrame(m_editingSelection.getStartFrame()) + offset; 2493 int p0 = getXForFrame(m_editingSelection.getStartFrame()) + offset;
2346 int p1 = getXForFrame(m_editingSelection.getEndFrame()) + offset; 2494 int p1 = getXForFrame(m_editingSelection.getEndFrame()) + offset;
2347 2495
2349 long f1 = getFrameForX(p1); 2497 long f1 = getFrameForX(p1);
2350 2498
2351 Selection newSelection(f0, f1); 2499 Selection newSelection(f0, f1);
2352 2500
2353 if (m_editingSelectionEdge == 0) { 2501 if (m_editingSelectionEdge == 0) {
2354 2502
2355 CommandHistory::getInstance()->startCompoundOperation 2503 CommandHistory::getInstance()->startCompoundOperation
2356 (tr("Drag Selection"), true); 2504 (tr("Drag Selection"), true);
2357 2505
2358 layer->moveSelection(m_editingSelection, f0); 2506 layer->moveSelection(m_editingSelection, f0);
2359 2507
2360 } else { 2508 } else {
2361 2509
2362 CommandHistory::getInstance()->startCompoundOperation 2510 CommandHistory::getInstance()->startCompoundOperation
2363 (tr("Resize Selection"), true); 2511 (tr("Resize Selection"), true);
2364 2512
2365 if (m_editingSelectionEdge < 0) { 2513 if (m_editingSelectionEdge < 0) {
2366 f1 = m_editingSelection.getEndFrame(); 2514 f1 = m_editingSelection.getEndFrame();
2367 } else { 2515 } else {
2368 f0 = m_editingSelection.getStartFrame(); 2516 f0 = m_editingSelection.getStartFrame();
2369 } 2517 }
2370 2518
2371 newSelection = Selection(f0, f1); 2519 newSelection = Selection(f0, f1);
2372 layer->resizeSelection(m_editingSelection, newSelection); 2520 layer->resizeSelection(m_editingSelection, newSelection);
2373 } 2521 }
2374 2522
2375 m_manager->removeSelection(m_editingSelection); 2523 m_manager->removeSelection(m_editingSelection);
2376 m_manager->addSelection(newSelection); 2524 m_manager->addSelection(newSelection);
2377 2525
2382 } 2530 }
2383 2531
2384 void 2532 void
2385 Pane::toolModeChanged() 2533 Pane::toolModeChanged()
2386 { 2534 {
2387 ViewManager::ToolMode mode = m_manager->getToolMode(); 2535 ViewManager::ToolMode mode = m_manager->getToolModeFor(this);
2388 // SVDEBUG << "Pane::toolModeChanged(" << mode << ")" << endl; 2536 // SVDEBUG << "Pane::toolModeChanged(" << mode << ")" << endl;
2389 2537
2390 if (mode == ViewManager::MeasureMode && !m_measureCursor1) { 2538 if (mode == ViewManager::MeasureMode && !m_measureCursor1) {
2391 m_measureCursor1 = new QCursor(QBitmap(":/icons/measure1cursor.xbm"), 2539 m_measureCursor1 = new QCursor(QBitmap(":/icons/measure1cursor.xbm"),
2392 QBitmap(":/icons/measure1mask.xbm"), 2540 QBitmap(":/icons/measure1mask.xbm"),
2397 } 2545 }
2398 2546
2399 switch (mode) { 2547 switch (mode) {
2400 2548
2401 case ViewManager::NavigateMode: 2549 case ViewManager::NavigateMode:
2402 setCursor(Qt::PointingHandCursor); 2550 setCursor(Qt::PointingHandCursor);
2403 break; 2551 break;
2404 2552
2405 case ViewManager::SelectMode: 2553 case ViewManager::SelectMode:
2406 setCursor(Qt::ArrowCursor); 2554 setCursor(Qt::ArrowCursor);
2407 break; 2555 break;
2408 2556
2409 case ViewManager::EditMode: 2557 case ViewManager::EditMode:
2410 setCursor(Qt::UpArrowCursor); 2558 setCursor(Qt::UpArrowCursor);
2411 break; 2559 break;
2412 2560
2413 case ViewManager::DrawMode: 2561 case ViewManager::DrawMode:
2414 setCursor(Qt::CrossCursor); 2562 setCursor(Qt::CrossCursor);
2415 break; 2563 break;
2416 2564
2417 case ViewManager::EraseMode: 2565 case ViewManager::EraseMode:
2418 setCursor(Qt::CrossCursor); 2566 setCursor(Qt::CrossCursor);
2419 break; 2567 break;
2420 2568
2421 case ViewManager::MeasureMode: 2569 case ViewManager::MeasureMode:
2422 if (m_measureCursor1) setCursor(*m_measureCursor1); 2570 if (m_measureCursor1) setCursor(*m_measureCursor1);
2423 break; 2571 break;
2424 2572
2425 /* 2573 // GF: NoteEditMode uses the same default cursor as EditMode, but it will change in a context sensitive manner.
2574 case ViewManager::NoteEditMode:
2575 setCursor(Qt::UpArrowCursor);
2576 break;
2577
2578 /*
2426 case ViewManager::TextMode: 2579 case ViewManager::TextMode:
2427 setCursor(Qt::IBeamCursor); 2580 setCursor(Qt::IBeamCursor);
2428 break; 2581 break;
2429 */ 2582 */
2430 } 2583 }
2431 } 2584 }
2432 2585
2433 void 2586 void
2507 emit contextHelpChanged(""); 2660 emit contextHelpChanged("");
2508 return; 2661 return;
2509 } 2662 }
2510 2663
2511 ViewManager::ToolMode mode = ViewManager::NavigateMode; 2664 ViewManager::ToolMode mode = ViewManager::NavigateMode;
2512 if (m_manager) mode = m_manager->getToolMode(); 2665 if (m_manager) mode = m_manager->getToolModeFor(this);
2513 2666
2514 bool editable = false; 2667 bool editable = false;
2515 Layer *layer = getSelectedLayer(); 2668 Layer *layer = getSelectedLayer();
2516 if (layer && layer->isLayerEditable()) { 2669 if (layer && layer->isLayerEditable()) {
2517 editable = true; 2670 editable = true;
2559 } 2712 }
2560 2713
2561 } else if (mode == ViewManager::DrawMode) { 2714 } else if (mode == ViewManager::DrawMode) {
2562 2715
2563 //!!! could call through to a layer function to find out exact meaning 2716 //!!! could call through to a layer function to find out exact meaning
2564 if (editable) { 2717 if (editable) {
2565 help = tr("Click to add a new item in the active layer"); 2718 help = tr("Click to add a new item in the active layer");
2566 } 2719 }
2567 2720
2568 } else if (mode == ViewManager::EraseMode) { 2721 } else if (mode == ViewManager::EraseMode) {
2569 2722
2570 //!!! could call through to a layer function to find out exact meaning 2723 //!!! could call through to a layer function to find out exact meaning
2571 if (editable) { 2724 if (editable) {
2572 help = tr("Click to erase an item from the active layer"); 2725 help = tr("Click to erase an item from the active layer");
2573 } 2726 }
2574 2727
2575 } else if (mode == ViewManager::EditMode) { 2728 } else if (mode == ViewManager::EditMode) {
2576 2729
2577 //!!! could call through to layer 2730 //!!! could call through to layer
2578 if (editable) { 2731 if (editable) {
2579 help = tr("Click and drag an item in the active layer to move it; hold Shift to override initial resistance"); 2732 help = tr("Click and drag an item in the active layer to move it; hold Shift to override initial resistance");
2580 if (pos) { 2733 if (pos) {
2581 bool closeToLeft = false, closeToRight = false; 2734 bool closeToLeft = false, closeToRight = false;
2582 Selection selection = getSelectionAt(pos->x(), closeToLeft, closeToRight); 2735 Selection selection = getSelectionAt(pos->x(), closeToLeft, closeToRight);
2583 if (!selection.isEmpty()) { 2736 if (!selection.isEmpty()) {
2617 Pane::toXml(QTextStream &stream, 2770 Pane::toXml(QTextStream &stream,
2618 QString indent, QString extraAttributes) const 2771 QString indent, QString extraAttributes) const
2619 { 2772 {
2620 View::toXml 2773 View::toXml
2621 (stream, indent, 2774 (stream, indent,
2622 QString("type=\"pane\" centreLineVisible=\"%1\" height=\"%2\" %3") 2775 QString("type=\"pane\" centreLineVisible=\"%1\" height=\"%2\" %3")
2623 .arg(m_centreLineVisible).arg(height()).arg(extraAttributes)); 2776 .arg(m_centreLineVisible).arg(height()).arg(extraAttributes));
2624 } 2777 }
2625 2778
2626 2779