@@ -76,11 +76,8 @@ SubkeyGenerateDialog::SubkeyGenerateDialog(int channel, GpgKeyPtr key,
7676 ui_->expireDateTimeEdit ->setDateTime (
7777 QDateTime::currentDateTime ().addYears (2 ));
7878
79- QSet<QString> algo_set;
80- for (const auto & algo : supported_subkey_algos_) {
81- algo_set.insert (algo.Name ());
82- }
83- ui_->algoComboBox ->addItems (QStringList (algo_set.cbegin (), algo_set.cend ()));
79+ // populate algo combo box with supported subkey algos
80+ PopulateAlgoComboBox (ui_->algoComboBox , supported_subkey_algos_);
8481
8582 ui_->expireDateTimeEdit ->setDateTime (gen_subkey_info_->GetExpireTime ());
8683 ui_->expireDateTimeEdit ->setDisabled (gen_subkey_info_->IsNonExpired ());
@@ -152,32 +149,91 @@ void SubkeyGenerateDialog::set_signal_slot_config() {
152149 });
153150#endif
154151
155- connect (ui_->algoComboBox , &QComboBox::currentTextChanged, this ,
156- [=](const QString& text) -> void {
157- auto [found, algo] = GetAlgoByName (text, supported_subkey_algos_);
158- ui_->generateButton ->setDisabled (!found);
159- if (found) gen_subkey_info_->SetAlgo (algo);
152+ auto get_exact_algo = [this ](QComboBox* algoCombo, QComboBox* lenCombo) {
153+ if (algoCombo->currentIndex () < 0 ) return std::make_tuple (false , KeyAlgo{});
160154
161- refresh_widgets_state ();
155+ auto data = algoCombo->currentData ().toMap ();
156+ QString name = data[" name" ].toString ();
157+ QString type = data[" type" ].toString ();
158+ int key_len = lenCombo->currentText ().toInt ();
159+
160+ return GetAlgoByNameTypeAndKeyLength (name, type, key_len,
161+ supported_subkey_algos_);
162+ };
163+
164+ auto validate_generate_button = [this , get_exact_algo]() -> void {
165+ auto [primaryFound, primaryAlgo] =
166+ get_exact_algo (ui_->algoComboBox , ui_->keyLengthComboBox );
167+
168+ bool secondary_found = true ;
169+ if (ui_->scndAlgoComboBox ->isEnabled () &&
170+ !ui_->scndAlgoComboBox ->isHidden ()) {
171+ auto [subFound, subAlgo] =
172+ get_exact_algo (ui_->scndAlgoComboBox , ui_->scndKeyLengthComboBox );
173+ secondary_found = subFound;
174+ }
175+
176+ ui_->generateButton ->setDisabled (!(primaryFound && secondary_found));
177+ };
178+
179+ auto on_algo_changed = [this , validate_generate_button](QComboBox* algoCombo,
180+ bool is_sub_algo) {
181+ auto data = algoCombo->currentData ().toMap ();
182+ QString name = data[" name" ].toString ();
183+ QString type = data[" type" ].toString ();
184+
185+ auto [found, base_algo] =
186+ GetAlgoByNameType (name, type, supported_subkey_algos_);
187+ if (found) {
188+ if (is_sub_algo) {
189+ gen_subkey_info_->SetSubAlgo (base_algo);
190+ } else {
191+ gen_subkey_info_->SetAlgo (base_algo);
192+ }
193+ } else {
194+ if (is_sub_algo) gen_subkey_info_->SetSubAlgo (KeyGenerateInfo::kNoneAlgo );
195+ }
162196
163- if (ui_->scndAlgoComboBox ->isEnabled ()) {
164- auto [found, algo] =
165- GetAlgoByName (ui_->scndAlgoComboBox ->currentText (),
166- supported_subkey_algos_);
167- if (found) {
168- gen_subkey_info_->SetSubAlgo (algo);
169- }
170- } else {
171- gen_subkey_info_->SetSubAlgo (KeyGenerateInfo::kNoneAlgo );
172- }
197+ if (is_sub_algo) {
198+ refresh_hybrid_algo_widgets_state ();
199+ } else {
200+ refresh_widgets_state ();
201+ }
202+
203+ validate_generate_button ();
204+ };
205+
206+ auto on_length_changed = [this , get_exact_algo, validate_generate_button](
207+ QComboBox* algoCombo, QComboBox* lenCombo,
208+ bool is_sub_algo) {
209+ auto [found, exact_algo] = get_exact_algo (algoCombo, lenCombo);
210+ if (found) {
211+ if (is_sub_algo) {
212+ gen_subkey_info_->SetSubAlgo (exact_algo);
213+ } else {
214+ gen_subkey_info_->SetAlgo (exact_algo);
215+ }
216+ }
217+ validate_generate_button ();
218+ };
219+
220+ connect (ui_->algoComboBox ,
221+ QOverload<int >::of (&QComboBox::currentIndexChanged), this ,
222+ [=](int ) { on_algo_changed (ui_->algoComboBox , false ); });
223+
224+ connect (ui_->scndAlgoComboBox ,
225+ QOverload<int >::of (&QComboBox::currentIndexChanged), this ,
226+ [=](int ) { on_algo_changed (ui_->scndAlgoComboBox , true ); });
227+
228+ connect (ui_->keyLengthComboBox , &QComboBox::currentTextChanged, this ,
229+ [=](const QString&) {
230+ on_length_changed (ui_->algoComboBox , ui_->keyLengthComboBox , false );
173231 });
174232
175- connect (ui_->scndAlgoComboBox , &QComboBox::currentTextChanged, this ,
176- [=](const QString& text) -> void {
177- auto [found, algo] = GetAlgoByName (text, supported_subkey_algos_);
178- ui_->generateButton ->setDisabled (!found);
179- if (found) gen_subkey_info_->SetSubAlgo (algo);
180- refresh_hybrid_algo_widgets_state ();
233+ connect (ui_->scndKeyLengthComboBox , &QComboBox::currentTextChanged, this ,
234+ [=](const QString&) {
235+ on_length_changed (ui_->scndAlgoComboBox , ui_->scndKeyLengthComboBox ,
236+ true );
181237 });
182238
183239#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
@@ -191,24 +247,6 @@ void SubkeyGenerateDialog::set_signal_slot_config() {
191247 gen_subkey_info_->SetNonPassPhrase (state == Qt::Checked);
192248 });
193249#endif
194-
195- connect (ui_->keyLengthComboBox , &QComboBox::currentTextChanged, this ,
196- [this ](const QString& text) -> void {
197- auto [found, algo] = GetAlgoByNameAndKeyLength (
198- ui_->algoComboBox ->currentText (), text.toInt (),
199- supported_subkey_algos_);
200-
201- if (found) gen_subkey_info_->SetAlgo (algo);
202- });
203-
204- connect (ui_->scndKeyLengthComboBox , &QComboBox::currentTextChanged, this ,
205- [this ](const QString& text) -> void {
206- auto [found, algo] = GetAlgoByNameAndKeyLength (
207- ui_->scndAlgoComboBox ->currentText (), text.toInt (),
208- supported_subkey_algos_);
209-
210- if (found) gen_subkey_info_->SetSubAlgo (algo);
211- });
212250}
213251
214252void SubkeyGenerateDialog::refresh_widgets_state () {
@@ -217,9 +255,14 @@ void SubkeyGenerateDialog::refresh_widgets_state() {
217255 ui_->algoComboBox ->blockSignals (false );
218256
219257 ui_->keyLengthComboBox ->blockSignals (true );
220- SetKeyLengthComboxBoxByAlgo (ui_->keyLengthComboBox ,
221- SearchAlgoByName (ui_->algoComboBox ->currentText (),
222- supported_subkey_algos_));
258+
259+ auto data = ui_->algoComboBox ->currentData ().toMap ();
260+ auto name = data[" name" ].toString ();
261+ auto type = data[" type" ].toString ();
262+ SetKeyLengthComboxBoxByAlgo (
263+ ui_->keyLengthComboBox ,
264+ SearchAlgoByNameType (name, type, supported_subkey_algos_));
265+
223266 ui_->keyLengthComboBox ->setCurrentText (
224267 QString::number (gen_subkey_info_->GetKeyLength ()));
225268 ui_->keyLengthComboBox ->blockSignals (false );
@@ -263,13 +306,9 @@ void SubkeyGenerateDialog::refresh_widgets_state() {
263306
264307 ui_->scndAlgoComboBox ->blockSignals (true );
265308 ui_->scndAlgoComboBox ->clear ();
266- QSet<QString> sub_algo_names;
267- for (const auto & algo : sub_algos) {
268- sub_algo_names.insert (algo.Name ());
269- }
270- for (const auto & algo_name : sub_algo_names) {
271- ui_->scndAlgoComboBox ->addItem (algo_name);
272- }
309+
310+ PopulateAlgoComboBox (ui_->scndAlgoComboBox , sub_algos);
311+
273312 ui_->scndAlgoComboBox ->blockSignals (false );
274313 } else {
275314 ui_->scndAlgoComboBox ->setEnabled (false );
@@ -345,10 +384,14 @@ void SubkeyGenerateDialog::refresh_hybrid_algo_widgets_state() {
345384 ui_->scndKeyLengthComboBox ->setEnabled (true );
346385 ui_->scndKeyLengthComboBox ->setHidden (false );
347386 ui_->scndKeyLengthComboBox ->blockSignals (true );
387+
388+ auto data = ui_->algoComboBox ->currentData ().toMap ();
389+ auto name = data[" name" ].toString ();
390+ auto type = data[" type" ].toString ();
348391 SetKeyLengthComboxBoxByAlgo (
349392 ui_->scndKeyLengthComboBox ,
350- SearchAlgoByName (ui_-> scndAlgoComboBox -> currentText (),
351- supported_subkey_algos_));
393+ SearchAlgoByNameType (name, type, supported_subkey_algos_));
394+
352395 ui_->scndKeyLengthComboBox ->setCurrentText (
353396 QString::number (gen_subkey_info_->SubAlgo ().KeyLength ()));
354397 ui_->scndKeyLengthComboBox ->blockSignals (false );
0 commit comments