Add level button (#32)

This commit is contained in:
Jeremy Bullock 2020-05-30 22:24:30 -06:00 committed by GitHub
parent 8dd05d7504
commit aabea72286
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 193 additions and 152 deletions

View file

@ -135,7 +135,9 @@ enum class PredefinedRect {
PANEL_EYE,
PANEL_PREVIEW_LAYER,
PANEL_LOCK,
PANEL_LAYER_NAME
PANEL_LAYER_NAME,
ADD_LEVEL_AREA,
ADD_LEVEL
};
enum class PredefinedLine {
LOCKED, //! dotted vertical line when cell is locked
@ -215,14 +217,14 @@ protected:
public:
virtual CellPosition xyToPosition(const QPoint &xy,
const ColumnFan *fan) const = 0;
const ColumnFan *fan) const = 0;
virtual QPoint positionToXY(const CellPosition &position,
const ColumnFan *fan) const = 0;
virtual CellPositionRatio xyToPositionRatio(const QPoint &xy) const = 0;
virtual QPoint positionRatioToXY(const CellPositionRatio &ratio) const = 0;
virtual int colToLayerAxis(int layer, const ColumnFan *fan) const = 0;
virtual int rowToFrameAxis(int frame) const = 0;
virtual int rowToFrameAxis(int frame) const = 0;
virtual QPoint frameLayerToXY(int frameAxis, int layerAxis) const = 0;
QRect frameLayerRect(const NumberRange &frameAxis,

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="4096px" height="3971px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
<g>
<path d="M772.83,118.557L772.83,855.303L210.088,855.303L210.088,314.504L414.122,118.557L772.83,118.557ZM527.787,446.364L527.787,264.119L446.654,264.119L446.654,446.364L264.41,446.364L264.41,527.496L446.654,527.496L446.654,709.74L527.787,709.74L527.787,527.496L710.031,527.496L710.031,446.364L527.787,446.364Z" style="fill:rgb(225,225,225);"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 875 B

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="4096px" height="3971px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(4.16667,0,0,4.16667,0,0)">
<g id="rect824" transform="matrix(4.16667,0,0,4.16667,0,0)">
<rect x="-0.445" y="0.555" width="236" height="228" style="fill:rgb(230,230,230);fill-opacity:0.29;"/>
</g>
<g>
<path d="M772.83,118.557L772.83,855.303L210.088,855.303L210.088,314.504L414.122,118.557L772.83,118.557ZM527.787,446.364L527.787,264.119L446.654,264.119L446.654,446.364L264.41,446.364L264.41,527.496L446.654,527.496L446.654,709.74L527.787,709.74L527.787,527.496L710.031,527.496L710.031,446.364L527.787,446.364Z" style="fill:rgb(225,225,225);"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -18,198 +18,209 @@
using XsheetGUI::ColumnArea;
#if QT_VERSION >= 0x050500
LayerFooterPanel::LayerFooterPanel(XsheetViewer *viewer, QWidget *parent,
Qt::WindowFlags flags)
#else
LayerFooterPanel::LayerFooterPanel(XsheetViewer *viewer, QWidget *parent,
Qt::WFlags flags)
#endif
: QWidget(parent, flags), m_viewer(viewer) {
const Orientation *o = Orientations::leftToRight();
QRect rect = o->rect(PredefinedRect::LAYER_FOOTER_PANEL);
Qt::WindowFlags flags)
: QWidget(parent, flags), m_viewer(viewer) {
const Orientation *o = Orientations::leftToRight();
QRect rect = o->rect(PredefinedRect::LAYER_FOOTER_PANEL);
setObjectName("layerFooterPanel");
setObjectName("layerFooterPanel");
setFixedSize(rect.size());
setMouseTracking(true);
setFixedSize(rect.size());
m_frameZoomSlider = new QSlider(Qt::Horizontal, this);
m_frameZoomSlider->setMinimum(20);
m_frameZoomSlider->setMaximum(100);
m_frameZoomSlider->setValue(m_viewer->getFrameZoomFactor());
m_frameZoomSlider->setToolTip(tr("Zoom in/out of timeline"));
setMouseTracking(true);
connect(m_frameZoomSlider, SIGNAL(valueChanged(int)), this,
SLOT(onFrameZoomSliderValueChanged(int)));
m_frameZoomSlider = new QSlider(Qt::Horizontal, this);
m_frameZoomSlider->setMinimum(20);
m_frameZoomSlider->setMaximum(100);
m_frameZoomSlider->setValue(m_viewer->getFrameZoomFactor());
m_frameZoomSlider->setToolTip(tr("Zoom in/out of timeline"));
connect(m_frameZoomSlider, SIGNAL(valueChanged(int)), this,
SLOT(onFrameZoomSliderValueChanged(int)));
}
LayerFooterPanel::~LayerFooterPanel() {}
namespace {
QColor mix(const QColor &a, const QColor &b, double w) {
return QColor(a.red() * w + b.red() * (1 - w),
a.green() * w + b.green() * (1 - w),
a.blue() * w + b.blue() * (1 - w));
}
QColor mix(const QColor &a, const QColor &b, double w) {
return QColor(a.red() * w + b.red() * (1 - w),
a.green() * w + b.green() * (1 - w),
a.blue() * w + b.blue() * (1 - w));
}
QColor withAlpha(const QColor &color, double alpha) {
QColor result(color);
result.setAlpha(alpha * 255);
return result;
}
QColor withAlpha(const QColor &color, double alpha) {
QColor result(color);
result.setAlpha(alpha * 255);
return result;
}
QRect shorter(const QRect original) { return original.adjusted(0, 2, 0, -2); }
QRect shorter(const QRect original) { return original.adjusted(0, 2, 0, -2); }
QLine leftSide(const QRect &r) { return QLine(r.topLeft(), r.bottomLeft()); }
QLine leftSide(const QRect &r) { return QLine(r.topLeft(), r.bottomLeft()); }
QLine rightSide(const QRect &r) { return QLine(r.topRight(), r.bottomRight()); }
QLine rightSide(const QRect &r) { return QLine(r.topRight(), r.bottomRight()); }
}
void LayerFooterPanel::paintEvent(QPaintEvent *event) {
QPainter p(this);
p.setRenderHint(QPainter::SmoothPixmapTransform, true);
QPainter p(this);
p.setRenderHint(QPainter::SmoothPixmapTransform, true);
const Orientation *o = Orientations::leftToRight();
const Orientation *o = Orientations::leftToRight();
QRect zoomSliderRect = o->rect(PredefinedRect::ZOOM_SLIDER_AREA);
p.fillRect(zoomSliderRect, Qt::NoBrush);
QRect zoomSliderRect = o->rect(PredefinedRect::ZOOM_SLIDER_AREA);
p.fillRect(zoomSliderRect, Qt::NoBrush);
QRect sliderObjRect = o->rect(PredefinedRect::ZOOM_SLIDER);
m_frameZoomSlider->setGeometry(sliderObjRect);
QRect sliderObjRect = o->rect(PredefinedRect::ZOOM_SLIDER);
m_frameZoomSlider->setGeometry(sliderObjRect);
static QPixmap zoomIn = svgToPixmap(":Resources/zoom_in.svg");
static QPixmap zoomInRollover = svgToPixmap(":Resources/zoom_in_rollover.svg");
const QRect zoomInImgRect = o->rect(PredefinedRect::ZOOM_IN);
static QPixmap zoomIn = svgToPixmap(":Resources/zoom_in.svg");
static QPixmap zoomInRollover =
svgToPixmap(":Resources/zoom_in_rollover.svg");
const QRect zoomInImgRect = o->rect(PredefinedRect::ZOOM_IN);
static QPixmap zoomOut = svgToPixmap(":Resources/zoom_out.svg");
static QPixmap zoomOutRollover = svgToPixmap(":Resources/zoom_out_rollover.svg");
const QRect zoomOutImgRect = o->rect(PredefinedRect::ZOOM_OUT);
static QPixmap zoomOut = svgToPixmap(":Resources/zoom_out.svg");
static QPixmap zoomOutRollover =
svgToPixmap(":Resources/zoom_out_rollover.svg");
const QRect zoomOutImgRect = o->rect(PredefinedRect::ZOOM_OUT);
p.setRenderHint(QPainter::SmoothPixmapTransform, true);
if (m_zoomInHighlighted)
p.drawPixmap(zoomInImgRect, zoomInRollover);
else
p.drawPixmap(zoomInImgRect, zoomIn);
static QPixmap addLevel = svgToPixmap(":Resources/new_level.svg");
static QPixmap addLevelRollover =
svgToPixmap(":Resources/new_level_rollover.svg");
const QRect addLevelImgRect = o->rect(PredefinedRect::ADD_LEVEL);
if (m_zoomOutHighlighted)
p.drawPixmap(zoomOutImgRect, zoomOutRollover);
else
p.drawPixmap(zoomOutImgRect, zoomOut);
p.setRenderHint(QPainter::SmoothPixmapTransform, true);
if (m_zoomInHighlighted)
p.drawPixmap(zoomInImgRect, zoomInRollover);
else
p.drawPixmap(zoomInImgRect, zoomIn);
p.setPen(withAlpha(m_viewer->getTextColor(), 0.5));
if (m_zoomOutHighlighted)
p.drawPixmap(zoomOutImgRect, zoomOutRollover);
else
p.drawPixmap(zoomOutImgRect, zoomOut);
QLine line = { leftSide(shorter(zoomOutImgRect)).translated(-2, 0) };
p.drawLine(line);
if (m_addLevelHighlighted)
p.drawPixmap(addLevelImgRect, addLevelRollover);
else
p.drawPixmap(addLevelImgRect, addLevel);
p.setPen(withAlpha(m_viewer->getTextColor(), 0.5));
QLine line = {leftSide(shorter(zoomOutImgRect)).translated(-4, 0)};
p.drawLine(line);
}
void LayerFooterPanel::showOrHide(const Orientation *o) {
QRect rect = o->rect(PredefinedRect::LAYER_FOOTER_PANEL);
if (rect.isEmpty())
hide();
else
show();
QRect rect = o->rect(PredefinedRect::LAYER_FOOTER_PANEL);
if (rect.isEmpty())
hide();
else
show();
}
//-----------------------------------------------------------------------------
void LayerFooterPanel::enterEvent(QEvent *) {
m_zoomInHighlighted = false;
m_zoomOutHighlighted = false;
m_zoomInHighlighted = false;
m_zoomOutHighlighted = false;
m_addLevelHighlighted = false;
update();
update();
}
void LayerFooterPanel::leaveEvent(QEvent *) {
m_zoomInHighlighted = false;
m_zoomOutHighlighted = false;
m_zoomInHighlighted = false;
m_zoomOutHighlighted = false;
m_addLevelHighlighted = false;
update();
update();
}
void LayerFooterPanel::mousePressEvent(QMouseEvent *event) {
const Orientation *o = Orientations::leftToRight();
const Orientation *o = Orientations::leftToRight();
if (event->button() == Qt::LeftButton) {
// get mouse position
QPoint pos = event->pos();
if (o->rect(PredefinedRect::ZOOM_IN_AREA).contains(pos)) {
int newFactor = isCtrlPressed ? m_frameZoomSlider->maximum()
: m_frameZoomSlider->value() + 10;
m_frameZoomSlider->setValue(newFactor);
}
else if (o->rect(PredefinedRect::ZOOM_OUT_AREA).contains(pos)) {
int newFactor = isCtrlPressed ? m_frameZoomSlider->minimum()
: m_frameZoomSlider->value() - 10;
m_frameZoomSlider->setValue(newFactor);
}
}
if (event->button() == Qt::LeftButton) {
// get mouse position
QPoint pos = event->pos();
if (o->rect(PredefinedRect::ZOOM_IN_AREA).contains(pos)) {
int newFactor = isCtrlPressed ? m_frameZoomSlider->maximum()
: m_frameZoomSlider->value() + 10;
m_frameZoomSlider->setValue(newFactor);
} else if (o->rect(PredefinedRect::ZOOM_OUT_AREA).contains(pos)) {
int newFactor = isCtrlPressed ? m_frameZoomSlider->minimum()
: m_frameZoomSlider->value() - 10;
m_frameZoomSlider->setValue(newFactor);
} else if (o->rect(PredefinedRect::ADD_LEVEL_AREA).contains(pos)) {
CommandManager::instance()->execute("MI_NewLevel");
}
}
update();
update();
}
void LayerFooterPanel::mouseMoveEvent(QMouseEvent *event) {
const Orientation *o = Orientations::leftToRight();
const Orientation *o = Orientations::leftToRight();
QPoint pos = event->pos();
QPoint pos = event->pos();
m_zoomInHighlighted = false;
m_zoomOutHighlighted = false;
if (o->rect(PredefinedRect::ZOOM_IN_AREA).contains(pos)) {
m_zoomInHighlighted = true;
m_tooltip = tr("Zoom in (Ctrl-click to zoom in all the way)");
}
else if (o->rect(PredefinedRect::ZOOM_OUT_AREA)
.contains(pos)) {
m_zoomOutHighlighted = true;
m_tooltip = tr("Zoom out (Ctrl-click to zoom out all the way)");
}
else {
m_tooltip = tr("");
}
m_zoomInHighlighted = false;
m_zoomOutHighlighted = false;
m_addLevelHighlighted = false;
if (o->rect(PredefinedRect::ZOOM_IN_AREA).contains(pos)) {
m_zoomInHighlighted = true;
m_tooltip = tr("Zoom in (Ctrl-click to zoom in all the way)");
} else if (o->rect(PredefinedRect::ZOOM_OUT_AREA).contains(pos)) {
m_zoomOutHighlighted = true;
m_tooltip = tr("Zoom out (Ctrl-click to zoom out all the way)");
} else if (o->rect(PredefinedRect::ADD_LEVEL_AREA).contains(pos)) {
m_addLevelHighlighted = true;
m_tooltip = tr("Add a new level.");
} else {
m_tooltip = tr("");
}
m_pos = pos;
m_pos = pos;
update();
update();
}
//-----------------------------------------------------------------------------
bool LayerFooterPanel::event(QEvent *event) {
if (event->type() == QEvent::ToolTip) {
if (!m_tooltip.isEmpty())
QToolTip::showText(mapToGlobal(m_pos), m_tooltip);
else
QToolTip::hideText();
}
return QWidget::event(event);
if (event->type() == QEvent::ToolTip) {
if (!m_tooltip.isEmpty())
QToolTip::showText(mapToGlobal(m_pos), m_tooltip);
else
QToolTip::hideText();
}
return QWidget::event(event);
}
//-----------------------------------------------------------------------------
void LayerFooterPanel::setZoomSliderValue(int val) {
if (val > m_frameZoomSlider->maximum())
val = m_frameZoomSlider->maximum();
else if (val < m_frameZoomSlider->minimum())
val = m_frameZoomSlider->minimum();
if (val > m_frameZoomSlider->maximum())
val = m_frameZoomSlider->maximum();
else if (val < m_frameZoomSlider->minimum())
val = m_frameZoomSlider->minimum();
m_frameZoomSlider->blockSignals(true);
m_frameZoomSlider->setValue(val);
m_frameZoomSlider->blockSignals(false);
m_frameZoomSlider->blockSignals(true);
m_frameZoomSlider->setValue(val);
m_frameZoomSlider->blockSignals(false);
}
//-----------------------------------------------------------------------------
void LayerFooterPanel::onFrameZoomSliderValueChanged(int val) {
m_viewer->zoomOnFrame(m_viewer->getCurrentRow(), val);
m_viewer->zoomOnFrame(m_viewer->getCurrentRow(), val);
}
//-----------------------------------------------------------------------------
void LayerFooterPanel::onControlPressed(bool pressed) {
isCtrlPressed = pressed;
update();
isCtrlPressed = pressed;
update();
}
//-----------------------------------------------------------------------------

View file

@ -16,51 +16,52 @@ class XsheetViewer;
// Panel showing column footers for layers in timeline mode
class LayerFooterPanel final : public QWidget {
Q_OBJECT
Q_OBJECT
QString m_tooltip;
QPoint m_pos;
QString m_tooltip;
QPoint m_pos;
QSlider *m_frameZoomSlider;
QSlider *m_frameZoomSlider;
bool isCtrlPressed = false;
bool m_zoomInHighlighted = false;
bool m_zoomOutHighlighted = false;
bool isCtrlPressed = false;
bool m_zoomInHighlighted = false;
bool m_zoomOutHighlighted = false;
bool m_addLevelHighlighted = false;
private:
XsheetViewer *m_viewer;
XsheetViewer *m_viewer;
public:
#if QT_VERSION >= 0x050500
LayerFooterPanel(XsheetViewer *viewer, QWidget *parent = 0,
Qt::WindowFlags flags = 0);
LayerFooterPanel(XsheetViewer *viewer, QWidget *parent = 0,
Qt::WindowFlags flags = 0);
#else
LayerFooterPanel(XsheetViewer *viewer, QWidget *parent = 0,
Qt::WFlags flags = 0);
LayerFooterPanel(XsheetViewer *viewer, QWidget *parent = 0,
Qt::WFlags flags = 0);
#endif
~LayerFooterPanel();
~LayerFooterPanel();
void showOrHide(const Orientation *o);
void showOrHide(const Orientation *o);
void setZoomSliderValue(int val);
void setZoomSliderValue(int val);
void onControlPressed(bool pressed);
const bool isControlPressed();
void onControlPressed(bool pressed);
const bool isControlPressed();
protected:
void paintEvent(QPaintEvent *event) override;
void paintEvent(QPaintEvent *event) override;
void enterEvent(QEvent *) override;
void leaveEvent(QEvent *) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
bool event(QEvent *event) override;
void enterEvent(QEvent *) override;
void leaveEvent(QEvent *) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
bool event(QEvent *event) override;
void keyPressEvent(QKeyEvent *event) override { event->ignore(); }
void wheelEvent(QWheelEvent *event) override { event->ignore(); }
void keyPressEvent(QKeyEvent *event) override { event->ignore(); }
void wheelEvent(QWheelEvent *event) override { event->ignore(); }
public slots:
void onFrameZoomSliderValueChanged(int val);
void onFrameZoomSliderValueChanged(int val);
};
#endif
#pragma once

View file

@ -152,6 +152,8 @@
<file>Resources/new_raster_level.svg</file>
<file>Resources/new_toonz_raster_level.svg</file>
<file>Resources/new_vector_level.svg</file>
<file>Resources/new_level.svg</file>
<file>Resources/new_level_rollover.svg</file>
<file>Resources/newmemo.svg</file>
<file>Resources/newmemo_disabled.svg</file>
<file>Resources/newstyle.png</file>

View file

@ -164,7 +164,7 @@ NumberRange NumberRange::adjusted(int addFrom, int addTo) const {
}
double NumberRange::ratio(int at) const {
double result = ((double)at - _from) / (_to - _from);
double result = ((double)at - _from) / (_to - _from);
if (result < 0) result = 0;
if (result > 1) result = 1;
return result;
@ -1115,7 +1115,7 @@ LeftToRightOrientation::LeftToRightOrientation() {
QRect(0, 0, LAYER_HEADER_WIDTH + 2, LAYER_FOOTER_PANEL_HEIGHT));
addRect(PredefinedRect::LAYER_FOOTER_PANEL, layerFooterPanel);
QRect zoomSlider, zoomIn, zoomOut;
QRect zoomSlider, zoomIn, zoomOut, addLevel;
zoomSlider =
QRect(layerFooterPanel.width() - 100, 0, 81, LAYER_FOOTER_PANEL_HEIGHT);
@ -1130,6 +1130,10 @@ LeftToRightOrientation::LeftToRightOrientation() {
addRect(PredefinedRect::ZOOM_OUT_AREA, zoomOut);
addRect(PredefinedRect::ZOOM_OUT, zoomOut.adjusted(1, 1, 0, 0));
addLevel = QRect(zoomOut.left() - 24, 0, 16, LAYER_FOOTER_PANEL_HEIGHT);
addRect(PredefinedRect::ADD_LEVEL_AREA, addLevel);
addRect(PredefinedRect::ADD_LEVEL, addLevel.adjusted(1, 1, 0, 0));
// Flags
addFlag(PredefinedFlag::DRAG_LAYER_BORDER, false);
addFlag(PredefinedFlag::DRAG_LAYER_VISIBLE, true);

View file

@ -510,7 +510,7 @@ void Preferences::definePreferenceItems() {
"inputCellsWithoutDoubleClickingEnabled", QMetaType::Bool, false);
define(shortcutCommandsWhileRenamingCellEnabled,
"shortcutCommandsWhileRenamingCellEnabled", QMetaType::Bool, false);
define(showXSheetToolbar, "showXSheetToolbar", QMetaType::Bool, true);
define(showXSheetToolbar, "showXSheetToolbar", QMetaType::Bool, false);
define(expandFunctionHeader, "expandFunctionHeader", QMetaType::Bool, false);
define(showColumnNumbers, "showColumnNumbers", QMetaType::Bool, false);
define(syncLevelRenumberWithXsheet, "syncLevelRenumberWithXsheet",