fix pasteinto undo

This commit is contained in:
shun_iwasawa 2017-05-22 13:52:00 +09:00
parent 2fc36cb841
commit a174fa3a66
3 changed files with 24 additions and 17 deletions

View file

@ -61,7 +61,8 @@ void TCellData::setCells(TXsheet *xsh, int r0, int c0, int r1, int c1) {
// data -> xsh
bool TCellData::getCells(TXsheet *xsh, int r0, int c0, int &r1, int &c1,
bool insert, bool doZeraryClone) const {
bool insert, bool doZeraryClone,
bool skipEmptyCells) const {
int c;
r1 = r0 + m_rowCount - 1;
c1 = c0 + m_colCount - 1;
@ -76,11 +77,13 @@ bool TCellData::getCells(TXsheet *xsh, int r0, int c0, int &r1, int &c1,
isColumnEmpty = column->isEmpty();
/*- 各セルに左上→右下で順に割り振られるIndex -*/
int cellIndex = index * m_rowCount;
/*- セルに中身があるところまでcellIndexをインクリメント -*/
while (cellIndex < (index + 1) * m_rowCount &&
m_cells[cellIndex].isEmpty())
++cellIndex;
/*- 選択範囲の終端 -*/
// increment the cellIndex and skip empty cells
if (skipEmptyCells) {
while (cellIndex < (index + 1) * m_rowCount &&
m_cells[cellIndex].isEmpty())
++cellIndex;
}
// if the cellIndex reaches the end of the selection
if ((int)m_cells.size() <= cellIndex) // Celle vuote.
return cellSet;
/*- カラムが変更不可なら次のカラムへ -*/
@ -152,9 +155,9 @@ void TCellData::cloneZeraryFx(int index, std::vector<TXshCell> &cells) const {
TXshZeraryFxColumn *newFxColumn = new TXshZeraryFxColumn(0);
newFxColumn->getZeraryColumnFx()->setZeraryFx(newZeraryFx);
newFxLevel->setColumn(newFxColumn);
cells.clear();
// replace the zerary fx cells by the new fx
int r;
for (r = firstNotEmptyIndex; r < (index + 1) * m_rowCount; r++)
cells.push_back(TXshCell(newFxLevel, m_cells[r].getFrameId()));
for (r = firstNotEmptyIndex; r < (index + 1) * m_rowCount; r++)
cells[r] = TXshCell(newFxLevel, m_cells[r].getFrameId());
}
}

View file

@ -40,10 +40,12 @@ public:
// data -> xsh;
/*! If insert == true insert cells and shift old one.
If column type don't match (sound vs nto sound) don't set column cells.
If doZeraryClone == true clone zerary cells fx.*/
If column type don't match (sound vs not sound) don't set column cells.
If doZeraryClone == true clone zerary cells fx.
If skipEmptyCells == false do not skip setting empty cells in data*/
bool getCells(TXsheet *xsh, int r0, int c0, int &r1, int &c1,
bool insert = true, bool doZeraryClone = true) const;
bool insert = true, bool doZeraryClone = true,
bool skipEmptyCells = true) const;
//! Return true if cell in TCellData can be set in \b xsh xsheet.
bool canChange(TXsheet *xsh, int c0) const;

View file

@ -910,7 +910,8 @@ public:
//=============================================================================
bool pasteCellsWithoutUndo(int &r0, int &c0, int &r1, int &c1,
bool insert = true, bool doZeraryClone = true) {
bool insert = true, bool doZeraryClone = true,
bool skipEmptyCells = true) {
TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
QClipboard *clipboard = QApplication::clipboard();
const QMimeData *mimeData = clipboard->mimeData();
@ -921,7 +922,8 @@ bool pasteCellsWithoutUndo(int &r0, int &c0, int &r1, int &c1,
if (r0 < 0 || c0 < 0) return false;
/*-- この中で、r1,c1はペースト範囲にあわせリサイズされる --*/
bool ret = cellData->getCells(xsh, r0, c0, r1, c1, insert, doZeraryClone);
bool ret = cellData->getCells(xsh, r0, c0, r1, c1, insert, doZeraryClone,
skipEmptyCells);
if (!ret) return false;
// Se la selezione corrente e' TCellSelection selezione le celle copiate
@ -992,16 +994,16 @@ public:
}
/*-- クリップボードの内容を取っておく --*/
const QMimeData *mimeData = clipboard->mimeData();
QMimeData *mimeData = cloneData(clipboard->mimeData());
/*--
* cellDataとしていったんクリップボードに入れ
* --*/
clipboard->setMimeData(cloneData(m_beforeData), QClipboard::Clipboard);
pasteCellsWithoutUndo(r0, c0, c1, r1, true, false);
pasteCellsWithoutUndo(r0, c0, r1, c1, true, false, false);
/*-- クリップボードを元に戻す --*/
clipboard->setMimeData(cloneData(mimeData), QClipboard::Clipboard);
clipboard->setMimeData(mimeData, QClipboard::Clipboard);
// Se le selezione corrente e' TCellSelection seleziono le celle che sono in
// oldSelection