Mercurial > hg > svgui
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 |