void SelectableTextEditorWidget::setSelections(const QMap<int, QList<DiffSelection> > &selections) { m_diffSelections.clear(); for (auto it = selections.cbegin(), end = selections.cend(); it != end; ++it) { const QList<DiffSelection> diffSelections = it.value(); QList<DiffSelection> workingList; for (const DiffSelection &diffSelection : diffSelections) { if (diffSelection.start == -1 && diffSelection.end == 0) continue; if (diffSelection.start == diffSelection.end && diffSelection.start >= 0) continue; int j = 0; while (j < workingList.count()) { const DiffSelection existingSelection = workingList.takeAt(j); const QList<DiffSelection> newSelection = subtractSelection(existingSelection, diffSelection); for (int k = 0; k < newSelection.count(); k++) workingList.insert(j + k, newSelection.at(k)); j += newSelection.count(); } workingList.append(diffSelection); } m_diffSelections.insert(it.key(), workingList); } }
void SelectableTextEditorWidget::setSelections(const QMap<int, QList<DiffSelection> > &selections) { m_diffSelections.clear(); QMapIterator<int, QList<DiffSelection> > itBlock(selections); while (itBlock.hasNext()) { itBlock.next(); const QList<DiffSelection> diffSelections = itBlock.value(); QList<DiffSelection> workingList; for (int i = 0; i < diffSelections.count(); i++) { const DiffSelection &diffSelection = diffSelections.at(i); if (diffSelection.start == -1 && diffSelection.end == 0) continue; if (diffSelection.start == diffSelection.end && diffSelection.start >= 0) continue; int j = 0; while (j < workingList.count()) { const DiffSelection existingSelection = workingList.takeAt(j); const QList<DiffSelection> newSelection = subtractSelection(existingSelection, diffSelection); for (int k = 0; k < newSelection.count(); k++) workingList.insert(j + k, newSelection.at(k)); j += newSelection.count(); } workingList.append(diffSelection); } const int blockNumber = itBlock.key(); QVector<QTextLayout::FormatRange> selList; for (int i = 0; i < workingList.count(); i++) { const DiffSelection &diffSelection = workingList.at(i); if (diffSelection.format) { QTextLayout::FormatRange formatRange; formatRange.start = diffSelection.start; if (formatRange.start < 0) formatRange.start = 0; formatRange.length = diffSelection.end < 0 ? INT_MAX : diffSelection.end - diffSelection.start; formatRange.format = *diffSelection.format; if (diffSelection.end < 0) formatRange.format.setProperty(QTextFormat::FullWidthSelection, true); selList.append(formatRange); } } m_diffSelections.insert(blockNumber, workingList); } }
void KisPixelSelection::applySelection(KisPixelSelectionSP selection, selectionAction action) { switch (action) { case SELECTION_REPLACE: // XXX: Shouldn't we actually replace the selection, instead of falling through to add? case SELECTION_ADD: addSelection(selection); break; case SELECTION_SUBTRACT: subtractSelection(selection); break; case SELECTION_INTERSECT: intersectSelection(selection); break; default: break; } }