Progress on the new Qt GUI

newui-qt
John Tsiombikas 2022-03-20 19:57:22 +02:00
rodzic a44577892a
commit 0c38320f1a
11 zmienionych plików z 874 dodań i 220 usunięć

1
.gitignore vendored
Wyświetl plik

@ -4,3 +4,4 @@
Makefile
spnavcfg
ui_mainwin.h
res.cc

Wyświetl plik

@ -1,14 +1,16 @@
csrc = $(wildcard src/*.c)
ccsrc = $(wildcard src/*.cc)
mochdr = src/ui.h
mocsrc = $(mochdr:.h=.moc.cc)
obj = $(ccsrc:.cc=.o) $(mocsrc:.cc=.o)
dep = $(ccsrc:.cc=.d)
obj = $(csrc:.c=.o) $(ccsrc:.cc=.o) $(mocsrc:.cc=.o) res.cc
dep = $(csrc:.c=.d) $(ccsrc:.cc=.d)
bin = spnavcfg
CC ?= gcc
CXX ?= g++
UIC ?= uic
MOC ?= moc
RCC ?= rcc
warn = -pedantic -Wall
incdir = -I.
@ -30,9 +32,12 @@ ui_mainwin.h: ui/spnavcfg.ui
%.moc.cc: %.h
$(MOC) -o $@ $(incdir) $<
res.cc: ui/spnavcfg.qrc icons/devices.png
$(RCC) -o $@ $<
.PHONY: clean
clean:
rm -f $(obj) $(bin) $(mocsrc) win_main_ui.h
rm -f $(obj) $(bin) $(mocsrc) win_main_ui.h res.cc
.PHONY: cleandep
cleandep:

Wyświetl plik

@ -5,7 +5,7 @@ About
-----
Spacenav daemon interactive configuration program.
![shot](http://spacenav.sourceforge.net/images/spnavcfg-shot-thumb.png)
![shot](http://spacenav.sourceforge.net/images/spnavcfg1-shot-thumb.png)
Compatibility
@ -29,9 +29,15 @@ which will work with older versions of the daemon is 0.3.1.
Installation
------------
Requires libspnav, GTK+ 2, and Xlib headers to be installed.
`./configure`, `make`, `make install`, as usual (the `make install` part as root
if you're installing system-wide). See `./configure --help` for build options.
First make sure you have the dependencies installed:
- libspnav v0.4 or higher
- Qt 5 (core, gui, and widgets).
To build just run `./configure`, `make`, and `make install` as usual.
The `make install` part will probably need to be executed as root, if you're
installing system-wide.
For build options, see `./configure --help`.
License
-------

BIN
icons/devices.png (Przechowane za pomocą Git LFS) 100644

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -1,7 +1,14 @@
#include <QApplication>
#include <QSocketNotifier>
#define SPNAV_CONFIG_H_
#include <spnav.h>
#include "spnavcfg.h"
#include "ui.h"
QWidget *mainwin;
static bool init();
MainWin *mainwin;
static QSocketNotifier *sockev;
int main(int argc, char **argv)
{
@ -12,5 +19,37 @@ int main(int argc, char **argv)
w.show();
mainwin = &w;
if(!init()) {
return 1;
}
return app.exec();
}
static bool init()
{
if(spnav_open() == -1) {
errorbox("Failed to connect to spacenavd!");
return false;
}
if(spnav_protocol() < 1) {
errorbox("Currently running version of spacenavd is too old for this version of the configuration tool.\n"
"\nEither update to a recent version of spacenavd (v0.9 or later), or downgrade to spnavcfg v0.3.1.");
return false;
}
spnav_client_name("spnavcfg");
if(read_devinfo(&devinfo) == -1) {
errorbox("Failed to read device info.");
return false;
}
if(read_cfg(&cfg) == -1) {
errorbox("Failed to read current configuration.");
return false;
}
sockev = new QSocketNotifier(spnav_fd(), QSocketNotifier::Read);
QObject::connect(sockev, &QSocketNotifier::activated, mainwin, &MainWin::spnav_input);
return true;
}

39
src/spnavcfg.c 100644
Wyświetl plik

@ -0,0 +1,39 @@
#include <string.h>
#include <spnav.h>
#include "spnavcfg.h"
#include "ui.h"
struct device_info devinfo;
struct config cfg;
int read_devinfo(struct device_info *inf)
{
inf->name = strdup(spnav_dev_name(0, 0));
inf->path = strdup(spnav_dev_path(0, 0));
inf->nbuttons = spnav_dev_buttons();
inf->naxes = spnav_dev_axes();
inf->type = spnav_dev_type();
}
int read_cfg(struct config *cfg)
{
int i;
cfg->sens = spnav_cfg_get_sens();
spnav_cfg_get_axis_sens(cfg->sens_axis);
cfg->invert = spnav_cfg_get_invert();
cfg->led = spnav_cfg_get_led();
cfg->grab = spnav_cfg_get_grab();
for(i=0; i<6; i++) {
cfg->map_axis[i] = spnav_cfg_get_axismap(i);
}
for(i=0; i<MAX_AXES; i++) {
cfg->dead_thres[i] = spnav_cfg_get_deadzone(i);
}
for(i=0; i<MAX_BUTTONS; i++) {
cfg->map_bn[i] = spnav_cfg_get_bnmap(i);
}
update_ui();
}

38
src/spnavcfg.h 100644
Wyświetl plik

@ -0,0 +1,38 @@
#ifndef SPNAVCFG_H_
#define SPNAVCFG_H_
struct device_info {
char *name, *path;
int nbuttons, naxes;
int type;
};
enum {TX, TY, TZ, RX, RY, RZ};
#define MAX_BUTTONS 64
#define MAX_AXES 64
struct config {
float sens, sens_axis[6];
int invert;
int map_axis[MAX_AXES];
int dead_thres[MAX_AXES];
int map_bn[MAX_BUTTONS];
int led, grab;
int repeat;
};
extern struct device_info devinfo;
extern struct config cfg;
#ifdef __cplusplus
extern "C" {
#endif
int read_devinfo(struct device_info *inf);
int read_cfg(struct config *cfg);
#ifdef __cplusplus
}
#endif
#endif /* SPNAVCFG_H_ */

192
src/ui.cc
Wyświetl plik

@ -1,14 +1,206 @@
#include <stdio.h>
#define SPNAV_CONFIG_H_
#include <spnav.h>
#include "ui.h"
#include "spnavcfg.h"
#include "ui_mainwin.h"
#include <QMessageBox>
static QSlider *slider_sens_axis[6];
static QCheckBox *chk_inv[6];
static QComboBox *combo_axismap[6];
static QDoubleSpinBox *spin_sens_axis[6];
static QSpinBox *spin_dead_axis[6];
static QProgressBar *prog_axis[6];
static QPixmap *dev_atlas;
struct device_image {
int devtype;
int width, height;
int xoffs, yoffs;
};
static struct device_image devimglist[] = {
{SPNAV_DEV_UNKNOWN, 150, 150, 0, 0},
{SPNAV_DEV_SB2003, 150, 150, 1, 0},
{SPNAV_DEV_SB3003, 150, 150, 2, 0},
{SPNAV_DEV_SB4000, 150, 150, 3, 0},
{SPNAV_DEV_SM, 150, 150, 5, 0},
{SPNAV_DEV_SM5000, 150, 150, 2, 0},
{SPNAV_DEV_SMCADMAN, 150, 150, 6, 0},
{SPNAV_DEV_PLUSXT, 150, 150, 5, 0},
{SPNAV_DEV_CADMAN, 150, 150, 6, 0},
{SPNAV_DEV_SMCLASSIC, 150, 150, 4, 0},
{SPNAV_DEV_SB5000, 150, 150, 3, 0},
{SPNAV_DEV_STRAVEL, 150, 150, 2, 1},
{SPNAV_DEV_SPILOT, 150, 150, 3, 1},
{SPNAV_DEV_SNAV, 150, 150, 0, 1},
{SPNAV_DEV_SEXP, 150, 150, 4, 1},
{SPNAV_DEV_SNAVNB, 150, 150, 1, 1},
{SPNAV_DEV_SPILOTPRO, 150, 150, 5, 1},
{SPNAV_DEV_SMPRO, 150, 150, 6, 1},
{SPNAV_DEV_NULOOQ, 150, 150, 7, 0},
{SPNAV_DEV_SMW, 150, 150, 1, 2},
{SPNAV_DEV_SMPROW, 150, 150, 6, 1},
{SPNAV_DEV_SMENT, 150, 150, 7, 1},
{SPNAV_DEV_SMCOMP, 150, 150, 0, 2},
{SPNAV_DEV_SMMOD, 150, 150, 0, 0},
{-1}
};
MainWin::MainWin(QWidget *par)
: QWidget(par)
{
ui = new Ui::win_main;
ui->setupUi(this);
dev_atlas = new QPixmap(":/icons/devices.png");
slider_sens_axis[0] = ui->slider_sens_tx;
slider_sens_axis[1] = ui->slider_sens_ty;
slider_sens_axis[2] = ui->slider_sens_tz;
slider_sens_axis[3] = ui->slider_sens_rx;
slider_sens_axis[4] = ui->slider_sens_ry;
slider_sens_axis[5] = ui->slider_sens_rz;
chk_inv[0] = ui->chk_inv_tx;
chk_inv[1] = ui->chk_inv_ty;
chk_inv[2] = ui->chk_inv_tz;
chk_inv[3] = ui->chk_inv_rx;
chk_inv[4] = ui->chk_inv_ry;
chk_inv[5] = ui->chk_inv_rz;
combo_axismap[0] = ui->combo_axismap_tx;
combo_axismap[1] = ui->combo_axismap_ty;
combo_axismap[2] = ui->combo_axismap_tz;
combo_axismap[3] = ui->combo_axismap_rx;
combo_axismap[4] = ui->combo_axismap_ry;
combo_axismap[5] = ui->combo_axismap_rz;
spin_dead_axis[0] = ui->spin_dead_tx;
spin_dead_axis[1] = ui->spin_dead_ty;
spin_dead_axis[2] = ui->spin_dead_tz;
spin_dead_axis[3] = ui->spin_dead_rx;
spin_dead_axis[4] = ui->spin_dead_ry;
spin_dead_axis[5] = ui->spin_dead_rz;
spin_sens_axis[0] = ui->spin_sens_tx;
spin_sens_axis[1] = ui->spin_sens_ty;
spin_sens_axis[2] = ui->spin_sens_tz;
spin_sens_axis[3] = ui->spin_sens_rx;
spin_sens_axis[4] = ui->spin_sens_ry;
spin_sens_axis[5] = ui->spin_sens_rz;
prog_axis[0] = ui->prog_tx;
prog_axis[1] = ui->prog_ty;
prog_axis[2] = ui->prog_tz;
prog_axis[3] = ui->prog_rx;
prog_axis[4] = ui->prog_ry;
prog_axis[5] = ui->prog_rz;
}
MainWin::~MainWin()
{
delete ui;
delete dev_atlas;
}
void MainWin::updateui()
{
struct device_image devimg = devimglist[0];
for(int i=0; devimglist[i].devtype != -1; i++) {
if(devimglist[i].devtype == devinfo.type) {
devimg = devimglist[i];
break;
}
}
int ncol = dev_atlas->width() / devimg.width;
int nrow = dev_atlas->height() / devimg.height;
devimg.xoffs = devimg.xoffs * dev_atlas->width() / ncol;
devimg.yoffs = devimg.yoffs * dev_atlas->height() / nrow;
QPixmap pix = dev_atlas->copy(devimg.xoffs, devimg.yoffs, devimg.width, devimg.height);
ui->img_dev->setPixmap(pix);
ui->lb_devname->setText(devinfo.name);
ui->lb_devfile->setText(devinfo.path);
ui->lb_numaxes->setText(QString::number(devinfo.naxes));
ui->lb_numbn->setText(QString::number(devinfo.nbuttons));
ui->combo_led->setCurrentIndex(cfg.led);
ui->chk_grab->setChecked(cfg.grab);
if(cfg.repeat > 0) {
ui->chk_repeat->setChecked(true);
ui->spin_repeat->setValue(cfg.repeat);
} else {
ui->chk_repeat->setChecked(false);
}
ui->slider_sens->setValue(cfg.sens * 10);
ui->spin_sens->setValue(cfg.sens);
for(int i=0; i<6; i++) {
slider_sens_axis[i]->setValue(cfg.sens_axis[i] * 10);
spin_sens_axis[i]->setValue(cfg.sens_axis[i]);
chk_inv[i]->setChecked((cfg.invert >> i) & 1);
combo_axismap[i]->clear();
for(int j=0; j<devinfo.naxes; j++) {
combo_axismap[i]->addItem(QString::number(j));
}
for(int j=0; j<devinfo.naxes; j++) {
if(cfg.map_axis[j] == i) {
combo_axismap[i]->setCurrentIndex(j);
spin_dead_axis[i]->setValue(cfg.dead_thres[j]);
}
}
}
bool same = true;
for(int i=0; i<devinfo.naxes; i++) {
if(i > 0 && cfg.dead_thres[i] != cfg.dead_thres[i - 1]) {
same = false;
}
}
ui->spin_dead->setValue(same ? cfg.dead_thres[0] : 0);
ui->chk_dead_global->setChecked(same);
}
void MainWin::spnav_input()
{
static int maxval = 256;
spnav_event ev;
while(spnav_poll_event(&ev)) {
switch(ev.type) {
case SPNAV_EVENT_MOTION:
for(int i=0; i<6; i++) {
if(abs(ev.motion.data[i] > maxval)) maxval = abs(ev.motion.data[i]);
}
for(int i=0; i<6; i++) {
prog_axis[i]->setMinimum(-maxval);
prog_axis[i]->setMaximum(maxval);
prog_axis[i]->setValue(ev.motion.data[i]);
}
break;
case SPNAV_EVENT_BUTTON:
// TODO
break;
default:
break;
}
}
}
extern "C" void update_ui(void)
{
mainwin->updateui();
}
extern "C" void errorbox(const char *msg)
{
QMessageBox::critical(mainwin, "Error", msg, QMessageBox::Ok);
}

Wyświetl plik

@ -1,7 +1,13 @@
#ifndef UI_H_
#define UI_H_
#include "ui_mainwin.h"
#ifdef __cplusplus
#include <QWidget>
namespace Ui {
class win_main;
}
class MainWin : public QWidget {
Q_OBJECT
@ -12,6 +18,23 @@ private:
public:
explicit MainWin(QWidget *par = 0);
~MainWin();
void updateui();
public slots:
void spnav_input();
};
extern MainWin *mainwin;
extern "C" {
#endif
void update_ui(void);
void errorbox(const char *msg);
#ifdef __cplusplus
}
#endif
#endif /* UI_H_ */

6
ui/spnavcfg.qrc 100644
Wyświetl plik

@ -0,0 +1,6 @@
<!DOCTYPE RCC>
<RCC version="1.0">
<qresource>
<file>../icons/devices.png</file>
</qresource>
</RCC>

Wyświetl plik

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>816</width>
<height>650</height>
<width>800</width>
<height>667</height>
</rect>
</property>
<property name="windowTitle">
@ -159,12 +159,12 @@
<widget class="QComboBox" name="combo_led">
<item>
<property name="text">
<string>On</string>
<string>Off</string>
</property>
</item>
<item>
<property name="text">
<string>Off</string>
<string>On</string>
</property>
</item>
<item>
@ -295,7 +295,7 @@
<item>
<widget class="QTabWidget" name="tabWidget_2">
<property name="currentIndex">
<number>1</number>
<number>0</number>
</property>
<widget class="QWidget" name="tab_axes" native="true">
<attribute name="title">
@ -327,11 +327,24 @@
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="spin_sens">
<property name="maximum">
<double>10.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
@ -350,6 +363,42 @@
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="chk_dead_global">
<property name="text">
<string>Global deadzone</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spin_dead">
<property name="toolTip">
<string>Deadzone for all axes</string>
</property>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
@ -358,10 +407,72 @@
<string>Translation</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="2">
<widget class="QLabel" name="label_9">
<item row="3" column="1" rowspan="2">
<widget class="QProgressBar" name="prog_ty">
<property name="minimum">
<number>-128</number>
</property>
<property name="maximum">
<number>127</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
<property name="format">
<string>%v</string>
</property>
</widget>
</item>
<item row="2" column="5" rowspan="2">
<widget class="QComboBox" name="combo_axismap_ty">
<property name="toolTip">
<string>Select which device axis affects Y translation</string>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QComboBox" name="combo_axismap_tx">
<property name="toolTip">
<string>Select which device axis affects X translation</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QProgressBar" name="prog_tz">
<property name="minimum">
<number>-128</number>
</property>
<property name="maximum">
<number>127</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
<property name="format">
<string>%v</string>
</property>
</widget>
</item>
<item row="3" column="2" rowspan="2">
<widget class="QCheckBox" name="chk_inv_ty">
<property name="toolTip">
<string>invert Y axis translation</string>
</property>
<property name="text">
<string>invert</string>
<string/>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QLabel" name="label_11">
<property name="text">
<string>device axis</string>
</property>
</widget>
</item>
@ -372,10 +483,43 @@
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="label_11">
<item row="1" column="6">
<widget class="QSpinBox" name="spin_dead_tx">
<property name="enabled">
<bool>false</bool>
</property>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QCheckBox" name="chk_inv_tz">
<property name="toolTip">
<string>invert Z axis translation</string>
</property>
<property name="text">
<string>device axis</string>
<string/>
</property>
</widget>
</item>
<item row="4" column="5" rowspan="2">
<widget class="QComboBox" name="combo_axismap_tz">
<property name="toolTip">
<string>Select which device axis affects Z translation</string>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QSlider" name="slider_sens_tz">
<property name="toolTip">
<string>Z axis translation sensitivity</string>
</property>
<property name="maximum">
<number>60</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
@ -389,17 +533,14 @@
</property>
</widget>
</item>
<item row="1" column="1" rowspan="2">
<widget class="QProgressBar" name="prog_tx">
<property name="minimum">
<number>-100</number>
</property>
<property name="value">
<number>24</number>
</property>
<property name="invertedAppearance">
<item row="5" column="6">
<widget class="QSpinBox" name="spin_dead_tz">
<property name="enabled">
<bool>false</bool>
</property>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
<item row="1" column="2" rowspan="2">
@ -412,66 +553,6 @@
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QSlider" name="slider_sens_tx">
<property name="toolTip">
<string>X axis translation sensitivity</string>
</property>
<property name="maximum">
<number>60</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QComboBox" name="comvo_axismap_tx">
<property name="toolTip">
<string>Select which device axis affects X translation</string>
</property>
</widget>
</item>
<item row="2" column="4" rowspan="2">
<widget class="QComboBox" name="comvo_axismap_ty">
<property name="toolTip">
<string>Select which device axis affects Y translation</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>TY</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1" rowspan="2">
<widget class="QProgressBar" name="prog_ty">
<property name="minimum">
<number>-100</number>
</property>
<property name="value">
<number>24</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="2" rowspan="2">
<widget class="QCheckBox" name="chk_inv_ty">
<property name="toolTip">
<string>invert Y axis translation</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QSlider" name="slider_sens_ty">
<property name="toolTip">
@ -485,10 +566,62 @@
</property>
</widget>
</item>
<item row="4" column="4" rowspan="2">
<widget class="QComboBox" name="comvo_axismap_tz">
<item row="1" column="1" rowspan="2">
<widget class="QProgressBar" name="prog_tx">
<property name="minimum">
<number>-128</number>
</property>
<property name="maximum">
<number>127</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
<property name="format">
<string>%v</string>
</property>
</widget>
</item>
<item row="3" column="6">
<widget class="QSpinBox" name="spin_dead_ty">
<property name="enabled">
<bool>false</bool>
</property>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QSlider" name="slider_sens_tx">
<property name="toolTip">
<string>Select which device axis affects Z translation</string>
<string>X axis translation sensitivity</string>
</property>
<property name="maximum">
<number>60</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QLabel" name="label_20">
<property name="text">
<string>deadzone</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>TY</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
@ -502,41 +635,21 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QProgressBar" name="prog_tz">
<property name="minimum">
<number>-100</number>
</property>
<property name="value">
<number>24</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QCheckBox" name="chk_inv_tz">
<property name="toolTip">
<string>invert Z axis translation</string>
</property>
<item row="0" column="2">
<widget class="QLabel" name="label_9">
<property name="text">
<string/>
<string>invert</string>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QSlider" name="slider_sens_tz">
<property name="toolTip">
<string>Z axis translation sensitivity</string>
</property>
<property name="maximum">
<number>60</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<item row="1" column="4">
<widget class="QDoubleSpinBox" name="spin_sens_tx"/>
</item>
<item row="3" column="4">
<widget class="QDoubleSpinBox" name="spin_sens_ty"/>
</item>
<item row="5" column="4">
<widget class="QDoubleSpinBox" name="spin_sens_tz"/>
</item>
</layout>
</widget>
@ -547,54 +660,10 @@
<string>Rotation</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="2">
<widget class="QLabel" name="label_12">
<property name="text">
<string>invert</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="label_13">
<property name="text">
<string>sensitivity</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="label_14">
<property name="text">
<string>device axis</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>RX</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1" rowspan="2">
<widget class="QProgressBar" name="prog_rx">
<property name="minimum">
<number>-100</number>
</property>
<property name="value">
<number>24</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="2" rowspan="2">
<widget class="QCheckBox" name="chk_inv_rx">
<item row="5" column="2">
<widget class="QCheckBox" name="chk_inv_rz">
<property name="toolTip">
<string>invert X axis rotation</string>
<string>invert Z axis rotation</string>
</property>
<property name="text">
<string/>
@ -614,50 +683,20 @@
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QComboBox" name="comvo_axismap_rx">
<item row="1" column="5">
<widget class="QComboBox" name="combo_axismap_rx">
<property name="toolTip">
<string>Select which device axis affects X rotation</string>
</property>
</widget>
</item>
<item row="2" column="4" rowspan="2">
<widget class="QComboBox" name="comvo_axismap_ry">
<property name="toolTip">
<string>Select which device axis affects Y rotation</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>RY</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1" rowspan="2">
<widget class="QProgressBar" name="prog_ry">
<property name="minimum">
<number>-100</number>
</property>
<property name="value">
<number>24</number>
</property>
<property name="invertedAppearance">
<item row="3" column="6">
<widget class="QSpinBox" name="spin_dead_ry">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="2" rowspan="2">
<widget class="QCheckBox" name="chk_inv_ry">
<property name="toolTip">
<string>invert Y axis rotation</string>
</property>
<property name="text">
<string/>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
@ -674,46 +713,121 @@
</property>
</widget>
</item>
<item row="4" column="4" rowspan="2">
<widget class="QComboBox" name="comvo_axismap_rz">
<item row="2" column="5" rowspan="2">
<widget class="QComboBox" name="combo_axismap_ry">
<property name="toolTip">
<string>Select which device axis affects Z rotation</string>
<string>Select which device axis affects Y rotation</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_17">
<item row="3" column="1" rowspan="2">
<widget class="QProgressBar" name="prog_ry">
<property name="minimum">
<number>-128</number>
</property>
<property name="maximum">
<number>127</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
<property name="format">
<string>%v</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>RZ</string>
<string>RY</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QProgressBar" name="prog_rz">
<item row="1" column="1" rowspan="2">
<widget class="QProgressBar" name="prog_rx">
<property name="minimum">
<number>-100</number>
<number>-128</number>
</property>
<property name="maximum">
<number>127</number>
</property>
<property name="value">
<number>24</number>
<number>0</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
<property name="format">
<string>%v</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QCheckBox" name="chk_inv_rz">
<item row="0" column="2">
<widget class="QLabel" name="label_12">
<property name="text">
<string>invert</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QProgressBar" name="prog_rz">
<property name="minimum">
<number>-128</number>
</property>
<property name="maximum">
<number>127</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
<property name="format">
<string>%v</string>
</property>
</widget>
</item>
<item row="5" column="6">
<widget class="QSpinBox" name="spin_dead_rz">
<property name="enabled">
<bool>false</bool>
</property>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
<item row="3" column="2" rowspan="2">
<widget class="QCheckBox" name="chk_inv_ry">
<property name="toolTip">
<string>invert Z axis rotation</string>
<string>invert Y axis rotation</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="label_13">
<property name="text">
<string>sensitivity</string>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QLabel" name="label_14">
<property name="text">
<string>device axis</string>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QSlider" name="slider_sens_rz">
<property name="toolTip">
@ -727,6 +841,69 @@
</property>
</widget>
</item>
<item row="1" column="2" rowspan="2">
<widget class="QCheckBox" name="chk_inv_rx">
<property name="toolTip">
<string>invert X axis rotation</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>RZ</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="6">
<widget class="QSpinBox" name="spin_dead_rx">
<property name="enabled">
<bool>false</bool>
</property>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QLabel" name="label_21">
<property name="text">
<string>deadzone</string>
</property>
</widget>
</item>
<item row="4" column="5" rowspan="2">
<widget class="QComboBox" name="combo_axismap_rz">
<property name="toolTip">
<string>Select which device axis affects Z rotation</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>RX</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QDoubleSpinBox" name="spin_sens_rx"/>
</item>
<item row="3" column="4">
<widget class="QDoubleSpinBox" name="spin_sens_ry"/>
</item>
<item row="5" column="4">
<widget class="QDoubleSpinBox" name="spin_sens_rz"/>
</item>
</layout>
</widget>
</item>
@ -736,6 +913,19 @@
<attribute name="title">
<string>Buttons</string>
</attribute>
<widget class="QLabel" name="label_19">
<property name="geometry">
<rect>
<x>140</x>
<y>150</y>
<width>471</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>TODO: Button mapping, keyboard emulation, actions and so on....</string>
</property>
</widget>
</widget>
</widget>
</item>
@ -826,5 +1016,117 @@
</hint>
</hints>
</connection>
<connection>
<sender>chk_dead_global</sender>
<signal>toggled(bool)</signal>
<receiver>spin_dead_tx</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>649</x>
<y>271</y>
</hint>
<hint type="destinationlabel">
<x>738</x>
<y>355</y>
</hint>
</hints>
</connection>
<connection>
<sender>chk_dead_global</sender>
<signal>toggled(bool)</signal>
<receiver>spin_dead_ty</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>728</x>
<y>284</y>
</hint>
<hint type="destinationlabel">
<x>747</x>
<y>393</y>
</hint>
</hints>
</connection>
<connection>
<sender>chk_dead_global</sender>
<signal>toggled(bool)</signal>
<receiver>spin_dead_tz</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>639</x>
<y>279</y>
</hint>
<hint type="destinationlabel">
<x>765</x>
<y>429</y>
</hint>
</hints>
</connection>
<connection>
<sender>chk_dead_global</sender>
<signal>toggled(bool)</signal>
<receiver>spin_dead_rx</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>622</x>
<y>280</y>
</hint>
<hint type="destinationlabel">
<x>743</x>
<y>520</y>
</hint>
</hints>
</connection>
<connection>
<sender>chk_dead_global</sender>
<signal>toggled(bool)</signal>
<receiver>spin_dead_ry</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>625</x>
<y>275</y>
</hint>
<hint type="destinationlabel">
<x>755</x>
<y>560</y>
</hint>
</hints>
</connection>
<connection>
<sender>chk_dead_global</sender>
<signal>toggled(bool)</signal>
<receiver>spin_dead_rz</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>627</x>
<y>279</y>
</hint>
<hint type="destinationlabel">
<x>769</x>
<y>599</y>
</hint>
</hints>
</connection>
<connection>
<sender>chk_dead_global</sender>
<signal>toggled(bool)</signal>
<receiver>spin_dead</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>629</x>
<y>272</y>
</hint>
<hint type="destinationlabel">
<x>760</x>
<y>277</y>
</hint>
</hints>
</connection>
</connections>
</ui>