diff --git a/src/tabletfinder/dialog.cpp b/src/tabletfinder/dialog.cpp
index 5c4014a..75fe7e4 100644
--- a/src/tabletfinder/dialog.cpp
+++ b/src/tabletfinder/dialog.cpp
@@ -1,506 +1,504 @@
/*
* This file is part of the KDE wacomtablet project. For copyright
* information and license terms see the AUTHORS and COPYING files
* in the top-level directory of this distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "dialog.h"
#include "ui_dialog.h"
#include "hwbuttondialog.h"
#include "tabletdatabase.h"
#include
#include
#include
#include
#include
#include
using namespace Wacom;
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, m_ui(new Ui::Dialog)
, m_hwbDialog(0)
{
m_ui->setupUi(this);
connect(m_ui->refreshButton, SIGNAL(clicked()),
SLOT(refreshTabletList()));
connect(m_ui->listTablets, SIGNAL(currentIndexChanged(int)),
SLOT(changeTabletSelection(int)));
connect(m_ui->hasStatusLEDsLeft, SIGNAL(toggled(bool)),
SLOT(onHasStatusLEDsLeftChanged(bool)));
connect(m_ui->hasStatusLEDsRight, SIGNAL(toggled(bool)),
SLOT(onhasStatusLEDsRightChanged(bool)));
connect(m_ui->hasTouchRing, SIGNAL(toggled(bool)),
SLOT(onhasTouchRingChanged(bool)));
connect(m_ui->hasTouchStripLeft, SIGNAL(toggled(bool)),
SLOT(onhasTouchStripLeftChanged(bool)));
connect(m_ui->hasTouchStripRight, SIGNAL(toggled(bool)),
SLOT(onhasTouchStripRightChanged(bool)));
connect(m_ui->hasWheel, SIGNAL(toggled(bool)),
SLOT(onhasWheelChanged(bool)));
connect(m_ui->expressKeyNumbers, SIGNAL(valueChanged(int)),
SLOT(onExpressKeyNumbersChanged(int)));
connect(m_ui->buttonBox, SIGNAL(clicked(QAbstractButton*)),
SLOT(buttonBoxClicked(QAbstractButton*)));
connect(m_ui->mapButtons, SIGNAL(clicked()),
SLOT(onMapButtons()));
connect(m_ui->comboTouchSensor, static_cast(&QComboBox::currentIndexChanged),
this, &Dialog::onPairedIdChanged);
connect(m_ui->radioNormalTablet, &QRadioButton::toggled, this, &Dialog::onNormalTabletSet);
connect(m_ui->radioParentTablet, &QRadioButton::toggled, this, &Dialog::onParentTabletSet);
connect(m_ui->radioTouchSensor, &QRadioButton::toggled, this, &Dialog::onTouchSensorSet);
m_ui->mapButtons->setEnabled(false);
refreshTabletList();
}
Dialog::~Dialog()
{
delete m_ui;
}
void Dialog::refreshTabletList()
{
m_ui->listTablets->blockSignals(true);
m_ui->comboTouchSensor->blockSignals(true);
m_ui->listTablets->clear();
m_ui->comboTouchSensor->clear();
m_tabletList.clear();
// fetch all connected tablets
QLatin1String program("xsetwacom");
QStringList arguments;
arguments << QLatin1String("--list") << QLatin1String("devices");
QProcess listDevices;
listDevices.start(program, arguments);
listDevices.waitForFinished();
QString listDevicesString = QString::fromLatin1(listDevices.readAll());
QStringList listDevicesStringList = listDevicesString.split(QLatin1String("\n"));
// for each tablet device fetch the device id
QMap tabletList;
foreach(const QString &s, listDevicesStringList) {
QString device = s.split(QLatin1String("\t")).first();
device = device.trimmed();
if(device.isEmpty()) {
continue;
}
QProcess checkTabletID;
arguments.clear();
arguments << QLatin1String("--get") << device << QLatin1String("TabletID");
checkTabletID.start(program, arguments);
checkTabletID.waitForFinished();
QString checkTabletIDString = QString::fromLatin1(checkTabletID.readAll());
checkTabletIDString.remove(QLatin1String("\n"));
QString tabletID = checkTabletIDString.trimmed();
QStringList tl = tabletList.value(tabletID);
tl << device;
tabletList.insert(tabletID, tl);
}
// for each device id figure out the common base name
// for most this is the name without "pad", "stylus", "touch" etc
// for some like the Wacom Pen and Touch we remove "Finger" as well
QMapIterator i(tabletList);
while (i.hasNext()) {
i.next();
QString name;
QStringList deviceList = i.value();
QString firstDevice = deviceList.takeFirst();
bool end = false;
for(int j=0; j < firstDevice.length(); j++) {
QChar c = firstDevice.at(j);
foreach(const QString &s, deviceList) {
if(s.at(j) != c) {
end = true;
break;
}
}
if(end) {
break;
}
name.append(c);
}
// create the Tablet entry
Tablet t;
t.serialID = i.key().toInt();
t.company = QLatin1String("Wacom");
t.name = name.trimmed();
t.devices = i.value();
QString hexNumber = QString::number( t.serialID, 16 );
while(hexNumber.length() < 4) {
hexNumber.prepend(QLatin1String("0"));
}
TabletInformation ti;
if (TabletDatabase::instance().lookupTablet(hexNumber.toUpper(), ti)) {
t.buttonNumber = ti.getInt(TabletInfo::NumPadButtons);
int leds = ti.getInt(TabletInfo::StatusLEDs);
t.hasStatusLEDsLeft = leds > 4;
t.hasStatusLEDsRight = leds > 0;
t.hasTouchRing = ti.getBool(TabletInfo::HasTouchRing);
t.hasTouchStripLeft = ti.getBool(TabletInfo::HasLeftTouchStrip);
t.hasTouchStripRight = ti.getBool(TabletInfo::HasRightTouchStrip);
t.hasWheel = ti.getBool(TabletInfo::HasWheel);
t.company = ti.get(TabletInfo::CompanyName);
t.name = ti.get(TabletInfo::TabletName);
t.model = ti.get(TabletInfo::TabletModel);
t.layout = ti.get(TabletInfo::ButtonLayout);
// set default button map
for(int i=1; i <= t.buttonNumber;i++) {
t.hwMapping << i;
}
- QMapIterator i(ti.getButtonMap());
- while (i.hasNext()) {
- i.next();
- int b = i.key().toInt();
- int k = i.value().toInt();
- if(b < t.hwMapping.size()) {
- t.hwMapping.replace(b-1,k);
+ const auto buttonMap = ti.getButtonMap();
+ for (const auto key : buttonMap.keys()) {
+ const auto keyIndex = key.toInt() - 1;
+ if (keyIndex < t.buttonNumber) {
+ t.hwMapping[keyIndex] = buttonMap.value(key).toInt();
}
}
auto pairedID = ti.get(TabletInfo::TouchSensorId);
if (pairedID.isEmpty()) {
t.hasPairedID = false;
} else {
t.hasPairedID = true;
t.pairedID = pairedID;
}
t.isTouchSensor = ti.getBool(TabletInfo::IsTouchSensor);
}
m_tabletList.append(t);
m_ui->listTablets->addItem(t.name);
m_ui->comboTouchSensor->addItem(t.name);
}
m_ui->listTablets->setCurrentIndex(0);
m_ui->listTablets->blockSignals(false);
m_ui->comboTouchSensor->setCurrentIndex(0);
m_ui->comboTouchSensor->blockSignals(false);
changeTabletSelection(0);
}
bool Dialog::validIndex()
{
return !m_tabletList.isEmpty() && m_tabletList.size() > m_ui->listTablets->currentIndex();
}
void Dialog::changeTabletSelection(int index)
{
if(!validIndex()) {
return;
}
Tablet t = m_tabletList.at(index);
QString hexNumber = QString::number( t.serialID, 16 );
while(hexNumber.length() < 4) {
hexNumber.prepend(QLatin1String("0"));
}
m_ui->listSerialId->setText(QString::fromLatin1("%1 [%2]")
.arg(t.serialID)
.arg(hexNumber.toUpper()));
m_ui->listDevices->setText(t.devices.join(QLatin1String("\n")));
m_ui->hasStatusLEDsLeft->setChecked(t.hasStatusLEDsLeft);
m_ui->hasStatusLEDsRight->setChecked(t.hasStatusLEDsRight);
m_ui->hasTouchRing->setChecked(t.hasTouchRing);
m_ui->hasTouchStripLeft->setChecked(t.hasTouchStripLeft);
m_ui->hasTouchStripRight->setChecked(t.hasTouchStripRight);
m_ui->hasWheel->setChecked(t.hasWheel);
m_ui->expressKeyNumbers->setValue(t.buttonNumber);
m_ui->radioNormalTablet->setChecked(!t.isTouchSensor && !t.hasPairedID);
m_ui->radioTouchSensor->setChecked(t.isTouchSensor);
m_ui->radioParentTablet->setChecked(t.hasPairedID);
m_ui->comboTouchSensor->setEnabled(t.hasPairedID);
int tabletIndex = 0;
for (const auto &tablet : m_tabletList) {
if (QString::fromLatin1("%1").arg(tablet.serialID, 4, 16, QChar::fromLatin1('0')) == t.pairedID) {
m_ui->comboTouchSensor->setCurrentIndex(tabletIndex);
break;
}
++tabletIndex;
}
showHWButtonMap();
}
void Dialog::onHasStatusLEDsLeftChanged(bool toggled)
{
if(!validIndex()) {
return;
}
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
t.hasStatusLEDsLeft = toggled;
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
}
void Dialog::onhasStatusLEDsRightChanged(bool toggled)
{
if(!validIndex()) {
return;
}
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
t.hasStatusLEDsRight = toggled;
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
}
void Dialog::onhasTouchRingChanged(bool toggled)
{
if(!validIndex()) {
return;
}
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
t.hasTouchRing = toggled;
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
}
void Dialog::onhasTouchStripLeftChanged(bool toggled)
{
if(!validIndex()) {
return;
}
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
t.hasTouchStripLeft = toggled;
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
}
void Dialog::onhasTouchStripRightChanged(bool toggled)
{
if(!validIndex()) {
return;
}
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
t.hasTouchStripRight = toggled;
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
}
void Dialog::onhasWheelChanged(bool toggled)
{
if(!validIndex()) {
return;
}
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
t.hasWheel = toggled;
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
}
void Dialog::onExpressKeyNumbersChanged(int buttons)
{
if(!validIndex()) {
return;
}
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
t.buttonNumber = buttons;
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
m_ui->mapButtons->setEnabled( m_ui->expressKeyNumbers->value() > 0 );
showHWButtonMap();
}
void Dialog::buttonBoxClicked(QAbstractButton *button)
{
QDialogButtonBox::StandardButton stdButton = m_ui->buttonBox->standardButton(button);
switch (stdButton) {
case QDialogButtonBox::Close:
qApp->quit();
break;
case QDialogButtonBox::Save:
{
if(!validIndex()) {
return;
}
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
saveTabletInfo(t);
break;
}
case QDialogButtonBox::SaveAll:
{
foreach(const Tablet &t, m_tabletList) {
saveTabletInfo(t);
}
break;
}
default:
return;
}
}
void Dialog::onPairedIdChanged(int index)
{
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
t.pairedID = QString::fromLatin1("%1").arg(m_tabletList.at(index).serialID, 4, 16, QChar::fromLatin1('0'));
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
}
void Dialog::onNormalTabletSet(bool enabled)
{
if (enabled) {
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
t.isTouchSensor = false;
t.hasPairedID = false;
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
m_ui->comboTouchSensor->setEnabled(false);
}
}
void Dialog::onParentTabletSet(bool enabled)
{
if (enabled) {
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
t.isTouchSensor = false;
t.hasPairedID = true;
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
m_ui->comboTouchSensor->setEnabled(true);
} else {
m_ui->comboTouchSensor->setEnabled(false);
}
}
void Dialog::onTouchSensorSet(bool enabled)
{
if (enabled) {
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
t.isTouchSensor = true;
t.hasPairedID = false;
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
m_ui->comboTouchSensor->setEnabled(false);
}
}
void Dialog::onMapButtons()
{
m_hwbDialog = new HWButtonDialog(m_ui->expressKeyNumbers->value(), this);
int ret = m_hwbDialog->exec();
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
if (ret == QDialog::Accepted) {
t.hwMapping = m_hwbDialog->buttonMap();
} else {
t.hwMapping.clear();
}
m_tabletList.replace(m_ui->listTablets->currentIndex(), t);
showHWButtonMap();
}
void Dialog::showHWButtonMap()
{
Tablet t = m_tabletList.at(m_ui->listTablets->currentIndex());
QString text;
for (int i = 0; i < t.hwMapping.size(); ++i) {
text.append(i18n("Button %1 maps to Button %2", (i+1), t.hwMapping.at(i)));
text.append(QLatin1String("\n"));
}
m_ui->buttonMappingLabel->setText(text);
}
void Dialog::saveTabletInfo(const Tablet &t)
{
KConfig config(QLatin1String("tabletdblocalrc"));
QString hexNumber = QString::number( t.serialID, 16 );
while(hexNumber.length() < 4) {
hexNumber.prepend(QLatin1String("0"));
}
KConfigGroup tabletGroup( &config, hexNumber.toUpper() );
tabletGroup.deleteGroup();
tabletGroup.config()->sync();
tabletGroup.writeEntry( "model", t.model );
tabletGroup.writeEntry( "layout", t.layout );
tabletGroup.writeEntry( "name", t.name );
int leds = 0;
if(t.hasStatusLEDsLeft && t.hasStatusLEDsRight) {
leds = 8;
}
else if(t.hasStatusLEDsLeft || t.hasStatusLEDsRight) {
leds = 4;
}
tabletGroup.writeEntry( "statusleds", leds );
tabletGroup.writeEntry( "wheel", t.hasWheel );
tabletGroup.writeEntry( "touchring", t.hasTouchRing );
tabletGroup.writeEntry( "touchstripl", t.hasTouchStripLeft );
tabletGroup.writeEntry( "touchstripr", t.hasTouchStripRight );
tabletGroup.writeEntry( "padbuttons", t.buttonNumber );
for(int i=0; i < t.hwMapping.size(); i++) {
tabletGroup.writeEntry( QString::fromLatin1("hwbutton%1").arg(i+1), t.hwMapping.at(i) );
}
if (t.isTouchSensor) {
tabletGroup.writeEntry("istouchsensor", t.isTouchSensor);
}
if (t.hasPairedID) {
tabletGroup.writeEntry("touchsensorid", t.pairedID);
}
tabletGroup.config()->sync();
}