mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-15 07:20:31 +02:00
The Back choice is hidden during the move, but the key still closed the screen. The destructor then blocked the UI thread until the move was done, and FinishFolderMove() never ran, leaving the config pointing at the old, now emptied folder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
137 lines
3.4 KiB
C++
137 lines
3.4 KiB
C++
// Copyright (c) 2013- PPSSPP Project.
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, version 2.0 or later versions.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License 2.0 for more details.
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
// Official git repository and contact information can be found at
|
|
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
|
|
|
#pragma once
|
|
|
|
#include <functional>
|
|
#include <string>
|
|
#include <atomic>
|
|
|
|
#include "ppsspp_config.h"
|
|
|
|
#include "Common/File/Path.h"
|
|
#include "Common/UI/UIScreen.h"
|
|
#include "Common/Thread/Promise.h"
|
|
|
|
#include "Core/Util/MemStick.h"
|
|
|
|
#include "UI/BaseScreens.h"
|
|
#include "UI/MiscViews.h"
|
|
|
|
class NoticeView;
|
|
|
|
// MemStickScreen - let's you configure your memory stick directory.
|
|
// Currently only useful for Android.
|
|
class MemStickScreen : public UIBaseDialogScreen {
|
|
public:
|
|
MemStickScreen(bool initialSetup);
|
|
~MemStickScreen() = default;
|
|
|
|
const char *tag() const override { return "MemStick"; }
|
|
|
|
enum Choice {
|
|
CHOICE_BROWSE_FOLDER,
|
|
CHOICE_PRIVATE_DIRECTORY,
|
|
CHOICE_STORAGE_ROOT,
|
|
CHOICE_SET_MANUAL,
|
|
};
|
|
|
|
protected:
|
|
void CreateViews() override;
|
|
|
|
void dialogFinished(const Screen *dialog, DialogResult result) override;
|
|
void update() override;
|
|
ScreenRenderFlags render(ScreenRenderMode mode) override {
|
|
// Simple anti-flicker due to delayed finish.
|
|
if (!done_) {
|
|
// render as usual.
|
|
return UIBaseDialogScreen::render(mode);
|
|
} else {
|
|
// no render. black frame insertion is better than flicker.
|
|
}
|
|
return ScreenRenderFlags::NONE;
|
|
}
|
|
|
|
private:
|
|
// Event handlers
|
|
void OnHelp(UI::EventParams &e);
|
|
|
|
// Confirm button sub handlers
|
|
void Browse(UI::EventParams &e);
|
|
void UseInternalStorage(UI::EventParams ¶ms);
|
|
void UseStorageRoot(UI::EventParams ¶ms);
|
|
void SetFolderManually(UI::EventParams ¶ms);
|
|
|
|
// Button handlers.
|
|
void OnConfirmClick(UI::EventParams ¶ms);
|
|
void OnChoiceClick(UI::EventParams ¶ms);
|
|
|
|
bool initialSetup_;
|
|
bool storageBrowserWorking_;
|
|
bool done_ = false;
|
|
|
|
#if PPSSPP_PLATFORM(UWP) && !defined(__LIBRETRO__)
|
|
int choice_ = CHOICE_PRIVATE_DIRECTORY;
|
|
#else
|
|
int choice_ = 0;
|
|
#endif
|
|
};
|
|
|
|
struct SpaceResult {
|
|
int64_t bytesFree;
|
|
};
|
|
|
|
class ConfirmMemstickMoveScreen : public UIBaseDialogScreen {
|
|
public:
|
|
ConfirmMemstickMoveScreen(const Path &newMemstickFolder, bool initialSetup);
|
|
~ConfirmMemstickMoveScreen();
|
|
|
|
const char *tag() const override { return "ConfirmMemstickMove"; }
|
|
|
|
bool key(const KeyInput &key) override;
|
|
|
|
protected:
|
|
void update() override;
|
|
void CreateViews() override;
|
|
|
|
private:
|
|
void OnMoveDataClick(UI::EventParams ¶ms);
|
|
void FinishFolderMove();
|
|
|
|
void OnConfirm(UI::EventParams ¶ms);
|
|
|
|
Path newMemstickFolder_;
|
|
bool existingFilesInNewFolder_;
|
|
bool folderConflict_;
|
|
|
|
#if PPSSPP_PLATFORM(UWP) && !defined(__LIBRETRO__)
|
|
bool moveData_ = false;
|
|
#else
|
|
bool moveData_ = true;
|
|
#endif
|
|
bool initialSetup_;
|
|
|
|
MoveProgressReporter progressReporter_;
|
|
UI::TextView *progressView_ = nullptr;
|
|
UI::TextView *newFreeSpaceView_ = nullptr;
|
|
|
|
Promise<MoveResult *> *moveDataTask_ = nullptr;
|
|
Promise<SpaceResult *> *newSpaceTask_ = nullptr;
|
|
|
|
std::string error_;
|
|
};
|