From 829604e8089736945e8121cd134c3c3fcbf28291 Mon Sep 17 00:00:00 2001 From: Crystalwarrior Date: Thu, 3 Oct 2019 15:44:18 +0300 Subject: [PATCH] Positional evidence implemented. Click a button to change between private/global evidence list. There's also a button to transfer evidence to global/private, context sensitive. TODO: Save/load private evidence list --- include/courtroom.h | 10 +++ src/evidence.cpp | 207 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 173 insertions(+), 44 deletions(-) diff --git a/include/courtroom.h b/include/courtroom.h index 86a4ea7..9f3b659 100644 --- a/include/courtroom.h +++ b/include/courtroom.h @@ -411,6 +411,11 @@ private: int max_emotes_on_page = 10; QVector local_evidence_list; + QVector private_evidence_list; + QVector global_evidence_list; + + //false = use private_evidence_list + bool current_evidence_global = true; int current_evidence_page = 0; int current_evidence = 0; @@ -563,6 +568,8 @@ private: AOButton *ui_evidence_image_button; AOButton *ui_evidence_x; AOButton *ui_evidence_ok; + AOButton *ui_evidence_switch; + AOButton *ui_evidence_transfer; AOTextEdit *ui_evidence_description; AOImage *ui_char_select_background; @@ -733,10 +740,13 @@ private slots: void on_evidence_delete_clicked(); void on_evidence_x_clicked(); void on_evidence_ok_clicked(); + void on_evidence_switch_clicked(); + void on_evidence_transfer_clicked(); void on_evidence_edited(); void evidence_close(); + void evidence_switch(bool global); bool compare_evidence_changed(evi_type evi_a, evi_type evi_b); void on_back_to_lobby_clicked(); diff --git a/src/evidence.cpp b/src/evidence.cpp index 58f3181..82e496d 100644 --- a/src/evidence.cpp +++ b/src/evidence.cpp @@ -16,6 +16,9 @@ void Courtroom::initialize_evidence() ui_evidence_present = new AOButton(ui_evidence, ao_app); ui_evidence_present->setToolTip(tr("Present this piece of evidence to everyone on your next spoken message")); + ui_evidence_switch = new AOButton(ui_evidence, ao_app); + ui_evidence_transfer = new AOButton(ui_evidence, ao_app); + ui_evidence_overlay = new AOImage(ui_evidence, ao_app); ui_evidence_delete = new AOButton(ui_evidence_overlay, ao_app); @@ -40,6 +43,9 @@ void Courtroom::initialize_evidence() connect(ui_evidence_left, SIGNAL(clicked()), this, SLOT(on_evidence_left_clicked())); connect(ui_evidence_right, SIGNAL(clicked()), this, SLOT(on_evidence_right_clicked())); connect(ui_evidence_present, SIGNAL(clicked()), this, SLOT(on_evidence_present_clicked())); + connect(ui_evidence_switch, SIGNAL(clicked()), this, SLOT(on_evidence_switch_clicked())); + connect(ui_evidence_transfer, SIGNAL(clicked()), this, SLOT(on_evidence_transfer_clicked())); + connect(ui_evidence_delete, SIGNAL(clicked()), this, SLOT(on_evidence_delete_clicked())); connect(ui_evidence_image_name, SIGNAL(returnPressed()), this, SLOT(on_evidence_image_name_edited())); connect(ui_evidence_image_name, SIGNAL(double_clicked()), this, SLOT(on_evidence_image_name_double_clicked())); @@ -65,11 +71,14 @@ void Courtroom::refresh_evidence() ui_evidence_list.clear(); set_size_and_pos(ui_evidence_button, "evidence_button"); - ui_evidence_button->set_image("evidencebutton"); + ui_evidence_button->set_image("evidence_button"); ui_evidence_button->setToolTip(tr("Bring up the Evidence screen.")); set_size_and_pos(ui_evidence, "evidence_background"); - ui_evidence->set_image("evidencebackground"); + if (current_evidence_global) + ui_evidence->set_image("evidence_background"); + else + ui_evidence->set_image("evidence_background_private"); set_size_and_pos(ui_evidence_name, "evidence_name"); @@ -85,20 +94,47 @@ void Courtroom::refresh_evidence() ui_evidence_present->set_image("present"); set_size_and_pos(ui_evidence_overlay, "evidence_overlay"); - ui_evidence_overlay->set_image("evidenceoverlay"); + if (current_evidence_global) + ui_evidence_overlay->set_image("evidence_overlay"); + else + ui_evidence_overlay->set_image("evidence_overlay_private"); set_size_and_pos(ui_evidence_delete, "evidence_delete"); - ui_evidence_delete->set_image("deleteevidence"); + ui_evidence_delete->set_image("evidence_delete"); set_size_and_pos(ui_evidence_image_name, "evidence_image_name"); set_size_and_pos(ui_evidence_image_button, "evidence_image_button"); set_size_and_pos(ui_evidence_x, "evidence_x"); - ui_evidence_x->set_image("evidencex"); + ui_evidence_x->set_image("evidence_x"); set_size_and_pos(ui_evidence_ok, "evidence_ok"); - ui_evidence_ok->set_image("evidenceok"); + ui_evidence_ok->set_image("evidence_ok"); + + set_size_and_pos(ui_evidence_switch, "evidence_switch"); + if (current_evidence_global) + { + ui_evidence_switch->set_image("evidence_global"); + ui_evidence_switch->setToolTip(tr("Switch evidence to private inventory.")); + } + else + { + ui_evidence_switch->set_image("evidence_private"); + ui_evidence_switch->setToolTip(tr("Switch evidence to global inventory.")); + } + + set_size_and_pos(ui_evidence_transfer, "evidence_transfer"); + if (current_evidence_global) + { + ui_evidence_transfer->set_image("evidence_transfer"); + ui_evidence_transfer->setToolTip(tr("Transfer evidence to private inventory.")); + } + else + { + ui_evidence_transfer->set_image("evidence_transfer_private"); + ui_evidence_transfer->setToolTip(tr("Transfer evidence to global inventory.")); + } set_size_and_pos(ui_evidence_description, "evidence_description"); @@ -145,6 +181,10 @@ void Courtroom::refresh_evidence() void Courtroom::set_evidence_list(QVector &p_evi_list) { + global_evidence_list = p_evi_list; + if (!current_evidence_global) + return; //We're on private evidence editing, wait for user to do their thing + QVector old_list = local_evidence_list; local_evidence_list.clear(); local_evidence_list = p_evi_list; @@ -171,7 +211,7 @@ void Courtroom::set_evidence_list(QVector &p_evi_list) msgBox->setInformativeText("Do you wish to keep your changes?"); msgBox->setDetailedText("Name: " + local_evidence_list.at(current_evidence).name + "\nImage: " + local_evidence_list.at(current_evidence).image + "\nDescription:\n" + local_evidence_list.at(current_evidence).description); msgBox->setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox->setDefaultButton(QMessageBox::No); + msgBox->setDefaultButton(QMessageBox::LastButton); //msgBox->setWindowModality(Qt::NonModal); int ret = msgBox->exec(); switch (ret) { @@ -259,18 +299,6 @@ void Courtroom::on_evidence_name_edited() ui_evidence_name->setReadOnly(true); if (current_evidence >= local_evidence_list.size()) return; - -// Prefer pressing [X] to update the evidence. -// QStringList f_contents; - -// evi_type f_evi = local_evidence_list.at(current_evidence); - -// f_contents.append(QString::number(current_evidence)); -// f_contents.append(ui_evidence_name->text()); -// f_contents.append(f_evi.description); -// f_contents.append(f_evi.image); - -// ao_app->send_server_packet(new AOPacket("EE", f_contents)); } void Courtroom::on_evidence_name_double_clicked() @@ -295,17 +323,6 @@ void Courtroom::on_evidence_image_name_edited() ui_evidence_image_name->setReadOnly(true); if (current_evidence >= local_evidence_list.size()) return; - -// QStringList f_contents; - -// evi_type f_evi = local_evidence_list.at(current_evidence); - -// f_contents.append(QString::number(current_evidence)); -// f_contents.append(f_evi.name); -// f_contents.append(f_evi.description); -// f_contents.append(ui_evidence_image_name->text()); - -// ao_app->send_server_packet(new AOPacket("EE", f_contents)); } void Courtroom::on_evidence_image_button_clicked() @@ -339,7 +356,19 @@ void Courtroom::on_evidence_clicked(int p_id) if (f_real_id == local_evidence_list.size()) { - ao_app->send_server_packet(new AOPacket("PE###empty.png#%")); + if (current_evidence_global) + ao_app->send_server_packet(new AOPacket("PE###empty.png#%")); + else + { + evi_type f_evi; + f_evi.name = ""; + f_evi.description = ""; + f_evi.image = "empty.png"; + + local_evidence_list.append(f_evi); + private_evidence_list = local_evidence_list; + set_evidence_page(); + } return; } else if (f_real_id > local_evidence_list.size()) @@ -425,6 +454,12 @@ void Courtroom::on_evidence_right_clicked() void Courtroom::on_evidence_present_clicked() { + if (!current_evidence_global) + { + ui_evidence_present->hide(); + is_presenting_evidence = false; + return; //otherwise we get force-disconnected + } if (is_presenting_evidence) ui_evidence_present->set_image("present"); else @@ -438,7 +473,14 @@ void Courtroom::on_evidence_present_clicked() void Courtroom::on_evidence_delete_clicked() { evidence_close(); - ao_app->send_server_packet(new AOPacket("DE#" + QString::number(current_evidence) + "#%")); + if (current_evidence_global) + ao_app->send_server_packet(new AOPacket("DE#" + QString::number(current_evidence) + "#%")); + else + { + local_evidence_list.remove(current_evidence); + private_evidence_list = local_evidence_list; + set_evidence_page(); + } current_evidence = 0; @@ -488,24 +530,82 @@ void Courtroom::on_evidence_ok_clicked() ui_evidence_description->setReadOnly(true); ui_evidence_image_name->setReadOnly(true); if (current_evidence < local_evidence_list.size()) + { + evi_type f_evi = local_evidence_list.at(current_evidence); + if (current_evidence_global) + { + QStringList f_contents; + f_contents.append(QString::number(current_evidence)); + f_contents.append(ui_evidence_name->text()); + f_contents.append(ui_evidence_description->toPlainText()); + f_contents.append(ui_evidence_image_name->text()); + + ao_app->send_server_packet(new AOPacket("EE", f_contents)); + } + else + { + f_evi.name = ui_evidence_name->text(); + f_evi.description = ui_evidence_description->toPlainText(); + f_evi.image = ui_evidence_image_name->text(); + local_evidence_list.replace(current_evidence, f_evi); + private_evidence_list = local_evidence_list; + ui_evidence_ok->hide(); + set_evidence_page(); + } + } +} + +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() +{ + if (current_evidence >= local_evidence_list.size()) + return; + + if (!current_evidence_global) //Transfer private evidence to global { evi_type f_evi = local_evidence_list.at(current_evidence); QStringList f_contents; - f_contents.append(QString::number(current_evidence)); - f_contents.append(ui_evidence_name->text()); - f_contents.append(ui_evidence_description->toPlainText()); - f_contents.append(ui_evidence_image_name->text()); + f_contents.append(f_evi.name); + f_contents.append(f_evi.description); + f_contents.append(f_evi.image); - ao_app->send_server_packet(new AOPacket("EE", f_contents)); - -// QMessageBox *msgBox = new QMessageBox; - -// msgBox->setText("You succesfully saved your changes."); -// msgBox->setStandardButtons(QMessageBox::Ok); -// msgBox->setDefaultButton(QMessageBox::Ok); -// msgBox->exec(); + ao_app->send_server_packet(new AOPacket("PE", f_contents)); } + else //Transfer global evidence to private + { + evi_type f_evi = local_evidence_list.at(current_evidence); + private_evidence_list.append(f_evi); + } + + QMessageBox *msgBox = new QMessageBox; + msgBox->setText("Evidence has been transferred."); + msgBox->setStandardButtons(QMessageBox::Ok); + msgBox->setDefaultButton(QMessageBox::Ok); + msgBox->exec(); } void Courtroom::on_evidence_edited() @@ -534,6 +634,25 @@ void Courtroom::evidence_close() ui_ic_chat_message->setFocus(); } +void Courtroom::evidence_switch(bool global) +{ + current_evidence_global = global; + is_presenting_evidence = false; + ui_evidence_present->set_image("present"); + local_evidence_list.clear(); + if (current_evidence_global) + { + local_evidence_list = global_evidence_list; + ui_evidence_present->show(); + } + else + { + local_evidence_list = private_evidence_list; + ui_evidence_present->hide(); + } + set_evidence_page(); +} + bool Courtroom::compare_evidence_changed(evi_type evi_a, evi_type evi_b) { return evi_a.name != evi_b.name || evi_a.image != evi_b.image || evi_a.description != evi_b.description;