2 #include <KConfigGroup>
7 #include <QButtonGroup>
10 #include <QHBoxLayout>
11 #include <QVBoxLayout>
12 #include <KPushButton>
13 #include <KMessageBox>
14 #include <KPluginFactory>
15 #include <KPluginLoader>
17 #include "FingerManagerWindow.h"
18 #include "FingerManagerDevicesModel.h"
19 #include "FMDbusConn.h"
20 #include "FingerNames.h"
25 K_PLUGIN_FACTORY(FingerManagerWindowFactory
,
26 registerPlugin
<FingerManagerWindow
>();
29 K_EXPORT_PLUGIN(FingerManagerWindowFactory("kcmkfingermanager"))
31 const static char fingerManagerVersion
[] = "v0.0.4";
34 * Handle checkbox status changes
36 void FingerManagerWindow::fingerSelected(int idx
) {
37 int devid
= devices
->currentIndex();
39 qDebug("%s: %d", fingerNames
[idx
].iface
, fingers
[idx
]->isChecked());
40 if (fingers
[idx
]->isChecked()) {
41 KMessageBox::sorry(this, i18n("Deletion of single "
42 "fingerprint is not supported in fprintd D-Bus "
44 fingers
[idx
]->setChecked(true);
46 // QString device = ((FingerManagerDevicesModel*)devices->model())->
47 // getDeviceName(devid);
48 // QString msg = QString(i18n("Enroll finger \"%1\" on device \"%2\" for user \"%3\"?"));
49 // msg = msg.arg(fingerNames[idx].name, device, login);
50 // int result = KMessageBox::questionYesNo(this,
53 // if (result == KMessageBox::Yes) {
54 // fingers[idx]->setChecked(true);
56 // fingers[idx]->setChecked(false);
58 FMEnroll
*e
= new FMEnroll(
59 ((FingerManagerDevicesModel
*)devices
->model())->getDeviceModel(devid
),
63 int retval
= e
->exec();
65 if (retval
== QDialog::Rejected
) {
66 fingers
[idx
]->setChecked(false);
73 * Retrieves enrolled fingers from dbus and set checked corresponding checkboxes
75 void FingerManagerWindow::processFingers(QStringList fngrs
) {
76 qDebug("Enrolled fingers were discovered (%d)", fngrs
.size());
77 for (int i
= 0; i
< 10; i
++) {
78 if (fingers
[i
]) fingers
[i
]->setChecked(false);
80 for (int i
= 0; i
< fngrs
.size(); i
++) {
81 QString finger
= fngrs
.at(i
);
82 for (int j
= 0; j
< 10; j
++) {
83 if (finger
== fingerNames
[j
].iface
) {
84 if (fingers
[j
]) fingers
[j
]->setChecked(true);
91 * Hook after search enrolled fingerprints for selected device
93 void FingerManagerWindow::deviceChanged(int idx
) {
94 qDebug("deviceChanged: %d", idx
);
96 qDebug() << " device: "<< ((FingerManagerDevicesModel
*)devices
->model())->getDevicePath(idx
);
97 QStringList fingers
= dbc
->getFingers(
98 ((FingerManagerDevicesModel
*)devices
->model())->getDevicePath(idx
), login
);
99 processFingers(fingers
);
100 deleteAllBtn
->setEnabled(true);
102 deleteAllBtn
->setEnabled(false);
107 * Verify deletion of enrolled fingerprints on selected device for current user
109 void FingerManagerWindow::deleteAll() {
111 int idx
= devices
->currentIndex();
114 QString device
= ((FingerManagerDevicesModel
*)devices
->model())->
116 QString msg
= QString(i18n("Do you really want delete all fingerprints "
117 "on device \"%1\" for user \"%2\""));
118 msg
= msg
.arg(device
, login
);
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 if (dbc
->deleteAllEnrolledFingers(
124 ((FingerManagerDevicesModel
*)devices
->model())->getDevicePath(idx
),
132 QCheckBox
* FingerManagerWindow::createCheckBox(int idx
, int x
, int y
) {
133 QCheckBox
*cb
= new QCheckBox(handsPanel
);
134 QSize size
= cb
->sizeHint();
135 cb
->setGeometry(QRect(x
- (size
.width()/2),
136 y_base
+ y
- (size
.height()/2),
139 btng
->addButton(cb
, idx
);
143 void FingerManagerWindow::loadConfig(KConfig
*settings
) {
145 KConfigGroup cfgGroup
;
148 cfgGroup
= settings
->group("image");
149 y_base
= cfgGroup
.readEntry("base", 20);
151 QString filename
= cfgGroup
.readEntry("filename", "hands.png");
152 QPixmap image
= QPixmap(filename
);
153 if (!image
.isNull()) {
154 handsLabel
->setPixmap(image
);
156 handsLabel
->setText("File not found: " + filename
);
158 // set label position
159 handsLabel
->setGeometry(QRect(0, y_base
, image
.width(), image
.height()));
161 // Set handsPanel dimension
162 handsPanel
->setMinimumWidth(handsLabel
->width());
163 handsPanel
->setMinimumHeight(handsLabel
->height());
166 cfgGroup
= settings
->group("fingers");
167 fingersCount
= cfgGroup
.readEntry("count", 0);
168 for (int i
= 0; i
< fingersCount
&& i
< MAX_FINGERS
; i
++) {
171 name
.sprintf("%d/x", i
+1);
172 int x
= cfgGroup
.readEntry(name
, 0);
174 name
.sprintf("%d/y", i
+1);
175 int y
= cfgGroup
.readEntry(name
, 0);
177 name
.sprintf("%d/idx", i
+1);
178 unsigned int idx
= cfgGroup
.readEntry(name
, i
);
180 if (x
&& y
&& idx
< MAX_FINGERS
) {
181 qDebug("Adding new checkbox[%d]", idx
);
182 fingers
[idx
] = createCheckBox(idx
, x
, y
);
184 qDebug("Checkbox[%d] skipped", idx
);
192 * Actualize all texts in window after language changes
194 void FingerManagerWindow::retranslate() {
196 setWindowTitle(i18n("Finger manager..."));
199 setWhatsThis(i18n("Finger Manager Application"));
201 deviceLabel
->setText(i18n("Select device:"));
202 deleteAllBtn
->setText(i18n("Delete all"));
203 deleteAllBtn
->setToolTip(i18n("Delete all enrolled fingerprints on selected device."));
205 box
->setTitle(i18n("Select finger for enroll or modify"));
207 for (int i
= 0; i
< 10; i
++) {
209 fingers
[i
]->setWhatsThis(i18n(fingerNames
[i
].name
));
210 fingers
[i
]->setToolTip(i18n(fingerNames
[i
].name
));
216 * FingerManagerWindow contructor
218 FingerManagerWindow::FingerManagerWindow(QWidget
*parent
, const QVariantList
&) :
219 KCModule(FingerManagerWindowFactory::componentData(), parent
) {
223 setButtons(KCModule::NoAdditionalButton
);
225 about
= new KAboutData("kfingermanager", "KFingerManager",
226 ki18n("Manage Enrolled Fingers"), fingerManagerVersion
,
227 ki18n("Manage Enrolled Fingers of User"), KAboutData::License_GPL
,
228 ki18n("(c) 2009 Jaroslav Barton"), ki18n(0L));
229 about
->addAuthor(ki18n("Jaroslav Barton"), ki18n("Maintainer"), "djaara@djaara.net");
232 login
= user
->loginName();
236 loadConfig(settings
);
239 // Handle all check buttons
240 btng
->setExclusive(false);
241 QObject::connect(btng
, SIGNAL(buttonPressed(int)), SLOT(fingerSelected(int)));
244 QObject::connect(devices
, SIGNAL(currentIndexChanged(int)), this, SLOT(deviceChanged(int)));
246 // Devices model for combo box
247 FingerManagerDevicesModel
* m
= dbc
->getDevices();
248 devices
->setModel(m
);
249 devices
->setCurrentIndex(m
->getDefault());
251 // Handle delete all button
252 QObject::connect(deleteAllBtn
, SIGNAL(pressed()), this, SLOT(deleteAll()));
255 handsLayout
->addStretch();
256 handsLayout
->addWidget(handsPanel
);
257 handsLayout
->addStretch();
258 mainPanelLayout
->addLayout(handsLayout
);
259 mainPanelLayout
->addWidget(separator
);
260 devicesLayout
->addWidget(deviceLabel
);
261 devicesLayout
->addWidget(devices
);
262 devicesLayout
->addStretch();
263 devicesLayout
->addWidget(deleteAllBtn
);
264 mainPanelLayout
->addLayout(devicesLayout
);
265 mainLayout
->addWidget(box
);
266 mainLayout
->addStretch();
268 setMinimumSize(box
->minimumSizeHint());
272 * void initComponents()
273 * Initialize main components of FingerManagerWindow
275 void FingerManagerWindow::initComponents() {
276 dbc
= FMDbusConn::getConn();
279 settings
= new KConfig("kfingerrc");
282 box
= new QGroupBox();
283 mainPanelLayout
= new QVBoxLayout(box
);
285 // pane with hands image
286 handsPanel
= new QWidget();
288 btng
= new QButtonGroup(handsPanel
);
290 handsLabel
= new QLabel(handsPanel
);
293 separator
= new KSeparator(box
);
296 deviceLabel
= new QLabel();
297 devices
= new QComboBox();
298 devices
->setModel(new FingerManagerDevicesModel());
299 deleteAllBtn
= new KPushButton();
300 deleteAllBtn
->setEnabled(false);
301 devicesLayout
= new QHBoxLayout();
302 devicesLayout
->setSpacing(KDialog::spacingHint());
303 devicesLayout
->setMargin(0);
305 mainLayout
= new QVBoxLayout(this);
306 mainLayout
->setSpacing(KDialog::spacingHint());
307 mainLayout
->setMargin(0);
309 handsLayout
= new QHBoxLayout();
311 for (int i
= 0; i
< MAX_FINGERS
; i
++) {
317 * FingerManagerWindow destructor
319 FingerManagerWindow::~FingerManagerWindow() {
320 if (user
) delete user
;
321 for (int i
= 0; i
< fingersCount
; i
++) {
322 if (fingers
[i
]) delete fingers
[i
];
324 if (dbc
) dbc
->releaseConn();
325 if (settings
) delete settings
;
326 if (btng
) delete btng
;
330 if (deleteAllBtn
) delete deleteAllBtn
;
331 if (handsLabel
) delete handsLabel
;
332 if (separator
) delete separator
;
333 if (devicesLayout
) delete devicesLayout
;
334 if (handsPanel
) delete handsPanel
;
335 if (handsLayout
) delete handsLayout
;
336 if (mainPanelLayout
) delete mainPanelLayout
;
338 if (mainLayout
) delete mainLayout
;