1 #include "layerfooterpanel.h"
2
3 #include <QPainter>
4 #include <QToolTip>
5 #include <QScrollBar>
6
7 #include "xsheetviewer.h"
8 #include "xshcolumnviewer.h"
9
10 #include "tapp.h"
11 #include "toonz/tscenehandle.h"
12 #include "toonz/txsheethandle.h"
13 #include "toonz/tobjecthandle.h"
14
15 #include "toonz/preferences.h"
16
17 #include "toonzqt/gutil.h"
18
19 using XsheetGUI::ColumnArea;
20
21 #if QT_VERSION >= 0x050500
LayerFooterPanel(XsheetViewer * viewer,QWidget * parent,Qt::WindowFlags flags)22 LayerFooterPanel::LayerFooterPanel(XsheetViewer *viewer, QWidget *parent,
23 Qt::WindowFlags flags)
24 #else
25 LayerFooterPanel::LayerFooterPanel(XsheetViewer *viewer, QWidget *parent,
26 Qt::WFlags flags)
27 #endif
28 : QWidget(parent, flags), m_viewer(viewer) {
29 const Orientation *o = Orientations::leftToRight();
30 QRect rect = o->rect(PredefinedRect::LAYER_FOOTER_PANEL);
31
32 setObjectName("layerFooterPanel");
33
34 setFixedSize(rect.size());
35
36 setMouseTracking(true);
37
38 m_frameZoomSlider = new QSlider(Qt::Horizontal, this);
39 m_frameZoomSlider->setMinimum(20);
40 m_frameZoomSlider->setMaximum(100);
41 m_frameZoomSlider->setValue(m_viewer->getFrameZoomFactor());
42 m_frameZoomSlider->setToolTip(tr("Zoom in/out of timeline"));
43
44 connect(m_frameZoomSlider, SIGNAL(valueChanged(int)), this,
45 SLOT(onFrameZoomSliderValueChanged(int)));
46 }
47
~LayerFooterPanel()48 LayerFooterPanel::~LayerFooterPanel() {}
49
50 namespace {
51
mix(const QColor & a,const QColor & b,double w)52 QColor mix(const QColor &a, const QColor &b, double w) {
53 return QColor(a.red() * w + b.red() * (1 - w),
54 a.green() * w + b.green() * (1 - w),
55 a.blue() * w + b.blue() * (1 - w));
56 }
57
withAlpha(const QColor & color,double alpha)58 QColor withAlpha(const QColor &color, double alpha) {
59 QColor result(color);
60 result.setAlpha(alpha * 255);
61 return result;
62 }
63
shorter(const QRect original)64 QRect shorter(const QRect original) { return original.adjusted(0, 2, 0, -2); }
65
leftSide(const QRect & r)66 QLine leftSide(const QRect &r) { return QLine(r.topLeft(), r.bottomLeft()); }
67
rightSide(const QRect & r)68 QLine rightSide(const QRect &r) { return QLine(r.topRight(), r.bottomRight()); }
69 }
70
paintEvent(QPaintEvent * event)71 void LayerFooterPanel::paintEvent(QPaintEvent *event) {
72 QPainter p(this);
73 p.setRenderHint(QPainter::SmoothPixmapTransform, true);
74
75 const Orientation *o = Orientations::leftToRight();
76
77 QRect zoomSliderRect = o->rect(PredefinedRect::ZOOM_SLIDER_AREA);
78 p.fillRect(zoomSliderRect, Qt::NoBrush);
79
80 QRect sliderObjRect = o->rect(PredefinedRect::ZOOM_SLIDER);
81 m_frameZoomSlider->setGeometry(sliderObjRect);
82
83 static QPixmap zoomIn =
84 recolorPixmap(svgToPixmap(getIconThemePath("actions/15/zoom_in.svg")));
85 static QPixmap zoomInRollover = recolorPixmap(
86 svgToPixmap(getIconThemePath("actions/15/zoom_in_rollover.svg")));
87 const QRect zoomInImgRect = o->rect(PredefinedRect::ZOOM_IN);
88
89 static QPixmap zoomOut =
90 recolorPixmap(svgToPixmap(getIconThemePath("actions/15/zoom_out.svg")));
91 static QPixmap zoomOutRollover = recolorPixmap(
92 svgToPixmap(getIconThemePath("actions/15/zoom_out_rollover.svg")));
93 const QRect zoomOutImgRect = o->rect(PredefinedRect::ZOOM_OUT);
94
95 p.setRenderHint(QPainter::SmoothPixmapTransform, true);
96 if (m_zoomInHighlighted)
97 p.drawPixmap(zoomInImgRect, zoomInRollover);
98 else
99 p.drawPixmap(zoomInImgRect, zoomIn);
100
101 if (m_zoomOutHighlighted)
102 p.drawPixmap(zoomOutImgRect, zoomOutRollover);
103 else
104 p.drawPixmap(zoomOutImgRect, zoomOut);
105
106 p.setPen(m_viewer->getVerticalLineColor());
107
108 QLine line = {leftSide(shorter(zoomOutImgRect)).translated(-2, 0)};
109 p.drawLine(line);
110 }
111
showOrHide(const Orientation * o)112 void LayerFooterPanel::showOrHide(const Orientation *o) {
113 QRect rect = o->rect(PredefinedRect::LAYER_FOOTER_PANEL);
114 if (rect.isEmpty())
115 hide();
116 else
117 show();
118 }
119
120 //-----------------------------------------------------------------------------
enterEvent(QEvent *)121 void LayerFooterPanel::enterEvent(QEvent *) {
122 m_zoomInHighlighted = false;
123 m_zoomOutHighlighted = false;
124
125 update();
126 }
127
leaveEvent(QEvent *)128 void LayerFooterPanel::leaveEvent(QEvent *) {
129 m_zoomInHighlighted = false;
130 m_zoomOutHighlighted = false;
131
132 update();
133 }
134
mousePressEvent(QMouseEvent * event)135 void LayerFooterPanel::mousePressEvent(QMouseEvent *event) {
136 const Orientation *o = Orientations::leftToRight();
137
138 if (event->button() == Qt::LeftButton) {
139 // get mouse position
140 QPoint pos = event->pos();
141 if (o->rect(PredefinedRect::ZOOM_IN_AREA).contains(pos)) {
142 int newFactor = isCtrlPressed ? m_frameZoomSlider->maximum()
143 : m_frameZoomSlider->value() + 10;
144 m_frameZoomSlider->setValue(newFactor);
145 } else if (o->rect(PredefinedRect::ZOOM_OUT_AREA).contains(pos)) {
146 int newFactor = isCtrlPressed ? m_frameZoomSlider->minimum()
147 : m_frameZoomSlider->value() - 10;
148 m_frameZoomSlider->setValue(newFactor);
149 }
150 }
151
152 update();
153 }
154
mouseMoveEvent(QMouseEvent * event)155 void LayerFooterPanel::mouseMoveEvent(QMouseEvent *event) {
156 const Orientation *o = Orientations::leftToRight();
157
158 QPoint pos = event->pos();
159
160 m_zoomInHighlighted = false;
161 m_zoomOutHighlighted = false;
162 if (o->rect(PredefinedRect::ZOOM_IN_AREA).contains(pos)) {
163 m_zoomInHighlighted = true;
164 m_tooltip = tr("Zoom in (Ctrl-click to zoom in all the way)");
165 } else if (o->rect(PredefinedRect::ZOOM_OUT_AREA).contains(pos)) {
166 m_zoomOutHighlighted = true;
167 m_tooltip = tr("Zoom out (Ctrl-click to zoom out all the way)");
168 } else {
169 m_tooltip = tr("");
170 }
171
172 m_pos = pos;
173
174 update();
175 }
176
177 //-----------------------------------------------------------------------------
178
event(QEvent * event)179 bool LayerFooterPanel::event(QEvent *event) {
180 if (event->type() == QEvent::ToolTip) {
181 if (!m_tooltip.isEmpty())
182 QToolTip::showText(mapToGlobal(m_pos), m_tooltip);
183 else
184 QToolTip::hideText();
185 }
186 return QWidget::event(event);
187 }
188
189 //-----------------------------------------------------------------------------
190
setZoomSliderValue(int val)191 void LayerFooterPanel::setZoomSliderValue(int val) {
192 if (val > m_frameZoomSlider->maximum())
193 val = m_frameZoomSlider->maximum();
194 else if (val < m_frameZoomSlider->minimum())
195 val = m_frameZoomSlider->minimum();
196
197 m_frameZoomSlider->blockSignals(true);
198 m_frameZoomSlider->setValue(val);
199 m_frameZoomSlider->blockSignals(false);
200 }
201
202 //-----------------------------------------------------------------------------
203
onFrameZoomSliderValueChanged(int val)204 void LayerFooterPanel::onFrameZoomSliderValueChanged(int val) {
205 m_viewer->zoomOnFrame(m_viewer->getCurrentRow(), val);
206 }
207
208 //-----------------------------------------------------------------------------
209
onControlPressed(bool pressed)210 void LayerFooterPanel::onControlPressed(bool pressed) {
211 isCtrlPressed = pressed;
212 update();
213 }
214
215 //-----------------------------------------------------------------------------
216
isControlPressed()217 const bool LayerFooterPanel::isControlPressed() { return isCtrlPressed; }
218