Skip to content

Commit

Permalink
Speed up unloading component
Browse files Browse the repository at this point in the history
  • Loading branch information
kbinani committed Dec 24, 2023
1 parent 8a40f77 commit f617522
Show file tree
Hide file tree
Showing 18 changed files with 313 additions and 169 deletions.
13 changes: 7 additions & 6 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -55,17 +55,18 @@ set(je2be_desktop_files
src/AccountScanThread.h
src/Application.cpp
src/AsyncHandler.h
src/AsyncUpdaterWith.h
src/CommandID.h
src/ComponentState.h
src/Constants.h
src/File.h
src/GameDirectory.h
src/GameDirectoryScanThreadBedrock.cpp
src/GameDirectoryScanThreadBedrock.h
src/GameDirectoryScanThreadJava.cpp
src/GameDirectoryScanThreadJava.h
src/GameDirectoryScanThreadXbox360.cpp
src/GameDirectoryScanThreadXbox360.h
src/GameDirectoryScanWorkerBedrock.cpp
src/GameDirectoryScanWorkerBedrock.h
src/GameDirectoryScanWorkerJava.cpp
src/GameDirectoryScanWorkerJava.h
src/GameDirectoryScanWorkerXbox360.cpp
src/GameDirectoryScanWorkerXbox360.h
src/LocalizationHelper.cpp
src/LocalizationHelper.h
src/LookAndFeel.cpp
Expand Down
113 changes: 65 additions & 48 deletions src/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,10 @@ class Application : public juce::JUCEApplication {
}

bool perform(InvocationInfo const &info) override {
Component *current = fMainWindow->getContentComponent();
auto current = fMainWindowContent;
switch (info.commandID) {
case commands::toJ2BConfig: {
auto provider = dynamic_cast<ChooseInputStateProvider *>(current);
auto provider = dynamic_cast<ChooseInputStateProvider *>(current.get());
if (!provider) {
return false;
}
Expand All @@ -103,71 +103,78 @@ class Application : public juce::JUCEApplication {
if (state->fType != InputType::Java) {
return false;
}
auto config = new component::j2b::J2BConfig(*state);
fMainWindow->setContentOwned(config, true);
auto config = std::make_shared<component::j2b::J2BConfig>(*state);
fMainWindow->setContentNonOwned(config.get(), true);
fMainWindowContent = config;
return true;
}
case commands::toChooseJavaInput: {
std::optional<ChooseInputState> state;
auto provider = dynamic_cast<ChooseInputStateProvider *>(current);
auto provider = dynamic_cast<ChooseInputStateProvider *>(current.get());
if (provider) {
state = provider->getChooseInputState();
}
auto chooseInput = new component::ChooseJavaInput(state);
fMainWindow->setContentOwned(chooseInput, true);
auto chooseInput = std::make_shared<component::ChooseJavaInput>(state);
fMainWindow->setContentNonOwned(chooseInput.get(), true);
fMainWindowContent = chooseInput;
fMainWindow->setName(getApplicationName() + " : " + TRANS("Java to Bedrock"));
return true;
}
case commands::toJ2BConvert: {
auto provider = dynamic_cast<J2BConfigStateProvider *>(current);
auto provider = dynamic_cast<J2BConfigStateProvider *>(current.get());
if (!provider) {
return false;
}
auto convert = new component::j2b::J2BConvertProgress(provider->getConfigState());
fMainWindow->setContentOwned(convert, true);
auto convert = std::make_shared<component::j2b::J2BConvertProgress>(provider->getConfigState());
fMainWindow->setContentNonOwned(convert.get(), true);
fMainWindowContent = convert;
return true;
}
case commands::toChooseBedrockOutput: {
auto provider = dynamic_cast<BedrockConvertedStateProvider *>(current);
auto provider = dynamic_cast<BedrockConvertedStateProvider *>(current.get());
if (!provider) {
return false;
}
auto state = provider->getConvertedState();
if (!state) {
return false;
}
auto chooseOutput = new component::ChooseBedrockOutput(*state);
fMainWindow->setContentOwned(chooseOutput, true);
auto chooseOutput = std::make_shared<component::ChooseBedrockOutput>(*state);
fMainWindow->setContentNonOwned(chooseOutput.get(), true);
fMainWindowContent = chooseOutput;
return true;
}
case commands::toCopyBedrockArtifact: {
auto provider = dynamic_cast<BedrockOutputChoosenStateProvider *>(current);
auto provider = dynamic_cast<BedrockOutputChoosenStateProvider *>(current.get());
if (!provider) {
return false;
}
auto copy = new component::CopyBedrockArtifactProgress(provider->getBedrockOutputChoosenState());
fMainWindow->setContentOwned(copy, true);
auto copy = std::make_shared<component::CopyBedrockArtifactProgress>(provider->getBedrockOutputChoosenState());
fMainWindow->setContentNonOwned(copy.get(), true);
fMainWindowContent = copy;
return true;
}
case commands::toModeSelect: {
auto modeSelect = new component::ModeSelect;
fMainWindow->setContentOwned(modeSelect, true);
auto modeSelect = std::make_shared<component::ModeSelect>();
fMainWindow->setContentNonOwned(modeSelect.get(), true);
fMainWindowContent = modeSelect;
fMainWindow->setName(Application::getApplicationName());
return true;
}
case commands::toChooseBedrockInput: {
std::optional<ChooseInputState> state;
auto provider = dynamic_cast<ChooseInputStateProvider *>(current);
auto provider = dynamic_cast<ChooseInputStateProvider *>(current.get());
if (provider) {
state = provider->getChooseInputState();
}
auto chooseInput = new component::ChooseBedrockInput(state);
fMainWindow->setContentOwned(chooseInput, true);
auto chooseInput = std::make_shared<component::ChooseBedrockInput>(state);
fMainWindow->setContentNonOwned(chooseInput.get(), true);
fMainWindowContent = chooseInput;
fMainWindow->setName(getApplicationName() + " : " + TRANS("Bedrock to Java"));
return true;
}
case commands::toB2JConfig: {
auto provider = dynamic_cast<ChooseInputStateProvider *>(current);
auto provider = dynamic_cast<ChooseInputStateProvider *>(current.get());
if (!provider) {
return false;
}
Expand All @@ -178,45 +185,49 @@ class Application : public juce::JUCEApplication {
if (state->fType != InputType::Bedrock) {
return false;
}
auto config = new component::b2j::B2JConfig(*state);
fMainWindow->setContentOwned(config, true);
auto config = std::make_shared<component::b2j::B2JConfig>(*state);
fMainWindow->setContentNonOwned(config.get(), true);
fMainWindowContent = config;
return true;
}
case commands::toB2JConvert: {
auto provider = dynamic_cast<B2JConfigStateProvider *>(current);
auto provider = dynamic_cast<B2JConfigStateProvider *>(current.get());
if (!provider) {
return false;
}
auto convert = new component::b2j::B2JConvertProgress(provider->getConfigState());
fMainWindow->setContentOwned(convert, true);
auto convert = std::make_shared<component::b2j::B2JConvertProgress>(provider->getConfigState());
fMainWindow->setContentNonOwned(convert.get(), true);
fMainWindowContent = convert;
return true;
}
case commands::toChooseJavaOutput: {
auto provider = dynamic_cast<JavaConvertedStateProvider *>(current);
auto provider = dynamic_cast<JavaConvertedStateProvider *>(current.get());
if (!provider) {
return false;
}
auto state = provider->getConvertedState();
if (!state) {
return false;
}
auto chooseOutput = new component::ChooseJavaOutput(*state);
fMainWindow->setContentOwned(chooseOutput, true);
auto chooseOutput = std::make_shared<component::ChooseJavaOutput>(*state);
fMainWindow->setContentNonOwned(chooseOutput.get(), true);
fMainWindowContent = chooseOutput;
return true;
}
case commands::toCopyJavaArtifact: {
auto provider = dynamic_cast<JavaOutputChoosenStateProvider *>(current);
auto provider = dynamic_cast<JavaOutputChoosenStateProvider *>(current.get());
if (!provider) {
return false;
}
auto copy = new component::CopyJavaArtifactProgress(provider->getJavaOutputChoosenState());
fMainWindow->setContentOwned(copy, true);
auto copy = std::make_shared<component::CopyJavaArtifactProgress>(provider->getJavaOutputChoosenState());
fMainWindow->setContentNonOwned(copy.get(), true);
fMainWindowContent = copy;
return true;
}
case commands::toChooseXbox360InputToBedrock:
case commands::toChooseXbox360InputToJava: {
std::optional<ChooseInputState> state;
auto provider = dynamic_cast<ChooseInputStateProvider *>(current);
auto provider = dynamic_cast<ChooseInputStateProvider *>(current.get());
if (provider) {
state = provider->getChooseInputState();
}
Expand All @@ -229,13 +240,14 @@ class Application : public juce::JUCEApplication {
destination = commands::toXbox360ToJavaConfig;
title = TRANS("Xbox360 to Java");
}
auto chooseInput = new component::ChooseXbox360Input(destination, state);
fMainWindow->setContentOwned(chooseInput, true);
auto chooseInput = std::make_shared<component::ChooseXbox360Input>(destination, state);
fMainWindow->setContentNonOwned(chooseInput.get(), true);
fMainWindowContent = chooseInput;
fMainWindow->setName(getApplicationName() + " : " + title);
return true;
}
case commands::toXbox360ToJavaConfig: {
auto provider = dynamic_cast<ChooseInputStateProvider *>(current);
auto provider = dynamic_cast<ChooseInputStateProvider *>(current.get());
if (!provider) {
return false;
}
Expand All @@ -246,21 +258,23 @@ class Application : public juce::JUCEApplication {
if (state->fType != InputType::Xbox360) {
return false;
}
auto config = new component::x2j::X2JConfig(*state);
fMainWindow->setContentOwned(config, true);
auto config = std::make_shared<component::x2j::X2JConfig>(*state);
fMainWindow->setContentNonOwned(config.get(), true);
fMainWindowContent = config;
return true;
}
case commands::toXbox360ToJavaConvert: {
auto provider = dynamic_cast<X2JConfigStateProvider *>(current);
auto provider = dynamic_cast<X2JConfigStateProvider *>(current.get());
if (!provider) {
return false;
}
auto convert = new component::x2j::X2JConvertProgress(provider->getConfigState());
fMainWindow->setContentOwned(convert, true);
auto convert = std::make_shared<component::x2j::X2JConvertProgress>(provider->getConfigState());
fMainWindow->setContentNonOwned(convert.get(), true);
fMainWindowContent = convert;
return true;
}
case commands::toXbox360ToBedrockConfig: {
auto provider = dynamic_cast<ChooseInputStateProvider *>(current);
auto provider = dynamic_cast<ChooseInputStateProvider *>(current.get());
if (!provider) {
return false;
}
Expand All @@ -271,17 +285,19 @@ class Application : public juce::JUCEApplication {
if (state->fType != InputType::Xbox360) {
return false;
}
auto config = new component::x2b::X2BConfig(*state);
fMainWindow->setContentOwned(config, true);
auto config = std::make_shared<component::x2b::X2BConfig>(*state);
fMainWindow->setContentNonOwned(config.get(), true);
fMainWindowContent = config;
return true;
}
case commands::toXbox360ToBedrockConvert: {
auto provider = dynamic_cast<X2BConfigStateProvider *>(current);
auto provider = dynamic_cast<X2BConfigStateProvider *>(current.get());
if (!provider) {
return false;
}
auto convert = new component::x2b::X2BConvertProgress(provider->getConfigState());
fMainWindow->setContentOwned(convert, true);
auto convert = std::make_shared<component::x2b::X2BConvertProgress>(provider->getConfigState());
fMainWindow->setContentNonOwned(convert.get(), true);
fMainWindowContent = convert;
return true;
}
default:
Expand All @@ -291,6 +307,7 @@ class Application : public juce::JUCEApplication {

private:
std::unique_ptr<component::MainWindow> fMainWindow;
std::shared_ptr<juce::Component> fMainWindowContent;
SharedResourcePointer<TooltipWindow> fTooltipWindow;
std::unique_ptr<je2be::desktop::LookAndFeel> fLaf;
};
Expand Down
36 changes: 36 additions & 0 deletions src/AsyncUpdaterWith.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#pragma once

#include <juce_gui_extra/juce_gui_extra.h>

namespace je2be::desktop {

template <class Q>
class AsyncUpdaterWith : juce::AsyncUpdater {
public:
void triggerAsyncUpdateWith(Q q) {
{
std::lock_guard<std::mutex> lk(fMut);
fQueue.push_back(q);
}
triggerAsyncUpdate();
}

void handleAsyncUpdate() override {
std::deque<Q> copy;
{
std::lock_guard<std::mutex> lk(fMut);
copy.swap(fQueue);
}
for (auto const &q : copy) {
handleAsyncUpdateWith(q);
}
}

virtual void handleAsyncUpdateWith(Q q) = 0;

private:
std::deque<Q> fQueue;
std::mutex fMut;
};

} // namespace je2be::desktop
22 changes: 0 additions & 22 deletions src/GameDirectoryScanThreadBedrock.h

This file was deleted.

22 changes: 0 additions & 22 deletions src/GameDirectoryScanThreadJava.h

This file was deleted.

Loading

0 comments on commit f617522

Please sign in to comment.