1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
/*********
*
* This file is part of BibleTime's source code, http://www.bibletime.info/.
*
* Copyright 1999-2016 by the BibleTime developers.
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
*
**********/
#include "frontend/btmoduleindexdialog.h"
#include <QApplication>
#include <QMutexLocker>
#include "backend/managers/cswordbackend.h"
#include "frontend/messagedialog.h"
#include "util/btassert.h"
#include "util/btconnect.h"
bool BtModuleIndexDialog::indexAllModules(const QList<CSwordModuleInfo *> &modules)
{
static QMutex mutex;
QMutexLocker lock(&mutex);
if (modules.empty()) return true;
BtModuleIndexDialog d(modules.size());
d.show();
d.raise();
return d.indexAllModulesPrivate(modules);
}
BtModuleIndexDialog::BtModuleIndexDialog(int numModules)
: QProgressDialog(tr("Preparing to index modules..."), tr("Cancel"), 0,
numModules * 100, nullptr),
m_currentModuleIndex(0)
{
setWindowTitle(tr("Creating indices"));
setModal(true);
}
bool BtModuleIndexDialog::indexAllModulesPrivate(const QList<CSwordModuleInfo*> &modules)
{
bool success = true;
QList <CSwordModuleInfo*> indexedModules;
Q_FOREACH(CSwordModuleInfo * const m, modules) {
BT_ASSERT(!m->hasIndex());
/*
Keep track of created indices to delete them on failure or
cancellation:
*/
indexedModules.append(m);
BT_CONNECT(this, SIGNAL(canceled()), m, SLOT(cancelIndexing()));
BT_CONNECT(m, SIGNAL(indexingFinished()), this, SLOT(slotFinished()));
BT_CONNECT(m, SIGNAL(indexingProgress(int)),
this, SLOT(slotModuleProgress(int)));
// Single module indexing blocks until finished:
setLabelText(tr("Creating index for work: %1").arg(m->name()));
try {
m->buildIndex();
} catch (...) {
QString msg;
try {
throw;
} catch (std::exception const & e) {
msg = e.what();
} catch (...) {
msg = tr("<UNKNOWN EXCEPTION>");
}
message::showWarning(this,
tr("Indexing aborted"),
tr("An internal error occurred while building "
"the index.") + "<br/><br/>" + msg);
success = false;
}
m_currentModuleIndex++;
disconnect(this, SIGNAL(canceled()),
m, SLOT(cancelIndexing()));
disconnect(m, SIGNAL(indexingFinished()),
this, SLOT(slotFinished()));
disconnect(m, SIGNAL(indexingProgress(int)),
this, SLOT(slotModuleProgress(int)));
if (wasCanceled()) success = false;
if (!success) break;
}
if (!success)
// Delete already created indices:
Q_FOREACH(CSwordModuleInfo * const m, indexedModules)
if (m->hasIndex())
m->deleteIndex();
return success;
}
void BtModuleIndexDialog::slotModuleProgress(int percentage) {
setValue(m_currentModuleIndex * 100 + percentage);
qApp->processEvents();
}
void BtModuleIndexDialog::slotFinished() {
setValue(m_currentModuleIndex * 100 + 100);
qApp->processEvents();
}
|