FingerManagerWindow uses KUser and its function loginName instead of getlogin()
[KFingerManager.git] / src / FingerManagerWindow.cpp
blobef8a072ab0542372d35218e8f4c009119fe24ccb
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>
14 #include <KPluginFactory>
15 #include <KPluginLoader>
17 #include "FingerManagerWindow.h"
18 #include "FingerManagerDevicesModel.h"
19 #include "FMDbusConn.h"
20 #include "FingerNames.h"
21 #include "FMEnroll.h"
23 int y_base;
25 K_PLUGIN_FACTORY(FingerManagerWindowFactory,
26 registerPlugin<FingerManagerWindow>();
29 K_EXPORT_PLUGIN(FingerManagerWindowFactory("kcmkfingermanager"))
31 const static char fingerManagerVersion[] = "v0.0.4";
33 /**
34 * Handle checkbox status changes
36 void FingerManagerWindow::fingerSelected(int idx) {
37 int devid = devices->currentIndex();
38 if (devid > -1) {
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 "
43 "daemon"));
44 fingers[idx]->setChecked(true);
45 } else {
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,
51 // msg,
52 // i18n("Enroll?"));
53 // if (result == KMessageBox::Yes) {
54 // fingers[idx]->setChecked(true);
55 // } else {
56 // fingers[idx]->setChecked(false);
57 // }
58 FMEnroll *e = new FMEnroll(
59 ((FingerManagerDevicesModel*)devices->model())->getDeviceModel(devid),
60 login,
61 idx,
62 this);
63 int retval = e->exec();
64 delete(e);
65 if (retval == QDialog::Rejected) {
66 fingers[idx]->setChecked(false);
72 /**
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);
90 /**
91 * Hook after search enrolled fingerprints for selected device
93 void FingerManagerWindow::deviceChanged(int idx) {
94 qDebug("deviceChanged: %d", idx);
95 if (idx > -1) {
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);
101 } else {
102 deleteAllBtn->setEnabled(false);
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, 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),
125 login)) {
126 deviceChanged(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),
137 size.height(),
138 size.height()));
139 btng->addButton(cb, idx);
140 return(cb);
143 void FingerManagerWindow::loadConfig(KConfig *settings) {
144 // Config helper
145 KConfigGroup cfgGroup;
147 // Load image
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);
155 } else {
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());
165 // Load checkboxes
166 cfgGroup = settings->group("fingers");
167 fingersCount = cfgGroup.readEntry("count", 0);
168 for (int i = 0; i < fingersCount && i < MAX_FINGERS; i++) {
169 QString name;
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);
183 } else {
184 qDebug("Checkbox[%d] skipped", idx);
185 fingers[idx] = 0;
192 * Actualize all texts in window after language changes
194 void FingerManagerWindow::retranslate() {
195 // Window title
196 setWindowTitle(i18n("Finger manager..."));
198 // What's this
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++) {
208 if (fingers[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) {
221 user = new KUser();
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");
230 setAboutData(about);
232 login = user->loginName();
234 // Prepare component
235 initComponents();
236 loadConfig(settings);
237 retranslate();
239 // Handle all check buttons
240 btng->setExclusive(false);
241 QObject::connect(btng, SIGNAL(buttonPressed(int)), SLOT(fingerSelected(int)));
243 // Internal slots
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()));
254 // Layout
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();
278 // config file
279 settings = new KConfig("kfingerrc");
281 // box around UI
282 box = new QGroupBox();
283 mainPanelLayout = new QVBoxLayout(box);
285 // pane with hands image
286 handsPanel = new QWidget();
287 // and with buttons
288 btng = new QButtonGroup(handsPanel);
289 //and image
290 handsLabel = new QLabel(handsPanel);
292 // separator
293 separator = new KSeparator(box);
295 // device section
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++) {
312 fingers[i] = 0;
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;
327 if (devices) {
328 delete devices;
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;
337 if (box) delete box;
338 if (mainLayout) delete mainLayout;