highlight xsheet line every second

This commit is contained in:
shun-iwasawa 2022-03-30 16:58:41 +09:00 committed by manongjohn
parent b45e7ac54a
commit e1d56eec48
13 changed files with 118 additions and 133 deletions

View file

@ -133,6 +133,7 @@ enum PreferencesItemId {
expandFunctionHeader,
showColumnNumbers,
parentColorsInXsheetColumn,
highlightLineEverySecond,
syncLevelRenumberWithXsheet,
currentTimelineEnabled,
currentColumnColor,

View file

@ -190,10 +190,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
@ -202,6 +200,7 @@ of first
\sa getMarkers()
*/
void setMarkers(int distance, int offset);
/*!
Returns full-color images subsampling in scene. Subsampling value is
the simplifying

View file

@ -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;
@ -456,17 +456,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);

View file

@ -1301,6 +1301,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 Scene")},
{currentTimelineEnabled,
@ -2007,6 +2008,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);

View file

@ -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,13 @@ 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();

View file

@ -76,8 +76,7 @@ public slots:
void onFullColorSubsampEditingFinished();
void onTlvSubsampEditingFinished();
void onMakerIntervalEditingFinished();
void onStartFrameEditingFinished();
void onMakerInformationChanged();
void setBgColor(const TPixel32 &value, bool isDragging);

View file

@ -1256,32 +1256,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
: -1 // o->rect(PredefinedRect::DRAG_HANDLE_CORNER).width()
: -1; // 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);
}
@ -1535,10 +1545,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);
@ -1629,6 +1638,8 @@ void CellArea::drawSoundCell(QPainter &p, int row, int col, bool isReference) {
if (!soundColumn->getLevelRange(row, r0, r1)) {
// cell mark
drawCellMarker(p, markId, rect, true, isNextEmpty);
if (o->isVerticalTimeline() || !row) drawFrameSeparator(p, row, col, false);
return;
}
bool isFirstRow = (row > 0 && row == r0);
@ -1762,19 +1773,6 @@ void CellArea::drawSoundCell(QPainter &p, int row, int col, bool isReference) {
if (r1 != r1WithoutOff) p.fillRect(modifierRect, SoundColumnExtenderColor);
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));
}
}
//-----------------------------------------------------------------------------
@ -2211,18 +2209,6 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference,
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));
}
QRect nameRect = o->rect(PredefinedRect::CELL_NAME).translated(QPoint(x, y));
@ -2327,6 +2313,12 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference,
if (isImplicitCell || isStopFrame) return;
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 || (row > 0 && xsh->isImplicitCell(row - 1, col)) ||
@ -2462,19 +2454,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());
@ -2658,8 +2637,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);
bool isSelected =
isColSelected || cellSelection->isCellSelected(info.row, col);
QColor tmpCellColor = (isSelected) ? selectedCellColor : cellColor;
@ -2677,6 +2654,7 @@ void CellArea::drawSoundTextColumn(QPainter &p, int r0, int r1, int col) {
// cell mark
drawCellMarker(p, info.markId, info.rect, true);
bool heldFrame = (!o->isVerticalTimeline() && info.row != row);
drawFrameSeparator(p, info.row, col, false, heldFrame);
if (TApp::instance()->getCurrentFrame()->isEditingScene() &&
@ -2820,13 +2798,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;
@ -2872,6 +2843,13 @@ 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) &&
!isImplicitCell;
@ -2952,11 +2930,6 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col,
cellColor);
}
if (o->isVerticalTimeline() && isAfterMarkers) {
p.setPen(m_viewer->getMarkerLineColor());
p.drawLine(o->line(PredefinedLine::SEE_MARKER_THROUGH).translated(xy));
}
if ((sameLevel && prevCell.m_frameId == cell.m_frameId && !isAfterMarkers) ||
isImplicitCell) { // cell equal to previous one (not on marker line):
// do not write anything and draw a vertical line

View file

@ -1181,12 +1181,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;

View file

@ -105,9 +105,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;
@ -130,9 +130,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();

View file

@ -580,6 +580,8 @@ void Preferences::definePreferenceItems() {
define(showColumnNumbers, "showColumnNumbers", QMetaType::Bool, false);
define(parentColorsInXsheetColumn, "parentColorsInXsheetColumn",
QMetaType::Bool, true);
define(highlightLineEverySecond, "highlightLineEverySecond", QMetaType::Bool,
false);
define(syncLevelRenumberWithXsheet, "syncLevelRenumberWithXsheet",
QMetaType::Bool, true);
define(currentTimelineEnabled, "currentTimelineEnabled", QMetaType::Bool,

View file

@ -133,6 +133,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;

View file

@ -373,9 +373,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();

View file

@ -382,7 +382,8 @@ 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);
@ -401,11 +402,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));
}
}
//-----------------------------------------------------------------------------
@ -499,15 +495,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
@ -531,6 +527,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 ();