Pencil2D Animation
Download Community News Docs Contribute
  • Overview
  • Articles
  • Code
  •  
  • Class List
  • Class Index
  • Class Hierarchy
  • Class Members
  • File List
Loading...
Searching...
No Matches
  • app
  • src
spinslider.cpp
1/*
2
3Pencil2D - Traditional Animation Software
4Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5Copyright (C) 2012-2020 Matthew Chiawen Chang
6
7This program is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public License
9as published by the Free Software Foundation; version 2 of the License.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16*/
17
18#include "spinslider.h"
19
20#include <cmath>
21#include <QLabel>
22#include <QSlider>
23#include <QGridLayout>
24#include <QLocale>
25#include <QDebug>
26#include <QStyle>
27
28
29SpinSlider::SpinSlider(QWidget* parent) : QWidget(parent)
30{}
31
32void SpinSlider::init(QString text, GROWTH_TYPE type, qreal min, qreal max)
33{
34 if (type == LOG)
35 {
36 // important! dividing by zero is not acceptable.
37 Q_ASSERT_X(min > 0.0, "SpinSlider", "Real type value must larger than 0!!");
38 }
39
40 mValue = 1.0;
41 mGrowthType = type;
42 mMin = min;
43 mMax = max;
44
45 mLabel = new QLabel(text + ": ");
46
47 mSlider = new QSlider(Qt::Horizontal, this);
48 mSlider->setMinimum(0);
49 mSlider->setMaximum(100);
50 mSlider->setMaximumWidth(500);
51
52 QGridLayout* layout = new QGridLayout();
53 layout->setContentsMargins(2, 2, 2, 2);
54 layout->setSpacing(2);
55
56 layout->addWidget(mLabel, 0, 0, 1, 1);
57 layout->addWidget(mSlider, 1, 0, 1, 2);
58
59 setLayout(layout);
60 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
61
62 connect(mSlider, &QSlider::valueChanged, this, &SpinSlider::onSliderValueChanged);
63}
64
65void SpinSlider::setRange(qreal min, qreal max)
66{
67 mMin = min;
68 mMax = max;
69
70 mValue = qBound(mMin, mValue, mMax);
71
72 setValue(mValue);
73}
74
75void SpinSlider::changeValue(qreal value)
76{
77 mValue = value;
78 emit valueChanged(value);
79}
80
81void SpinSlider::onSliderValueChanged(int v)
82{
83 qreal value2 = 0.0;
84 if (mGrowthType == LINEAR)
85 {
86 value2 = mMin + v * (mMax - mMin) / mSlider->maximum();
87 }
88 else if (mGrowthType == LOG)
89 {
90 value2 = mMin * std::exp(v * std::log(mMax / mMin) / mSlider->maximum());
91 }
92 else if (mGrowthType == EXPONENT) {
93 value2 = mMin + std::pow(v, mExp) * (mMax - mMin) / std::pow(mSlider->maximum(), mExp);
94 }
95 changeValue(value2);
96}
97
98void SpinSlider::setLabel(QString newText)
99{
100 mLabel->setText(newText);
101}
102
103void SpinSlider::setValue(qreal v)
104{
105 Q_ASSERT(mMin <= v && v <= mMax);
106
107 int value2 = 0;
108 if (mGrowthType == LINEAR)
109 {
110 value2 =qRound((mSlider->maximum() * (v - mMin) / (mMax - mMin)));
111 }
112 else if (mGrowthType == LOG)
113 {
114 value2 = qRound(std::log(v / mMin) * mSlider->maximum() / std::log(mMax / mMin));
115 }
116 else if (mGrowthType == EXPONENT)
117 {
118 value2 = qRound(std::pow((v - mMin) * std::pow(mSlider->maximum(), mExp) / (mMax - mMin), 1 / mExp));
119 }
120
121 changeValue(v);
122 mSlider->setSliderPosition(value2);
123}
124
125void SpinSlider::setPixelPos(qreal min, qreal max, int val, int space, bool upsideDown)
126{
127 mSlider->setSliderPosition(QStyle::sliderValueFromPosition(static_cast<int>(min),
128 static_cast<int>(max), val, space, upsideDown));
129}
130
131void SpinSlider::setExponent(const qreal exp)
132{
133 mExp = exp;
134}
QAbstractSlider::setMaximum
void setMaximum(int)
QAbstractSlider::setMinimum
void setMinimum(int)
QAbstractSlider::setSliderPosition
void setSliderPosition(int)
QAbstractSlider::valueChanged
void valueChanged(int value)
QGridLayout
QLabel
QLabel::setText
void setText(const QString &)
QLayout::addWidget
void addWidget(QWidget *w)
QLayout::setContentsMargins
void setContentsMargins(int left, int top, int right, int bottom)
QLayout::setSpacing
void setSpacing(int)
QObject::connect
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QSizePolicy::Preferred
Preferred
QSlider
QString
QStyle::sliderValueFromPosition
int sliderValueFromPosition(int min, int max, int position, int span, bool upsideDown)
Qt::Horizontal
Horizontal
QWidget
QWidget::layout
QLayout * layout() const const
QWidget::setMaximumWidth
void setMaximumWidth(int maxw)
QWidget::setLayout
void setLayout(QLayout *layout)
QWidget::setSizePolicy
void setSizePolicy(QSizePolicy)
Generated on Wed Dec 24 2025 23:46:02 for Pencil2D by doxygen 1.9.6 based on revision 1be63043db1f7fc0545528fc3b6d5098a552755b