summaryrefslogtreecommitdiffhomepage
path: root/migration/20160906_00-mappings.cpp
blob: 65759dec55536b020e8cd4de13b19e2e0922e346 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/* Copyright (c) 2016, 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 "migration.hpp"
#include "logic/mappings.hpp"
#include "logic/main-settings.hpp"
#include "options/group.hpp"

#include <QPointF>
#include <QList>

#include <memory>

#include <QDebug>

using namespace migrations;

struct mappings_from_2_3_0_rc11 : migration
{
    static QList<QList<QPointF>> get_old_splines()
    {
        QList<QList<QPointF>> ret;

        static const char* names[] =
        {
            "tx", "tx_alt",
            "ty", "ty_alt",
            "tz", "tz_alt",
            "rx", "rx_alt",
            "ry", "ry_alt",
            "rz", "rz_alt",
        };

        std::shared_ptr<QSettings> settings_ = options::group::ini_file();
        QSettings& settings(*settings_);

        for (const char* name : names)
        {
            QList<QPointF> points;

            settings.beginGroup(QString("Curves-%1").arg(name));

            const int max = settings.value("point-count", 0).toInt();

            for (int i = 0; i < max; i++)
            {
                QPointF new_point(settings.value(QString("point-%1-x").arg(i), 0).toDouble(),
                                  settings.value(QString("point-%1-y").arg(i), 0).toDouble());

                points.append(new_point);
            }

            settings.endGroup();

            ret.append(points);
        }

        return ret;
    }

    QString unique_date() const override { return "20160909_00"; }
    QString name() const override { return "mappings to new layout"; }

    static Mappings get_new_mappings()
    {
        main_settings s;
        return Mappings(std::vector<axis_opts*>{&s.a_x, &s.a_y, &s.a_z, &s.a_yaw, &s.a_pitch, &s.a_roll});
    }

    bool should_run() const override
    {
        Mappings m = get_new_mappings();

        // run only if no new splines were set
        for (int i = 0; i < 6; i++)
            if (m(i).spline_main.get_point_count() || m(i).spline_alt.get_point_count())
                return false;

        // run only if old splines exist
        for (const QList<QPointF>& points : get_old_splines())
            if (points.size())
                return true;

        // no splines exit at all
        return false;
    }
    void run() override
    {
        const QList<QList<QPointF>> old_mappings = get_old_splines();
        Mappings m = get_new_mappings();

        std::shared_ptr<QSettings> s_ = options::group::ini_file();
        QSettings& s = *s_;

        for (int i = 0; i < 12; i++)
        {
            spline& spl = (i % 2) == 0 ? m(i / 2).spline_main : m(i / 2).spline_alt;
            spl.removeAllPoints();
            const QList<QPointF>& points = old_mappings[i];
            for (const QPointF& pt : points)
                spl.addPoint(pt);
            spl.save(s);
        }
    }
};

OPENTRACK_MIGRATION(mappings_from_2_3_0_rc11);