Horizontal Level Strip

This commit is contained in:
Jeremy Bullock 2020-04-17 01:23:35 -06:00
parent ba9cee0d0b
commit 09d153abb9
3 changed files with 404 additions and 108 deletions

View file

@ -119,9 +119,14 @@ FilmstripFrames::FilmstripFrames(QScrollArea *parent, Qt::WFlags flags)
setFrameStyle(QFrame::StyledPanel);
setFocusPolicy(Qt::StrongFocus);
setFixedWidth(m_iconSize.width() + fs_leftMargin + fs_rightMargin +
fs_iconMarginLR * 2);
setFixedHeight(parentWidget()->height());
if (m_isVertical) {
setFixedWidth(m_iconSize.width() + fs_leftMargin + fs_rightMargin +
fs_iconMarginLR * 2);
setFixedHeight(parentWidget()->height());
} else {
setFixedHeight(parentWidget()->height());
setFixedWidth(parentWidget()->width());
}
// la testa mobile che indica il frame corrente (e gestisce la GUI dell'onion
// skin)
@ -158,6 +163,14 @@ int FilmstripFrames::y2index(int y) const {
//-----------------------------------------------------------------------------
int FilmstripFrames::x2index(int x) const {
const int dx = getIconSize().width() + fs_frameSpacing + fs_iconMarginLR +
fs_leftMargin + fs_rightMargin;
return x / dx;
}
//-----------------------------------------------------------------------------
int FilmstripFrames::index2y(int index) const {
const int dy = getIconSize().height() + fs_frameSpacing + fs_iconMarginTop +
fs_iconMarginBottom;
@ -166,6 +179,14 @@ int FilmstripFrames::index2y(int index) const {
//-----------------------------------------------------------------------------
int FilmstripFrames::index2x(int index) const {
const int dx = getIconSize().width() + fs_frameSpacing + fs_iconMarginLR +
fs_leftMargin + fs_rightMargin;
return index * dx;
}
//-----------------------------------------------------------------------------
TFrameId FilmstripFrames::index2fid(int index) const {
TXshSimpleLevel *sl = getLevel();
if (!sl || index < 0) return TFrameId();
@ -192,53 +213,110 @@ int FilmstripFrames::getFramesHeight() const {
//-----------------------------------------------------------------------------
int FilmstripFrames::getFramesWidth() const {
TXshSimpleLevel *level = getLevel();
int frameCount = level ? level->getFrameCount() : 1;
int frameWidth = m_iconSize.width() + fs_frameSpacing + fs_leftMargin +
fs_rightMargin + fs_iconMarginLR;
return frameWidth * (frameCount + 1);
}
//-----------------------------------------------------------------------------
int FilmstripFrames::getOneFrameHeight() {
return m_iconSize.height() + fs_frameSpacing + fs_iconMarginTop +
fs_iconMarginBottom;
}
//-----------------------------------------------------------------------------
int FilmstripFrames::getOneFrameWidth() {
return m_iconSize.width() + fs_frameSpacing + fs_leftMargin +
fs_iconMarginLR + fs_rightMargin;
}
//-----------------------------------------------------------------------------
void FilmstripFrames::updateContentHeight(int minimumHeight) {
if (minimumHeight < 0)
minimumHeight = visibleRegion().boundingRect().bottom();
minimumHeight = visibleRegion().boundingRect().bottom();
int contentHeight = getFramesHeight();
if (contentHeight < minimumHeight) contentHeight = minimumHeight;
int parentHeight = parentWidget()->height();
if (contentHeight < parentHeight) contentHeight = parentHeight;
int parentHeight = parentWidget()->height();
if (contentHeight < parentHeight) contentHeight = parentHeight;
if (contentHeight != height()) setFixedHeight(contentHeight);
}
//-----------------------------------------------------------------------------
void FilmstripFrames::updateContentWidth(int minimumWidth) {
setFixedHeight(getOneFrameHeight());
if (minimumWidth < 0) minimumWidth = visibleRegion().boundingRect().right();
int contentWidth = getFramesWidth();
if (contentWidth < minimumWidth) contentWidth = minimumWidth;
int parentWidth = parentWidget()->width();
if (contentWidth < parentWidth) contentWidth = parentWidth;
if (contentWidth != width()) setFixedWidth(contentWidth);
}
//-----------------------------------------------------------------------------
void FilmstripFrames::showFrame(int index) {
TXshSimpleLevel *level = getLevel();
if (!level->isFid(index2fid(index))) return;
int y0 = index2y(index);
int y1 = y0 + m_iconSize.height() + fs_frameSpacing + fs_iconMarginTop +
fs_iconMarginBottom;
if (y1 > height()) setFixedHeight(y1);
m_scrollArea->ensureVisible(0, (y0 + y1) / 2, 50, (y1 - y0) / 2);
if (m_isVertical) {
if (!level->isFid(index2fid(index))) {
if (!level->isFid(index2fid(index))) return;
}
int y0 = index2y(index);
int y1 = y0 + m_iconSize.height() + fs_frameSpacing + fs_iconMarginTop +
fs_iconMarginBottom;
if (y1 > height()) setFixedHeight(y1);
m_scrollArea->ensureVisible(0, (y0 + y1) / 2, 50, (y1 - y0) / 2);
} else {
if (!level->isFid(index2fid(index))) {
if (!level->isFid(index2fid(index - 1))) return;
}
int x0 = index2x(index);
int x1 = x0 + m_iconSize.width() + fs_frameSpacing + fs_leftMargin +
fs_rightMargin + fs_iconMarginLR;
if (x1 > width()) setFixedWidth(x1);
m_scrollArea->ensureVisible((x0 + x1) / 2, 0, (x1 - x0) / 2, 50);
}
}
//-----------------------------------------------------------------------------
void FilmstripFrames::scroll(int dy) {
QScrollBar *sb = m_scrollArea->verticalScrollBar();
int sbValue = sb->value();
if (m_isVertical) {
QScrollBar *sb = m_scrollArea->verticalScrollBar();
int sbValue = sb->value();
updateContentHeight(getFramesHeight());
if (sbValue + dy > getFramesHeight()) {
sb->setValue(getFramesHeight());
return;
updateContentHeight(getFramesHeight());
if (sbValue + dy > getFramesHeight()) {
sb->setValue(getFramesHeight());
return;
}
sb->setValue(sbValue + dy);
} else {
QScrollBar *sb = m_scrollArea->horizontalScrollBar();
int sbValue = sb->value();
updateContentWidth(getFramesWidth());
if (sbValue + dy > getFramesWidth()) {
sb->setValue(getFramesWidth());
return;
}
sb->setValue(sbValue + dy);
}
sb->setValue(sbValue + dy);
}
//---------------------------------------------------------------------------
void FilmstripFrames::mouseDoubleClickEvent(QMouseEvent *event) {
int index = y2index(event->pos().y());
int index;
if (m_isVertical) {
index = y2index(event->pos().y());
} else {
index = x2index(event->pos().x());
}
select(index, ONLY_SELECT); // ONLY_SELECT
}
@ -458,10 +536,17 @@ void FilmstripFrames::paintEvent(QPaintEvent *evt) {
QRect(QPoint(fs_leftMargin, fs_frameSpacing / 2), frameSize);
int oneFrameHeight = frameSize.height() + fs_frameSpacing;
int oneFrameWidth = frameSize.width() + fs_frameSpacing;
// visible frame index range
int i0 = y2index(clipRect.top());
int i1 = y2index(clipRect.bottom());
int i0, i1;
if (m_isVertical) {
i0 = y2index(clipRect.top());
i1 = y2index(clipRect.bottom());
} else {
i0 = x2index(clipRect.left());
i1 = x2index(clipRect.right());
}
// fids, frameCount <- frames del livello
std::vector<TFrameId> fids;
@ -471,7 +556,12 @@ void FilmstripFrames::paintEvent(QPaintEvent *evt) {
else {
for (int i = i0; i <= i1; i++) {
// draw white rectangles if obtaining the level is failed
QRect iconRect = frameRect.translated(QPoint(0, oneFrameHeight * i));
QRect iconRect;
if (m_isVertical) {
iconRect = frameRect.translated(QPoint(0, oneFrameHeight * i));
} else {
iconRect = frameRect.translated(QPoint(oneFrameWidth * i, 0));
}
p.setBrush(QColor(192, 192, 192));
p.setPen(Qt::NoPen);
p.drawRect(iconRect);
@ -512,8 +602,9 @@ void FilmstripFrames::paintEvent(QPaintEvent *evt) {
QRectF naviRatio(
(-(float)m_viewer->width() * 0.5f - (float)imgBottomLeft.x) /
imgSizeInViewer.width(),
1.0f - ((float)m_viewer->height() * 0.5f - (float)imgBottomLeft.y) /
imgSizeInViewer.height(),
1.0f -
((float)m_viewer->height() * 0.5f - (float)imgBottomLeft.y) /
imgSizeInViewer.height(),
(float)m_viewer->width() / imgSizeInViewer.width(),
(float)m_viewer->height() / imgSizeInViewer.height());
@ -538,7 +629,7 @@ void FilmstripFrames::paintEvent(QPaintEvent *evt) {
int frameCount = (int)fids.size();
bool isReadOnly = false;
bool isReadOnly = false;
if (sl) isReadOnly = sl->isReadOnly();
int i;
@ -550,17 +641,27 @@ void FilmstripFrames::paintEvent(QPaintEvent *evt) {
// linee orizzontali che separano i frames
p.setPen(getLightLineColor());
for (i = i0; i <= i1; i++) {
int y = index2y(i) + frameHeight;
p.drawLine(0, y, x1, y);
if (m_isVertical) {
int y = index2y(i) + frameHeight;
p.drawLine(0, y, x1, y);
} else {
int x = index2x(i) + iconWidth;
p.drawLine(x, 0, x, frameHeight);
}
}
TFilmstripSelection::InbetweenRange range = m_selection->getInbetweenRange();
// draw for each frames
for (i = i0; i <= i1; i++) {
QRect tmp_iconImgRect =
iconImgRect.translated(QPoint(0, oneFrameHeight * i));
QRect tmp_frameRect = frameRect.translated(QPoint(0, oneFrameHeight * i));
QRect tmp_iconImgRect, tmp_frameRect;
if (m_isVertical) {
tmp_iconImgRect = iconImgRect.translated(QPoint(0, oneFrameHeight * i));
tmp_frameRect = frameRect.translated(QPoint(0, oneFrameHeight * i));
} else {
tmp_iconImgRect = iconImgRect.translated(QPoint(oneFrameWidth * i, 0));
tmp_frameRect = frameRect.translated(QPoint(oneFrameWidth * i, 0));
}
bool isCurrentFrame =
(i == sl->fid2index(TApp::instance()->getCurrentFrame()->getFid()));
bool isSelected =
@ -624,7 +725,11 @@ void FilmstripFrames::paintEvent(QPaintEvent *evt) {
// navigator rect
if (naviRect.isValid() && fid >= 0 && fid == getCurrentFrameId()) {
p.setPen(QPen(Qt::red, 1));
p.drawRect(naviRect.translated(0, oneFrameHeight * i));
if (m_isVertical) {
p.drawRect(naviRect.translated(0, oneFrameHeight * i));
} else {
p.drawRect(naviRect.translated(oneFrameWidth * i, 0));
}
p.setPen(Qt::NoPen);
}
@ -718,16 +823,33 @@ TFrameId FilmstripFrames::getCurrentFrameId() {
//-----------------------------------------------------------------------------
void FilmstripFrames::mousePressEvent(QMouseEvent *event) {
m_selecting = false;
int index = y2index(event->pos().y());
m_selecting = false;
int index = 0;
if (m_isVertical) {
index = y2index(event->pos().y());
} else {
index = x2index(event->pos().x());
}
TFrameId fid = index2fid(index);
TXshSimpleLevel *sl = getLevel();
int i0 = y2index(0);
int frameHeight = m_iconSize.height() + fs_frameSpacing + fs_iconMarginTop +
fs_iconMarginBottom;
QPoint clickedPos = event->pos() - QPoint(0, (index - i0) * frameHeight);
bool actualIconClicked =
int frameWidth = m_iconSize.width() + fs_frameSpacing + fs_iconMarginLR +
fs_leftMargin + fs_rightMargin;
int i0;
QPoint clickedPos;
bool actualIconClicked;
if (m_isVertical) {
i0 = y2index(0);
clickedPos = event->pos() - QPoint(0, (index - i0) * frameHeight);
} else {
i0 = x2index(0);
clickedPos = event->pos() - QPoint((index - i0) * frameWidth, 0);
}
actualIconClicked =
QRect(QPoint(fs_leftMargin + fs_iconMarginLR,
fs_frameSpacing / 2 +
fs_iconMarginTop) //<- top-left position of the icon
@ -757,6 +879,14 @@ void FilmstripFrames::mousePressEvent(QMouseEvent *event) {
return;
}
// was the inbetween button clicked?
bool inbetweenSelected = false;
if (m_isVertical)
inbetweenSelected = event->pos().x() > width() - 20 - fs_rightMargin;
else
inbetweenSelected =
event->pos().y() > height() - 20 - fs_iconMarginBottom;
// with shift or control
if (event->modifiers() & Qt::ShiftModifier) {
select(index, SHIFT_SELECT);
@ -769,10 +899,8 @@ void FilmstripFrames::mousePressEvent(QMouseEvent *event) {
} else if (event->modifiers() & Qt::ControlModifier)
select(index, CTRL_SELECT);
// was the inbetween button clicked?
else if (sl->getType() == PLI_XSHLEVEL &&
m_selection->isInInbetweenRange(fid) &&
event->pos().x() > width() - 20 - fs_rightMargin) {
m_selection->isInInbetweenRange(fid) && inbetweenSelected) {
inbetween();
} else {
// move current frame when clicked without modifier
@ -814,13 +942,18 @@ void FilmstripFrames::mousePressEvent(QMouseEvent *event) {
//-----------------------------------------------------------------------------
void FilmstripFrames::execNavigatorPan(const QPoint &point) {
int index = y2index(point.y());
TFrameId fid = index2fid(index);
int i0 = y2index(0);
int index = y2index(point.y());
if (!m_isVertical) index = x2index(point.x());
TFrameId fid = index2fid(index);
int i0 = y2index(0);
if (!m_isVertical) i0 = x2index(0);
int frameHeight = m_iconSize.height() + fs_frameSpacing + fs_iconMarginTop +
fs_iconMarginBottom;
QPoint clickedPos = point - QPoint(0, (index - i0) * frameHeight);
int frameWidth = m_iconSize.width() + fs_frameSpacing + fs_iconMarginLR +
fs_leftMargin + fs_rightMargin;
QPoint clickedPos = point - QPoint(0, (index - i0) * frameHeight);
if (!m_isVertical) clickedPos = point - QPoint((index - i0) * frameWidth, 0);
if (fid != getCurrentFrameId()) return;
@ -864,8 +997,9 @@ void FilmstripFrames::mouseReleaseEvent(QMouseEvent *e) {
//-----------------------------------------------------------------------------
void FilmstripFrames::mouseMoveEvent(QMouseEvent *e) {
QPoint pos = e->pos();
int index = y2index(e->pos().y());
QPoint pos = e->pos();
int index = y2index(e->pos().y());
if (!m_isVertical) index = x2index(e->pos().x());
if (e->buttons() & Qt::LeftButton || e->buttons() & Qt::MiddleButton) {
// navigator pan
if (m_isNavigatorPanning) {
@ -886,31 +1020,55 @@ void FilmstripFrames::mouseMoveEvent(QMouseEvent *e) {
}
// autopan
int speed = getOneFrameHeight() / 64;
int speed = getOneFrameHeight() / 64;
if (!m_isVertical) speed = getOneFrameWidth() / 64;
QRect visibleRect = visibleRegion().boundingRect();
int visibleTop = visibleRect.top();
int visibleBottom = visibleRect.bottom();
if (pos.y() < visibleRect.top()) {
m_scrollSpeed = -speed;
if (visibleRect.top() - pos.y() > 30) {
m_timerInterval = 50;
} else if (visibleRect.top() - pos.y() > 15) {
m_timerInterval = 150;
} else {
m_timerInterval = 300;
}
} else if (pos.y() > visibleRect.bottom()) {
m_scrollSpeed = speed;
if (pos.y() - visibleRect.bottom() > 30) {
m_timerInterval = 50;
} else if (pos.y() - visibleRect.bottom() > 15) {
m_timerInterval = 150;
} else {
m_timerInterval = 300;
}
} else
m_scrollSpeed = 0;
if (m_isVertical) {
if (pos.y() < visibleRect.top()) {
m_scrollSpeed = -speed;
if (visibleRect.top() - pos.y() > 30) {
m_timerInterval = 50;
} else if (visibleRect.top() - pos.y() > 15) {
m_timerInterval = 150;
} else {
m_timerInterval = 300;
}
} else if (pos.y() > visibleRect.bottom()) {
m_scrollSpeed = speed;
if (pos.y() - visibleRect.bottom() > 30) {
m_timerInterval = 50;
} else if (pos.y() - visibleRect.bottom() > 15) {
m_timerInterval = 150;
} else {
m_timerInterval = 300;
}
} else
m_scrollSpeed = 0;
} else {
if (pos.x() < visibleRect.left()) {
m_scrollSpeed = -speed;
if (visibleRect.left() - pos.x() > 30) {
m_timerInterval = 50;
} else if (visibleRect.left() - pos.x() > 15) {
m_timerInterval = 150;
} else {
m_timerInterval = 300;
}
} else if (pos.x() > visibleRect.right()) {
m_scrollSpeed = speed;
if (pos.x() - visibleRect.right() > 30) {
m_timerInterval = 50;
} else if (pos.x() - visibleRect.right() > 15) {
m_timerInterval = 150;
} else {
m_timerInterval = 300;
}
} else
m_scrollSpeed = 0;
}
if (m_scrollSpeed != 0) {
startAutoPanning();
} else
@ -919,7 +1077,11 @@ void FilmstripFrames::mouseMoveEvent(QMouseEvent *e) {
} else if (e->buttons() & Qt::MidButton) {
// scroll con il tasto centrale
pos = e->globalPos();
scroll((m_pos.y() - pos.y()) * 10);
if (m_isVertical) {
scroll((m_pos.y() - pos.y()) * 10);
} else {
scroll((m_pos.x() - pos.x()) * 10);
}
m_pos = pos;
} else {
TFrameId fid = index2fid(index);
@ -953,25 +1115,39 @@ void FilmstripFrames::keyPressEvent(QKeyEvent *event) {
}
fh->setFrameIds(fids);
if (event->key() == Qt::Key_Up)
if (event->key() == Qt::Key_Up || event->key() == Qt::Key_Left)
fh->prevFrame();
else if (event->key() == Qt::Key_Down)
else if (event->key() == Qt::Key_Down || event->key() == Qt::Key_Right)
fh->nextFrame(newId);
else if (event->key() == Qt::Key_Home)
fh->firstFrame();
else if (event->key() == Qt::Key_End)
fh->lastFrame();
else if (event->key() == Qt::Key_PageDown) {
int frameHeight = m_iconSize.height();
int visibleHeight = visibleRegion().rects()[0].height();
int visibleFrames = double(visibleHeight) / double(frameHeight);
scroll(visibleFrames * frameHeight);
if (m_isVertical) {
int frameHeight = m_iconSize.height();
int visibleHeight = visibleRegion().rects()[0].height();
int visibleFrames = double(visibleHeight) / double(frameHeight);
scroll(visibleFrames * frameHeight);
} else {
int frameWidth = m_iconSize.width();
int visibleWidth = visibleRegion().rects()[0].width();
int visibleFrames = double(visibleWidth) / double(frameWidth);
scroll(visibleFrames * frameWidth);
}
return;
} else if (event->key() == Qt::Key_PageUp) {
int frameHeight = m_iconSize.height();
int visibleHeight = visibleRegion().rects()[0].height();
int visibleFrames = double(visibleHeight) / double(frameHeight);
scroll(-visibleFrames * frameHeight);
if (m_isVertical) {
int frameHeight = m_iconSize.height();
int visibleHeight = visibleRegion().rects()[0].height();
int visibleFrames = double(visibleHeight) / double(frameHeight);
scroll(-visibleFrames * frameHeight);
} else {
int frameWidth = m_iconSize.width();
int visibleWidth = visibleRegion().rects()[0].width();
int visibleFrames = double(visibleWidth) / double(frameWidth);
scroll(-visibleFrames * frameWidth);
}
return;
} else
return;
@ -1013,8 +1189,9 @@ void FilmstripFrames::timerEvent(QTimerEvent *) {
m_timerId = 0;
m_timerId = startTimer(m_timerInterval);
if (m_selecting) {
QPoint pos = mapFromGlobal(m_pos);
int index = y2index(pos.y());
QPoint pos = mapFromGlobal(m_pos);
int index = y2index(pos.y());
if (!m_isVertical) index = x2index(pos.x());
select(index, DRAG_SELECT);
showFrame(index);
update();
@ -1068,21 +1245,67 @@ void FilmstripFrames::contextMenuEvent(QContextMenuEvent *event) {
(sl->getType() == OVL_XSHLEVEL && sl->getPath().getType() != "gif" &&
sl->getPath().getType() != "mp4" && sl->getPath().getType() != "webm")))
menu->addAction(cm->getAction(MI_RevertToLastSaved));
menu->addSeparator();
QAction *toggleOrientation = menu->addAction(tr("Toggle Orientation"));
connect(toggleOrientation, SIGNAL(triggered(bool)), this,
SLOT(orientationToggled(bool)));
menu->exec(event->globalPos());
}
//-----------------------------------------------------------------------------
void FilmstripFrames::orientationToggled(bool ignore) {
m_isVertical = !m_isVertical;
emit(orientationToggledSignal(m_isVertical));
}
//-----------------------------------------------------------------------------
void FilmstripFrames::setOrientation(bool isVertical) {
m_isVertical = isVertical;
if (m_isVertical) {
setFixedWidth(m_iconSize.width() + fs_leftMargin + fs_rightMargin +
fs_iconMarginLR * 2);
setFixedHeight(parentWidget()->height());
} else {
setFixedHeight(parentWidget()->height());
setFixedWidth(parentWidget()->width());
}
if (m_isVertical)
updateContentHeight();
else
updateContentWidth();
TApp *app = TApp::instance();
TFrameHandle *fh = app->getCurrentFrame();
TFrameId fid = getCurrentFrameId();
int index = fid2index(fid);
if (index >= 0) {
showFrame(index);
}
update();
}
//-----------------------------------------------------------------------------
void FilmstripFrames::onLevelChanged() {
updateContentHeight();
if (m_isVertical)
updateContentHeight();
else
updateContentWidth();
update();
}
//-----------------------------------------------------------------------------
void FilmstripFrames::onLevelSwitched(TXshLevel *) {
updateContentHeight(0);
if (m_isVertical)
updateContentHeight(0);
else
updateContentWidth(0);
onFrameSwitched(); // deve visualizzare il frame corrente nella levelstrip
}
@ -1190,13 +1413,11 @@ Filmstrip::Filmstrip(QWidget *parent, Qt::WFlags flags)
m_frames = new FilmstripFrames(m_frameArea);
//----
m_frames->m_isVertical = m_isVertical;
m_frameArea->setObjectName("filmScrollArea");
m_frameArea->setFrameStyle(QFrame::StyledPanel);
m_frameArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_frameArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
setOrientation(m_isVertical);
m_frameArea->verticalScrollBar()->setObjectName("LevelStripScrollBar");
m_frameArea->setWidget(m_frames);
m_chooseLevelCombo->setMaxVisibleItems(50);
@ -1220,6 +1441,8 @@ Filmstrip::Filmstrip(QWidget *parent, Qt::WFlags flags)
// changed
connect(m_chooseLevelCombo, SIGNAL(activated(int)), this,
SLOT(onChooseLevelComboChanged(int)));
connect(m_frames, SIGNAL(orientationToggledSignal(bool)), this,
SLOT(orientationToggled(bool)));
}
//-----------------------------------------------------------------------------
@ -1365,7 +1588,7 @@ void Filmstrip::showEvent(QShowEvent *) {
TXshLevelHandle *levelHandle = app->getCurrentLevel();
bool ret = connect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)),
SLOT(onLevelSwitched(TXshLevel *)));
ret = ret &&
ret = ret &&
connect(levelHandle, SIGNAL(xshLevelChanged()), SLOT(onLevelChanged()));
// updateWindowTitle is called in the onLevelChanged
@ -1434,9 +1657,15 @@ void Filmstrip::hideEvent(QHideEvent *) {
//-----------------------------------------------------------------------------
void Filmstrip::resizeEvent(QResizeEvent *e) {
m_frames->updateContentHeight();
m_frameArea->verticalScrollBar()->setSingleStep(
m_frames->getOneFrameHeight());
if (m_isVertical) {
m_frames->updateContentHeight();
m_frameArea->verticalScrollBar()->setSingleStep(
m_frames->getOneFrameHeight());
} else {
m_frames->updateContentWidth();
m_frameArea->horizontalScrollBar()->setSingleStep(
m_frames->getOneFrameWidth());
}
}
//-----------------------------------------------------------------------------
@ -1493,9 +1722,17 @@ void Filmstrip::onLevelSwitched(TXshLevel *oldLevel) {
void Filmstrip::onSliderMoved(int val) {
int oneFrameHeight = m_frames->getIconSize().height() + fs_frameSpacing +
fs_iconMarginTop + fs_iconMarginBottom;
int tmpVal =
(int)((float)val / (float)oneFrameHeight + 0.5f) * oneFrameHeight;
m_frameArea->verticalScrollBar()->setValue(tmpVal);
int oneFrameWidth =
m_frames->getIconSize().width() + fs_frameSpacing + fs_iconMarginLR;
if (m_isVertical) {
int tmpVal =
(int)((float)val / (float)oneFrameHeight + 0.5f) * oneFrameHeight;
m_frameArea->verticalScrollBar()->setValue(tmpVal);
} else {
int tmpVal =
(int)((float)val / (float)oneFrameWidth + 0.5f) * oneFrameWidth;
m_frameArea->horizontalScrollBar()->setValue(tmpVal);
}
}
//-----------------------------------------------------------------------------
@ -1522,6 +1759,41 @@ void Filmstrip::onFrameSwitched() {
levelName);
}
//-----------------------------------------------------------------------------
void Filmstrip::orientationToggled(bool isVertical) {
setOrientation(isVertical);
}
//-----------------------------------------------------------------------------
void Filmstrip::setOrientation(bool isVertical) {
m_isVertical = isVertical;
if (isVertical) {
m_frameArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_frameArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
m_frameArea->verticalScrollBar()->setObjectName("LevelStripScrollBar");
} else {
m_frameArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
m_frameArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_frameArea->horizontalScrollBar()->setObjectName("LevelStripScrollBar");
}
m_frames->setOrientation(m_isVertical);
}
// SaveLoadQSettings
void Filmstrip::save(QSettings &settings) const {
UINT orientation = 0;
orientation = m_isVertical ? 1 : 0;
settings.setValue("vertical", orientation);
}
void Filmstrip::load(QSettings &settings) {
UINT orientation = settings.value("vertical", 1).toUInt();
m_isVertical = orientation == 1;
setOrientation(m_isVertical);
}
//=============================================================================
// inbetweenDialog
//-----------------------------------------------------------------------------
@ -1558,7 +1830,7 @@ QString InbetweenDialog::getValue() { return m_comboBox->currentText(); }
//-----------------------------------------------------------------------------
void InbetweenDialog::setValue(const QString &value) {
int currentIndex = m_comboBox->findText(value);
int currentIndex = m_comboBox->findText(value);
if (currentIndex < 0) currentIndex = 0;
m_comboBox->setCurrentIndex(currentIndex);
}

View file

@ -6,6 +6,7 @@
// TnzQt includes
#include "toonzqt/dvdialog.h"
#include "toonzqt/selection.h"
#include "saveloadqsettings.h"
// Qt includes
#include <QScrollArea>
@ -48,6 +49,8 @@ public:
#endif
~FilmstripFrames();
bool m_isVertical = true;
void setBGColor(const QColor &color) { m_bgColor = color; }
QColor getBGColor() const { return m_bgColor; }
void setLightLineColor(const QColor &color) { m_lightLineColor = color; }
@ -65,6 +68,10 @@ public:
int y2index(int y) const;
int index2y(int index) const;
// convert mouse coordinate x to a frame index and vice versa
int x2index(int x) const;
int index2x(int index) const;
// returns the frame id of the provided index if index >= 0
// otherwise returns TFrameId()
TFrameId index2fid(int index) const;
@ -75,6 +82,9 @@ public:
// returns the height of all frames plus a blank one
int getFramesHeight() const;
// returns the width of all frames plus a blank one
int getFramesWidth() const;
// aggiorna le dimensioni del QWidget in base al numero di fotogrammi del
// livello
// la dimensione verticale e' sempre >= minimumHeight. Questo permette di
@ -83,6 +93,7 @@ public:
// se minimumHeight == -1 viene utilizzato
// visibleRegion().boundingRect().bottom()
void updateContentHeight(int minimumHeight = -1);
void updateContentWidth(int minimumHeight = -1);
// makes sure that the indexed frame is visible (scrolling if necessary)
void showFrame(int index);
@ -106,6 +117,11 @@ public:
void select(int index, SelectionMode mode = SIMPLE_SELECT);
int getOneFrameHeight();
int getOneFrameWidth();
void setOrientation(bool isVertical);
signals:
void orientationToggledSignal(bool);
protected:
void showEvent(QShowEvent *) override;
@ -145,6 +161,7 @@ protected slots:
void onLevelSwitched(TXshLevel *);
void onFrameSwitched();
void getViewer();
void orientationToggled(bool);
private:
// QSS Properties
@ -196,7 +213,7 @@ private:
// Filmstrip
//-----------------------------------------------------------------------------
class Filmstrip final : public QWidget {
class Filmstrip final : public QWidget, public SaveLoadQSettings {
Q_OBJECT
FilmstripFrames *m_frames;
@ -206,6 +223,7 @@ class Filmstrip final : public QWidget {
std::vector<TXshSimpleLevel *> m_levels;
std::map<TXshSimpleLevel *, TFrameId> m_workingFrames;
bool m_isVertical = true;
public:
#if QT_VERSION >= 0x050500
@ -215,7 +233,12 @@ public:
#endif
~Filmstrip();
// SaveLoadQSettings
virtual void save(QSettings &settings) const override;
virtual void load(QSettings &settings) override;
protected:
void setOrientation(bool isVertical);
void showEvent(QShowEvent *) override;
void hideEvent(QHideEvent *) override;
void resizeEvent(QResizeEvent *) override;
@ -237,6 +260,7 @@ public slots:
void onChooseLevelComboChanged(int index);
void onFrameSwitched();
void orientationToggled(bool);
private:
void updateWindowTitle();

View file

@ -201,9 +201,9 @@ QSize DockLayout::maximumSize() const {
QSize DockLayout::sizeHint() const {
QSize s(0, 0);
int n = m_items.size();
int n = m_items.size();
if (n > 0) s = QSize(100, 70); // start with a nice default size
int i = 0;
int i = 0;
while (i < n) {
QLayoutItem *o = m_items[i];
s = s.expandedTo(o->sizeHint());
@ -466,9 +466,9 @@ void DockLayout::redistribute() {
// glitchy.
bool widgetsCanBeFixedWidth =
!m_regions.front()->checkWidgetsToBeFixedWidth(widgets);
if (widgetsCanBeFixedWidth) {
for (QWidget *widget : widgets) widget->setFixedWidth(widget->width());
}
// if (widgetsCanBeFixedWidth) {
// for (QWidget *widget : widgets) widget->setFixedWidth(widget->width());
//}
m_regions.front()->calculateExtremalSizes();
@ -487,12 +487,12 @@ void DockLayout::redistribute() {
m_regions.front()->setGeometry(contentsRect());
m_regions.front()->redistribute();
if (widgetsCanBeFixedWidth) {
for (QWidget *widget : widgets) {
widget->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
widget->setMinimumSize(0, 0);
}
}
// if (widgetsCanBeFixedWidth) {
// for (QWidget *widget : widgets) {
// widget->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
// widget->setMinimumSize(0, 0);
// }
//}
}
// Finally, apply Region geometries found
@ -1498,7 +1498,7 @@ bool DockLayout::restoreState(const State &state) {
}
// Else, deallocate old regions and substitute with new ones
for (j = 0; j < m_regions.size(); ++j) delete m_regions[j];
for (j = 0; j < m_regions.size(); ++j) delete m_regions[j];
m_regions = newHierarchy;
// Now re-initialize dock widgets' infos.