Use of new enroll dialog.
[KFingerManager.git] / src / FingerManagerWindow.cpp
blob275cb741f1e7d700f2373fb242a39b81d7473395
1 #include <KConfig>
2 #include <KConfigGroup>
3 #include <KLocale>
4 #include <KSeparator>
5 #include <QWidget>
6 #include <QPixmap>
7 #include <QButtonGroup>
8 #include <QSize>
9 #include <QtCore>
10 #include <QHBoxLayout>
11 #include <QVBoxLayout>
12 #include <KPushButton>
13 #include <KMessageBox>
15 #include "FingerManagerWindow.h"
16 #include "FingerManagerDevicesModel.h"
17 #include "FMDbusConn.h"
18 #include "FingerNames.h"
19 #include "FMEnroll.h"
21 int y_base;
23 /**
24 * Handle checkbox status changes
26 void FingerManagerWindow::fingerSelected(int idx) {
27 int devid = devices->currentIndex();
28 if (devid > -1) {
29 qDebug("%s: %d", fingerNames[idx].iface, fingers[idx]->isChecked());
30 if (fingers[idx]->isChecked()) {
31 KMessageBox::sorry(this, i18n("Deletion of single "
32 "fingerprint is not supported in fprintd D-Bus "
33 "daemon"));
34 fingers[idx]->setChecked(true);fingers[idx]->setChecked(true);
35 } else {
36 // QString device = ((FingerManagerDevicesModel*)devices->model())->
37 // getDeviceName(devid);
38 // QString msg = QString(i18n("Enroll finger \"%1\" on device \"%2\" for user \"%3\"?"));
39 // msg = msg.arg(fingerNames[idx].name, device, getlogin());
40 // int result = KMessageBox::questionYesNo(this,
41 // msg,
42 // i18n("Enroll?"));
43 // if (result == KMessageBox::Yes) {
44 // fingers[idx]->setChecked(true);
45 // } else {
46 // fingers[idx]->setChecked(false);
47 // }
48 FMEnroll *e = new FMEnroll(
49 ((FingerManagerDevicesModel*)devices->model())->getDeviceModel(devid),
50 idx,
51 this);
52 e->exec();
57 /**
58 * Fill combo box with founded devices
60 void FingerManagerWindow::addDevices(int idx) {
61 qDebug("Devices were discovered (%d)...", idx);
62 FingerManagerDevicesModel* m = dbc->getModel(idx);
63 devices->setModel(m);
64 devices->setCurrentIndex(m->getDefault());
67 /**
68 * Retrieves enrolled fingers from dbus and set checked corresponding checkboxes
70 void FingerManagerWindow::processFingers(int idx) {
71 qDebug("Enrolled fingers were discovered (%d)", idx);
72 QStringList fngrs = dbc->getFingers(idx);
73 for (int i = 0; i < 10; i++) {
74 if (fingers[i]) fingers[i]->setChecked(false);
76 for (int i = 0; i < fngrs.size(); i++) {
77 QString finger = fngrs.at(i);
78 for (int j = 0; j < 10; j++) {
79 if (finger == fingerNames[j].iface) {
80 if (fingers[i]) fingers[j]->setChecked(true);
86 /**
87 * Hook after search enrolled fingerprints for selected device
89 void FingerManagerWindow::deviceChanged(int idx) {
90 if (idx > -1) {
91 qDebug() << "deviceChanged: "<< ((FingerManagerDevicesModel*)devices->model())->getDevicePath(idx);
92 dbc->getEnrolledFingers(((FingerManagerDevicesModel*)devices->model())->getDevicePath(idx), getlogin());
93 deleteAllBtn->setEnabled(true);
94 } else {
95 deleteAllBtn->setEnabled(false);
99 /**
100 * Hook after deletion all enrolled fingerprints for selected device
102 void FingerManagerWindow::fingerprintsDeleted() {
103 deviceChanged(devices->currentIndex());
107 * Verify deletion of enrolled fingerprints on selected device for current user
109 void FingerManagerWindow::deleteAll() {
110 //get device
111 int idx = devices->currentIndex();
112 if (idx > -1) {
113 // Warning message
114 QString device = ((FingerManagerDevicesModel*)devices->model())->
115 getDeviceName(idx);
116 QString msg = QString(i18n("Do you really want delete all fingerprints "
117 "on device \"%1\" for user \"%2\""));
118 msg = msg.arg(device, getlogin());
119 // Show Yes/No message box
120 int result = KMessageBox::questionYesNo(this, msg);
121 if (result == KMessageBox::Yes) {
122 qDebug() << "Deleting all enrolled fingerprints...";
123 dbc->deleteAllEnrolledFingers(
124 ((FingerManagerDevicesModel*)devices->model())->getDevicePath(idx),
125 getlogin());
130 QCheckBox* FingerManagerWindow::createCheckBox(int idx, int x, int y) {
131 QCheckBox *cb = new QCheckBox(handsPanel);
132 QSize size = cb->sizeHint();
133 cb->setGeometry(QRect(x - (size.width()/2),
134 y_base + y - (size.height()/2),
135 size.height(),
136 size.height()));
137 btng->addButton(cb, idx);
138 return(cb);
141 void FingerManagerWindow::load(KConfig *settings) {
142 // Config helper
143 KConfigGroup cfgGroup;
145 // Load image
146 cfgGroup = settings->group("image");
147 y_base = cfgGroup.readEntry("base", 20);
149 QString filename = cfgGroup.readEntry("filename", "/home/djaara/.config/djaara.net/hands.png");
150 QPixmap image = QPixmap(filename);
151 if (!image.isNull()) {
152 handsLabel->setPixmap(image);
153 } else {
154 handsLabel->setText("File not found: " + filename);
156 handsLabel->setGeometry(QRect(0, y_base, image.width(), image.height()));
158 // Set handsPanel dimension
159 handsPanel->setFixedWidth(handsLabel->width());
160 handsPanel->setFixedHeight(handsLabel->height());
162 // Load checkboxes
163 cfgGroup = settings->group("fingers");
164 fingersCount = cfgGroup.readEntry("count", 0);
165 for (int i = 0; i < fingersCount && i < MAX_FINGERS; i++) {
166 QString name;
168 name.sprintf("%d/x", i+1);
169 int x = cfgGroup.readEntry(name, 0);
171 name.sprintf("%d/y", i+1);
172 int y = cfgGroup.readEntry(name, 0);
174 name.sprintf("%d/idx", i+1);
175 unsigned int idx = cfgGroup.readEntry(name, i);
177 if (x && y && idx < MAX_FINGERS) {
178 qDebug("Adding new checkbox[%d]", idx);
179 fingers[idx] = createCheckBox(idx, x, y);
180 } else {
181 qDebug("Checkbox[%d] skipped", idx);
182 fingers[idx] = 0;
189 * Actualize all texts in window after language changes
191 void FingerManagerWindow::retranslate() {
192 // Window title
193 setWindowTitle(i18n("Finger manager..."));
195 // What's this
196 setWhatsThis(i18n("Finger Manager Application"));
198 deviceLabel->setText(i18n("Select device:"));
199 deleteAllBtn->setText(i18n("Delete all"));
200 deleteAllBtn->setToolTip(i18n("Delete all enrolled fingerprints on selected device."));
202 for (int i = 0; i < 10; i++) {
203 if (fingers[i]) {
204 fingers[i]->setWhatsThis(i18n(fingerNames[i].name));
205 fingers[i]->setToolTip(i18n(fingerNames[i].name));
211 * FingerManagerWindow contructor
213 FingerManagerWindow::FingerManagerWindow(QWidget *parent,
214 Qt::WindowFlags wflags) : KDialog(parent, wflags) {
215 // Only OK button, precedent by separator
216 setButtons(KDialog::Ok);
217 showButtonSeparator(true);
219 // Prepare component
220 initComponents();
221 load(settings);
222 retranslate();
224 // Connect to FMDbusConn
225 QObject::connect(dbc, SIGNAL(devicesDiscovered(int)), this, SLOT(addDevices(int)));
226 QObject::connect(dbc, SIGNAL(enrolledFingersDiscovered(int)), this, SLOT(processFingers(int)));
227 QObject::connect(dbc, SIGNAL(enrolledFingersDeleted()), this, SLOT(fingerprintsDeleted()));
228 dbc->getDevices();
230 // Dialog's main widget
231 setMainWidget(mainPanel);
233 // Handle all check buttons
234 btng->setExclusive(false);
235 QObject::connect(btng, SIGNAL(buttonPressed(int)), SLOT(fingerSelected(int)));
237 // Handle delete all button
238 QObject::connect(deleteAllBtn, SIGNAL(pressed()), this, SLOT(deleteAll()));
240 // layout
241 mainPanelLayout->addWidget(handsPanel);
242 mainPanelLayout->addWidget(separator);
243 devicesLayout->addWidget(deviceLabel);
244 devicesLayout->addWidget(devices);
245 devicesLayout->addStretch();
246 devicesLayout->addWidget(deleteAllBtn);
247 mainPanelLayout->addLayout(devicesLayout);
248 mainPanel->setLayout(mainPanelLayout);
250 QObject::connect(devices, SIGNAL(currentIndexChanged(int)), this, SLOT(deviceChanged(int)));
252 setMaximumSize(minimumSizeHint());
256 * void initComponents()
257 * Initialize main components of FingerManagerWindow
259 void FingerManagerWindow::initComponents() {
260 dbc = new FMDbusConn;
261 mainPanel = new QWidget();
262 handsPanel = new QWidget();
263 btng = new QButtonGroup(handsPanel);
264 settings = new KConfig("kfingerrc");
265 handsLabel = new QLabel(handsPanel);
266 deviceLabel = new QLabel();
267 devices = new QComboBox;
268 devices->setModel(new FingerManagerDevicesModel);
269 devicesLayout = new QHBoxLayout();
270 mainPanelLayout = new QVBoxLayout();
271 mainPanelLayout->setSizeConstraint(QLayout::SetFixedSize);
272 separator = new KSeparator(mainPanel);
273 deleteAllBtn = new KPushButton();
274 deleteAllBtn->setEnabled(false);
278 * FingerManagerWindow destructor
280 FingerManagerWindow::~FingerManagerWindow() {
281 for (int i = 0; i < fingersCount; i++) {
282 if (fingers[i]) delete fingers[i];
284 if (dbc) {
285 dbc->disconnect();
286 delete dbc;
288 if (settings) delete settings;
289 if (btng) delete btng;
290 if (devices) {
291 delete devices;
293 if (deleteAllBtn) delete deleteAllBtn;
294 if (handsLabel) delete handsLabel;
295 if (separator) delete separator;
296 if (devicesLayout) delete devicesLayout;
297 if (handsPanel) delete handsPanel;
298 if (mainPanelLayout) delete mainPanelLayout;
299 if (mainPanel) delete mainPanel;