## Summary * **What is the goal of this PR?** Small UX improvement to the Home screen by preserving the last selected cursor position when returning to it. It supersedes #985 and #1103, which are both significantly outdated and hundreds of commits behind master. --- ### AI Usage Did you use AI tools to help write this code? _**< YES >**_
64 lines
2.1 KiB
C++
64 lines
2.1 KiB
C++
#pragma once
|
|
#include <Logging.h>
|
|
|
|
#include <cassert>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
#include "ActivityManager.h" // for using the ActivityManager singleton
|
|
#include "ActivityResult.h"
|
|
#include "GfxRenderer.h"
|
|
#include "MappedInputManager.h"
|
|
#include "RenderLock.h"
|
|
#include "util/ScreenshotInfo.h"
|
|
|
|
class Activity {
|
|
friend class ActivityManager;
|
|
|
|
protected:
|
|
std::string name;
|
|
GfxRenderer& renderer;
|
|
MappedInputManager& mappedInput;
|
|
|
|
ActivityResultHandler resultHandler;
|
|
ActivityResult result;
|
|
|
|
public:
|
|
explicit Activity(std::string name, GfxRenderer& renderer, MappedInputManager& mappedInput)
|
|
: name(std::move(name)), renderer(renderer), mappedInput(mappedInput) {}
|
|
virtual ~Activity() = default;
|
|
virtual void onEnter();
|
|
virtual void onExit();
|
|
virtual void loop() {}
|
|
|
|
virtual void render(RenderLock&&) {}
|
|
|
|
// If immediate is true, the update will be triggered immediately.
|
|
// Otherwise, it will be deferred until the end of the current loop iteration.
|
|
virtual void requestUpdate(bool immediate = false);
|
|
|
|
// Request an immediate render and block until it completes.
|
|
virtual void requestUpdateAndWait();
|
|
|
|
virtual bool skipLoopDelay() { return false; }
|
|
virtual bool preventAutoSleep() { return false; }
|
|
virtual bool isReaderActivity() const { return false; }
|
|
virtual ScreenshotInfo getScreenshotInfo() const { return {}; }
|
|
|
|
// Start a new activity without destroying the current one
|
|
// Note: requestUpdate() will be invoked automatically once resultHandler finishes
|
|
void startActivityForResult(std::unique_ptr<Activity>&& activity, ActivityResultHandler resultHandler);
|
|
|
|
// Set the result to be passed back to the previous activity when this activity finishes
|
|
void setResult(ActivityResult&& result);
|
|
|
|
// Finish this activity and return to the previous one on the stack (if any)
|
|
void finish();
|
|
|
|
// Convenience method to facilitate API transition to ActivityManager
|
|
// TODO: remove this in near future
|
|
void onGoHome(HomeMenuItem item = HomeMenuItem::NONE);
|
|
void onSelectBook(const std::string& path);
|
|
};
|