aboutsummaryrefslogtreecommitdiff
path: root/src/charselect.cpp
diff options
context:
space:
mode:
authorstonedDiscord <stoned@derpymail.org>2020-03-06 16:43:03 +0100
committerGitHub <noreply@github.com>2020-03-06 16:43:03 +0100
commitb668bb227652f0b19f0d0b7251c2afa2f36473c5 (patch)
tree9f23859a30574d9ce9220dd0f5fd2450b5ec7e2c /src/charselect.cpp
parentc2fd3796a97ee8d87544ec26df7d6797acfebd80 (diff)
parent8c93cce0be0a316723284349d1f618dbf770ba3f (diff)
Merge branch 'master' into music_list_update
Diffstat (limited to 'src/charselect.cpp')
-rw-r--r--src/charselect.cpp112
1 files changed, 70 insertions, 42 deletions
diff --git a/src/charselect.cpp b/src/charselect.cpp
index 0cfb775..d6ee044 100644
--- a/src/charselect.cpp
+++ b/src/charselect.cpp
@@ -5,6 +5,59 @@
#include "debug_functions.h"
#include "hardware_functions.h"
+class AOCharSelectGenerationThreading : public QRunnable
+{
+public:
+ Courtroom *thisCourtroom;
+ int char_num;
+ AOCharButton *char_button;
+ AOCharSelectGenerationThreading(Courtroom *my_courtroom, int character_number, AOCharButton *charbut){
+ thisCourtroom = my_courtroom;
+ char_num = character_number;
+ char_button = charbut;
+ }
+ void run()
+ {
+ AOCharButton* thisCharacterButton = char_button;
+ thisCharacterButton->reset();
+ thisCharacterButton->hide();
+ thisCharacterButton->set_image(thisCourtroom->char_list.at(char_num).name);
+ thisCourtroom->ui_char_button_list.append(thisCharacterButton);
+
+ thisCourtroom->connect(thisCharacterButton, SIGNAL(clicked()), thisCourtroom->char_button_mapper, SLOT(map()));
+ thisCourtroom->char_button_mapper->setMapping(thisCharacterButton, thisCourtroom->ui_char_button_list.size() - 1);
+ }
+};
+
+class AOCharSelectFilterThreading : public QRunnable
+{
+public:
+ Courtroom *thisCourtroom;
+ int char_num;
+ AOCharSelectFilterThreading(Courtroom *my_courtroom, int character_number){
+ thisCourtroom = my_courtroom;
+ char_num = character_number;
+ }
+ void run()
+ {
+ AOCharButton* current_char = thisCourtroom->ui_char_button_list.at(char_num);
+
+ if (!thisCourtroom->ui_char_taken->isChecked() && thisCourtroom->char_list.at(char_num).taken)
+ return;
+
+ if (!thisCourtroom->char_list.at(char_num).name.contains(thisCourtroom->ui_char_search->text(), Qt::CaseInsensitive))
+ return;
+
+ // We only really need to update the fact that a character is taken
+ // for the buttons that actually appear.
+ // You'd also update the passwordedness and etc. here later.
+ current_char->reset();
+ current_char->set_taken(thisCourtroom->char_list.at(char_num).taken);
+
+ thisCourtroom->ui_char_button_list_filtered.append(current_char);
+ }
+};
+
void Courtroom::construct_char_select()
{
ui_char_select_background = new AOImage(this, ao_app);
@@ -44,6 +97,7 @@ void Courtroom::construct_char_select()
set_size_and_pos(ui_char_buttons, "char_buttons");
+ connect(char_button_mapper, SIGNAL(mapped(int)), this, SLOT(char_clicked(int)));
connect(ui_back_to_lobby, SIGNAL(clicked()), this, SLOT(on_back_to_lobby_clicked()));
connect(ui_char_select_left, SIGNAL(clicked()), this, SLOT(on_char_select_left_clicked()));
@@ -125,7 +179,7 @@ void Courtroom::char_clicked(int n_char)
if (!file_exists(char_ini_path))
{
- call_notice("Could not find " + char_ini_path);
+ call_notice(tr("Could not find %1").arg(char_ini_path, 1));
return;
}
@@ -197,28 +251,15 @@ void Courtroom::character_loading_finished()
// Later on, we'll be revealing buttons as we need them.
for (int n = 0; n < char_list.size(); n++)
{
- AOCharButton* char_button = new AOCharButton(ui_char_buttons, ao_app, 0, 0, char_list.at(n).taken);
- char_button->reset();
- char_button->hide();
- char_button->set_image(char_list.at(n).name);
- ui_char_button_list.append(char_button);
-
- connect(char_button, &AOCharButton::clicked, [this, n](){
- this->char_clicked(n);
- });
-
- // This part here serves as a way of showing to the player that the game is still running, it is
- // just loading the pictures of the characters.
- if (ao_app->lobby_constructed)
- {
- ao_app->generated_chars++;
- int total_loading_size = ao_app->char_list_size * 2 + ao_app->evidence_list_size + ao_app->music_list_size;
- int loading_value = int(((ao_app->loaded_chars + ao_app->generated_chars + ao_app->loaded_music + ao_app->loaded_evidence) / static_cast<double>(total_loading_size)) * 100);
- ao_app->w_lobby->set_loading_value(loading_value);
- ao_app->w_lobby->set_loading_text(tr("Generating chars:\n%1/%2").arg(QString::number(ao_app->generated_chars)).arg(QString::number(ao_app->char_list_size)));
- }
+ AOCharButton* characterButton = new AOCharButton(ui_char_buttons, ao_app, 0, 0, char_list.at(n).taken);
+ AOCharSelectGenerationThreading *char_generate = new AOCharSelectGenerationThreading(this, n, characterButton);
+ QThreadPool::globalInstance()->start(char_generate);
+ if(QThreadPool::globalInstance()->activeThreadCount() == QThreadPool::globalInstance()->maxThreadCount())
+ {
+ QThreadPool::globalInstance()->waitForDone();
+ }
}
-
+ QThreadPool::globalInstance()->waitForDone();
filter_character_list();
}
@@ -227,27 +268,14 @@ void Courtroom::filter_character_list()
ui_char_button_list_filtered.clear();
for (int i = 0; i < char_list.size(); i++)
{
- AOCharButton* current_char = ui_char_button_list.at(i);
-
- // It seems passwording characters is unimplemented yet?
- // Until then, this will stay here, I suppose.
- //if (ui_char_passworded->isChecked() && character_is_passworded??)
- // continue;
-
- if (!ui_char_taken->isChecked() && char_list.at(i).taken)
- continue;
-
- if (!char_list.at(i).name.contains(ui_char_search->text(), Qt::CaseInsensitive))
- continue;
-
- // We only really need to update the fact that a character is taken
- // for the buttons that actually appear.
- // You'd also update the passwordedness and etc. here later.
- current_char->reset();
- current_char->set_taken(char_list.at(i).taken);
-
- ui_char_button_list_filtered.append(current_char);
+ AOCharSelectFilterThreading *char_filter = new AOCharSelectFilterThreading(this, i);
+ QThreadPool::globalInstance()->start(char_filter);
+ if(QThreadPool::globalInstance()->activeThreadCount() == QThreadPool::globalInstance()->maxThreadCount())
+ {
+ QThreadPool::globalInstance()->waitForDone();
+ }
}
+ QThreadPool::globalInstance()->waitForDone();
current_char_page = 0;
set_char_select_page();