summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2017-01-29 03:10:28 +0100
committerStanislaw Halik <sthalik@misaki.pl>2017-01-29 03:10:28 +0100
commit01210b7fba37356ee2c18420762eeeed52489d20 (patch)
tree9c2494842b9183d28b6b77ecf3b0d0760f05a922
parent0ea648f8254ff49942e7f83d9034155b50498ac9 (diff)
gui/mapping-window, spline-widget, logic/main-settings: limited mapping range
-rw-r--r--gui/mapping-window.cpp24
-rw-r--r--gui/mapping-window.ui147
-rw-r--r--logic/main-settings.hpp14
-rw-r--r--spline-widget/spline-widget.hpp3
-rw-r--r--spline-widget/spline.cpp55
-rw-r--r--spline-widget/spline.hpp2
6 files changed, 186 insertions, 59 deletions
diff --git a/gui/mapping-window.cpp b/gui/mapping-window.cpp
index d1188e66..d34fcc48 100644
--- a/gui/mapping-window.cpp
+++ b/gui/mapping-window.cpp
@@ -25,6 +25,10 @@ MapWidget::MapWidget(Mappings& m) : m(m)
tie_setting(s.a_yaw.altp, ui.rx_altp);
tie_setting(s.a_pitch.altp, ui.ry_altp);
tie_setting(s.a_roll.altp, ui.rz_altp);
+
+ tie_setting(s.a_yaw.clamp, ui.max_yaw_rotation);
+ tie_setting(s.a_pitch.clamp, ui.max_pitch_rotation);
+ tie_setting(s.a_roll.clamp, ui.max_roll_rotation);
}
void MapWidget::load()
@@ -51,19 +55,23 @@ void MapWidget::load()
{ nullptr, Yaw, nullptr, false }
};
+ for (QComboBox* x : { ui.max_yaw_rotation, ui.max_pitch_rotation, ui.max_roll_rotation })
+ {
+ using a = axis_opts::max_rotation;
+ for (a y : { a::r180, a::r90, a::r60, a::r45, a::r30, a::r20 })
+ x->addItem(QString::number(y) + "°", y);
+ }
+
for (int i = 0; qfcs[i].qfc; i++)
{
const bool altp = qfcs[i].altp;
Map& axis = m(qfcs[i].axis);
spline& conf = altp ? axis.spline_alt : axis.spline_main;
- //const QString& name = altp ? axis.name2 : axis.name1;
- //conf.set_bundle(make_bundle(name));
- qfcs[i].qfc->setConfig(&conf);
+ spline_widget& qfc = *qfcs[i].qfc;
if (altp)
{
- spline_widget& qfc = *qfcs[i].qfc;
connect(qfcs[i].checkbox, &QCheckBox::toggled,
this,
[&](bool f) -> void {qfc.setEnabled(f); qfc.force_redraw();});
@@ -71,10 +79,18 @@ void MapWidget::load()
qfc.force_redraw();
}
+ connect(&axis.opts.clamp, static_cast<void(base_value::*)(int) const>(&base_value::valueChanged),
+ &qfc, [&conf, &qfc](int value) { conf.set_max_input(value); qfc.reload_spline(); });
+ conf.set_max_input(axis.opts.clamp);
+
if (qfcs[i].axis >= 3)
+ {
qfcs[i].qfc->set_snap(1, 2.5);
+ }
else
qfcs[i].qfc->set_snap(.5, 1);
+
+ qfcs[i].qfc->setConfig(&conf);
}
}
diff --git a/gui/mapping-window.ui b/gui/mapping-window.ui
index c1a52021..dc43ab8a 100644
--- a/gui/mapping-window.ui
+++ b/gui/mapping-window.ui
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -22,12 +22,6 @@
<height>664</height>
</size>
</property>
- <property name="maximumSize">
- <size>
- <width>970</width>
- <height>664</height>
- </size>
- </property>
<property name="windowTitle">
<string>Mapping properties</string>
</property>
@@ -41,9 +35,6 @@
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
- <property name="styleSheet">
- <string notr="true"/>
- </property>
<property name="tabPosition">
<enum>QTabWidget::North</enum>
</property>
@@ -51,14 +42,49 @@
<number>0</number>
</property>
<widget class="QWidget" name="tabWidgetPage1">
- <property name="styleSheet">
- <string notr="true">background-color: #ccc;</string>
- </property>
<attribute name="title">
<string>Yaw</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
+ <widget class="QFrame" name="frame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Max rotation</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="max_yaw_rotation">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
<widget class="spline_widget" name="rxconfig" native="true">
<property name="colorBezier" stdset="0">
<color>
@@ -104,14 +130,49 @@
</layout>
</widget>
<widget class="QWidget" name="tabWidgetPage2">
- <property name="styleSheet">
- <string notr="true">background-color: #ccc;</string>
- </property>
<attribute name="title">
<string>Pitch</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
+ <widget class="QFrame" name="frame_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Max rotation</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="max_pitch_rotation">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
<widget class="spline_widget" name="ryconfig" native="true">
<property name="colorBezier" stdset="0">
<color>
@@ -157,14 +218,49 @@
</layout>
</widget>
<widget class="QWidget" name="tabWidgetPage3">
- <property name="styleSheet">
- <string notr="true">background-color: #ccc;</string>
- </property>
<attribute name="title">
<string>Roll</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
+ <widget class="QFrame" name="frame_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QLabel" name="label_4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Max rotation</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="max_roll_rotation">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
<widget class="spline_widget" name="rzconfig" native="true">
<property name="colorBezier" stdset="0">
<color>
@@ -208,11 +304,12 @@
</widget>
</item>
</layout>
+ <zorder>rzconfig</zorder>
+ <zorder>rz_altp</zorder>
+ <zorder>rzconfig_alt</zorder>
+ <zorder>frame_3</zorder>
</widget>
<widget class="QWidget" name="tabWidgetPage4">
- <property name="styleSheet">
- <string notr="true">background-color: #ccc;</string>
- </property>
<attribute name="title">
<string>X</string>
</attribute>
@@ -263,9 +360,6 @@
</layout>
</widget>
<widget class="QWidget" name="tabWidgetPage5">
- <property name="styleSheet">
- <string notr="true">background-color: #ccc;</string>
- </property>
<attribute name="title">
<string>Y</string>
</attribute>
@@ -316,9 +410,6 @@
</layout>
</widget>
<widget class="QWidget" name="tabWidgetPage6">
- <property name="styleSheet">
- <string notr="true">background-color: #ccc;</string>
- </property>
<attribute name="title">
<string>Z</string>
</attribute>
diff --git a/logic/main-settings.hpp b/logic/main-settings.hpp
index 749f6d25..66146913 100644
--- a/logic/main-settings.hpp
+++ b/logic/main-settings.hpp
@@ -18,18 +18,30 @@ using namespace options;
struct axis_opts final
{
+ enum max_rotation : int
+ {
+ r180 = 180,
+ r90 = 90,
+ r60 = 60,
+ r45 = 45,
+ r30 = 30,
+ r20 = 25,
+ };
+
// note, these two bundles can be the same value with no issues
bundle b_settings_window, b_mapping_window;
value<double> zero;
value<int> src;
value<bool> invert, altp;
+ value<max_rotation> clamp;
axis_opts(bundle b_settings_window, bundle b_mapping_window, QString pfx, int idx) :
b_settings_window(b_settings_window),
b_mapping_window(b_mapping_window),
zero(b_settings_window, n(pfx, "zero-pos"), 0),
src(b_settings_window, n(pfx, "source-index"), idx),
invert(b_settings_window, n(pfx, "invert-sign"), false),
- altp(b_mapping_window, n(pfx, "alt-axis-sign"), false)
+ altp(b_mapping_window, n(pfx, "alt-axis-sign"), false),
+ clamp(b_mapping_window, n(pfx, "max-value"), idx == Pitch ? r90 : r180)
{}
private:
static inline QString n(QString pfx, QString name)
diff --git a/spline-widget/spline-widget.hpp b/spline-widget/spline-widget.hpp
index 921f44a2..4d5a7680 100644
--- a/spline-widget/spline-widget.hpp
+++ b/spline-widget/spline-widget.hpp
@@ -57,12 +57,13 @@ public:
void set_snap(double x, double y) { snap_x = x; snap_y = y; }
void get_snap(double& x, double& y) const { x = snap_x; y = snap_y; }
+public slots:
+ void reload_spline();
protected slots:
void paintEvent(QPaintEvent *e) override;
void mousePressEvent(QMouseEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
- void reload_spline();
private:
int get_closeness_limit();
void show_tooltip(const QPoint& pos, const QPointF& value = QPointF(0, 0));
diff --git a/spline-widget/spline.cpp b/spline-widget/spline.cpp
index 59ed9939..8d8fe0e5 100644
--- a/spline-widget/spline.cpp
+++ b/spline-widget/spline.cpp
@@ -147,31 +147,41 @@ void spline::add_lone_point()
s->points = points;
}
-QPointF spline::ensure_in_bounds(const QList<QPointF>& points, int i)
+QPointF spline::ensure_in_bounds(const QList<QPointF>& points, double max_x, int i)
{
const int sz = points.size();
-start:
- if (i < 0 || sz == 0)
- return QPointF(0, 0);
+ if (!(max_x > 0))
+ {
+ if (i < 0 || sz == 0)
+ return QPointF(0, 0);
+
+ if (i < sz)
+ return points[i];
- if (i < sz)
+ return points[sz - 1];
+ }
+ else
{
- if (max_x > 0 && max_x < points[i])
+ do
{
- i--;
- goto start;
- }
- return points[i];
- }
+ QPointF ret;
- if (max_x > 0 && max_x < points[sz - 1])
- {
- i = sz - 2;
- goto start;
- }
+ if (i < 0 || sz == 0)
+ return QPointF(0, 0);
+
+ if (i < sz)
+ ret = points[i];
+ else
+ ret = points[sz - 1];
- return points[sz - 1];
+ if (!(ret.x() > max_x))
+ return ret;
+ else
+ i--;
+ }
+ while (1);
+ }
}
bool spline::sort_fn(const QPointF& one, const QPointF& two)
@@ -212,10 +222,10 @@ void spline::update_interp_data()
for (int i = 0; i < points.size(); i++)
{
- const QPointF p0 = ensure_in_bounds(points, i - 1);
- const QPointF p1 = ensure_in_bounds(points, i + 0);
- const QPointF p2 = ensure_in_bounds(points, i + 1);
- const QPointF p3 = ensure_in_bounds(points, i + 2);
+ const QPointF p0 = ensure_in_bounds(points, max_x, i - 1);
+ const QPointF p1 = ensure_in_bounds(points, max_x, i + 0);
+ const QPointF p2 = ensure_in_bounds(points, max_x, i + 1);
+ const QPointF p3 = ensure_in_bounds(points, max_x, i + 2);
const double p0_x = p0.x(), p1_x = p1.x(), p2_x = p2.x(), p3_x = p3.x();
const double p0_y = p0.y(), p1_y = p1.y(), p2_y = p2.y(), p3_y = p3.y();
@@ -395,9 +405,6 @@ void spline::recompute()
{
QPointF& pt(list[i]);
- pt.setX(clamp(pt.x(), 0, max_x));
- pt.setY(clamp(pt.y(), 0, max_y));
-
const bool overlap = progn(
for (int j = 0; j < i; j++)
{
diff --git a/spline-widget/spline.hpp b/spline-widget/spline.hpp
index 660757f2..ade7f69a 100644
--- a/spline-widget/spline.hpp
+++ b/spline-widget/spline.hpp
@@ -48,7 +48,7 @@ class OPENTRACK_SPLINE_EXPORT spline final
void add_lone_point();
static bool sort_fn(const QPointF& one, const QPointF& two);
- static QPointF ensure_in_bounds(const QList<QPointF>& points, int i);
+ static QPointF ensure_in_bounds(const QList<QPointF>& points, double max_x, int i);
mem<spline_detail::settings> s;
QMetaObject::Connection connection;