diff --git a/toonz/sources/include/toonz/preferencesitemids.h b/toonz/sources/include/toonz/preferencesitemids.h index 204c6e5..0e0dbd5 100644 --- a/toonz/sources/include/toonz/preferencesitemids.h +++ b/toonz/sources/include/toonz/preferencesitemids.h @@ -130,6 +130,7 @@ enum PreferencesItemId { expandFunctionHeader, showColumnNumbers, parentColorsInXsheetColumn, + highlightLineEverySecond, syncLevelRenumberWithXsheet, currentTimelineEnabled, currentColumnColor, diff --git a/toonz/sources/include/toonz/sceneproperties.h b/toonz/sources/include/toonz/sceneproperties.h index 145dc1f..c1a258d 100644 --- a/toonz/sources/include/toonz/sceneproperties.h +++ b/toonz/sources/include/toonz/sceneproperties.h @@ -197,10 +197,8 @@ Set the distance between two markers to \p distance and \b offset to markers offset, \sa setMarkers() */ - void getMarkers(int &distance, int &offset) const { - distance = m_markerDistance; - offset = m_markerOffset; - } + void getMarkers(int &distance, int &offset, int &secDistance) const; + /*! Sets information about xsheet markers, xsheet horizontal line. Sets the distance between two markers to \p distance and \b offset,row @@ -209,6 +207,7 @@ of first \sa getMarkers() */ void setMarkers(int distance, int offset); + /*! Returns full-color images subsampling in scene. Subsampling value is the simplifying diff --git a/toonz/sources/include/toonzqt/spreadsheetviewer.h b/toonz/sources/include/toonzqt/spreadsheetviewer.h index 138a5ff..c067ab8 100644 --- a/toonz/sources/include/toonzqt/spreadsheetviewer.h +++ b/toonz/sources/include/toonzqt/spreadsheetviewer.h @@ -312,7 +312,7 @@ class DVAPI SpreadsheetViewer : public QDialog { QPoint m_lastAutoPanPos; int m_rowCount, m_columnCount; int m_currentRow; - int m_markRowDistance, m_markRowOffset; + int m_markRowDistance, m_markRowOffset, m_markSecRowDistance; // QRect m_selectedCells; // x=col, y=row bool m_isComputingSize; // const Orientation *m_orientation; @@ -453,17 +453,22 @@ public: bool isSelectedCell(int row, int col) const { return getSelectedCells().contains(QPoint(col, row)); } - void setMarkRow(int distance, int offset) { - m_markRowDistance = distance; // distance > 0 ? distance : 6; - m_markRowOffset = offset; + void setMarkRow(int distance, int offset, int secDistance) { + m_markRowDistance = distance; // distance > 0 ? distance : 6; + m_markRowOffset = offset; + m_markSecRowDistance = secDistance; } void getMarkRow(int &distance, int &offset) const { distance = m_markRowDistance; offset = m_markRowOffset; } - int isMarkRow(int row) const { + bool isMarkRow(int row) const { return m_markRowDistance > 0 && - ((row - m_markRowOffset) % m_markRowDistance) == 0; + ((row - m_markRowOffset) % m_markRowDistance) == 0 && row > 0; + } + bool isMarkSecRow(int row) const { + return m_markSecRowDistance > 0 && + ((row - m_markRowOffset) % m_markSecRowDistance) == 0 && row > 0; } void setFrameHandle(TFrameHandle *frameHandle); diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index 29342c8..4f3b7a6 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -1257,6 +1257,7 @@ QString PreferencesPopup::getUIString(PreferencesItemId id) { {showColumnNumbers, tr("Show Column Numbers in Column Headers")}, {parentColorsInXsheetColumn, tr("Show Column Parent's Color in the Xsheet")}, + {highlightLineEverySecond, tr("Highlight Line Every Second")}, {syncLevelRenumberWithXsheet, tr("Sync Level Strip Drawing Number Changes with the Xsheet")}, {currentTimelineEnabled, @@ -1972,6 +1973,7 @@ QWidget* PreferencesPopup::createXsheetPage() { { insertUI(expandFunctionHeader, xshToolbarLay); } insertUI(showColumnNumbers, lay); insertUI(parentColorsInXsheetColumn, lay); + insertUI(highlightLineEverySecond, lay); insertUI(syncLevelRenumberWithXsheet, lay); insertUI(currentTimelineEnabled, lay); insertUI(currentColumnColor, lay); diff --git a/toonz/sources/toonz/scenesettingspopup.cpp b/toonz/sources/toonz/scenesettingspopup.cpp index 2856346..52fa68f 100644 --- a/toonz/sources/toonz/scenesettingspopup.cpp +++ b/toonz/sources/toonz/scenesettingspopup.cpp @@ -270,8 +270,8 @@ SceneSettingsPopup::SceneSettingsPopup() m_tlvSubsamplingFld = new DVGui::IntLineEdit(this, tlvSubsampling, 1); // Marker Interval - Start Frame - int distance, offset; - sprop->getMarkers(distance, offset); + int distance, offset, secDistance; + sprop->getMarkers(distance, offset, secDistance); m_markerIntervalFld = new DVGui::IntLineEdit(this, distance, 0); m_startFrameFld = new DVGui::IntLineEdit(this, offset); @@ -294,7 +294,8 @@ SceneSettingsPopup::SceneSettingsPopup() // Frame Rate mainLayout->addWidget(new QLabel(tr("Frame Rate:"), this), 0, 0, Qt::AlignRight | Qt::AlignVCenter); - mainLayout->addWidget(m_frameRateFld, 0, 1); + mainLayout->addWidget(m_frameRateFld, 0, 1, 1, 4, + Qt::AlignLeft | Qt::AlignVCenter); // Camera BG color mainLayout->addWidget(new QLabel(tr("Camera BG Color:"), this), 1, 0, Qt::AlignRight | Qt::AlignVCenter); @@ -305,7 +306,8 @@ SceneSettingsPopup::SceneSettingsPopup() mainLayout->addWidget(m_fieldGuideFld, 2, 1); mainLayout->addWidget(new QLabel(tr("A/R:"), this), 2, 2, Qt::AlignRight | Qt::AlignVCenter); - mainLayout->addWidget(m_aspectRatioFld, 2, 3); + mainLayout->addWidget(m_aspectRatioFld, 2, 3, 1, 2, + Qt::AlignLeft | Qt::AlignVCenter); // Image Subsampling - Tlv Subsampling mainLayout->addWidget(new QLabel(tr("Image Subsampling:"), this), 3, 0, Qt::AlignRight | Qt::AlignVCenter); @@ -362,9 +364,10 @@ SceneSettingsPopup::SceneSettingsPopup() SLOT(onTlvSubsampEditingFinished())); // Marker Interval - Start Frame ret = ret && connect(m_markerIntervalFld, SIGNAL(editingFinished()), this, - SLOT(onMakerIntervalEditingFinished())); + SLOT(onMakerInformationChanged())); ret = ret && connect(m_startFrameFld, SIGNAL(editingFinished()), this, - SLOT(onStartFrameEditingFinished())); + SLOT(onMakerInformationChanged())); + // Use Color Filter and Transparency for Rendering ret = ret && connect(m_colorFilterOnRenderCB, SIGNAL(stateChanged(int)), this, SLOT(onColorFilterOnRenderChanged())); @@ -418,8 +421,8 @@ void SceneSettingsPopup::update() { m_fullcolorSubsamplingFld->setValue(sprop->getFullcolorSubsampling()); if (m_tlvSubsamplingFld) m_tlvSubsamplingFld->setValue(sprop->getTlvSubsampling()); - int markerDistance = 0, markerOffset = 0; - sprop->getMarkers(markerDistance, markerOffset); + int markerDistance = 0, markerOffset = 0, secDistance; + sprop->getMarkers(markerDistance, markerOffset, secDistance); m_markerIntervalFld->setValue(markerDistance); m_startFrameFld->setValue(markerOffset + 1); m_colorFilterOnRenderCB->setChecked( @@ -494,29 +497,14 @@ void SceneSettingsPopup::onTlvSubsampEditingFinished() { //----------------------------------------------------------------------------- -void SceneSettingsPopup::onMakerIntervalEditingFinished() { +void SceneSettingsPopup::onMakerInformationChanged() { TSceneProperties *sprop = getProperties(); - int distance, offset; - sprop->getMarkers(distance, offset); + int distance, offset, secDistance; + sprop->getMarkers(distance, offset, secDistance); int markerDistance = m_markerIntervalFld->text().toInt(); int markerOffset = m_startFrameFld->text().toInt() - 1; - assert(offset == markerOffset); - if (distance == markerDistance) return; - sprop->setMarkers(markerDistance, markerOffset); - TApp::instance()->getCurrentScene()->notifySceneChanged(); - TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); -} - -//----------------------------------------------------------------------------- -void SceneSettingsPopup::onStartFrameEditingFinished() { - TSceneProperties *sprop = getProperties(); - int distance, offset; - sprop->getMarkers(distance, offset); - int markerDistance = m_markerIntervalFld->text().toInt(); - int markerOffset = m_startFrameFld->text().toInt() - 1; - assert(markerDistance == distance); - if (offset == markerOffset) return; + if (distance == markerDistance && offset == markerOffset) return; sprop->setMarkers(markerDistance, markerOffset); TApp::instance()->getCurrentScene()->notifySceneChanged(); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); diff --git a/toonz/sources/toonz/scenesettingspopup.h b/toonz/sources/toonz/scenesettingspopup.h index b6096a8..6108497 100644 --- a/toonz/sources/toonz/scenesettingspopup.h +++ b/toonz/sources/toonz/scenesettingspopup.h @@ -76,8 +76,7 @@ public slots: void onFullColorSubsampEditingFinished(); void onTlvSubsampEditingFinished(); - void onMakerIntervalEditingFinished(); - void onStartFrameEditingFinished(); + void onMakerInformationChanged(); void setBgColor(const TPixel32 &value, bool isDragging); diff --git a/toonz/sources/toonz/xshcellviewer.cpp b/toonz/sources/toonz/xshcellviewer.cpp index 8406e2d..a589973 100644 --- a/toonz/sources/toonz/xshcellviewer.cpp +++ b/toonz/sources/toonz/xshcellviewer.cpp @@ -1177,32 +1177,42 @@ void CellArea::drawFrameSeparator(QPainter &p, int row, int col, layerAxisRange = NumberRange(layerAxis + 1, layerAxis + adjY); } - // mark interval every 6 frames - int distance, offset; + // mark interval + int distance, offset, secDistance; TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( - distance, offset); - // if (distance == 0) distance = 6; + distance, offset, secDistance); bool isAfterMarkers = distance > 0 && ((row - offset) % distance) == 0 && row != 0; - QColor color = isAfterMarkers ? m_viewer->getMarkerLineColor() - : m_viewer->getLightLineColor(); - color.setAlpha(isAfterMarkers ? m_viewer->getMarkerLineColor().alpha() - : m_viewer->getLightLineColor().alpha()); + bool isAfterSecMarkers = + secDistance > 0 && ((row - offset) % secDistance) == 0 && row != 0; + + QColor color = (isAfterMarkers || isAfterSecMarkers) + ? m_viewer->getMarkerLineColor() + : m_viewer->getLightLineColor(); + double lineWidth = (isAfterSecMarkers) ? 3. : 1.; + + int frameAxis = m_viewer->rowToFrameAxis(row); + int handleSize = + (emptyFrame) + ? 0 + : (o->isVerticalTimeline()) + ? (isAfterMarkers || isAfterSecMarkers) + ? 0 + : o->rect(PredefinedRect::DRAG_HANDLE_CORNER).width() + : o->rect(PredefinedRect::DRAG_HANDLE_CORNER).height(); - int frameAxis = m_viewer->rowToFrameAxis(row); QLine horizontalLine = m_viewer->orientation()->horizontalLine( - frameAxis, - layerAxisRange.adjusted((o->isVerticalTimeline() ? 0 : -1), 0)); + frameAxis, layerAxisRange.adjusted(handleSize - 1, 1)); if (heldFrame) { int x = horizontalLine.x1(); - int y = horizontalLine.y2() - 1; + int y = horizontalLine.y2() - 2; horizontalLine.setP1(QPoint(x, y)); color.setAlpha(120); } else if (!o->isVerticalTimeline() && !isAfterMarkers && emptyFrame) - color.setAlpha(isAfterMarkers ? m_viewer->getMarkerLineColor().alpha() - : m_viewer->getLightLineColor().alpha()); - p.setPen(color); + color.setAlpha(m_viewer->getLightLineColor().alpha()); + + p.setPen(QPen(color, lineWidth, Qt::SolidLine, Qt::FlatCap)); p.drawLine(horizontalLine); } @@ -1456,10 +1466,9 @@ void CellArea::drawExtenderHandles(QPainter &p) { ? QPoint(0, 0) : o->point(PredefinedPoint::KEY_HIDDEN); - int distance, offset; + int distance, offset, secDistance; TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( - distance, offset); - // if (distance == 0) distance = 6; + distance, offset, secDistance); QPoint xyRadius = o->point(PredefinedPoint::EXTENDER_XY_RADIUS); @@ -1556,12 +1565,12 @@ void CellArea::drawSoundCell(QPainter &p, int row, int col, bool isReference) { return; } - if (o->isVerticalTimeline() || !row) drawFrameSeparator(p, row, col, false); - TXshSoundLevelP soundLevel = cell.getSoundLevel(); int r0, r1; if (!soundColumn->getLevelRange(row, r0, r1)) { + if (o->isVerticalTimeline() || !row) drawFrameSeparator(p, row, col, false); + // only draw mark if (markId >= 0) { p.setBrush(markColor); @@ -1608,6 +1617,8 @@ void CellArea::drawSoundCell(QPainter &p, int row, int col, bool isReference) { drawEndOfDragHandle(p, isLastRow, xy, cellColor); drawLockedDottedLine(p, soundColumn->isLocked(), xy, cellColor); + if (o->isVerticalTimeline() || !row) drawFrameSeparator(p, row, col, false); + QRect trackRect = o->rect(PredefinedRect::SOUND_TRACK) .adjusted(0, 0, -frameAdj.x(), -frameAdj.y()) .translated(xy); @@ -1693,19 +1704,6 @@ void CellArea::drawSoundCell(QPainter &p, int row, int col, bool isReference) { m_soundLevelModifyRects.append(modifierRect); } - int distance, markerOffset; - TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( - distance, markerOffset); - // if (distance == 0) distance = 6; - bool isAfterMarkers = - distance > 0 && ((row - markerOffset) % distance) == 0 && row != 0; - - // draw marker interval - if (o->isVerticalTimeline() && isAfterMarkers) { - p.setPen(m_viewer->getMarkerLineColor()); - p.drawLine(o->line(PredefinedLine::SEE_MARKER_THROUGH).translated(xy)); - } - // cell mark if (markId >= 0) { p.setBrush(markColor); @@ -1920,11 +1918,11 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference, bool heldFrame = (!o->isVerticalTimeline() && sameLevel && prevCell.m_frameId == cell.m_frameId); - drawFrameSeparator(p, row, col, false, heldFrame); if (cell.isEmpty()) { // it means previous is not empty // diagonal cross meaning end of level + drawFrameSeparator(p, row, col, true, heldFrame); // cell mark if (markId >= 0) { p.setBrush(markColor); @@ -2001,18 +1999,7 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference, drawLockedDottedLine(p, xsh->getColumn(col)->isLocked(), xy, cellColor); - int distance, offset; - TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( - distance, offset); - // if (distance == 0) distance = 6; - bool isAfterMarkers = - distance > 0 && ((row - offset) % distance) == 0 && row != 0; - - // draw marker interval - if (o->isVerticalTimeline() && isAfterMarkers) { - p.setPen(m_viewer->getMarkerLineColor()); - p.drawLine(o->line(PredefinedLine::SEE_MARKER_THROUGH).translated(xy)); - } + drawFrameSeparator(p, row, col, false, heldFrame); QRect nameRect = o->rect(PredefinedRect::CELL_NAME).translated(QPoint(x, y)); @@ -2124,6 +2111,12 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference, p.setPen(penColor); } + int distance, offset, secDistance; + TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( + distance, offset, secDistance); + bool isAfterMarkers = + distance > 0 && ((row - offset) % distance) == 0 && row != 0; + // draw level name if (showLevelName && (!sameLevel || @@ -2220,9 +2213,11 @@ void CellArea::drawSoundTextCell(QPainter &p, int row, int col) { bool heldFrame = (!o->isVerticalTimeline() && sameLevel && prevCell.m_frameId == cell.m_frameId); - drawFrameSeparator(p, row, col, false, heldFrame); if (cell.isEmpty()) { // diagonal cross meaning end of level + + drawFrameSeparator(p, row, col, false, heldFrame); + QColor levelEndColor = m_viewer->getTextColor(); levelEndColor.setAlphaF(0.3); p.setPen(levelEndColor); @@ -2272,6 +2267,8 @@ void CellArea::drawSoundTextCell(QPainter &p, int row, int col) { drawLockedDottedLine(p, xsh->getColumn(col)->isLocked(), xy, cellColor); + drawFrameSeparator(p, row, col, false, heldFrame); + // cell mark if (markId >= 0) { p.setBrush(markColor); @@ -2282,19 +2279,6 @@ void CellArea::drawSoundTextCell(QPainter &p, int row, int col) { TFrameId fid = cell.m_frameId; if (fid.getNumber() - 1 < 0) return; - int distance, offset; - TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( - distance, offset); - // if (distance == 0) distance = 6; - bool isAfterMarkers = - distance > 0 && ((row - offset) % distance) == 0 && row != 0; - - // draw marker interval - if (o->isVerticalTimeline() && isAfterMarkers) { - p.setPen(m_viewer->getMarkerLineColor()); - p.drawLine(o->line(PredefinedLine::SEE_MARKER_THROUGH).translated(xy)); - } - p.setPen(Qt::black); QRect nameRect = o->rect(PredefinedRect::CELL_NAME).translated(QPoint(x, y)); nameRect.adjust(0, 0, -frameAdj.x(), -frameAdj.y()); @@ -2480,9 +2464,6 @@ void CellArea::drawSoundTextColumn(QPainter &p, int r0, int r1, int col) { // paint background and other stuffs for (auto info : infoList) { - bool heldFrame = (!o->isVerticalTimeline() && info.row != row); - drawFrameSeparator(p, info.row, col, false, heldFrame); - bool isSelected = isColSelected || cellSelection->isCellSelected(info.row, col); QColor tmpCellColor = (isSelected) ? selectedCellColor : cellColor; @@ -2499,6 +2480,9 @@ void CellArea::drawSoundTextColumn(QPainter &p, int r0, int r1, int col) { drawEndOfDragHandle(p, info.row == rowTo, info.xy, tmpCellColor); drawLockedDottedLine(p, xsh->getColumn(col)->isLocked(), info.xy, tmpCellColor); + + bool heldFrame = (!o->isVerticalTimeline() && info.row != row); + drawFrameSeparator(p, info.row, col, false, heldFrame); // draw mark if (info.markId >= 0) { p.setBrush(info.markColor); @@ -2625,13 +2609,6 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, bool sameLevel = prevCell.m_level.getPointer() == cell.m_level.getPointer(); - int distance, offset; - TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( - distance, offset); - // if (distance == 0) distance = 6; - bool isAfterMarkers = - distance > 0 && ((row - offset) % distance) == 0 && row != 0; - bool isRed = false; TXshPaletteLevel *pl = cell.getPaletteLevel(); if (pl && !pl->getPalette()) isRed = true; @@ -2695,11 +2672,20 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, return; } + int distance, offset, secDistance; + TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( + distance, offset, secDistance); + + bool isAfterMarkers = + distance > 0 && ((row - offset) % distance) == 0 && row != 0; + bool heldFrame = (!o->isVerticalTimeline() && !isAfterMarkers && sameLevel && prevCell.m_frameId == cell.m_frameId); - drawFrameSeparator(p, row, col, false, heldFrame); if (cell.isEmpty()) { // this means the former is not empty + + drawFrameSeparator(p, row, col, false, heldFrame); + QColor levelEndColor = m_viewer->getTextColor(); levelEndColor.setAlphaF(0.3); p.setPen(levelEndColor); @@ -2753,10 +2739,7 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, drawEndOfDragHandle(p, isLastRow, xy, cellColor); drawLockedDottedLine(p, xsh->getColumn(col)->isLocked(), xy, cellColor); - if (o->isVerticalTimeline() && isAfterMarkers) { - p.setPen(m_viewer->getMarkerLineColor()); - p.drawLine(o->line(PredefinedLine::SEE_MARKER_THROUGH).translated(xy)); - } + drawFrameSeparator(p, row, col, false, heldFrame); if (sameLevel && prevCell.m_frameId == cell.m_frameId && !isAfterMarkers) { // cell equal to previous one (not on marker line): diff --git a/toonz/sources/toonz/xsheetviewer.cpp b/toonz/sources/toonz/xsheetviewer.cpp index 797b676..aa4a0a8 100644 --- a/toonz/sources/toonz/xsheetviewer.cpp +++ b/toonz/sources/toonz/xsheetviewer.cpp @@ -1163,12 +1163,12 @@ void XsheetViewer::wheelEvent(QWheelEvent *event) { return; } - int markerDistance = 0, markerOffset = 0; + int markerDistance = 0, markerOffset = 0, secDistance; TApp::instance() ->getCurrentScene() ->getScene() ->getProperties() - ->getMarkers(markerDistance, markerOffset); + ->getMarkers(markerDistance, markerOffset, secDistance); if (event->angleDelta().x() == 0) { // vertical scroll if (!orientation()->isVerticalTimeline()) markerDistance = 1; diff --git a/toonz/sources/toonz/xshrowviewer.cpp b/toonz/sources/toonz/xshrowviewer.cpp index c20bf6d..4af1bd8 100644 --- a/toonz/sources/toonz/xshrowviewer.cpp +++ b/toonz/sources/toonz/xshrowviewer.cpp @@ -106,9 +106,9 @@ void RowArea::drawRows(QPainter &p, int r0, int r1) { p.setFont(font); // marker interval - int distance, offset; + int distance, offset, secDistance; TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( - distance, offset); + distance, offset, secDistance); // default value // if (distance == 0) distance = 6; @@ -131,9 +131,16 @@ void RowArea::drawRows(QPainter &p, int r0, int r1) { //--- draw horizontal line bool isAfterMarkers = (distance > 0 && ((r - offset) % distance) == 0 && r != 0); - QColor color = isAfterMarkers ? m_viewer->getMarkerLineColor() - : m_viewer->getLightLineColor(); - p.setPen(color); + bool isAfterSecMarkers = + secDistance > 0 && ((r - offset) % secDistance) == 0 && r != 0; + + QColor color = (isAfterSecMarkers || isAfterMarkers) + ? m_viewer->getMarkerLineColor() + : m_viewer->getLightLineColor(); + + p.setPen( + QPen(color, (isAfterSecMarkers) ? 3. : 1., Qt::SolidLine, Qt::FlatCap)); + // p.setPen(color); QLine horizontalLine = o->horizontalLine(frameAxis, layerSide); if (!o->isVerticalTimeline()) { int x = horizontalLine.x1(); diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index 5bec8d7..e4dae07 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -580,6 +580,8 @@ void Preferences::definePreferenceItems() { define(showColumnNumbers, "showColumnNumbers", QMetaType::Bool, false); define(parentColorsInXsheetColumn, "parentColorsInXsheetColumn", QMetaType::Bool, false); + define(highlightLineEverySecond, "highlightLineEverySecond", QMetaType::Bool, + false); define(syncLevelRenumberWithXsheet, "syncLevelRenumberWithXsheet", QMetaType::Bool, true); define(currentTimelineEnabled, "currentTimelineEnabled", QMetaType::Bool, diff --git a/toonz/sources/toonzlib/sceneproperties.cpp b/toonz/sources/toonzlib/sceneproperties.cpp index fc0bb34..f167771 100644 --- a/toonz/sources/toonzlib/sceneproperties.cpp +++ b/toonz/sources/toonzlib/sceneproperties.cpp @@ -140,6 +140,19 @@ void TSceneProperties::setBgColor(const TPixel32 &color) { m_bgColor = color; } //----------------------------------------------------------------------------- +void TSceneProperties::getMarkers(int &distance, int &offset, + int &secDistance) const { + distance = m_markerDistance; + offset = m_markerOffset; + // TODO: handle drop frame when the fps has decimal part + secDistance = + (Preferences::instance()->getBoolValue(highlightLineEverySecond)) + ? (int)std::round(getOutputProperties()->getFrameRate()) + : -1; +} + +//----------------------------------------------------------------------------- + void TSceneProperties::setMarkers(int distance, int offset) { m_markerDistance = distance; m_markerOffset = offset; diff --git a/toonz/sources/toonzqt/functionviewer.cpp b/toonz/sources/toonzqt/functionviewer.cpp index c4f7a25..a62fbb3 100644 --- a/toonz/sources/toonzqt/functionviewer.cpp +++ b/toonz/sources/toonzqt/functionviewer.cpp @@ -371,9 +371,9 @@ void FunctionViewer::refreshModel() { m_treeView->setCurrentScenePath(scenePath); - int distance, offset; - scene->getProperties()->getMarkers(distance, offset); - m_numericalColumns->setMarkRow(distance, offset); + int distance, offset, secDistance; + scene->getProperties()->getMarkers(distance, offset, secDistance); + m_numericalColumns->setMarkRow(distance, offset, secDistance); } m_treeView->updateAll(); diff --git a/toonz/sources/toonzqt/spreadsheetviewer.cpp b/toonz/sources/toonzqt/spreadsheetviewer.cpp index 4ebced3..dff1065 100644 --- a/toonz/sources/toonzqt/spreadsheetviewer.cpp +++ b/toonz/sources/toonzqt/spreadsheetviewer.cpp @@ -376,10 +376,11 @@ void RowPanel::drawRows(QPainter &p, int r0, int r1) { for (r = r0; r <= r1; r++) { int next_y = getViewer()->rowToY(r + 1); // draw horizontal line - QColor color = (getViewer()->isMarkRow(r)) + bool isMarkSecRow = getViewer()->isMarkSecRow(r); + QColor color = (isMarkSecRow || getViewer()->isMarkRow(r)) ? getViewer()->getMarkerLineColor() : getViewer()->getLightLineColor(); - p.setPen(color); + p.setPen(QPen(color, (isMarkSecRow) ? 3. : 1., Qt::SolidLine, Qt::FlatCap)); p.drawLine(x0, y, x1, y); if (simpleView && r > 0 && !getViewer()->isMarkRow(r + 1)) { @@ -395,11 +396,6 @@ void RowPanel::drawRows(QPainter &p, int r0, int r1) { Qt::AlignVCenter | Qt::AlignRight, number); y = next_y; } - // erase the marker interval at upper-end - if (r0 == 0) { - p.setPen(getViewer()->getLightLineColor()); - p.drawLine(x0, getViewer()->rowToY(0), x1, getViewer()->rowToY(0)); - } } //----------------------------------------------------------------------------- @@ -493,15 +489,15 @@ void CellPanel::paintEvent(QPaintEvent *e) { // draw rows int currentRow = getViewer()->getCurrentRow(); for (int r = r0; r <= r1; r++) { - int y = getViewer()->rowToY(r); - QColor color = getViewer()->isMarkRow(r) ? getViewer()->getMarkerLineColor() - : getViewer()->getLightLineColor(); - painter.setPen(color); + int y = getViewer()->rowToY(r); + bool isMarkSecRow = getViewer()->isMarkSecRow(r); + QColor color = (isMarkSecRow || getViewer()->isMarkRow(r)) + ? getViewer()->getMarkerLineColor() + : getViewer()->getLightLineColor(); + painter.setPen( + QPen(color, (isMarkSecRow) ? 3. : 1., Qt::SolidLine, Qt::FlatCap)); painter.drawLine(x0, y, x1, y); } - // erase the marker interval at upper-end - painter.setPen(getViewer()->getLightLineColor()); - painter.drawLine(x0, 0, x1, 0); } } // namespace Spreadsheet @@ -525,6 +521,7 @@ SpreadsheetViewer::SpreadsheetViewer(QWidget *parent) , m_currentRow(0) , m_markRowDistance(6) , m_markRowOffset(0) + , m_markSecRowDistance(-1) , m_isComputingSize(false) , m_frameScroller() { // m_orientation = Orientations::topToBottom ();