Mercurial > hg > svapp
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 } |