diff --git a/toonz/sources/include/toonzqt/selectioncommandids.h b/toonz/sources/include/toonzqt/selectioncommandids.h index 50fa74b..1c7a69a 100644 --- a/toonz/sources/include/toonzqt/selectioncommandids.h +++ b/toonz/sources/include/toonzqt/selectioncommandids.h @@ -6,7 +6,9 @@ #define MI_Cut "MI_Cut" #define MI_Copy "MI_Copy" #define MI_Insert "MI_Insert" +#define MI_InsertAbove "MI_InsertAbove" #define MI_Paste "MI_Paste" +#define MI_PasteAbove "MI_PasteAbove" #define MI_PasteInto "MI_PasteInto" #define MI_PasteValues "MI_PasteValues" #define MI_PasteColors "MI_PasteColors" diff --git a/toonz/sources/toonz/columncommand.cpp b/toonz/sources/toonz/columncommand.cpp index 744e883..07221fe 100644 --- a/toonz/sources/toonz/columncommand.cpp +++ b/toonz/sources/toonz/columncommand.cpp @@ -263,7 +263,8 @@ bool pasteColumnsWithoutUndo(std::set *indices, bool doClone, std::list restoredSplineIds; data->restoreObjects(*indices, restoredSplineIds, xsh, - doClone ? StageObjectsData::eDoClone : 0); + doClone ? StageObjectsData::eDoClone : 0, + TConst::nowhere); app->getCurrentXsheet()->notifyXsheetChanged(); app->getCurrentObject()->notifyObjectIdSwitched(); return true; @@ -647,8 +648,8 @@ class InsertEmptyColumnsUndo final : public ColumnCommandUndo { std::vector> m_columnBlocks; public: - InsertEmptyColumnsUndo(const std::vector &indices) { - initialize(indices); + InsertEmptyColumnsUndo(const std::vector &indices, bool insertAfter) { + initialize(indices, insertAfter); } bool isConsistent() const override { return true; } @@ -672,12 +673,13 @@ public: int getHistoryType() override { return HistoryType::Xsheet; } private: - void initialize(const std::vector &indices); + void initialize(const std::vector &indices, bool insertAfter = false); }; //------------------------------------------------------ -void InsertEmptyColumnsUndo::initialize(const std::vector &indices) { +void InsertEmptyColumnsUndo::initialize(const std::vector &indices, + bool insertAfter) { TApp *app = TApp::instance(); TXsheet *xsh = app->getCurrentXsheet()->getXsheet(); @@ -690,7 +692,8 @@ void InsertEmptyColumnsUndo::initialize(const std::vector &indices) { (ce != cEnd) && (*ce == c);) // by iterating as long as the next ++ce, ++c; // column index is the previous one + 1 - m_columnBlocks.push_back(std::make_pair(*cb, c - *cb)); + int insertAt = (insertAfter ? c : *cb); + m_columnBlocks.push_back(std::make_pair(insertAt, c - *cb)); } assert(!m_columnBlocks.empty()); @@ -702,6 +705,10 @@ void InsertEmptyColumnsUndo::redo() const { TApp *app = TApp::instance(); TXsheet *xsh = app->getCurrentXsheet()->getXsheet(); + // If this is the very first column, add one now since there is always + // 1 visible on the screen but its not actually there yet. + if (!xsh->getColumnCount()) xsh->insertColumn(0); + std::vector>::const_reverse_iterator bt, bEnd = m_columnBlocks.rend(); for (bt = m_columnBlocks.rbegin(); bt != bEnd; ++bt) @@ -730,14 +737,15 @@ void InsertEmptyColumnsUndo::undo() const { //====================================================== -void ColumnCmd::insertEmptyColumns(const std::set &indices) { +void ColumnCmd::insertEmptyColumns(const std::set &indices, + bool insertAfter) { // Filter out all less than 0 indices (in particular, the 'camera' column // in the Toonz derivative product "Tab") std::vector positiveIndices(indices.lower_bound(0), indices.end()); if (positiveIndices.empty()) return; std::unique_ptr undo( - new InsertEmptyColumnsUndo(positiveIndices)); + new InsertEmptyColumnsUndo(positiveIndices, insertAfter)); if (undo->isConsistent()) { undo->redo(); TUndoManager::manager()->add(undo.release()); diff --git a/toonz/sources/toonz/columncommand.h b/toonz/sources/toonz/columncommand.h index 2f758c8..aef95da 100644 --- a/toonz/sources/toonz/columncommand.h +++ b/toonz/sources/toonz/columncommand.h @@ -9,7 +9,7 @@ class StageObjectsData; namespace ColumnCmd { -void insertEmptyColumns(const std::set &indices); +void insertEmptyColumns(const std::set &indices, bool insertAfter = false); void insertEmptyColumn(int index); void copyColumns(const std::set &indices); diff --git a/toonz/sources/toonz/columnselection.cpp b/toonz/sources/toonz/columnselection.cpp index cf1394a..bbb81bc 100644 --- a/toonz/sources/toonz/columnselection.cpp +++ b/toonz/sources/toonz/columnselection.cpp @@ -38,7 +38,9 @@ void TColumnSelection::enableCommands() { enableCommand(this, MI_Cut, &TColumnSelection::cutColumns); enableCommand(this, MI_Copy, &TColumnSelection::copyColumns); enableCommand(this, MI_Paste, &TColumnSelection::pasteColumns); + enableCommand(this, MI_PasteAbove, &TColumnSelection::pasteColumnsAbove); enableCommand(this, MI_Clear, &TColumnSelection::deleteColumns); + enableCommand(this, MI_InsertAbove, &TColumnSelection::insertColumnsAbove); enableCommand(this, MI_Insert, &TColumnSelection::insertColumns); enableCommand(this, MI_Collapse, &TColumnSelection::collapse); enableCommand(this, MI_ExplodeChild, &TColumnSelection::explodeChild); @@ -68,6 +70,19 @@ void TColumnSelection::pasteColumns() { ColumnCmd::pasteColumns(m_indices); } //----------------------------------------------------------------------------- +void TColumnSelection::pasteColumnsAbove() { + std::set indices; + std::set::iterator it; + + for (it = m_indices.begin(); it != m_indices.end(); it++) { + int newIdx = *it + 1; + indices.insert(newIdx); + } + + ColumnCmd::pasteColumns(indices, 0); +} + +//----------------------------------------------------------------------------- void TColumnSelection::deleteColumns() { ColumnCmd::deleteColumns(m_indices, false, false); } @@ -87,6 +102,11 @@ void TColumnSelection::insertColumns() { //----------------------------------------------------------------------------- +void TColumnSelection::insertColumnsAbove() { + ColumnCmd::insertEmptyColumns(m_indices, true); +} + +//----------------------------------------------------------------------------- void TColumnSelection::collapse() { if (m_indices.empty()) return; SubsceneCmd::collapse(m_indices); diff --git a/toonz/sources/toonz/columnselection.h b/toonz/sources/toonz/columnselection.h index 4f32bd2..fad2253 100644 --- a/toonz/sources/toonz/columnselection.h +++ b/toonz/sources/toonz/columnselection.h @@ -33,9 +33,11 @@ public: void copyColumns(); void pasteColumns(); + void pasteColumnsAbove(); void deleteColumns(); void cutColumns(); void insertColumns(); + void insertColumnsAbove(); void collapse(); void explodeChild(); diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index e75ed5f..e8824bf 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1424,7 +1424,7 @@ QAction *MainWindow::createAction(const char *id, const QString &name, if (strcmp(id, MI_ShortcutPopup) == 0) { action->setMenuRole(QAction::NoRole); } - if (strcmp(id,MI_ExitGroup) == 0) { + if (strcmp(id, MI_ExitGroup) == 0) { action->setMenuRole(QAction::NoRole); } #endif @@ -1696,7 +1696,9 @@ void MainWindow::defineActions() { redoAction->setIcon(QIcon(":Resources/redo.svg")); createMenuEditAction(MI_Cut, tr("&Cut"), "Ctrl+X"); createMenuEditAction(MI_Copy, tr("&Copy"), "Ctrl+C"); - createMenuEditAction(MI_Paste, tr("&Insert Paste"), "Ctrl+V"); + createMenuEditAction(MI_Paste, tr("&Paste Insert"), "Ctrl+V"); + createMenuEditAction(MI_PasteAbove, tr("&Paste Insert Above/After"), + "Ctrl+Shift+V"); // createMenuEditAction(MI_PasteNew, tr("&Paste New"), ""); createMenuCellsAction(MI_MergeFrames, tr("&Merge"), ""); createMenuEditAction(MI_PasteInto, tr("&Paste Into"), ""); @@ -1711,6 +1713,7 @@ void MainWindow::defineActions() { tr("Remove Reference to Studio Palette"), ""); createMenuEditAction(MI_Clear, tr("&Delete"), "Del"); createMenuEditAction(MI_Insert, tr("&Insert"), "Ins"); + createMenuEditAction(MI_InsertAbove, tr("&Insert Above/After"), "Shift+Ins"); createMenuEditAction(MI_Group, tr("&Group"), "Ctrl+G"); createMenuEditAction(MI_Ungroup, tr("&Ungroup"), "Ctrl+Shift+G"); createMenuEditAction(MI_BringToFront, tr("&Bring to Front"), "Ctrl+]"); @@ -2405,9 +2408,9 @@ RecentFiles::~RecentFiles() {} void RecentFiles::addFilePath(QString path, FileType fileType) { QList files = - (fileType == Scene) - ? m_recentScenes - : (fileType == Level) ? m_recentLevels : m_recentFlipbookImages; + (fileType == Scene) ? m_recentScenes : (fileType == Level) + ? m_recentLevels + : m_recentFlipbookImages; int i; for (i = 0; i < files.size(); i++) if (files.at(i) == path) files.removeAt(i); @@ -2532,9 +2535,9 @@ void RecentFiles::saveRecentFiles() { QList RecentFiles::getFilesNameList(FileType fileType) { QList files = - (fileType == Scene) - ? m_recentScenes - : (fileType == Level) ? m_recentLevels : m_recentFlipbookImages; + (fileType == Scene) ? m_recentScenes : (fileType == Level) + ? m_recentLevels + : m_recentFlipbookImages; QList names; int i; for (i = 0; i < files.size(); i++) { @@ -2561,9 +2564,9 @@ void RecentFiles::refreshRecentFilesMenu(FileType fileType) { menu->setEnabled(false); else { CommandId clearActionId = - (fileType == Scene) - ? MI_ClearRecentScene - : (fileType == Level) ? MI_ClearRecentLevel : MI_ClearRecentImage; + (fileType == Scene) ? MI_ClearRecentScene : (fileType == Level) + ? MI_ClearRecentLevel + : MI_ClearRecentImage; menu->setActions(names); menu->addSeparator(); QAction *clearAction = CommandManager::instance()->getAction(clearActionId); diff --git a/toonz/sources/toonz/menubar.cpp b/toonz/sources/toonz/menubar.cpp index dae7d12..2de2024 100644 --- a/toonz/sources/toonz/menubar.cpp +++ b/toonz/sources/toonz/menubar.cpp @@ -408,10 +408,12 @@ QMenuBar *StackedMenuBar::createCleanupMenuBar() { addMenuItem(editMenu, MI_Copy); addMenuItem(editMenu, MI_Cut); addMenuItem(editMenu, MI_Paste); + addMenuItem(editMenu, MI_PasteAbove); addMenuItem(editMenu, MI_PasteInto); editMenu->addSeparator(); addMenuItem(editMenu, MI_Clear); addMenuItem(editMenu, MI_Insert); + addMenuItem(editMenu, MI_InsertAbove); addMenuItem(editMenu, MI_SelectAll); addMenuItem(editMenu, MI_InvertSelection); @@ -554,10 +556,12 @@ QMenuBar *StackedMenuBar::createPltEditMenuBar() { addMenuItem(editMenu, MI_Copy); addMenuItem(editMenu, MI_Cut); addMenuItem(editMenu, MI_Paste); + addMenuItem(editMenu, MI_PasteAbove); addMenuItem(editMenu, MI_PasteInto); editMenu->addSeparator(); addMenuItem(editMenu, MI_Clear); addMenuItem(editMenu, MI_Insert); + addMenuItem(editMenu, MI_InsertAbove); addMenuItem(editMenu, MI_SelectAll); addMenuItem(editMenu, MI_InvertSelection); @@ -733,10 +737,12 @@ QMenuBar *StackedMenuBar::createInknPaintMenuBar() { addMenuItem(editMenu, MI_Copy); addMenuItem(editMenu, MI_Cut); addMenuItem(editMenu, MI_Paste); + addMenuItem(editMenu, MI_PasteAbove); addMenuItem(editMenu, MI_PasteInto); editMenu->addSeparator(); addMenuItem(editMenu, MI_Clear); addMenuItem(editMenu, MI_Insert); + addMenuItem(editMenu, MI_InsertAbove); addMenuItem(editMenu, MI_SelectAll); addMenuItem(editMenu, MI_InvertSelection); @@ -906,10 +912,12 @@ QMenuBar *StackedMenuBar::createXsheetMenuBar() { addMenuItem(editMenu, MI_Copy); addMenuItem(editMenu, MI_Cut); addMenuItem(editMenu, MI_Paste); + addMenuItem(editMenu, MI_PasteAbove); addMenuItem(editMenu, MI_PasteInto); editMenu->addSeparator(); addMenuItem(editMenu, MI_Clear); addMenuItem(editMenu, MI_Insert); + addMenuItem(editMenu, MI_InsertAbove); addMenuItem(editMenu, MI_SelectAll); addMenuItem(editMenu, MI_InvertSelection); editMenu->addSeparator(); @@ -1131,11 +1139,13 @@ QMenuBar *StackedMenuBar::createFullMenuBar() { addMenuItem(editMenu, MI_Cut); addMenuItem(editMenu, MI_Copy); addMenuItem(editMenu, MI_Paste); + addMenuItem(editMenu, MI_PasteAbove); // addMenuItem(editMenu, MI_PasteNew); addMenuItem(editMenu, MI_PasteInto); editMenu->addSeparator(); addMenuItem(editMenu, MI_Clear); addMenuItem(editMenu, MI_Insert); + addMenuItem(editMenu, MI_InsertAbove); editMenu->addSeparator(); addMenuItem(editMenu, MI_SelectAll); addMenuItem(editMenu, MI_InvertSelection); diff --git a/toonz/sources/toonz/xshcellmover.cpp b/toonz/sources/toonz/xshcellmover.cpp index 303a233..a89ce32 100644 --- a/toonz/sources/toonz/xshcellmover.cpp +++ b/toonz/sources/toonz/xshcellmover.cpp @@ -174,7 +174,9 @@ bool CellsMover::canMoveCells(const TPoint &pos) { c = pos.y; cStart = m_startPos.y; } - if (c < 0) return false; + if (c < 0 || + (!m_orientation->isVerticalTimeline() && c >= xsh->getColumnCount())) + return false; if (c != cStart) { int count = 0; // controlla il tipo @@ -182,7 +184,10 @@ bool CellsMover::canMoveCells(const TPoint &pos) { while (i < m_rowCount * m_colCount) { TXshColumn::ColumnType srcType = getColumnTypeFromCell(i); int dstIndex = c + i; - TXshColumn *dstColumn = xsh->getColumn(dstIndex); + if (!m_orientation->isVerticalTimeline() && + dstIndex >= xsh->getColumnCount()) + return false; + TXshColumn *dstColumn = xsh->getColumn(dstIndex); if (srcType == TXshColumn::eZeraryFxType || srcType == TXshColumn::eSoundTextType) return false; @@ -397,13 +402,16 @@ bool LevelMoverTool::canMoveColumns(const TPoint &pos) { cLast = m_lastPos.y; cRange = m_range.ly; } - if (c < 0) return false; + if (c < 0 || (!o->isVerticalTimeline() && c >= xsh->getColumnCount())) + return false; if (c != cLast) { int count = 0; // controlla il tipo for (int i = 0; i < cRange; i++) { - int srcIndex = cLast + i; - int dstIndex = c + i; + int srcIndex = cLast + i; + int dstIndex = c + i; + if (!o->isVerticalTimeline() && dstIndex >= xsh->getColumnCount()) + return false; TXshColumn *srcColumn = xsh->getColumn(srcIndex); if (srcColumn && srcColumn->isLocked()) continue; TXshColumn *dstColumn = xsh->getColumn(dstIndex); @@ -499,9 +507,15 @@ void LevelMoverTool::onCellChange(int row, int col) { TPoint pos = (o->isVerticalTimeline() ? TPoint(col, row) : TPoint(row, col)) + m_grabOffset; - int origX = pos.x; - int origY = pos.y; - if (pos.y < 0) pos.y = 0; + int origX = pos.x; + int origY = pos.y; + int currEnd = xsh->getColumnCount() - 1; + + if (pos.y < 0) + pos.y = 0; + else if (!o->isVerticalTimeline() && pos.y > currEnd) + pos.y = currEnd; + if (pos.x < 0) pos.x = 0; TPoint delta = pos - m_aimedPos; @@ -511,30 +525,16 @@ void LevelMoverTool::onCellChange(int row, int col) { CellsMover *cellsMover = m_undo->getCellsMover(); std::set ii; TRect currSelection(m_aimedPos, m_range); + if (!o->isVerticalTimeline()) { - if (origY < 0) dCol += origY; int newBegin = currSelection.y0 + dCol; - if (newBegin < 0) { - newBegin *= -1; - for (int y = 0; y < newBegin; y++) ii.insert(y); - ColumnCmd::insertEmptyColumns(ii); - m_lastPos += TPoint(0, newBegin); - m_startPos += TPoint(0, newBegin); - m_aimedPos += TPoint(0, newBegin); - cellsMover->setStartPos(cellsMover->getStartPos() + TPoint(0, newBegin)); - cellsMover->setPos(cellsMover->getPos() + TPoint(0, newBegin)); - // getViewer()->setCurrentColumn(getViewer()->getCurrentColumn() - //+ newBegin); - pos.x = origY + newBegin; - } else { - int maxY = xsh->getColumnCount() - 1; - int newEnd = currSelection.y1 + dCol; - if (newEnd > maxY) { - for (int y = maxY + 1; y <= newEnd; y++) ii.insert(y); - ColumnCmd::insertEmptyColumns(ii); - } - } + int newEnd = currSelection.y1 + dCol; + + if (newBegin < 0 || + (!getViewer()->orientation()->isVerticalTimeline() && newEnd > currEnd)) + return; } + if (pos == m_aimedPos) return; m_aimedPos = pos; diff --git a/toonz/sources/toonz/xshcolumnviewer.cpp b/toonz/sources/toonz/xshcolumnviewer.cpp index 736e0ed..46b0f9c 100644 --- a/toonz/sources/toonz/xshcolumnviewer.cpp +++ b/toonz/sources/toonz/xshcolumnviewer.cpp @@ -2216,8 +2216,10 @@ void ColumnArea::contextMenuEvent(QContextMenuEvent *event) { menu.addAction(cmdManager->getAction(MI_Cut)); menu.addAction(cmdManager->getAction(MI_Copy)); menu.addAction(cmdManager->getAction(MI_Paste)); + menu.addAction(cmdManager->getAction(MI_PasteAbove)); menu.addAction(cmdManager->getAction(MI_Clear)); menu.addAction(cmdManager->getAction(MI_Insert)); + menu.addAction(cmdManager->getAction(MI_InsertAbove)); menu.addSeparator(); menu.addAction(cmdManager->getAction(MI_InsertFx)); menu.addAction(cmdManager->getAction(MI_NewNoteLevel)); @@ -2278,7 +2280,32 @@ void ColumnArea::contextMenuEvent(QContextMenuEvent *event) { } } + QAction *act = cmdManager->getAction(MI_Insert), + *act2 = cmdManager->getAction(MI_InsertAbove), + *act3 = cmdManager->getAction(MI_Paste), + *act4 = cmdManager->getAction(MI_PasteAbove); + + QString actText = act->text(), act2Text = act2->text(), + act3Text = act3->text(), act4Text = act4->text(); + + if (o->isVerticalTimeline()) { + act->setText(tr("&Insert Before")); + act2->setText(tr("&Insert After")); + act3->setText(tr("&Paste Insert Before")); + act4->setText(tr("&Paste Insert After")); + } else { + act->setText(tr("&Insert Below")); + act2->setText(tr("&Insert Above")); + act3->setText(tr("&Paste Insert Below")); + act4->setText(tr("&Paste Insert Above")); + } + menu.exec(event->globalPos()); + + act->setText(actText); + act2->setText(act2Text); + act3->setText(act3Text); + act4->setText(act4Text); } //----------------------------------------------------------------------------- @@ -2323,5 +2350,4 @@ void ColumnArea::onSubSampling(QAction *action) { ->invalidateAll(); TApp::instance()->getCurrentScene()->notifySceneChanged(); } - } // namespace XsheetGUI diff --git a/toonz/sources/toonz/xsheetdragtool.cpp b/toonz/sources/toonz/xsheetdragtool.cpp index 6e0ce07..6c0001b 100644 --- a/toonz/sources/toonz/xsheetdragtool.cpp +++ b/toonz/sources/toonz/xsheetdragtool.cpp @@ -177,8 +177,11 @@ public: refreshRowsArea(); } void onDrag(const CellPosition &pos) override { + TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); int row = pos.frame(), col = pos.layer(); - if (col < 0) return; + if (col < 0 || (!getViewer()->orientation()->isVerticalTimeline() && + col >= xsh->getColumnCount())) + return; if (row < 0) row = 0; if (m_modifier & Qt::ControlModifier) getViewer()->getCellKeyframeSelection()->selectCellsKeyframes( @@ -1195,13 +1198,16 @@ public: } void onChange(TPointD pos) { - pos = pos - m_delta; + TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); + pos = pos - m_delta; CellPosition cellPosition = getViewer()->xyToPosition(pos); int row = cellPosition.frame(); int col = cellPosition.layer(); if (row < 0) row = 0; - if (col < 0) col = 0; + if (col < 0 || (!getViewer()->orientation()->isVerticalTimeline() && + (col == 0 || col >= xsh->getColumnCount()))) + return; QPoint xy = getViewer()->positionToXY(CellPosition(row, col)); TPointD newPos = pos - TPointD(xy.x(), xy.y()); @@ -1478,9 +1484,12 @@ public: } void onDrag(const CellPosition &pos) override { - int col = pos.layer(); + TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); + int col = pos.layer(); if (!m_enabled) return; - if (col < 0) return; + if (col < 0 || (!getViewer()->orientation()->isVerticalTimeline() && + col >= xsh->getColumnCount())) + return; TColumnSelection *selection = getViewer()->getColumnSelection(); selection->selectNone(); int i, ia = m_firstColumn, ib = col; @@ -1615,41 +1624,22 @@ public: assert(m_lastCol == *indices.begin()); - int origCol = col; - if (col < 0) col = 0; - int dCol = col - (m_lastCol - m_offset); + int currEnd = xsh->getColumnCount() - 1; + int origCol = col; + if (col < 0) + col = 0; + else if (!getViewer()->orientation()->isVerticalTimeline() && col > currEnd) + col = currEnd; + int dCol = col - (m_lastCol - m_offset); int newBegin = *indices.begin() + dCol; - if (!getViewer()->orientation()->isVerticalTimeline()) { - if (origCol < 0) { - dCol += origCol; - newBegin = *indices.begin() + dCol; - } - std::set ii; - if (newBegin < 0) { - newBegin *= -1; - for (int x = 0; x < newBegin; x++) ii.insert(x); - ColumnCmd::insertEmptyColumns(ii); - selection->selectNone(); - for (std::set::const_iterator it = indices.begin(); - it != indices.end(); it++) - selection->selectColumn(*it + newBegin, true); - indices = selection->getIndices(); - col = origCol + newBegin; - m_lastCol += newBegin; - m_firstCol += newBegin; - int currentIndx = app->getCurrentColumn()->getColumnIndex(); - app->getCurrentColumn()->setColumnIndex(currentIndx + newBegin); - } else { - int currEnd = xsh->getColumnCount() - 1; - int newEnd = *indices.rbegin() + dCol; - if (newEnd > currEnd) { - for (int x = currEnd + 1; x <= newEnd; x++) ii.insert(x); - ColumnCmd::insertEmptyColumns(ii); - } - } - } else if (newBegin < 0) - return; + int newEnd = *indices.rbegin() + dCol; + + if (newBegin < 0) + dCol -= newBegin; + else if (!getViewer()->orientation()->isVerticalTimeline() && + newEnd > currEnd) + dCol -= (newEnd - currEnd); if (col == (m_lastCol - m_offset)) return; m_lastCol = col + m_offset;