예제 #1
0
void
RangeListTest::testConstructors()
{
	RangeList ranges;
	QVERIFY(ranges.isEmpty() && ranges.rangesCount() == 0);

	ranges << Range(1, 2);
	QVERIFY(ranges.firstIndex() == 1 && ranges.lastIndex() == 2 && ranges.indexesCount() == 2);

	RangeList ranges2(Range(1, 2));
	QVERIFY(ranges == ranges2);

	ranges2 = ranges;
	QVERIFY(ranges == ranges2);

	ranges << Range(7, 9);
	QVERIFY(ranges.firstIndex() == 1 && ranges.lastIndex() == 9 && ranges.indexesCount() == 5);

	RangeList ranges3(ranges);
	QVERIFY(ranges == ranges3);

	ranges3 = ranges;
	QVERIFY(ranges == ranges3);

	RangeList complementRanges = ranges.complement();
	QVERIFY(complementRanges.firstIndex() == 0);
	QVERIFY(complementRanges.lastIndex() == Range::MaxIndex);

	RangeList::ConstIterator complementRangesIt = complementRanges.begin();
	QVERIFY(*(complementRangesIt++) == Range(0, 0));
	QVERIFY(*(complementRangesIt++) == Range(3, 6));
	QVERIFY(*(complementRangesIt++) == Range(10, Range::MaxIndex));
}
예제 #2
0
	void serializeRanges(const RangeList &list, std::string &out) {
		std::ostringstream outs;

		for (RangeList::const_iterator liter = list.begin(); liter != list.end(); ++liter) {
			cache_ssize_type len = (cache_ssize_type)((*liter).length());
			if ((*liter).goesToEndOfFile()) {
				len = -len;
			}
			outs << (*liter).startbyte() << " " << len << "; ";
		}
		out = outs.str();
	}
예제 #3
0
 inline bool
 contains(CallNo callNo, CallFlags callFlags = FREQUENCY_ALL) const {
     if (empty()) {
         return false;
     }
     RangeList::const_iterator it;
     for (it = ranges.begin(); it != ranges.end() && it->start <= callNo; ++it) {
         if (it->contains(callNo, callFlags)) {
             return true;
         }
     }
     return false;
 }
예제 #4
0
void
Subtitle::joinLines(const RangeList &ranges)
{
	beginCompositeAction(i18n("Join Lines"));

	RangeList obsoletedRanges;

	for(RangeList::ConstIterator rangesIt = ranges.begin(), end = ranges.end(); rangesIt != end; ++rangesIt) {
		int rangeStart = (*rangesIt).start();
		int rangeEnd = normalizeRangeIndex((*rangesIt).end());

		if(rangeStart >= rangeEnd)
			continue;

		SubtitleLine *firstLine = m_lines.at(rangeStart);
		SubtitleLine *lastLine = m_lines.at(rangeEnd);

		SString primaryText, secondaryText;

		for(SubtitleIterator it(*this, Range(rangeStart, rangeEnd - 1)); it.current(); ++it) {
			if(!it.current()->primaryText().isEmpty()) {
				primaryText.append(it.current()->primaryText());
				primaryText.append("\n");
			}

			if(!it.current()->secondaryText().isEmpty()) {
				secondaryText.append(it.current()->secondaryText());
				secondaryText.append("\n");
			}
		}

		primaryText.append(lastLine->primaryText());
		secondaryText.append(lastLine->secondaryText());

		firstLine->setTexts(primaryText, secondaryText);
		firstLine->setHideTime(lastLine->hideTime());

		obsoletedRanges << Range(rangeStart + 1, rangeEnd);
	}

	removeLines(obsoletedRanges, Both);

	endCompositeAction();
}
예제 #5
0
        void
        addRange(const CallRange & range) {
            if (range.start <= range.stop &&
                range.freq != FREQUENCY_NONE) {

                if (empty()) {
                    limits.start = range.start;
                    limits.stop = range.stop;
                } else {
                    if (range.start < limits.start)
                        limits.start = range.start;
                    if (range.stop > limits.stop)
                        limits.stop = range.stop;
                }

                RangeList::iterator it = ranges.begin();
                while (it != ranges.end() && it->start < range.start) {
                    ++it;
                }

                ranges.insert(it, range);
            }
        }
예제 #6
0
void
Subtitle::removeLines(const RangeList &r, TextTarget target)
{
	if(m_lines.isEmpty())
		return;

	RangeList ranges = r;
	ranges.trimToIndex(m_lines.count() - 1);

	if(ranges.isEmpty())
		return;

	if(target == Both) {
		beginCompositeAction(i18n("Remove Lines"));

		RangeList::ConstIterator rangesIt = ranges.end(), begin = ranges.begin();
		do {
			rangesIt--;
			processAction(new RemoveLinesAction(*this, (*rangesIt).start(), (*rangesIt).end()));
		} while(rangesIt != begin);

		endCompositeAction();
	} else if(target == Secondary) {
		beginCompositeAction(i18n("Remove Lines"));

		RangeList rangesComplement = ranges.complement();
		rangesComplement.trimToRange(Range(ranges.firstIndex(), m_lines.count() - 1));

		// we have to move the secondary texts up (we do it in chunks)
		SubtitleIterator srcIt(*this, rangesComplement);
		SubtitleIterator dstIt(*this, Range::upper(ranges.firstIndex()));
		for(; srcIt.current() && dstIt.current(); ++srcIt, ++dstIt)
			dstIt.current()->setSecondaryText(srcIt.current()->secondaryText());

		// the remaining lines secondary text must be cleared
		for(; dstIt.current(); ++dstIt)
			dstIt.current()->setSecondaryText(SString());

		endCompositeAction();
	} else {                                        // if target == Primary
		beginCompositeAction(i18n("Remove Lines"), true, false);

		RangeList mutableRanges(ranges);
		mutableRanges.trimToIndex(m_lines.count() - 1);

		// first, we need to append as many empty lines as we're to remove
		// we insert them with a greater time than the one of the last (non deleted) line

		int linesCount = m_lines.count();

		Range lastRange = mutableRanges.last();
		int lastIndex = lastRange.end() == linesCount - 1 ? lastRange.start() - 1 : linesCount - 1;
		SubtitleLine *lastLine = lastIndex < linesCount ? m_lines.at(lastIndex) : 0;
		Time showTime(lastLine ? lastLine->hideTime() + 100 : 0);
		Time hideTime(showTime + 1000);

		QList<SubtitleLine *> lines;
		for(int index = 0, size = ranges.indexesCount(); index < size; ++index) {
			lines.append(new SubtitleLine(SString(), SString(), showTime, hideTime));
			showTime.shift(1100);
			hideTime.shift(1100);
		}

		processAction(new InsertLinesAction(*this, lines));

		// then, we move the secondary texts down (we need to iterate from bottom to top for that)
		RangeList rangesComplement = mutableRanges.complement();

		SubtitleIterator srcIt(*this, Range(ranges.firstIndex(), m_lines.count() - lines.count() - 1), true);
		SubtitleIterator dstIt(*this, rangesComplement, true);
		for(; srcIt.current() && dstIt.current(); --srcIt, --dstIt)
			dstIt.current()->setSecondaryText(srcIt.current()->secondaryText());

		// finally, we can remove the specified lines
		RangeList::ConstIterator rangesIt = ranges.end(), begin = ranges.begin();
		do {
			rangesIt--;
			processAction(new RemoveLinesAction(*this, (*rangesIt).start(), (*rangesIt).end()));
		} while(rangesIt != begin);

		endCompositeAction();
	}
}