diff --git a/include/aoapplication.h b/include/aoapplication.h index d9b9e89..c69a0d3 100644 --- a/include/aoapplication.h +++ b/include/aoapplication.h @@ -538,6 +538,9 @@ public: // Get whether to opt out of player count metrics sent to the master server bool get_player_count_optout(); + // Whether opening evidence requires a single or double click + bool get_evidence_double_click(); + // Currently defined subtheme QString subtheme; diff --git a/include/aooptionsdialog.h b/include/aooptionsdialog.h index cb9b71b..a5b1e4d 100644 --- a/include/aooptionsdialog.h +++ b/include/aooptionsdialog.h @@ -51,6 +51,8 @@ private: QLabel *ui_subtheme_label; QComboBox *ui_subtheme_combobox; QPushButton *ui_theme_reload_button; + QLabel *ui_evidence_double_click_lbl; + QCheckBox *ui_evidence_double_click_cb; QLabel *ui_animated_theme_lbl; QCheckBox *ui_animated_theme_cb; QFrame *ui_theme_log_divider; diff --git a/include/courtroom.h b/include/courtroom.h index 0c53c95..88e6037 100644 --- a/include/courtroom.h +++ b/include/courtroom.h @@ -974,7 +974,7 @@ private slots: void on_evidence_button_clicked(); void on_evidence_delete_clicked(); - void on_evidence_x_clicked(); + bool on_evidence_x_clicked(); void on_evidence_ok_clicked(); void on_evidence_switch_clicked(); void on_evidence_transfer_clicked(); diff --git a/src/aooptionsdialog.cpp b/src/aooptionsdialog.cpp index 18e2f71..4bb15cb 100644 --- a/src/aooptionsdialog.cpp +++ b/src/aooptionsdialog.cpp @@ -465,6 +465,18 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) ui_gameplay_form->setWidget(row, QFormLayout::FieldRole, ui_category_stop_cb); + row += 1; + ui_evidence_double_click_lbl = new QLabel(ui_form_layout_widget); + ui_evidence_double_click_lbl->setText(tr("Evidence Double Click:")); + ui_evidence_double_click_lbl->setToolTip( + tr("If ticked, Evidence needs a double-click to view rather than a single click.")); + + ui_gameplay_form->setWidget(row, QFormLayout::LabelRole, ui_evidence_double_click_lbl); + + ui_evidence_double_click_cb = new QCheckBox(ui_form_layout_widget); + + ui_gameplay_form->setWidget(row, QFormLayout::FieldRole, ui_evidence_double_click_cb); + // Finish gameplay tab QScrollArea *scroll = new QScrollArea(this); scroll->setWidget(ui_form_layout_widget); @@ -1210,6 +1222,7 @@ void AOOptionsDialog::update_values() { ui_suppress_audio_spinbox->setValue(ao_app->get_default_suppress_audio()); ui_bliprate_spinbox->setValue(ao_app->read_blip_rate()); ui_default_showname_textbox->setText(ao_app->get_default_showname()); + ui_evidence_double_click_cb->setChecked(ao_app->get_evidence_double_click()); auto *defaultMount = new QListWidgetItem(tr("%1 (default)") .arg(ao_app->get_base_path())); @@ -1273,6 +1286,7 @@ void AOOptionsDialog::save_pressed() configini->setValue("demo_logging_enabled", ui_log_demo_cb->isChecked()); configini->setValue("continuous_playback", ui_continuous_cb->isChecked()); configini->setValue("category_stop", ui_category_stop_cb->isChecked()); + configini->setValue("evidence_double_click", ui_evidence_double_click_cb->isChecked()); QFile *callwordsini = new QFile(ao_app->get_base_path() + "callwords.ini"); if (callwordsini->open(QIODevice::WriteOnly | QIODevice::Truncate | diff --git a/src/evidence.cpp b/src/evidence.cpp index 3b38b41..34f09a6 100644 --- a/src/evidence.cpp +++ b/src/evidence.cpp @@ -12,6 +12,7 @@ void Courtroom::initialize_evidence() ui_evidence_name->setAlignment(Qt::AlignCenter); ui_evidence_name->setFrame(false); ui_evidence_name->setObjectName("ui_evidence_name"); + ui_evidence_name->setReadOnly(true); ui_evidence_buttons = new QWidget(ui_evidence); ui_evidence_buttons->setObjectName("ui_evidence_buttons"); @@ -449,17 +450,22 @@ void Courtroom::on_evidence_clicked(int p_id) } else if (f_real_id > local_evidence_list.size()) return; + + if (!ao_app->get_evidence_double_click()){ + on_evidence_double_clicked(p_id); + return; + } + + if (ui_evidence_overlay->isVisible()) { + return; + } ui_evidence_name->setText(local_evidence_list.at(f_real_id).name); - for (AOEvidenceButton *i_button : qAsConst(ui_evidence_list)) i_button->set_selected(false); ui_evidence_list.at(p_id)->set_selected(true); - current_evidence = f_real_id; - - // ui_ic_chat_message->setFocus(); } void Courtroom::on_evidence_double_clicked(int p_id) @@ -469,6 +475,17 @@ void Courtroom::on_evidence_double_clicked(int p_id) if (f_real_id >= local_evidence_list.size()) return; + if (ui_evidence_overlay->isVisible()) { + if (!on_evidence_x_clicked()) { + // We're told not to switch over to the other evidence ("cancel" clicked) + return; + } + } + + for (AOEvidenceButton *i_button : qAsConst(ui_evidence_list)) + i_button->set_selected(false); + + ui_evidence_list.at(p_id)->set_selected(true); current_evidence = f_real_id; evi_type f_evi = local_evidence_list.at(f_real_id); @@ -477,6 +494,7 @@ void Courtroom::on_evidence_double_clicked(int p_id) ui_evidence_description->appendPlainText(f_evi.description); ui_evidence_description->setReadOnly(false); ui_evidence_description->setToolTip(tr("Click to edit...")); + ui_evidence_description->moveCursor(QTextCursor::Start); ui_evidence_name->setText(f_evi.name); ui_evidence_name->setReadOnly(false); @@ -489,12 +507,15 @@ void Courtroom::on_evidence_double_clicked(int p_id) ui_evidence->show(); ui_evidence_overlay->show(); ui_evidence_ok->hide(); - - ui_ic_chat_message->setFocus(); } void Courtroom::on_evidence_hover(int p_id, bool p_state) { + if (ui_evidence_overlay->isVisible()) { + // Ignore hovering behavior if we're in the process of viewing a piece of evidence + return; + } + int final_id = p_id + max_evidence_on_page * current_evidence_page; if (p_state) { @@ -514,8 +535,6 @@ void Courtroom::on_evidence_left_clicked() --current_evidence_page; set_evidence_page(); - - ui_ic_chat_message->setFocus(); } void Courtroom::on_evidence_right_clicked() @@ -523,8 +542,6 @@ void Courtroom::on_evidence_right_clicked() ++current_evidence_page; set_evidence_page(); - - ui_ic_chat_message->setFocus(); } void Courtroom::on_evidence_present_clicked() @@ -557,24 +574,18 @@ void Courtroom::on_evidence_delete_clicked() } current_evidence = 0; - - ui_ic_chat_message->setFocus(); } -void Courtroom::on_evidence_x_clicked() +bool Courtroom::on_evidence_x_clicked() { if (current_evidence >= local_evidence_list.size()) // Should never happen but you never know. - return; + return true; - evi_type fake_evidence; - fake_evidence.name = ui_evidence_name->text(); - fake_evidence.description = ui_evidence_description->toPlainText(); - fake_evidence.image = ui_evidence_image_name->text(); - if (!compare_evidence_changed(fake_evidence, - local_evidence_list.at(current_evidence))) { + if (ui_evidence_ok->isHidden()) { + // Nothing was modified evidence_close(); - return; + return true; } QMessageBox *msgBox = new QMessageBox; msgBox->setAttribute(Qt::WA_DeleteOnClose); @@ -588,16 +599,14 @@ void Courtroom::on_evidence_x_clicked() case QMessageBox::Save: evidence_close(); on_evidence_ok_clicked(); - break; + return true; case QMessageBox::Discard: evidence_close(); - break; + return true; case QMessageBox::Cancel: - // Cancel was clicked, do nothing - break; default: - // should never be reached - break; + // Cancel was clicked, report that. + return false; } } @@ -629,28 +638,7 @@ void Courtroom::on_evidence_ok_clicked() void Courtroom::on_evidence_switch_clicked() { - evidence_close(); evidence_switch(!current_evidence_global); - if (current_evidence_global) { - ui_evidence_switch->set_image("evidence_global"); - ui_evidence->set_image("evidence_background"); - ui_evidence_overlay->set_image("evidence_overlay"); - ui_evidence_transfer->set_image("evidence_transfer"); - ui_evidence_transfer->setToolTip( - tr("Transfer evidence to private inventory.")); - ui_evidence_switch->setToolTip( - tr("Current evidence is global. Click to switch to private.")); - } - else { - ui_evidence_switch->set_image("evidence_private"); - ui_evidence->set_image("evidence_background_private"); - ui_evidence_overlay->set_image("evidence_overlay_private"); - ui_evidence_transfer->set_image("evidence_transfer_private"); - ui_evidence_transfer->setToolTip( - tr("Transfer evidence to global inventory.")); - ui_evidence_switch->setToolTip( - tr("Current evidence is private. Click to switch to global.")); - } } void Courtroom::on_evidence_transfer_clicked() @@ -708,11 +696,11 @@ void Courtroom::evidence_close() ui_evidence_name->setReadOnly(true); ui_evidence_image_name->setReadOnly(true); ui_evidence_overlay->hide(); - ui_ic_chat_message->setFocus(); } void Courtroom::evidence_switch(bool global) { + evidence_close(); current_evidence_global = global; is_presenting_evidence = false; ui_evidence_present->set_image("present"); @@ -722,12 +710,28 @@ void Courtroom::evidence_switch(bool global) ui_evidence_present->show(); ui_evidence_save->hide(); ui_evidence_load->hide(); + ui_evidence_switch->set_image("evidence_global"); + ui_evidence->set_image("evidence_background"); + ui_evidence_overlay->set_image("evidence_overlay"); + ui_evidence_transfer->set_image("evidence_transfer"); + ui_evidence_transfer->setToolTip( + tr("Transfer evidence to private inventory.")); + ui_evidence_switch->setToolTip( + tr("Current evidence is global. Click to switch to private.")); } else { local_evidence_list = private_evidence_list; ui_evidence_present->hide(); ui_evidence_save->show(); ui_evidence_load->show(); + ui_evidence_switch->set_image("evidence_private"); + ui_evidence->set_image("evidence_background_private"); + ui_evidence_overlay->set_image("evidence_overlay_private"); + ui_evidence_transfer->set_image("evidence_transfer_private"); + ui_evidence_transfer->setToolTip( + tr("Transfer evidence to global inventory.")); + ui_evidence_switch->setToolTip( + tr("Current evidence is private. Click to switch to global.")); } current_evidence_page = 0; set_evidence_page(); diff --git a/src/text_file_functions.cpp b/src/text_file_functions.cpp index f1e1fbb..bfb72f7 100644 --- a/src/text_file_functions.cpp +++ b/src/text_file_functions.cpp @@ -1232,3 +1232,9 @@ bool AOApplication::get_player_count_optout() return configini->value("player_count_optout", "false").value() .startsWith("true"); } + +bool AOApplication::get_evidence_double_click() +{ + return configini->value("evidence_double_click", "true").value() + .startsWith("true"); +}