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