comparison align/Align.cpp @ 761:6429a164b7e1 pitch-align

Schedule alignments with a small delay to avoid too much UI unresponsiveness. Also overhaul error reporting to use signals throughout.
author Chris Cannam
date Wed, 06 May 2020 11:45:27 +0100
parents 39808338e771
children dd742e566e60
comparison
equal deleted inserted replaced
757:f32df46d0c84 761:6429a164b7e1
16 #include "TransformAligner.h" 16 #include "TransformAligner.h"
17 #include "ExternalProgramAligner.h" 17 #include "ExternalProgramAligner.h"
18 #include "framework/Document.h" 18 #include "framework/Document.h"
19 19
20 #include <QSettings> 20 #include <QSettings>
21 #include <QTimer>
21 22
22 bool 23 void
23 Align::alignModel(Document *doc, 24 Align::alignModel(Document *doc,
24 ModelId reference, 25 ModelId reference,
25 ModelId toAlign, 26 ModelId toAlign)
26 QString &error) 27 {
28 addAligner(doc, reference, toAlign);
29 m_aligners[toAlign]->begin();
30 }
31
32 void
33 Align::scheduleAlignment(Document *doc,
34 ModelId reference,
35 ModelId toAlign)
36 {
37 addAligner(doc, reference, toAlign);
38 int delay = 500 + 500 * int(m_aligners.size());
39 if (delay > 3500) {
40 delay = 3500;
41 }
42 SVCERR << "Align::scheduleAlignment: delaying " << delay << "ms" << endl;
43 QTimer::singleShot(delay, m_aligners[toAlign].get(), SLOT(begin()));
44 }
45
46 void
47 Align::addAligner(Document *doc,
48 ModelId reference,
49 ModelId toAlign)
27 { 50 {
28 bool useProgram; 51 bool useProgram;
29 QString program; 52 QString program;
30 getAlignerPreference(useProgram, program); 53 getAlignerPreference(useProgram, program);
31 54
54 aligner = m_aligners[toAlign]; 77 aligner = m_aligners[toAlign];
55 } 78 }
56 79
57 connect(aligner.get(), SIGNAL(complete(ModelId)), 80 connect(aligner.get(), SIGNAL(complete(ModelId)),
58 this, SLOT(alignerComplete(ModelId))); 81 this, SLOT(alignerComplete(ModelId)));
59 82
60 return aligner->begin(error); 83 connect(aligner.get(), SIGNAL(failed(ModelId, QString)),
84 this, SLOT(alignerFailed(ModelId, QString)));
61 } 85 }
62 86
63 void 87 void
64 Align::getAlignerPreference(bool &useProgram, QString &program) 88 Align::getAlignerPreference(bool &useProgram, QString &program)
65 { 89 {
85 } 109 }
86 110
87 void 111 void
88 Align::alignerComplete(ModelId alignmentModel) 112 Align::alignerComplete(ModelId alignmentModel)
89 { 113 {
90 Aligner *aligner = qobject_cast<Aligner *>(sender()); 114 removeAligner(sender());
115 emit alignmentComplete(alignmentModel);
116 }
117
118 void
119 Align::alignerFailed(ModelId toAlign, QString error)
120 {
121 removeAligner(sender());
122 emit alignmentFailed(toAlign, error);
123 }
124
125 void
126 Align::removeAligner(QObject *obj)
127 {
128 Aligner *aligner = qobject_cast<Aligner *>(obj);
91 if (!aligner) { 129 if (!aligner) {
92 SVCERR << "ERROR: Align::alignerComplete: Caller is not an Aligner" 130 SVCERR << "ERROR: Align::removeAligner: Not an Aligner" << endl;
93 << endl;
94 return; 131 return;
95 } 132 }
96 133
97 { 134 QMutexLocker locker (&m_mutex);
98 QMutexLocker locker (&m_mutex);
99 135
100 for (auto p: m_aligners) { 136 for (auto p: m_aligners) {
101 if (aligner == p.second.get()) { 137 if (aligner == p.second.get()) {
102 m_aligners.erase(p.first); 138 m_aligners.erase(p.first);
103 break; 139 break;
104 }
105 } 140 }
106 } 141 }
142 }
107 143
108 emit alignmentComplete(alignmentModel);
109 }