From 85860fc5f4c27a6e8f5031e9f19f4fe3a444b5b0 Mon Sep 17 00:00:00 2001 From: Jaroslav Barton Date: Sat, 14 Mar 2009 00:26:09 +0100 Subject: [PATCH] Initial version --- .gitignore | 3 ++ CMakeLists.txt | 31 ++++++++++++ img/hands.ini | 26 ++++++++++ img/hands.png | Bin 0 -> 30018 bytes img/hands.svg | 104 +++++++++++++++++++++++++++++++++++++++ img/kfingerrc | 26 ++++++++++ src/FMDbusConn.cpp | 18 +++++++ src/FMDbusConn.h | 13 +++++ src/FingerManagerWindow.cpp | 115 ++++++++++++++++++++++++++++++++++++++++++++ src/FingerManagerWindow.h | 39 +++++++++++++++ src/FingerNames.h | 17 +++++++ src/main.cpp | 26 ++++++++++ 12 files changed, 418 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 img/hands.ini create mode 100644 img/hands.png create mode 100644 img/hands.svg create mode 100644 img/kfingerrc create mode 100644 src/FMDbusConn.cpp create mode 100644 src/FMDbusConn.h create mode 100644 src/FingerManagerWindow.cpp create mode 100644 src/FingerManagerWindow.h create mode 100644 src/FingerNames.h create mode 100644 src/main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..71a9f60 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +build/* +*~ +img/Measurements_of_the_hand.svg diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..77b594a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,31 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) + +PROJECT( FingerManager ) + +SET( FPRINT_ASK_SOURCES + ./src/main.cpp + ./src/FingerManagerWindow.cpp + ./src/FMDbusConn.cpp +) + +SET( FPRINT_ASK_HEADERS + ./src/FingerManagerWindow.h +) + +ADD_DEFINITIONS( -Wall -std=c++98 ) + +FIND_PACKAGE( Qt4 REQUIRED ) +FIND_PACKAGE( KDE4 REQUIRED ) + +INCLUDE( ${QT_USE_FILE} ) + +INCLUDE_DIRECTORIES( ./ ../ ${QT_INCLUDE_DIR} ${QT_QTDBUS_INCLUDE_DIR} + ${KDE4_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}) + +QT4_WRAP_CPP( FPRINT_MOC_SOURCES ${FPRINT_ASK_HEADERS} ) + +ADD_EXECUTABLE( FingerManagerApp ${FPRINT_MOC_SOURCES} ${FPRINT_ASK_SOURCES} ) + +TARGET_LINK_LIBRARIES( FingerManagerApp ${QT_LIBRARIES} ${QT_QTDBUS_LIBRARY} + ${KDE4_KDEUI_LIBS} ) + diff --git a/img/hands.ini b/img/hands.ini new file mode 100644 index 0000000..064ae1a --- /dev/null +++ b/img/hands.ini @@ -0,0 +1,26 @@ +[image] +filename=../img/hands.png +base=20 + +[fingers] +1\x=5 +1\y=160 +2\x=15 +2\y=75 +3\x=50 +3\y=15 +4\x=145 +4\y=-15 +5\x=285 +5\y=100 +6\x=338 +6\y=100 +7\x=478 +7\y=-15 +8\x=573 +8\y=15 +9\x=608 +9\y=75 +10\x=618 +10\y=160 +size=10 diff --git a/img/hands.png b/img/hands.png new file mode 100644 index 0000000000000000000000000000000000000000..9a8a95621e8efa4178db29577c676426b2494f99 GIT binary patch literal 30018 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 literal 0 HcwPel00001 diff --git a/img/hands.svg b/img/hands.svg new file mode 100644 index 0000000..041174a --- /dev/null +++ b/img/hands.svg @@ -0,0 +1,104 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/img/kfingerrc b/img/kfingerrc new file mode 100644 index 0000000..20cd8c6 --- /dev/null +++ b/img/kfingerrc @@ -0,0 +1,26 @@ +[fingers] +1/x=15 +1/y=170 +10/x=630 +10/y=170 +2/x=25 +2/y=87 +3/x=59 +3/y=25 +4/x=154 +4/y=-6 +5/x=295 +5/y=110 +6/x=352 +6/y=110 +7/x=492 +7/y=-6 +8/x=586 +8/y=25 +9/x=620 +9/y=87 +count=10 + +[image] +base=20 +filename=/home/djaara/.config/djaara.net/hands.png diff --git a/src/FMDbusConn.cpp b/src/FMDbusConn.cpp new file mode 100644 index 0000000..7dde7bd --- /dev/null +++ b/src/FMDbusConn.cpp @@ -0,0 +1,18 @@ +#include + +#include "FMDbusConn.h" + + +FMDbusConn::FMDbusConn() { + QDBusReply reply = QDBusConnection::sessionBus().interface()->registeredServiceNames(); + if (!reply.isValid()) { + qDebug() << "Error:" << reply.error().message(); + exit(1); + } + foreach (QString name, reply.value()) + qDebug() << name; +}; + +FMDbusConn::~FMDbusConn() { + +} diff --git a/src/FMDbusConn.h b/src/FMDbusConn.h new file mode 100644 index 0000000..172152f --- /dev/null +++ b/src/FMDbusConn.h @@ -0,0 +1,13 @@ +#ifndef FMDBUSCONN_H_ +#define FMDBUSCONN_H_ + +#include + +class FMDbusConn { + + public: + FMDbusConn(); + ~FMDbusConn(); +}; + +#endif /*FMDBUSCONN_H_*/ diff --git a/src/FingerManagerWindow.cpp b/src/FingerManagerWindow.cpp new file mode 100644 index 0000000..984eeef --- /dev/null +++ b/src/FingerManagerWindow.cpp @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "FingerManagerWindow.h" +#include "FMDbusConn.h" +#include "FingerNames.h" + +int y_base; + +void FingerManagerWindow::fingerSelected(int idx) { + qDebug() << "fingers[" <isChecked(); +} + +QCheckBox* FingerManagerWindow::createCheckBox(int idx, int x, int y) { + QCheckBox *cb = new QCheckBox(this); + QSize size = cb->sizeHint(); + cb->setGeometry(QRect(x - (size.width()/2), + y_base + y - (size.height()/2), + size.height(), + size.height())); + cb->setWhatsThis(i18n(fingerNames[idx])); + btng->addButton(cb, idx); + return(cb); +} + +void FingerManagerWindow::load(KConfig *settings) { + // Config helper + KConfigGroup cfgGroup; + + // Load image + cfgGroup = settings->group("image"); + y_base = cfgGroup.readEntry("base", 20); + + QString filename = cfgGroup.readEntry("filename", "/home/djaara/.config/djaara.net/hands.png"); + cfgGroup.writeEntry("filename", "/home/djaara/.config/djaara.net/hands.png"); + QPixmap image = QPixmap(filename); + if (!image.isNull()) { + handsLabel->setPixmap(image); + } else { + handsLabel->setText("File not found: " + filename); + } + handsLabel->setGeometry(QRect(0, y_base, image.width(), image.height())); + + // Load checkboxes + cfgGroup = settings->group("fingers"); + fingersCount = cfgGroup.readEntry("count", 0); + for (int i = 1; i < fingersCount + 1; i++) { + QString name; + fingers[i] = NULL; + + name.sprintf("%d/x", i); + int x = cfgGroup.readEntry(name, 0); + + name.sprintf("%d/y", i); + int y = cfgGroup.readEntry(name, 0); + + name.sprintf("%d/idx", i); + int idx = cfgGroup.readEntry(name, i); + + if (x && y) + fingers[i-1] = createCheckBox(idx - 1, x, y); + } + +} + +FingerManagerWindow::FingerManagerWindow(QWidget *parent, + Qt::WindowFlags wflags) : KDialog(parent, wflags) { + // No OK or Cancel buttons + setButtons(KDialog::None); + + // Window title + setWindowTitle("Finger manager..."); + + setWhatsThis(i18n("Finger Manager Application")); + + // Prepare component + initComponents(); + load(settings); + + // Handle all check buttons + btng->setExclusive(false); + QObject::connect(btng, SIGNAL(buttonClicked(int)), SLOT(fingerSelected(int))); + + // Set fixed size + setMinimumWidth(handsLabel->width()); + setMinimumHeight(handsLabel->height()); + setMaximumWidth(handsLabel->width()); + setMaximumHeight(handsLabel->height()); + + FMDbusConn dbc; +} + +/** + * void initComponents() + * Initialize main components of FingerManagerWindow + */ +void FingerManagerWindow::initComponents() { + btng = new QButtonGroup(this); + settings = new KConfig("kfingerrc"); + handsLabel = new QLabel(this); +} + +FingerManagerWindow::~FingerManagerWindow() { + for (int i = 0; i < fingersCount; i++) { + if (fingers[i]) delete fingers[i]; + } + if (settings) delete settings; + if (btng) delete btng; + if (handsLabel) delete handsLabel; +} diff --git a/src/FingerManagerWindow.h b/src/FingerManagerWindow.h new file mode 100644 index 0000000..ab5fcfa --- /dev/null +++ b/src/FingerManagerWindow.h @@ -0,0 +1,39 @@ +#ifndef FINGERMANAGERWINDOW_H_ +#define FINGERMANAGERWINDOW_H_ + +#include +#include +#include +#include +#include +#include +#include + +typedef struct { + int x; + int y; +} pos; + +class FingerManagerWindow : public KDialog { + + Q_OBJECT + + public slots: + void fingerSelected(int finger); + private: + //QSvgWidget handsImage; + QLabel *handsLabel; + QButtonGroup *btng; + QCheckBox *fingers[10]; + KConfig *settings; + int fingersCount; + + QCheckBox* createCheckBox(int idx, int x, int y); + void initComponents(); + void load(KConfig *config); + public: + FingerManagerWindow(QWidget *parent = NULL, Qt::WindowFlags wflags = Qt::Dialog); + virtual ~FingerManagerWindow(); +}; + +#endif /*FINGERMANAGERWINDOW_H_*/ diff --git a/src/FingerNames.h b/src/FingerNames.h new file mode 100644 index 0000000..d711af2 --- /dev/null +++ b/src/FingerNames.h @@ -0,0 +1,17 @@ +#ifndef FINGERNAMES_H_ +#define FINGERNAMES_H_ + +const char* fingerNames[10] = { + "Left little finger", + "Left ring finger", + "Left middle finger", + "Left index finger", + "Left thumb", + "Right thumb", + "Right index finger", + "Right middle finger", + "Right ring finger", + "Right little finger" +}; + +#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..36654db --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,26 @@ +#include +#include +#include +#include "FingerManagerWindow.h" + +#include + +const static char fingerManagerVersion[] = "0.1"; +int main(int argc, char** argv) { + + KAboutData about("finger-manager", "KFingerManager", + ki18n("Manage Enrolled Fingers"), fingerManagerVersion, + ki18n("Manage Enrolled Fingers of User"), KAboutData::License_GPL, + ki18n("(c) 2009 Jaroslav Barton"), ki18n(0L)); + about.addAuthor(ki18n("Jaroslav Barton"), ki18n("Maintainer"), "djaara@djaara.net"); + about.setProductName("kfinger/kfingermanager"); + + KCmdLineArgs::init(argc, argv, &about); + KApplication app(true); + +// app.setOrganizationName("djaara.net"); +// app.setApplicationName("FingerManager"); + + FingerManagerWindow fmw; + return(fmw.exec()); +} -- 2.11.4.GIT