summaryrefslogtreecommitdiffhomepage
path: root/qfunctionconfigurator
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2015-10-30 07:37:41 +0100
committerStanislaw Halik <sthalik@misaki.pl>2015-10-30 08:39:32 +0100
commitaa066bdd4622d4f6824fee864f6be6806813f04d (patch)
tree3df328b8b364cba2373a85827191b259bd78d546 /qfunctionconfigurator
parentd6a54431d178632a2bf466c9904f74abd143afe6 (diff)
move to subdirectory-based build system
Closes #224
Diffstat (limited to 'qfunctionconfigurator')
-rw-r--r--qfunctionconfigurator/broken/qfunctionconfiguratorplugin.cpp111
-rw-r--r--qfunctionconfigurator/broken/qfunctionconfiguratorplugin.h36
-rw-r--r--qfunctionconfigurator/functionconfig.cpp249
-rw-r--r--qfunctionconfigurator/functionconfig.h75
-rw-r--r--qfunctionconfigurator/qfunctionconfigurator.cpp440
-rw-r--r--qfunctionconfigurator/qfunctionconfigurator.h75
6 files changed, 0 insertions, 986 deletions
diff --git a/qfunctionconfigurator/broken/qfunctionconfiguratorplugin.cpp b/qfunctionconfigurator/broken/qfunctionconfiguratorplugin.cpp
deleted file mode 100644
index 1a9da10a..00000000
--- a/qfunctionconfigurator/broken/qfunctionconfiguratorplugin.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/* Copyright (c) 2011-2012 Stanislaw Halik <sthalik@misaki.pl>
- * Adapted to FaceTrackNoIR by Wim Vriend.
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- */
-#include "qfunctionconfigurator.h"
-
-#include <QtCore/QtPlugin>
-#include "qfunctionconfiguratorplugin.h"
-
-
-QFunctionConfiguratorPlugin::QFunctionConfiguratorPlugin(QObject *parent)
- : QObject(parent)
-{
- initialized = false;
-}
-
-void QFunctionConfiguratorPlugin::initialize(QDesignerFormEditorInterface *)
-{
- if (initialized)
- return;
-
- initialized = true;
-}
-
-bool QFunctionConfiguratorPlugin::isInitialized() const
-{
- return initialized;
-}
-
-QWidget *QFunctionConfiguratorPlugin::createWidget(QWidget *parent)
-{
- return new QFunctionConfigurator(parent);
-}
-
-QString QFunctionConfiguratorPlugin::name() const
-{
- return "QFunctionConfigurator";
-}
-
-QString QFunctionConfiguratorPlugin::group() const
-{
- return "My Plugins";
-}
-
-QIcon QFunctionConfiguratorPlugin::icon() const
-{
- return QIcon();
-}
-
-QString QFunctionConfiguratorPlugin::toolTip() const
-{
- return QString();
-}
-
-QString QFunctionConfiguratorPlugin::whatsThis() const
-{
- return QString();
-}
-
-bool QFunctionConfiguratorPlugin::isContainer() const
-{
- return false;
-}
-
-QString QFunctionConfiguratorPlugin::domXml() const
-{
- return "<widget class=\"QFunctionConfigurator\" name=\"qFunctionA\">\n"
- " <property name=\"geometry\">\n"
- " <rect>\n"
- " <x>0</x>\n"
- " <y>0</y>\n"
- " <width>161</width>\n"
- " <height>220</height>\n"
- " </rect>\n"
- " </property>\n"
- " <property name=\"colorBezier\">\n"
- " <color>\n"
- " <red>255</red>\n"
- " <green>170</green>\n"
- " <blue>0</blue>\n"
- " </color>\n"
- " </property>\n"
- " <property name=\"stringInputEGU\" stdset=\"0\">\n"
- " <string>Input Yaw (degr.)</string>\n"
- " </property>\n"
- " <property name=\"stringOutputEGU\" stdset=\"0\">\n"
- " <string>Output Yaw (degr.)</string>\n"
- " </property>\n"
- " <property name=\"maxInputEGU\" stdset=\"0\">\n"
- " <number>50</number>\n"
- " </property>\n"
- " <property name=\"maxOutputEGU\" stdset=\"0\">\n"
- " <number>180</number>\n"
- " </property>\n"
- " <property name=\"pixPerEGU_Input\" stdset=\"0\">\n"
- " <number>2</number>\n"
- " </property>\n"
- " <property name=\"pixPerEGU_Output\" stdset=\"0\">\n"
- " <number>1</number>\n"
- " </property>\n"
- "</widget>\n";
-}
-
-QString QFunctionConfiguratorPlugin::includeFile() const
-{
- return "qfunctionconfigurator.h";
-}
-
-Q_EXPORT_PLUGIN2(qfunctionconfigurator, QFunctionConfiguratorPlugin)
diff --git a/qfunctionconfigurator/broken/qfunctionconfiguratorplugin.h b/qfunctionconfigurator/broken/qfunctionconfiguratorplugin.h
deleted file mode 100644
index ca68e0e2..00000000
--- a/qfunctionconfigurator/broken/qfunctionconfiguratorplugin.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Copyright (c) 2011-2012 Stanislaw Halik <sthalik@misaki.pl>
- * Adapted to FaceTrackNoIR by Wim Vriend.
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- */
-#ifndef QFUNCTIONCONFIGURATORPLUGIN_H
-#define QFUNCTIONCONFIGURATORPLUGIN_H
-
-#include <QDesignerCustomWidgetInterface>
-
-class QFunctionConfiguratorPlugin : public QObject, public QDesignerCustomWidgetInterface
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface" FILE "analogclock.json")
- Q_INTERFACES(QDesignerCustomWidgetInterface)
-
-public:
- QFunctionConfiguratorPlugin(QObject *parent = 0);
-
- bool isContainer() const;
- bool isInitialized() const;
- QIcon icon() const;
- QString domXml() const;
- QString group() const;
- QString includeFile() const;
- QString name() const;
- QString toolTip() const;
- QString whatsThis() const;
- QWidget *createWidget(QWidget *parent);
- void initialize(QDesignerFormEditorInterface *core);
-private:
- bool initialized;
-};
-
-#endif // QFUNCTIONCONFIGURATORPLUGIN_H
diff --git a/qfunctionconfigurator/functionconfig.cpp b/qfunctionconfigurator/functionconfig.cpp
deleted file mode 100644
index 27f3bf40..00000000
--- a/qfunctionconfigurator/functionconfig.cpp
+++ /dev/null
@@ -1,249 +0,0 @@
-/* Copyright (c) 2012-2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#include <QMutexLocker>
-#include <QCoreApplication>
-#include <QPointF>
-#include <QList>
-#include "functionconfig.h"
-#include <QtAlgorithms>
-#include <QtAlgorithms>
-#include <QSettings>
-#include <QPixmap>
-#include <algorithm>
-#include <cmath>
-
-void Map::setTrackingActive(bool blnActive)
-{
- activep = blnActive;
-}
-
-Map::Map() :
- _mutex(QMutex::Recursive),
- activep(false),
- max_x(0),
- max_y(0)
-{
-}
-
-float Map::getValue(float x) {
- QMutexLocker foo(&_mutex);
- float q = x * precision();
- int xi = (int)q;
- float yi = getValueInternal(xi);
- float yiplus1 = getValueInternal(xi+1);
- float f = (q-xi);
- float ret = yiplus1 * f + yi * (1.0f - f); // at least do a linear interpolation.
- last_input_value.setX(std::fabs(x));
- last_input_value.setY(std::fabs(ret));
- return ret;
-}
-
-bool Map::getLastPoint(QPointF& point ) {
- QMutexLocker foo(&_mutex);
- point = last_input_value;
- return activep;
-}
-
-float Map::getValueInternal(int x) {
- float sign = x < 0 ? -1 : 1;
- x = abs(x);
- float ret;
- int sz = cur.data.size();
- if (sz == 0)
- ret = 0;
- else
- ret = cur.data[std::min<unsigned>(x, sz-1)];
- return ret * sign;
-}
-
-static QPointF ensureInBounds(QList<QPointF> points, int i) {
- int siz = points.size();
- if (siz == 0 || i < 0)
- return QPointF(0, 0);
- if (siz > i)
- return points[i];
- return points[siz - 1];
-}
-
-static bool sortFn(const QPointF& one, const QPointF& two) {
- return one.x() < two.x();
-}
-
-void Map::reload() {
- if (cur.input.size())
- {
- qStableSort(cur.input.begin(), cur.input.end(), sortFn);
-
- QList<QPointF> input = cur.input;
- auto& data = cur.data;
-
- data = std::vector<float>(value_count);
- const int mult = precision();
- const int mult_ = mult * 30;
-
- const int sz = data.size();
-
- for (int i = 0; i < sz; i++)
- data[i] = -1;
-
- if (input.size() == 1 && input[0].x() > 1e-2)
- {
- for (int k = 0; k < input[0].x() * mult; k++) {
- if (k < sz)
- data[k] = input[0].y() * k / (input[0].x() * mult);
- }
- }
- else if (input[0].x() > 1e-2)
- input.prepend(QPointF(0, 0));
-
- for (int i = 0; i < sz; i++) {
- const QPointF p0 = ensureInBounds(input, i - 1);
- const QPointF p1 = ensureInBounds(input, i);
- const QPointF p2 = ensureInBounds(input, i + 1);
- const QPointF p3 = ensureInBounds(input, i + 2);
-
- const float p0_x = p0.x(), p1_x = p1.x(), p2_x = p2.x(), p3_x = p3.x();
- const float p0_y = p0.y(), p1_y = p1.y(), p2_y = p2.y(), p3_y = p3.y();
-
- // multiplier helps fill in all the x's needed
- const int end = std::min<int>(sz, p2.x() * mult_);
- const int start = p1.x() * mult;
-
- for (int j = start; j < end; j++) {
- const float t = (j - start) / (float) (end - start);
- const float t2 = t*t;
- const float t3 = t*t*t;
-
- const int x = .5 * ((2. * p1_x) +
- (-p0_x + p2_x) * t +
- (2. * p0_x - 5. * p1_x + 4. * p2_x - p3_x) * t2 +
- (-p0_x + 3. * p1_x - 3. * p2_x + p3_x) * t3)
- * mult;
-
- const float y = .5 * ((2. * p1_y) +
- (-p0_y + p2_y) * t +
- (2. * p0_y - 5. * p1_y + 4. * p2_y - p3_y) * t2 +
- (-p0_y + 3. * p1_y - 3. * p2_y + p3_y) * t3);
-
- if (x >= 0 && x < sz)
- data[x] = y;
- }
- }
-
- float last = 0;
- for (int i = 0; i < sz; i++)
- {
- if (data[i] < 0)
- data[i] = last;
- last = data[i];
- }
- }
- else
- cur.data.clear();
-}
-
-void Map::removePoint(int i) {
- QMutexLocker foo(&_mutex);
- if (i >= 0 && i < cur.input.size())
- {
- cur.input.removeAt(i);
- reload();
- }
-}
-
-void Map::addPoint(QPointF pt) {
- QMutexLocker foo(&_mutex);
- cur.input.append(pt);
- reload();
- qStableSort(cur.input.begin(), cur.input.end(), sortFn);
-}
-
-void Map::movePoint(int idx, QPointF pt) {
- QMutexLocker foo(&_mutex);
- if (idx >= 0 && idx < cur.input.size())
- {
- cur.input[idx] = pt;
- reload();
- // we don't allow points to be reordered, so no sort here
- }
-}
-
-const QList<QPointF> Map::getPoints() {
- QMutexLocker foo(&_mutex);
- return cur.input;
-}
-
-void Map::invalidate_unsaved_settings()
-{
- QMutexLocker foo(&_mutex);
- cur = saved;
- reload();
-}
-
-void Map::loadSettings(QSettings& settings, const QString& title) {
- QMutexLocker foo(&_mutex);
- QPointF newPoint;
- QList<QPointF> points;
- settings.beginGroup(QString("Curves-%1").arg(title));
-
- int max = settings.value("point-count", 0).toInt();
-
- for (int i = 0; i < max; i++) {
- newPoint = QPointF(settings.value(QString("point-%1-x").arg(i), 0).toDouble(),
- settings.value(QString("point-%1-y").arg(i), 0).toDouble());
- if (newPoint.x() > max_x) {
- newPoint.setX(max_x);
- }
- if (newPoint.y() > max_y) {
- newPoint.setY(max_y);
- }
- points.append(newPoint);
- }
-
- settings.endGroup();
-
- if (max == 0)
- points.append(QPointF(maxInput(), maxOutput()));
-
- cur.input = points;
- reload();
- saved = cur;
-}
-
-void Map::saveSettings(QSettings& settings, const QString& title) {
- QMutexLocker foo(&_mutex);
- settings.beginGroup(QString("Curves-%1").arg(title));
- int max = cur.input.size();
- settings.setValue("point-count", max);
-
- for (int i = 0; i < max; i++) {
- settings.setValue(QString("point-%1-x").arg(i), cur.input[i].x());
- settings.setValue(QString("point-%1-y").arg(i), cur.input[i].y());
- }
-
- for (int i = max; true; i++)
- {
- QString x = QString("point-%1-x").arg(i);
- if (!settings.contains(x))
- break;
- settings.remove(x);
- settings.remove(QString("point-%1-y").arg(i));
- }
-
- saved = cur;
-
- settings.endGroup();
-}
-
-
-int Map::precision() const {
- if (cur.input.size())
- return value_count / std::max<float>(1.f, (cur.input[cur.input.size() - 1].x()));
- return 1;
-}
diff --git a/qfunctionconfigurator/functionconfig.h b/qfunctionconfigurator/functionconfig.h
deleted file mode 100644
index 6d76d0de..00000000
--- a/qfunctionconfigurator/functionconfig.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Copyright (c) 2012-2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#pragma once
-
-#include <QList>
-#include <QPointF>
-#include <QString>
-#include <QSettings>
-#include <QMutex>
-#include <vector>
-#include <limits>
-#include "opentrack-compat/qcopyable-mutex.hpp"
-
-class Map {
-private:
- static constexpr int value_count = 10000;
-
- struct State {
- QList<QPointF> input;
- std::vector<float> data;
- };
-
- int precision() const;
- void reload();
- float getValueInternal(int x);
-
- MyMutex _mutex;
- QPointF last_input_value;
- volatile bool activep;
- double max_x;
- double max_y;
-
- State cur, saved;
-public:
- double maxInput() const { return max_x; }
- double maxOutput() const { return max_y; }
- Map();
- Map(double maxx, double maxy)
- {
- setMaxInput(maxx);
- setMaxOutput(maxy);
- reload();
- }
-
- float getValue(float x);
- bool getLastPoint(QPointF& point);
- void removePoint(int i);
- void removeAllPoints() {
- QMutexLocker foo(&_mutex);
- cur.input.clear();
- reload();
- }
-
- void addPoint(QPointF pt);
- void movePoint(int idx, QPointF pt);
- const QList<QPointF> getPoints();
- void setMaxInput(double MaxInput) {
- max_x = MaxInput;
- }
- void setMaxOutput(double MaxOutput) {
- max_y = MaxOutput;
- }
-
- void saveSettings(QSettings& settings, const QString& title);
- void loadSettings(QSettings& settings, const QString& title);
- void invalidate_unsaved_settings();
-
- void setTrackingActive(bool blnActive);
-};
diff --git a/qfunctionconfigurator/qfunctionconfigurator.cpp b/qfunctionconfigurator/qfunctionconfigurator.cpp
deleted file mode 100644
index bcb895ec..00000000
--- a/qfunctionconfigurator/qfunctionconfigurator.cpp
+++ /dev/null
@@ -1,440 +0,0 @@
-/* Copyright (c) 2012-2015 Stanislaw Halik <sthalik@misaki.pl>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- */
-
-#include "opentrack/options.hpp"
-using namespace options;
-#include "qfunctionconfigurator/qfunctionconfigurator.h"
-#include <QPainter>
-#include <QPaintEvent>
-#include <QPen>
-#include <QPixmap>
-#include <cmath>
-#include <algorithm>
-
-static const int pointSize = 5;
-
-QFunctionConfigurator::QFunctionConfigurator(QWidget *parent) :
- QWidget(parent),
- _config(nullptr),
- moving_control_point_idx(-1),
- _draw_function(true)
-{
- update_range();
- setMouseTracking(true);
-}
-
-void QFunctionConfigurator::setConfig(Map* config, const QString& name) {
- mem<QSettings> iniFile = group::ini_file();
- if (name != "")
- config->loadSettings(*iniFile, name);
- _config = config;
- _draw_function = true;
- update_range();
- update();
-}
-
-void QFunctionConfigurator::drawBackground()
-{
- if (!_config)
- return;
- _background = QPixmap(width(), height());
-
- QPainter painter(&_background);
- painter.fillRect(rect(), QColor::fromRgb(204, 204, 204));
-
- QColor bg_color(112, 154, 209);
- if (!isEnabled())
- bg_color = QColor(176,176,180);
- painter.fillRect(pixel_bounds, bg_color);
-
- QFont font;
- font.setPointSize(8);
- painter.setFont(font);
- QFontMetrics metrics(font);
-
- QColor color__(176, 190, 209, 127);
-
- if (!isEnabled())
- color__ = QColor(70, 90, 100, 96);
-
- QPen pen(color__, 1, Qt::SolidLine);
-
- const int xstep = 10, ystep = 10;
- const double maxx = _config->maxInput();
- const double maxy = _config->maxOutput();
-
- // horizontal grid
- for (int i = 0; i < maxy; i += xstep)
- {
- double y = pixel_bounds.height() - i * c.y() + pixel_bounds.y();
- drawLine(&painter,
- QPointF(pixel_bounds.x(), y),
- QPointF(pixel_bounds.x() + pixel_bounds.width(), y),
- pen);
- painter.drawText(QRectF(10,
- y - metrics.height()/2,
- pixel_bounds.left(),
- metrics.height()),
- QString::number(i));
- }
-
- {
- const double i = maxy;
- double y = pixel_bounds.height() - i * c.y() + pixel_bounds.y();
- drawLine(&painter,
- QPointF(pixel_bounds.x(), y),
- QPointF(pixel_bounds.x() + pixel_bounds.width(), y),
- pen);
- painter.drawText(QRectF(10,
- y - metrics.height()/2,
- pixel_bounds.x() - 10,
- metrics.height()),
- QString::number(i));
- }
-
- // vertical grid
- for (int i = 0; i < maxx; i += ystep)
- {
- double x = pixel_bounds.x() + i * c.x();
- drawLine(&painter,
- QPointF(x, pixel_bounds.y()),
- QPointF(x, pixel_bounds.y() + pixel_bounds.height()),
- pen);
- const QString text = QString::number(i);
- painter.drawText(QRectF(x - metrics.width(text)/2,
- pixel_bounds.height() + 10 + metrics.height(),
- metrics.width(text),
- metrics.height()),
- text);
- }
- {
- const double i = maxx;
- double x = pixel_bounds.x() + i * c.x();
- drawLine(&painter,
- QPointF(x, pixel_bounds.y()),
- QPointF(x, pixel_bounds.y() + pixel_bounds.height()),
- pen);
- const QString text = QString::number(i);
- painter.drawText(QRectF(x - metrics.width(text)/2,
- pixel_bounds.height() + 10 + metrics.height(),
- metrics.width(text),
- metrics.height()),
- text);
- }
-}
-
-void QFunctionConfigurator::drawFunction()
-{
- if (!_config)
- return;
-
- _function = QPixmap(_background);
- QPainter painter(&_function);
- painter.setRenderHint(QPainter::Antialiasing, true);
-
- QList<QPointF> points = _config->getPoints();
-
- const int alpha = !isEnabled() ? 64 : 120;
- for (int i = 0; i < points.size(); i++) {
- drawPoint(&painter,
- point_to_pixel(points[i]),
- QColor(200, 200, 210, alpha),
- isEnabled() ? QColor(50, 100, 120, 200) : QColor(200, 200, 200, 96));
- }
-
- QColor color = spline_color;
-
- if (!isEnabled())
- {
- const int avg = 176;
- auto color_ = color;
- color = QColor(color_.red() * .5 + avg * .5,
- color_.green() * .5 + avg * .5,
- color_.blue() * .5 + avg * .5,
- 96);
- }
-
- QPen pen(color, 1.2, Qt::SolidLine);
-
- const double max = _config->maxInput();
- const double step = std::max(1e-2, max / 1000.);
-
- QPointF prev = point_to_pixel(QPointF(0, 0));
- for (double i = 0; i < max; i += step) {
- double val = _config->getValue(i);
- QPointF cur = point_to_pixel(QPointF(i, val));
- drawLine(&painter, prev, cur, pen);
- prev = cur;
- }
-}
-
-void QFunctionConfigurator::paintEvent(QPaintEvent *e)
-{
- QPainter p(this);
-
- if (_background.isNull())
- {
- _draw_function = true;
- drawBackground();
- }
-
- if (_draw_function) {
- _draw_function = false;
- drawFunction();
- }
-
- p.drawPixmap(e->rect(), _function);
-
- if (_config) {
- QPen pen(Qt::white, 1, Qt::SolidLine);
- QList<QPointF> points = _config->getPoints();
- if (points.size() && moving_control_point_idx >= 0 && moving_control_point_idx < points.size()) {
- if (points[0].x() > 1e-2)
- points.prepend(QPointF(0, 0));
- QPointF prev = point_to_pixel(points[0]);
- for (int i = 1; i < points.size(); i++) {
- auto tmp = point_to_pixel(points[i]);
- drawLine(&p, prev, tmp, pen);
- prev = tmp;
- }
- }
-
- // If the Tracker is active, the 'Last Point' it requested is recorded.
- // Show that point on the graph, with some lines to assist.
- // This new feature is very handy for tweaking the curves!
- QPointF last;
- if (_config->getLastPoint(last) && isEnabled()) {
- QPointF pixel_pos = point_to_pixel(last);
- drawPoint(&p, pixel_pos, QColor(255, 0, 0, 120));
- }
- }
-}
-
-void QFunctionConfigurator::drawPoint(QPainter *painter, const QPointF &pos, QColor colBG, QColor border)
-{
- painter->save();
- painter->setPen(border);
- painter->setBrush( colBG );
- painter->drawEllipse(QRectF(pos.x() - pointSize,
- pos.y() - pointSize,
- pointSize*2, pointSize*2));
- painter->restore();
-}
-
-void QFunctionConfigurator::drawLine(QPainter *painter, const QPointF &start, const QPointF &end, QPen &pen)
-{
- painter->save();
- painter->setPen(pen);
- painter->setBrush(Qt::NoBrush);
- painter->drawLine(start, end);
- painter->restore();
-}
-
-void QFunctionConfigurator::mousePressEvent(QMouseEvent *e)
-{
- if (!_config || !isEnabled())
- return;
- QList<QPointF> points = _config->getPoints();
- if (e->button() == Qt::LeftButton) {
- bool bTouchingPoint = false;
- moving_control_point_idx = -1;
- if (_config) {
- for (int i = 0; i < points.size(); i++) {
- if (point_within_pixel(points[i], e->pos())) {
- bTouchingPoint = true;
- moving_control_point_idx = i;
- break;
- }
- }
- if (!bTouchingPoint) {
- bool too_close = false;
- const auto pos = e->pos();
-
- for (int i = 0; i < points.size(); i++)
- {
- const QPointF pt = point_to_pixel(points[i]);
- const auto x = pt.x() - pos.x();
- if (point_closeness_limit * point_closeness_limit >= x * x)
- {
- too_close = true;
- break;
- }
- }
-
- if (!too_close)
- _config->addPoint(pixel_coord_to_point(e->pos()));
- }
- }
- }
-
- if (e->button() == Qt::RightButton) {
- if (_config) {
- int found_pt = -1;
- for (int i = 0; i < points.size(); i++) {
- if (point_within_pixel(points[i], e->pos())) {
- found_pt = i;
- break;
- }
- }
-
- if (found_pt != -1) {
- _config->removePoint(found_pt);
- }
- moving_control_point_idx = -1;
- }
- }
- _draw_function = true;
- update();
-}
-
-void QFunctionConfigurator::mouseMoveEvent(QMouseEvent *e)
-{
- if (!_config || !isEnabled())
- return;
-
- QList<QPointF> points = _config->getPoints();
-
- if (moving_control_point_idx != -1 && moving_control_point_idx < points.size()) {
- setCursor(Qt::ClosedHandCursor);
-
- bool overlap = false;
-
- QPoint pix = e->pos();
- QPointF new_pt = pixel_coord_to_point(pix);
-
- for (int i = 0; i < 2; i++)
- {
- bool bad = false;
- if (moving_control_point_idx + 1 < points.size())
- {
- auto other = points[moving_control_point_idx+1];
- auto other_pix = point_to_pixel(other);
- bad = pix.x() + point_closeness_limit > other_pix.x();
- if (i == 0 && bad)
- {
- pix.setX(other_pix.x() - point_closeness_limit - 1);
- new_pt = pixel_coord_to_point(pix);
- }
- else
- overlap |= bad;
- }
- if (moving_control_point_idx != 0)
- {
- auto other = points[moving_control_point_idx-1];
- auto other_pix = point_to_pixel(other);
- bad = pix.x() - point_closeness_limit < other_pix.x();
- if (i == 0 && bad)
- {
- pix.setX(other_pix.x() + point_closeness_limit + 1);
- new_pt = pixel_coord_to_point(pix);
- }
- else
- overlap |= bad;
- }
- if (!bad)
- break;
- }
-
- if (!overlap)
- {
- points[moving_control_point_idx] = new_pt;
- _config->movePoint(moving_control_point_idx, new_pt);
- _draw_function = true;
- update();
- }
- }
- else {
- bool is_on_point = false;
- for (int i = 0; i < points.size(); i++) {
- const QPoint pos = e->pos();
- if (point_within_pixel(points[i], pos)) {
- is_on_point = true;
- break;
- }
- }
-
- if (is_on_point) {
- setCursor(Qt::OpenHandCursor);
- }
- else {
- setCursor(Qt::ArrowCursor);
- }
- }
-}
-
-void QFunctionConfigurator::mouseReleaseEvent(QMouseEvent *e)
-{
- if (!_config || !isEnabled())
- return;
-
- if (e->button() == Qt::LeftButton) {
- mouseMoveEvent(e);
- setCursor(Qt::ArrowCursor);
- moving_control_point_idx = -1;
-
- _draw_function = true;
- update();
- }
-}
-
-void QFunctionConfigurator::update_range()
-{
- if (!_config)
- return;
-
- const double w = width(), h = height();
- const double mwl = 40, mhl = 20;
- const double mwr = 15, mhr = 35;
-
- pixel_bounds = QRectF(mwl, mhl, (w - mwl - mwr), (h - mhl - mhr));
- c = QPointF(pixel_bounds.width() / _config->maxInput(), pixel_bounds.height() / _config->maxOutput());
- _draw_function = true;
-
- _background = QPixmap();
- _function = QPixmap();
-
- update();
-}
-
-bool QFunctionConfigurator::point_within_pixel(const QPointF &pt, const QPointF &pixel)
-{
- QPointF pixel2 = point_to_pixel(pt);
- return pixel2.x() >= pixel.x() - pointSize && pixel2.x() < pixel.x() + pointSize &&
- pixel2.y() >= pixel.y() - pointSize && pixel2.y() < pixel.y() + pointSize;
-}
-
-QPointF QFunctionConfigurator::pixel_coord_to_point(const QPointF& point)
-{
- if (!_config)
- return QPointF(-1, -1);
-
- double x = (point.x() - pixel_bounds.x()) / c.x();
- double y = (pixel_bounds.height() - point.y() + pixel_bounds.y()) / c.y();
-
- if (x < 0)
- x = 0;
- if (x > _config->maxInput())
- x = _config->maxInput();
-
- if (y < 0)
- y = 0;
- if (y > _config->maxOutput())
- y = _config->maxOutput();
-
- return QPointF(x, y);
-}
-
-QPointF QFunctionConfigurator::point_to_pixel(const QPointF& point)
-{
- return QPointF(pixel_bounds.x() + point.x() * c.x(),
- pixel_bounds.y() + pixel_bounds.height() - point.y() * c.y());
-}
-
-void QFunctionConfigurator::resizeEvent(QResizeEvent *)
-{
- update_range();
-}
diff --git a/qfunctionconfigurator/qfunctionconfigurator.h b/qfunctionconfigurator/qfunctionconfigurator.h
deleted file mode 100644
index 667886cd..00000000
--- a/qfunctionconfigurator/qfunctionconfigurator.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Copyright (c) 2012-2015 Stanislaw Halik <sthalik@misaki.pl>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- */
-
-// Adapted to FaceTrackNoIR by Wim Vriend.
-
-#pragma once
-
-#include <QWidget>
-#include <QtGui>
-#include <QPointF>
-#include "qfunctionconfigurator/functionconfig.h"
-#include "opentrack/plugin-api.hpp"
-
-class QFunctionConfigurator : public QWidget
-{
- Q_OBJECT
- Q_PROPERTY(QColor colorBezier READ colorBezier WRITE setColorBezier)
-public:
- QFunctionConfigurator(QWidget *parent = 0);
-
- Map* config();
- void setConfig(Map* config, const QString &name);
-
- QColor colorBezier() const
- {
- return spline_color;
- }
- void setColorBezier(QColor color)
- {
- spline_color = color;
- update();
- }
- void force_redraw()
- {
- _background = QPixmap();
- update();
- }
-protected slots:
- void paintEvent(QPaintEvent *e) override;
- void mousePressEvent(QMouseEvent *e) override;
- void mouseMoveEvent(QMouseEvent *e) override;
- void mouseReleaseEvent(QMouseEvent *e) override;
-private:
- void drawBackground();
- void drawFunction();
- void drawPoint(QPainter *painter, const QPointF &pt, QColor colBG, QColor border = QColor(50, 100, 120, 200));
- void drawLine(QPainter *painter, const QPointF &start, const QPointF &end, QPen& pen);
- bool point_within_pixel(const QPointF& pt, const QPointF& pixel);
-protected:
- void resizeEvent(QResizeEvent *) override;
-private:
- void update_range();
- static constexpr int point_closeness_limit = 12;
-
- QPointF pixel_coord_to_point (const QPointF& point);
- QPointF point_to_pixel (const QPointF& point);
-
- Map* _config;
-
- // bounds of the rectangle user can interact with
- QRectF pixel_bounds;
-
- int moving_control_point_idx;
- QPointF c;
-
- QColor spline_color;
-
- QPixmap _background;
- QPixmap _function;
- bool _draw_function;
-};