spnavcfg/src/ui.cc

207 wiersze
5.3 KiB
C++

#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);
}