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; | 2445 | if (e->button() == Qt::LeftButton && !unfoldLine(lineToToggle)) { | ||
2446 | for (int i = 0; i < startingRanges.size(); ++i) | 2446 | foldLine(lineToToggle); | ||
2447 | if (startingRanges[i].second & Kate::TextFolding::Folded) { | 2447 | } else if (e->button() == Qt::RightButton) { | ||
2448 | anyFolded = true; | 2448 | toggleFoldingInRange(lineToToggle); | ||
2449 | } | | |||
2450 | | ||||
2451 | // fold or unfold all ranges, remember if any action happened! | | |||
2452 | bool actionDone = false; | | |||
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 | | ||||
2457 | // if no action done, try to fold it, create non-persistent folded range, if possible! | | |||
2458 | if (!actionDone) { | | |||
2459 | // either use the fold for this line or the range that is highlighted ATM if any! | | |||
2460 | KTextEditor::Range foldingRange = m_view->doc()->buffer().computeFoldingRangeForStartLine(cursorOnLine); | | |||
2461 | if (!foldingRange.isValid() && m_foldingRange) { | | |||
2462 | foldingRange = m_foldingRange->toRange(); | | |||
2463 | } | | |||
2464 | m_view->textFolding().newFoldingRange(foldingRange, Kate::TextFolding::Folded); | | |||
2465 | } | 2449 | } | ||
2466 | 2450 | | |||
2467 | delete m_foldingPreview; | 2451 | delete m_foldingPreview; | ||
2468 | } | 2452 | } | ||
2469 | 2453 | | |||
2470 | if (area == AnnotationBorder) { | 2454 | if (area == AnnotationBorder) { | ||
2471 | const bool singleClick = style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, nullptr, this); | 2455 | const bool singleClick = style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, nullptr, this); | ||
2472 | if (e->button() == Qt::LeftButton && singleClick) { | 2456 | if (e->button() == Qt::LeftButton && singleClick) { | ||
2473 | emit m_view->annotationActivated(m_view, cursorOnLine); | 2457 | emit m_view->annotationActivated(m_view, cursorOnLine); | ||
2474 | } else if (e->button() == Qt::RightButton) { | 2458 | } else if (e->button() == Qt::RightButton) { | ||
2475 | showAnnotationMenu(cursorOnLine, e->globalPos()); | 2459 | showAnnotationMenu(cursorOnLine, e->globalPos()); | ||
2476 | } | 2460 | } | ||
2477 | } | 2461 | } | ||
2478 | } | 2462 | } | ||
2479 | 2463 | | |||
2480 | QMouseEvent forward(QEvent::MouseButtonRelease, | 2464 | QMouseEvent forward(QEvent::MouseButtonRelease, | ||
2481 | QPoint(0, e->y()), e->button(), e->buttons(), e->modifiers()); | 2465 | QPoint(0, e->y()), e->button(), e->buttons(), e->modifiers()); | ||
2482 | m_viewInternal->mouseReleaseEvent(&forward); | 2466 | m_viewInternal->mouseReleaseEvent(&forward); | ||
2483 | } | 2467 | } | ||
2484 | 2468 | | |||
2469 | KTextEditor::Range KateIconBorder::foldLine(int line) | ||||
2470 | { | ||||
2471 | KTextEditor::Range foldingRange = m_view->doc()->buffer().computeFoldingRangeForStartLine(line); | ||||
2472 | if (!foldingRange.isValid()) { | ||||
2473 | return foldingRange; | ||||
2474 | } | ||||
2475 | | ||||
2476 | // Ensure not to fold the end marker to avoid a deceptive look, but only on token based folding | ||||
2477 | Kate::TextLine startTextLine = m_view->doc()->buffer().plainLine(line); | ||||
2478 | if (!startTextLine->markedAsFoldingStartIndentation()) { | ||||
2479 | const int adjustedLine = foldingRange.end().line() - 1; | ||||
2480 | foldingRange.setEnd(KTextEditor::Cursor(adjustedLine, m_view->doc()->buffer().plainLine(adjustedLine)->length())); | ||||
2481 | } | ||||
2482 | | ||||
2483 | // Don't try to fold a single line, which can happens due to adjustment above' | ||||
2484 | // FIXME Avoid to offer a such folding marker | ||||
loh.tar: oops, "to offer such a folding" | |||||
2485 | if (!foldingRange.onSingleLine()) { | ||||
2486 | m_view->textFolding().newFoldingRange(foldingRange, Kate::TextFolding::Folded); | ||||
2487 | } | ||||
2488 | | ||||
2489 | return foldingRange; | ||||
2490 | } | ||||
2491 | | ||||
2492 | bool KateIconBorder::unfoldLine(int line) | ||||
2493 | { | ||||
2494 | bool actionDone = false; | ||||
2495 | | ||||
2496 | // ask the folding info for this line, if any folds are around! | ||||
2497 | // auto = QVector<QPair<qint64, Kate::TextFolding::FoldingRangeFlags>> | ||||
2498 | auto startingRanges = m_view->textFolding().foldingRangesStartingOnLine(line); | ||||
2499 | for (int i = 0; i < startingRanges.size(); ++i) { | ||||
2500 | actionDone |= m_view->textFolding().unfoldRange(startingRanges[i].first); | ||||
2501 | } | ||||
2502 | | ||||
2503 | return actionDone; | ||||
2504 | } | ||||
2505 | | ||||
2506 | bool KateIconBorder::toggleFoldingInRange(int line) | ||||
2507 | { | ||||
2508 | KTextEditor::Range foldingRange = m_view->doc()->buffer().computeFoldingRangeForStartLine(line); | ||||
2509 | if (!foldingRange.isValid()) { | ||||
2510 | return false; | ||||
2511 | } | ||||
2512 | | ||||
2513 | bool actionDone = false; // Track success | ||||
2514 | | ||||
2515 | // Don't be too eager but obliging! Only toggle containing ranges which are | ||||
2516 | // visible -> Be done when the range is folded | ||||
2517 | actionDone |= unfoldLine(line); | ||||
2518 | | ||||
2519 | if (!actionDone) { | ||||
2520 | // Unfold all in range, but not the range itself | ||||
2521 | for (int ln = foldingRange.start().line() + 1; ln < foldingRange.end().line(); ++ln) { | ||||
2522 | actionDone |= unfoldLine(ln); | ||||
2523 | } | ||||
2524 | } | ||||
2525 | | ||||
2526 | if (!actionDone) { | ||||
2527 | // Fold all in range, but not the range itself | ||||
2528 | for (int ln = foldingRange.start().line() + 1; ln < foldingRange.end().line(); ++ln) { | ||||
2529 | KTextEditor::Range fr = foldLine(ln); | ||||
2530 | if (fr.isValid()) { | ||||
2531 | ln = fr.end().line() - 1; | ||||
2532 | actionDone = true; | ||||
2533 | } | ||||
2534 | } | ||||
2535 | } | ||||
2536 | | ||||
2537 | if (!actionDone) { | ||||
2538 | // At this place was an unfolded range clicked which contains no "childs" | ||||
2539 | // We assume the user want to fold it by the wrong button, be obliging! | ||||
2540 | actionDone |= foldLine(line).isValid(); | ||||
2541 | } | ||||
2542 | | ||||
2543 | return actionDone; // Should now always be true, but anyway | ||||
2544 | } | ||||
2545 | | ||||
2485 | void KateIconBorder::mouseDoubleClickEvent(QMouseEvent *e) | 2546 | void KateIconBorder::mouseDoubleClickEvent(QMouseEvent *e) | ||
2486 | { | 2547 | { | ||
2487 | int cursorOnLine = m_viewInternal->yToKateTextLayout(e->y()).line(); | 2548 | int cursorOnLine = m_viewInternal->yToKateTextLayout(e->y()).line(); | ||
2488 | 2549 | | |||
2489 | if (cursorOnLine == m_lastClickedLine && | 2550 | if (cursorOnLine == m_lastClickedLine && | ||
2490 | cursorOnLine <= m_doc->lastLine()) { | 2551 | cursorOnLine <= m_doc->lastLine()) { | ||
2491 | const BorderArea area = positionToArea(e->pos()); | 2552 | const BorderArea area = positionToArea(e->pos()); | ||
2492 | const bool singleClick = style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, nullptr, this); | 2553 | 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"