2021-12-26 23:18:28 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2020-2022 Roy Qu (royqh1979@gmail.com)
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
*/
|
2021-09-02 12:14:02 +08:00
|
|
|
#include "caretlist.h"
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
|
|
CaretList::CaretList(QObject* parent):
|
|
|
|
QObject(parent),
|
|
|
|
mIndex(-1),
|
|
|
|
mPauseAdd(false)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void CaretList::addCaret(Editor *editor, int line, int aChar)
|
|
|
|
{
|
|
|
|
if (mPauseAdd)
|
|
|
|
return;
|
|
|
|
for (int i=mList.count()-1;i>mIndex;i--) {
|
|
|
|
removeCaret(i);
|
|
|
|
}
|
|
|
|
PEditorCaret caret = std::make_shared<EditorCaret>();
|
|
|
|
caret->editor = editor;
|
|
|
|
caret->line = line;
|
|
|
|
caret->aChar = aChar;
|
|
|
|
mList.append(caret);
|
|
|
|
mIndex++;
|
2021-09-02 16:35:28 +08:00
|
|
|
//qDebug()<<"add caret:"<<mIndex<<":"<<mList.count();
|
2021-09-02 12:14:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
bool CaretList::hasPrevious() const
|
|
|
|
{
|
2021-09-02 16:35:28 +08:00
|
|
|
//qDebug()<<"has previous:"<<mIndex<<":"<<mList.count();
|
2021-09-02 12:14:02 +08:00
|
|
|
return mIndex>0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CaretList::hasNext() const
|
|
|
|
{
|
2021-09-02 16:35:28 +08:00
|
|
|
//qDebug()<<"has next:"<<mIndex<<":"<<mList.count();
|
2021-09-02 12:14:02 +08:00
|
|
|
return mIndex<mList.count()-1;
|
|
|
|
}
|
|
|
|
|
|
|
|
PEditorCaret CaretList::gotoAndGetPrevious()
|
|
|
|
{
|
|
|
|
if (!hasPrevious())
|
|
|
|
return PEditorCaret();
|
|
|
|
mIndex--;
|
2021-09-02 16:35:28 +08:00
|
|
|
//qDebug()<<"move previous:"<<mIndex<<":"<<mList.count();
|
2021-09-02 12:14:02 +08:00
|
|
|
if (mIndex<mList.count())
|
|
|
|
return mList[mIndex];
|
|
|
|
return PEditorCaret();
|
|
|
|
}
|
|
|
|
|
|
|
|
PEditorCaret CaretList::gotoAndGetNext()
|
|
|
|
{
|
|
|
|
if (!hasNext())
|
|
|
|
return PEditorCaret();
|
|
|
|
mIndex++;
|
2021-09-02 16:35:28 +08:00
|
|
|
//qDebug()<<"move next:"<<mIndex<<":"<<mList.count();
|
2021-09-02 12:14:02 +08:00
|
|
|
if (mIndex>=0)
|
|
|
|
return mList[mIndex];
|
|
|
|
return PEditorCaret();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CaretList::removeEditor(const Editor *editor)
|
|
|
|
{
|
|
|
|
for (int i = mList.count()-1;i>=0;i--) {
|
|
|
|
if (mList[i]->editor == editor)
|
|
|
|
removeCaret(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CaretList::reset()
|
|
|
|
{
|
|
|
|
mList.clear();
|
|
|
|
mIndex = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CaretList::pause()
|
|
|
|
{
|
|
|
|
mPauseAdd = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CaretList::unPause()
|
|
|
|
{
|
|
|
|
mPauseAdd = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CaretList::linesDeleted(const Editor *editor, int firstLine, int count)
|
|
|
|
{
|
2021-09-02 16:35:28 +08:00
|
|
|
//qDebug()<<"deleted:"<<mIndex<<":"<<mList.count();
|
2021-09-02 12:14:02 +08:00
|
|
|
for (int i=mList.count()-1;i>=0;i--) {
|
|
|
|
if (mList[i]->editor == editor
|
|
|
|
&& mList[i]->line>=firstLine) {
|
|
|
|
if (mList[i]->line < (firstLine+count))
|
|
|
|
removeCaret(i);
|
|
|
|
else
|
|
|
|
mList[i]->line-=count;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CaretList::linesInserted(const Editor *editor, int firstLine, int count)
|
|
|
|
{
|
2021-09-02 16:35:28 +08:00
|
|
|
//qDebug()<<"inserted:"<<mIndex<<":"<<mList.count();
|
2021-09-02 12:14:02 +08:00
|
|
|
for(PEditorCaret& caret:mList) {
|
|
|
|
if (caret->editor == editor
|
|
|
|
&& caret->line >= firstLine)
|
|
|
|
caret->line+=count;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CaretList::removeCaret(int index)
|
|
|
|
{
|
|
|
|
if (index<0 || index>=mList.count())
|
|
|
|
return;
|
|
|
|
mList.removeAt(index);
|
|
|
|
if (mIndex>=index)
|
|
|
|
mIndex--;
|
|
|
|
}
|