diff options
Diffstat (limited to 'gui/mapping-dialog.cpp')
-rw-r--r-- | gui/mapping-dialog.cpp | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/gui/mapping-dialog.cpp b/gui/mapping-dialog.cpp new file mode 100644 index 00000000..607563a7 --- /dev/null +++ b/gui/mapping-dialog.cpp @@ -0,0 +1,206 @@ +/* Copyright (c) 2014-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 "mapping-dialog.hpp" +#include "logic/main-settings.hpp" +#include "spline/spline-widget.hpp" + +MapWidget::MapWidget(Mappings& m) : m(m), widgets{} +{ + ui.setupUi(this); + + QWidget* pages[] = { + ui.tabWidgetPage1, + ui.tabWidgetPage2, + ui.tabWidgetPage3, + ui.tabWidgetPage4, + ui.tabWidgetPage5, + ui.tabWidgetPage6, + }; + + { + QColor bg = palette().background().color(); + + QString tmp; + tmp.reserve(32); + + tmp += QStringLiteral(".QWidget { background-color: #"); + + for (int i : { bg.red(), bg.green(), bg.blue() }) + { + if (i < 0xf0) + tmp += '0'; + tmp += QString::number(i, 16); + } + + tmp += "; }"; + + for (QWidget* w : pages) + w->setStyleSheet(tmp); + } + + load(); + + connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK())); + connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel())); + + 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_x.altp, ui.tx_altp); + tie_setting(s.a_y.altp, ui.ty_altp); + tie_setting(s.a_z.altp, ui.tz_altp); + + tie_setting(s.a_yaw.clamp_x_, ui.max_yaw_rotation); + tie_setting(s.a_pitch.clamp_x_, ui.max_pitch_rotation); + tie_setting(s.a_roll.clamp_x_, ui.max_roll_rotation); + tie_setting(s.a_x.clamp_x_, ui.max_x_translation); + tie_setting(s.a_y.clamp_x_, ui.max_y_translation); + tie_setting(s.a_z.clamp_x_, ui.max_z_translation); + + tie_setting(s.a_pitch.clamp_y_, ui.max_pitch_output); +} + +void MapWidget::load() +{ + struct { + spline_widget* qfc; + Axis axis; + QCheckBox* checkbox; + bool altp; + } qfcs[] = + { + { ui.rxconfig, Yaw, nullptr, false, }, + { ui.ryconfig, Pitch, nullptr, false, }, + { ui.rzconfig, Roll, nullptr, false, }, + { ui.txconfig, TX, nullptr, false, }, + { ui.tyconfig, TY, nullptr, false, }, + { ui.tzconfig, TZ, nullptr, false, }, + { ui.rxconfig_alt, Yaw, ui.rx_altp, true, }, + { ui.ryconfig_alt, Pitch, ui.ry_altp, true, }, + { ui.rzconfig_alt, Roll, ui.rz_altp, true, }, + { ui.txconfig_alt, TX, ui.tx_altp, true, }, + { ui.tyconfig_alt, TY, ui.ty_altp, true, }, + { ui.tzconfig_alt, TZ, ui.tz_altp, true, }, + { nullptr, Yaw, nullptr, false } + }; + + ui.max_pitch_output->setItemData(0, int(axis_opts::o_r180)); + ui.max_pitch_output->setItemData(1, int(axis_opts::o_r90)); + + using a = axis_opts::max_clamp; + + for (QComboBox* x : { ui.max_yaw_rotation, ui.max_pitch_rotation, ui.max_roll_rotation }) + for (a y : { a::r180, a::r90, a::r60, a::r45, a::r30, a::r25, a::r20, a::r15, a::r10 }) + x->addItem(tr("%1°").arg(y), y); + + for (QComboBox* x : { ui.max_x_translation, ui.max_y_translation, ui.max_z_translation }) + for (a y : { a::t30, a::t20, a::t15, a::t10, a::t100 }) + x->addItem(QStringLiteral("%1 cm").arg(int(y)), y); + + // XXX TODO add tie_setting overload for spline_widget!!! -sh 20171020 + + 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; + spline_widget& qfc = *qfcs[i].qfc; + + if (altp) + { + connect(&axis.opts.altp, + base_value::signal_fun<bool>(), + this, + [&](bool f) -> void {qfc.setEnabled(f); qfc.force_redraw();}); + qfc.setEnabled(axis.opts.altp); + qfc.force_redraw(); + } + + connect(&axis.opts.clamp_x_, base_value::signal_fun<int>(), + &qfc, [i, &conf, &qfc](int value) { + //qfc.reload_spline(); + qfc.set_x_step(value + 1e-2 >= 90 ? 10 : 5); + + if (i >= 3) + qfc.set_snap(1, 2.5); + else + { + const double x_snap = std::fmax(.5, conf.max_input() / 100.); + qfc.set_snap(x_snap, 1); + } + }); + + // force signal to avoid duplicating the slot's logic + qfc.setConfig(&conf); + axis.opts.clamp_x_.valueChanged(axis.opts.clamp_x_); + + widgets[i % 6][altp ? 1 : 0] = &qfc; + } +} + +void MapWidget::closeEvent(QCloseEvent*) +{ + invalidate_dialog(); +} + +void MapWidget::refresh_tab() +{ + if (!isVisible()) + return; + + const int idx = ui.tabWidget->currentIndex(); + + if (likely(idx >= 0 && idx < 6)) + { + widgets[idx][0]->repaint(); + widgets[idx][1]->repaint(); + } + else + qDebug() << "map-widget: bad index" << idx; +} + +void MapWidget::save_dialog() +{ + s.b_map->save(); + + for (int i = 0; i < 6; i++) + { + m.forall([&](Map& s) + { + s.spline_main.save(); + s.spline_alt.save(); + s.opts.b_mapping_window->save(); + }); + } +} + +void MapWidget::invalidate_dialog() +{ + s.b_map->reload(); + + m.forall([](Map& s) + { + s.spline_main.reload(); + s.spline_alt.reload(); + s.opts.b_mapping_window->reload(); + }); +} + +void MapWidget::doOK() +{ + save_dialog(); + close(); +} + +void MapWidget::doCancel() +{ + invalidate_dialog(); + close(); +} |