Changeset View
Changeset View
Standalone View
Standalone View
src/view/kateviewhelpers.cpp
Show First 20 Lines • Show All 91 Lines • ▼ Show 20 Line(s) | 2421 | if (!m_doc->handleMarkClick(cursorOnLine)) { | |||
---|---|---|---|---|---|
2435 | } | 2435 | } | ||
2436 | } | 2436 | } | ||
2437 | } else if (e->button() == Qt::RightButton) { | 2437 | } else if (e->button() == Qt::RightButton) { | ||
2438 | showMarkMenu(cursorOnLine, QCursor::pos()); | 2438 | showMarkMenu(cursorOnLine, QCursor::pos()); | ||
2439 | } | 2439 | } | ||
2440 | } | 2440 | } | ||
2441 | 2441 | | |||
2442 | if (area == FoldingMarkers) { | 2442 | if (area == FoldingMarkers) { | ||
2443 | // ask the folding info for this line, if any folds are around! | 2443 | // Prefer the highlighted range over the exact clicked line | ||
2444 | QVector<QPair<qint64, Kate::TextFolding::FoldingRangeFlags> > startingRanges = m_view->textFolding().foldingRangesStartingOnLine(cursorOnLine); | 2444 | const int lineToToggle = m_foldingRange ? m_foldingRange->toRange().start().line() : cursorOnLine; | ||
2445 | bool anyFolded = false; | | |||
2446 | for (int i = 0; i < startingRanges.size(); ++i) | | |||
2447 | if (startingRanges[i].second & Kate::TextFolding::Folded) { | | |||
2448 | anyFolded = true; | | |||
2449 | } | | |||
2450 | 2445 | | |||
2451 | // fold or unfold all ranges, remember if any action happened! | 2446 | // Whatever button it was, try to unfold | ||
2452 | bool actionDone = false; | 2447 | bool actionDone = unfoldLine(lineToToggle); | ||
2453 | for (int i = 0; i < startingRanges.size(); ++i) { | | |||
2454 | actionDone = (anyFolded ? m_view->textFolding().unfoldRange(startingRanges[i].first) : m_view->textFolding().foldRange(startingRanges[i].first)) || actionDone; | | |||
2455 | } | | |||
2456 | 2448 | | |||
2457 | // if no action done, try to fold it, create non-persistent folded range, if possible! | 2449 | // Nothing happens? Then do whatever button should do | ||
2458 | if (!actionDone) { | 2450 | if (!actionDone && e->button() == Qt::LeftButton) { | ||
2459 | // either use the fold for this line or the range that is highlighted ATM if any! | 2451 | foldLine(lineToToggle); | ||
2460 | KTextEditor::Range foldingRange = m_view->doc()->buffer().computeFoldingRangeForStartLine(cursorOnLine); | 2452 | } else if (!actionDone && e->button() == Qt::RightButton) { | ||
2461 | if (!foldingRange.isValid() && m_foldingRange) { | 2453 | toggleFoldingInRange(lineToToggle); | ||
2462 | foldingRange = m_foldingRange->toRange(); | | |||
2463 | } | | |||
2464 | m_view->textFolding().newFoldingRange(foldingRange, Kate::TextFolding::Folded); | | |||
2465 | } | 2454 | } | ||
2466 | 2455 | | |||
2467 | delete m_foldingPreview; | 2456 | delete m_foldingPreview; | ||
2468 | } | 2457 | } | ||
2469 | 2458 | | |||
2470 | if (area == AnnotationBorder) { | 2459 | if (area == AnnotationBorder) { | ||
2471 | const bool singleClick = style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, nullptr, this); | 2460 | const bool singleClick = style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, nullptr, this); | ||
2472 | if (e->button() == Qt::LeftButton && singleClick) { | 2461 | if (e->button() == Qt::LeftButton && singleClick) { | ||
2473 | emit m_view->annotationActivated(m_view, cursorOnLine); | 2462 | emit m_view->annotationActivated(m_view, cursorOnLine); | ||
2474 | } else if (e->button() == Qt::RightButton) { | 2463 | } else if (e->button() == Qt::RightButton) { | ||
2475 | showAnnotationMenu(cursorOnLine, e->globalPos()); | 2464 | showAnnotationMenu(cursorOnLine, e->globalPos()); | ||
2476 | } | 2465 | } | ||
2477 | } | 2466 | } | ||
2478 | } | 2467 | } | ||
2479 | 2468 | | |||
2480 | QMouseEvent forward(QEvent::MouseButtonRelease, | 2469 | QMouseEvent forward(QEvent::MouseButtonRelease, | ||
2481 | QPoint(0, e->y()), e->button(), e->buttons(), e->modifiers()); | 2470 | QPoint(0, e->y()), e->button(), e->buttons(), e->modifiers()); | ||
2482 | m_viewInternal->mouseReleaseEvent(&forward); | 2471 | m_viewInternal->mouseReleaseEvent(&forward); | ||
2483 | } | 2472 | } | ||
2484 | 2473 | | |||
2474 | KTextEditor::Range KateIconBorder::foldLine(int line) | ||||
2475 | { | ||||
2476 | KTextEditor::Range foldingRange = m_view->doc()->buffer().computeFoldingRangeForStartLine(line); | ||||
2477 | if (!foldingRange.isValid()) { | ||||
2478 | return foldingRange; | ||||
2479 | } | ||||
2480 | | ||||
2481 | // Ensure not to fold the end marker to avoid a deceptive look, but only on token based folding | ||||
2482 | Kate::TextLine startTextLine = m_view->doc()->buffer().plainLine(line); | ||||
2483 | const int adjust = startTextLine->markedAsFoldingStartIndentation() ? 0 : 1; | ||||
2484 | foldingRange.setEnd(KTextEditor::Cursor(foldingRange.end().line() - adjust, 0)); | ||||
2485 | m_view->textFolding().newFoldingRange(foldingRange, Kate::TextFolding::Folded); | ||||
2486 | | ||||
2487 | return foldingRange; | ||||
2488 | } | ||||
2489 | | ||||
loh.tar: oops, "to offer such a folding" | |||||
2490 | bool KateIconBorder::unfoldLine(int line) | ||||
2491 | { | ||||
2492 | bool actionDone = false; | ||||
2493 | | ||||
2494 | // ask the folding info for this line, if any folds are around! | ||||
2495 | // auto = QVector<QPair<qint64, Kate::TextFolding::FoldingRangeFlags>> | ||||
2496 | auto startingRanges = m_view->textFolding().foldingRangesStartingOnLine(line); | ||||
2497 | for (int i = 0; i < startingRanges.size(); ++i) { | ||||
2498 | actionDone |= m_view->textFolding().unfoldRange(startingRanges[i].first); | ||||
2499 | } | ||||
2500 | | ||||
2501 | return actionDone; | ||||
2502 | } | ||||
2503 | | ||||
2504 | bool KateIconBorder::toggleFoldingInRange(int line) | ||||
2505 | { | ||||
2506 | KTextEditor::Range foldingRange = m_view->doc()->buffer().computeFoldingRangeForStartLine(line); | ||||
2507 | if (!foldingRange.isValid()) { | ||||
2508 | return false; | ||||
2509 | } | ||||
2510 | | ||||
2511 | bool actionDone = false; | ||||
2512 | for (int ln = foldingRange.start().line() + 1; ln <= foldingRange.end().line(); ++ln) { | ||||
2513 | actionDone |= unfoldLine(ln); | ||||
2514 | } | ||||
2515 | | ||||
2516 | if (!actionDone) { | ||||
2517 | // Fold all in range, but not the range itself | ||||
2518 | for (int ln = foldingRange.start().line() + 1; ln <= foldingRange.end().line(); ++ln) { | ||||
2519 | KTextEditor::Range fr = foldLine(ln); | ||||
2520 | if (fr.isValid()) { | ||||
2521 | ln = fr.end().line() - 1; | ||||
2522 | actionDone = true; | ||||
2523 | } | ||||
2524 | } | ||||
2525 | } | ||||
2526 | | ||||
2527 | if (!actionDone) { | ||||
2528 | // At this place was an unfolded range clicked which contains no "childs" | ||||
2529 | // We assume the user want to fold it by the wrong button, be obliging! | ||||
2530 | actionDone |= foldLine(line).isValid(); | ||||
2531 | } | ||||
2532 | | ||||
2533 | return actionDone; | ||||
2534 | } | ||||
2535 | | ||||
2485 | void KateIconBorder::mouseDoubleClickEvent(QMouseEvent *e) | 2536 | void KateIconBorder::mouseDoubleClickEvent(QMouseEvent *e) | ||
2486 | { | 2537 | { | ||
2487 | int cursorOnLine = m_viewInternal->yToKateTextLayout(e->y()).line(); | 2538 | int cursorOnLine = m_viewInternal->yToKateTextLayout(e->y()).line(); | ||
2488 | 2539 | | |||
2489 | if (cursorOnLine == m_lastClickedLine && | 2540 | if (cursorOnLine == m_lastClickedLine && | ||
2490 | cursorOnLine <= m_doc->lastLine()) { | 2541 | cursorOnLine <= m_doc->lastLine()) { | ||
2491 | const BorderArea area = positionToArea(e->pos()); | 2542 | const BorderArea area = positionToArea(e->pos()); | ||
2492 | const bool singleClick = style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, nullptr, this); | 2543 | const bool singleClick = style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, nullptr, this); | ||
▲ Show 20 Lines • Show All 91 Lines • Show Last 20 Lines |
oops, "to offer such a folding"