diff --git a/src/Mod/Spreadsheet/App/Cell.cpp b/src/Mod/Spreadsheet/App/Cell.cpp index 1d4aef18d0..5bdfde67d3 100644 --- a/src/Mod/Spreadsheet/App/Cell.cpp +++ b/src/Mod/Spreadsheet/App/Cell.cpp @@ -461,8 +461,8 @@ void Cell::setSpans(int rows, int columns) if (rows != rowSpan || columns != colSpan) { PropertySheet::AtomicPropertyChange signaller(*owner); - rowSpan = rows; - colSpan = columns; + rowSpan = (rows == -1 ? 1 : rows); + colSpan = (columns == -1 ? 1 : columns); setUsed(SPANS_SET, (rowSpan != 1 || colSpan != 1) ); setUsed(SPANS_UPDATED); } diff --git a/src/Mod/Spreadsheet/App/PropertySheet.cpp b/src/Mod/Spreadsheet/App/PropertySheet.cpp index 051834d183..4e9c26dde5 100644 --- a/src/Mod/Spreadsheet/App/PropertySheet.cpp +++ b/src/Mod/Spreadsheet/App/PropertySheet.cpp @@ -552,7 +552,14 @@ void PropertySheet::moveCell(CellAddress currPos, CellAddress newPos, std::mapsecond; + int rows, columns; + // Get merged cell data + cell->getSpans(rows, columns); + + // Remove merged cell data + splitCell(currPos); + // Remove from old removeDependencies(currPos); data.erase(currPos); @@ -561,6 +568,15 @@ void PropertySheet::moveCell(CellAddress currPos, CellAddress newPos, std::mapmoveAbsolute(newPos); data[newPos] = cell; + + if (rows > 1 || columns > 1) { + CellAddress toPos(newPos.row() + rows - 1, newPos.col() + columns - 1); + + mergeCells(newPos, toPos); + } + else + cell->setSpans(-1, -1); + addDependencies(newPos); setDirty(newPos); @@ -875,7 +891,7 @@ void PropertySheet::splitCell(CellAddress address) mergedCells.erase(CellAddress(r, c)); } - setSpans(anchor, 1, 1); + setSpans(anchor, -1, -1); } void PropertySheet::getSpans(CellAddress address, int & rows, int & cols) const @@ -885,7 +901,10 @@ void PropertySheet::getSpans(CellAddress address, int & rows, int & cols) const if (i != mergedCells.end()) { CellAddress anchor = i->second; - cellAt(anchor)->getSpans(rows, cols); + if (anchor == address) + cellAt(anchor)->getSpans(rows, cols); + else + rows = cols = 1; } else { rows = cols = 1;