Commit e38339f1 authored by Alvin Wong's avatar Alvin Wong

Merge branch 'alvin/D12710-tablet-tester'

Add tablet tester from Drawpile, with some changes.

Differential Revision: https://phabricator.kde.org/D12710
parents b1d67ddc c0cf2856
......@@ -421,6 +421,8 @@ endif()
canvas/kis_animation_player.cpp
kis_animation_importer.cpp
KisSyncedAudioPlayback.cpp
input/wintab/drawpile_tablettester/tablettester.cpp
input/wintab/drawpile_tablettester/tablettest.cpp
)
if(UNIX)
......@@ -522,6 +524,7 @@ ki18n_wrap_ui(kritaui_LIB_SRCS
wdgsplash.ui
input/wintab/kis_screen_size_choice_dialog.ui
input/wintab/drawpile_tablettester/tablettest.ui
)
......
......@@ -82,6 +82,7 @@
#include <kis_signals_blocker.h>
#include "input/config/kis_input_configuration_page.h"
#include "input/wintab/drawpile_tablettester/tablettester.h"
#ifdef Q_OS_WIN
# include <kis_tablet_support_win8.h>
......@@ -663,6 +664,13 @@ TabletSettingsTab::TabletSettingsTab(QWidget* parent, const char* name): QWidget
#else
m_page->grpTabletApi->setVisible(false);
#endif
connect(m_page->btnTabletTest, SIGNAL(clicked()), SLOT(slotTabletTest()));
}
void TabletSettingsTab::slotTabletTest()
{
TabletTestDialog tabletTestDialog(this);
tabletTestDialog.exec();
}
......
......@@ -195,6 +195,9 @@ class TabletSettingsTab : public QWidget {
public:
TabletSettingsTab(QWidget *parent = 0, const char *name = 0);
private Q_SLOTS:
void slotTabletTest();
public:
void setDefault();
WdgTabletSettings *m_page;
......
......@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>569</width>
<height>366</height>
<height>433</height>
</rect>
</property>
<property name="sizePolicy">
......@@ -152,7 +152,7 @@
</property>
</spacer>
</item>
<item row="3" column="0">
<item row="4" column="0">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
......@@ -165,6 +165,13 @@
</property>
</spacer>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPushButton" name="btnTabletTest">
<property name="text">
<string>Open Tablet Tester...</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QGroupBox" name="grpTabletApi">
<property name="title">
......
Notes on code originating from external source:
Tablet Tester
=============
Files are taken and possibly modified from the git repo of [Drawpile] on
commit bc06dceba83e8c758d25cfe81b986e18f38aae95.
[Drawpile]: https://github.com/drawpile/Drawpile
File | Original in repo of Drawpile
-------------------- | ---
tablettester.cpp | src/desktop/dialogs/tablettester.cpp
tablettester.h | src/desktop/dialogs/tablettester.h
tablettest.cpp | src/desktop/widgets/tablettest.cpp
tablettest.h | src/desktop/widgets/tablettest.h
tablettest.ui | src/desktop/ui/tablettest.ui
/*
Drawpile - a collaborative drawing program.
Copyright (C) 2017 Calle Laakkonen
Drawpile 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 3 of the License, or
(at your option) any later version.
Drawpile 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 Drawpile. If not, see <http://www.gnu.org/licenses/>.
*/
#include "tablettest.h"
#include <QPaintEvent>
#include <QPainter>
TabletTester::TabletTester(QWidget *parent)
: QWidget(parent), m_mouseDown(false), m_tabletDown(false)
{
}
void TabletTester::clear()
{
m_mousePath.clear();
m_tabletPath.clear();
update();
}
void TabletTester::paintEvent(QPaintEvent *e)
{
Q_UNUSED(e);
const int w = width();
const int h = height();
QPainter p(this);
p.fillRect(0, 0, w, h, QColor(200, 200, 200));
p.setPen(QColor(128, 128, 128));
// Draw grid
for(int i=w/8;i<w;i+=w/8)
p.drawLine(i, 0, i, h);
for(int i=h/8;i<h;i+=h/8)
p.drawLine(0, i, w, i);
// Draw paths
if(!m_mousePath.isEmpty()) {
p.setPen(QPen(Qt::red, 3));
p.drawPolyline(m_mousePath);
}
if(!m_tabletPath.isEmpty()) {
p.setPen(QPen(Qt::blue, 2));
p.drawPolyline(m_tabletPath);
}
}
void TabletTester::mousePressEvent(QMouseEvent *e)
{
Q_EMIT eventReport(QString("Mouse press X=%1 Y=%2 B=%3").arg(e->x()).arg(e->y()).arg(e->button()));
m_mouseDown = true;
m_mousePath.clear();
update();
}
void TabletTester::mouseMoveEvent(QMouseEvent *e)
{
Q_EMIT eventReport(QString("Mouse move X=%1 Y=%2 B=%3").arg(e->x()).arg(e->y()).arg(e->buttons()));
m_mousePath << e->pos();
update();
}
void TabletTester::mouseReleaseEvent(QMouseEvent *e)
{
Q_UNUSED(e);
Q_EMIT eventReport(QString("Mouse release"));
m_mouseDown = false;
}
void TabletTester::tabletEvent(QTabletEvent *e)
{
e->accept();
QString msg;
switch(e->device()) {
case QTabletEvent::Stylus: msg = "Stylus"; break;
default: msg = QString("Device(%1)").arg(e->device()); break;
}
switch(e->type()) {
case QEvent::TabletMove:
msg += " move";
break;
case QEvent::TabletPress:
msg += " press";
m_tabletPath.clear();
m_tabletDown = true;
break;
case QEvent::TabletRelease:
msg += " release";
m_tabletDown = false;
break;
default:
msg += QString(" event-%1").arg(e->type());
break;
}
msg += QString(" X=%1 Y=%2 B=%3 P=%4%")
.arg(e->posF().x(), 0, 'f', 2)
.arg(e->posF().y(), 0, 'f', 2)
.arg(e->buttons())
.arg(e->pressure()*100, 0, 'f', 1)
;
if(e->type() == QEvent::TabletMove) {
if(m_tabletDown) {
msg += " (DRAW)";
m_tabletPath << e->pos();
update();
} else {
msg += " (HOVER)";
}
}
Q_EMIT eventReport(msg);
}
/*
Drawpile - a collaborative drawing program.
Copyright (C) 2017 Calle Laakkonen
Drawpile 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 3 of the License, or
(at your option) any later version.
Drawpile 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 Drawpile. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TABLETTEST_WIDGET_H
#define TABLETTEST_WIDGET_H
#include <QWidget>
class TabletTester : public QWidget {
Q_OBJECT
public:
TabletTester(QWidget *parent=nullptr);
public Q_SLOTS:
void clear();
Q_SIGNALS:
void eventReport(const QString &msg);
protected:
void paintEvent(QPaintEvent *e) override;
void mousePressEvent(QMouseEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
void tabletEvent(QTabletEvent *e) override;
private:
QPolygon m_mousePath;
QPolygon m_tabletPath;
bool m_mouseDown;
bool m_tabletDown;
};
#endif
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TabletTest</class>
<widget class="QDialog" name="TabletTest">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>730</width>
<height>385</height>
</rect>
</property>
<property name="windowTitle">
<string>Tablet Tester</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1">
<item>
<widget class="TabletTester" name="tablettest"/>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPlainTextEdit" name="logView">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Clear</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>TabletTester</class>
<extends>QWidget</extends>
<header>input/wintab/drawpile_tablettester/tablettest.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>pushButton</sender>
<signal>clicked()</signal>
<receiver>logView</receiver>
<slot>clear()</slot>
<hints>
<hint type="sourcelabel">
<x>722</x>
<y>377</y>
</hint>
<hint type="destinationlabel">
<x>659</x>
<y>84</y>
</hint>
</hints>
</connection>
<connection>
<sender>pushButton</sender>
<signal>clicked()</signal>
<receiver>tablettest</receiver>
<slot>clear()</slot>
<hints>
<hint type="sourcelabel">
<x>419</x>
<y>359</y>
</hint>
<hint type="destinationlabel">
<x>142</x>
<y>242</y>
</hint>
</hints>
</connection>
<connection>
<sender>tablettest</sender>
<signal>eventReport(QString)</signal>
<receiver>logView</receiver>
<slot>appendPlainText(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>287</x>
<y>187</y>
</hint>
<hint type="destinationlabel">
<x>546</x>
<y>207</y>
</hint>
</hints>
</connection>
</connections>
</ui>
/*
Drawpile - a collaborative drawing program.
Copyright (C) 2017 Calle Laakkonen
Drawpile 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 3 of the License, or
(at your option) any later version.
Drawpile 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 Drawpile. If not, see <http://www.gnu.org/licenses/>.
*/
#include "tablettester.h"
#include "tablettest.h"
#include "ui_tablettest.h"
TabletTestDialog::TabletTestDialog( QWidget *parent) :
QDialog(parent, Qt::Window)
{
m_ui = new Ui_TabletTest;
m_ui->setupUi(this);
qApp->installEventFilter(this);
}
TabletTestDialog::~TabletTestDialog()
{
qApp->removeEventFilter(this);
delete m_ui;
}
bool TabletTestDialog::eventFilter(QObject *watched, QEvent *e) {
Q_UNUSED(watched);
if(e->type() == QEvent::TabletEnterProximity || e->type() == QEvent::TabletLeaveProximity) {
QTabletEvent *te = static_cast<QTabletEvent*>(e);
bool isEraser = te->pointerType() == QTabletEvent::Eraser;
bool isNear = e->type() == QEvent::TabletEnterProximity;
QString msg;
if(isEraser) {
if (isNear) {
msg = QStringLiteral("Eraser brought near");
} else {
msg = QStringLiteral("Eraser taken away");
}
} else {
if (isNear) {
msg = QStringLiteral("Pen tip brought near");
} else {
msg = QStringLiteral("Pen tip taken away");
}
}
m_ui->logView->appendPlainText(msg);
}
return QDialog::eventFilter(watched, e);
}
/*
Drawpile - a collaborative drawing program.
Copyright (C) 2017 Calle Laakkonen
Drawpile 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 3 of the License, or
(at your option) any later version.
Drawpile 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 Drawpile. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TABLETTESTDIALOG_H
#define TABLETTESTDIALOG_H
#include <QDialog>
class Ui_TabletTest;
class TabletTestDialog : public QDialog
{
Q_OBJECT
public:
TabletTestDialog(QWidget *parent=nullptr);
~TabletTestDialog();
bool eventFilter(QObject *watched, QEvent *event) override;
private:
Ui_TabletTest *m_ui;
};
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment