mirror of
https://github.com/wiiu-env/WiiUPluginLoaderBackend.git
synced 2024-11-24 21:56:53 +01:00
ConfigMenu: Only redraw if something on the screen has changed
This commit is contained in:
parent
6e02c4b7a1
commit
340fdddf0b
@ -54,6 +54,7 @@ ConfigSubState CategoryRenderer::Update(Input &input, const WUPSConfigSimplePadD
|
|||||||
if (mSubCategoryRenderer) {
|
if (mSubCategoryRenderer) {
|
||||||
auto subResult = mSubCategoryRenderer->Update(input, simpleInputData, complexInputData);
|
auto subResult = mSubCategoryRenderer->Update(input, simpleInputData, complexInputData);
|
||||||
if (subResult != SUB_STATE_RUNNING) {
|
if (subResult != SUB_STATE_RUNNING) {
|
||||||
|
mNeedsRedraw = true;
|
||||||
mState = STATE_MAIN;
|
mState = STATE_MAIN;
|
||||||
mFirstFrame = true;
|
mFirstFrame = true;
|
||||||
return SUB_STATE_RUNNING;
|
return SUB_STATE_RUNNING;
|
||||||
@ -93,6 +94,7 @@ ConfigSubState CategoryRenderer::UpdateStateMain(Input &input, const WUPSConfigS
|
|||||||
}
|
}
|
||||||
mCurrentOpen = mCursorPos;
|
mCurrentOpen = mCursorPos;
|
||||||
mState = STATE_SUB;
|
mState = STATE_SUB;
|
||||||
|
mNeedsRedraw = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -115,6 +117,7 @@ ConfigSubState CategoryRenderer::UpdateStateMain(Input &input, const WUPSConfigS
|
|||||||
mItemRenderer[prevSelectedItem]->SetIsSelected(false);
|
mItemRenderer[prevSelectedItem]->SetIsSelected(false);
|
||||||
mItemRenderer[mCursorPos]->SetIsSelected(true);
|
mItemRenderer[mCursorPos]->SetIsSelected(true);
|
||||||
posJustChanged = true;
|
posJustChanged = true;
|
||||||
|
mNeedsRedraw = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!posJustChanged && !mFirstFrame) {
|
if (!posJustChanged && !mFirstFrame) {
|
||||||
@ -135,9 +138,43 @@ ConfigSubState CategoryRenderer::UpdateStateMain(Input &input, const WUPSConfigS
|
|||||||
|
|
||||||
mIsItemMovementAllowed = mItemRenderer[mCursorPos]->IsMovementAllowed();
|
mIsItemMovementAllowed = mItemRenderer[mCursorPos]->IsMovementAllowed();
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < mItemRenderer.size(); i++) {
|
||||||
|
bool isHighlighted = ((int) i == mCursorPos);
|
||||||
|
mItemRenderer[i]->Update(isHighlighted);
|
||||||
|
}
|
||||||
|
|
||||||
return SUB_STATE_RUNNING;
|
return SUB_STATE_RUNNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CategoryRenderer::ResetNeedsRedraw() {
|
||||||
|
mNeedsRedraw = false;
|
||||||
|
if (mState == STATE_SUB && mSubCategoryRenderer) {
|
||||||
|
mSubCategoryRenderer->ResetNeedsRedraw();
|
||||||
|
}
|
||||||
|
for (auto &item : mItemRenderer) {
|
||||||
|
item->ResetNeedsRedraw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool CategoryRenderer::NeedsRedraw() const {
|
||||||
|
if (mNeedsRedraw) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (mState == STATE_SUB && mSubCategoryRenderer) {
|
||||||
|
if (mSubCategoryRenderer->NeedsRedraw()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const auto &item : mItemRenderer) {
|
||||||
|
if (item->NeedsRedraw()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void CategoryRenderer::Render() const {
|
void CategoryRenderer::Render() const {
|
||||||
switch (mState) {
|
switch (mState) {
|
||||||
case STATE_MAIN:
|
case STATE_MAIN:
|
||||||
|
@ -19,6 +19,10 @@ public:
|
|||||||
|
|
||||||
void Render() const;
|
void Render() const;
|
||||||
|
|
||||||
|
[[nodiscard]] bool NeedsRedraw() const;
|
||||||
|
|
||||||
|
void ResetNeedsRedraw();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ConfigSubState UpdateStateMain(Input &input, const WUPSConfigSimplePadData &simpleInputData, const WUPSConfigComplexPadData &complexInputData);
|
ConfigSubState UpdateStateMain(Input &input, const WUPSConfigSimplePadData &simpleInputData, const WUPSConfigComplexPadData &complexInputData);
|
||||||
|
|
||||||
@ -43,4 +47,5 @@ private:
|
|||||||
bool mIsItemMovementAllowed = true;
|
bool mIsItemMovementAllowed = true;
|
||||||
bool mFirstFrame = true;
|
bool mFirstFrame = true;
|
||||||
bool mIsRoot = false;
|
bool mIsRoot = false;
|
||||||
|
bool mNeedsRedraw = true;
|
||||||
};
|
};
|
||||||
|
@ -68,6 +68,8 @@ ConfigSubState ConfigRenderer::UpdateStateMain(const Input &input) {
|
|||||||
if (mConfigs.empty()) {
|
if (mConfigs.empty()) {
|
||||||
return SUB_STATE_ERROR;
|
return SUB_STATE_ERROR;
|
||||||
}
|
}
|
||||||
|
auto prevSelectedItem = mCursorPos;
|
||||||
|
|
||||||
auto totalElementSize = mConfigs.size();
|
auto totalElementSize = mConfigs.size();
|
||||||
if (input.data.buttons_d & Input::eButtons::BUTTON_DOWN) {
|
if (input.data.buttons_d & Input::eButtons::BUTTON_DOWN) {
|
||||||
mCursorPos++;
|
mCursorPos++;
|
||||||
@ -101,9 +103,31 @@ ConfigSubState ConfigRenderer::UpdateStateMain(const Input &input) {
|
|||||||
} else if (mCursorPos >= mRenderOffset + MAX_BUTTONS_ON_SCREEN - 1) {
|
} else if (mCursorPos >= mRenderOffset + MAX_BUTTONS_ON_SCREEN - 1) {
|
||||||
mRenderOffset = mCursorPos - MAX_BUTTONS_ON_SCREEN + 1;
|
mRenderOffset = mCursorPos - MAX_BUTTONS_ON_SCREEN + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (prevSelectedItem != mCursorPos) {
|
||||||
|
mNeedRedraw = true;
|
||||||
|
}
|
||||||
|
|
||||||
return SUB_STATE_RUNNING;
|
return SUB_STATE_RUNNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ConfigRenderer::NeedsRedraw() const {
|
||||||
|
if (mNeedRedraw) {
|
||||||
|
return true;
|
||||||
|
} else if (mState == STATE_SUB && mCategoryRenderer) {
|
||||||
|
return mCategoryRenderer->NeedsRedraw();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigRenderer::ResetNeedsRedraw() {
|
||||||
|
mNeedRedraw = false;
|
||||||
|
if (mState == STATE_SUB && mCategoryRenderer) {
|
||||||
|
mCategoryRenderer->ResetNeedsRedraw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ConfigRenderer::Render() const {
|
void ConfigRenderer::Render() const {
|
||||||
switch (mState) {
|
switch (mState) {
|
||||||
case STATE_MAIN:
|
case STATE_MAIN:
|
||||||
@ -128,6 +152,7 @@ ConfigSubState ConfigRenderer::Update(Input &input, const WUPSConfigSimplePadDat
|
|||||||
if (mCategoryRenderer) {
|
if (mCategoryRenderer) {
|
||||||
auto subResult = mCategoryRenderer->Update(input, simpleInputData, complexInputData);
|
auto subResult = mCategoryRenderer->Update(input, simpleInputData, complexInputData);
|
||||||
if (subResult != SUB_STATE_RUNNING) {
|
if (subResult != SUB_STATE_RUNNING) {
|
||||||
|
mNeedRedraw = true;
|
||||||
mState = STATE_MAIN;
|
mState = STATE_MAIN;
|
||||||
return SUB_STATE_RUNNING;
|
return SUB_STATE_RUNNING;
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,10 @@ public:
|
|||||||
|
|
||||||
void Render() const;
|
void Render() const;
|
||||||
|
|
||||||
|
[[nodiscard]] bool NeedsRedraw() const;
|
||||||
|
|
||||||
|
void ResetNeedsRedraw();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ConfigSubState UpdateStateMain(const Input &input);
|
ConfigSubState UpdateStateMain(const Input &input);
|
||||||
|
|
||||||
@ -40,4 +44,6 @@ private:
|
|||||||
int32_t mCurrentOpen = -1;
|
int32_t mCurrentOpen = -1;
|
||||||
void CallOnCloseCallback(const GeneralConfigInformation &info, const std::vector<std::unique_ptr<WUPSConfigAPIBackend::WUPSConfigCategory>> &categories);
|
void CallOnCloseCallback(const GeneralConfigInformation &info, const std::vector<std::unique_ptr<WUPSConfigAPIBackend::WUPSConfigCategory>> &categories);
|
||||||
void CallOnCloseCallback(const GeneralConfigInformation &info, const WUPSConfigAPIBackend::WUPSConfig &config);
|
void CallOnCloseCallback(const GeneralConfigInformation &info, const WUPSConfigAPIBackend::WUPSConfig &config);
|
||||||
|
|
||||||
|
bool mNeedRedraw = true;
|
||||||
};
|
};
|
||||||
|
@ -12,11 +12,28 @@ public:
|
|||||||
assert(mItem);
|
assert(mItem);
|
||||||
drawGenericBoxAndText(yOffset, mItem->getDisplayName(), isHighlighted);
|
drawGenericBoxAndText(yOffset, mItem->getDisplayName(), isHighlighted);
|
||||||
DrawUtils::setFontSize(24);
|
DrawUtils::setFontSize(24);
|
||||||
if (isHighlighted) {
|
DrawUtils::print(SCREEN_WIDTH - 16 * 2, yOffset + 8 + 24, mCurItemText.c_str(), true);
|
||||||
DrawUtils::print(SCREEN_WIDTH - 16 * 2, yOffset + 8 + 24, mItem->getCurrentValueSelectedDisplay().c_str(), true);
|
|
||||||
} else {
|
|
||||||
DrawUtils::print(SCREEN_WIDTH - 16 * 2, yOffset + 8 + 24, mItem->getCurrentValueDisplay().c_str(), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string GetValueToPrint(bool isHighlighted) {
|
||||||
|
return isHighlighted ? mItem->getCurrentValueSelectedDisplay() : mItem->getCurrentValueDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update(bool isHighlighted) override {
|
||||||
|
const auto newText = GetValueToPrint(isHighlighted);
|
||||||
|
|
||||||
|
if (mCurItemText != newText) {
|
||||||
|
mNeedsDraw = true;
|
||||||
|
}
|
||||||
|
mCurItemText = newText;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResetNeedsRedraw() override {
|
||||||
|
mNeedsDraw = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] bool NeedsRedraw() const override {
|
||||||
|
return mNeedsDraw;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetIsSelected(bool isSelected) override {
|
void SetIsSelected(bool isSelected) override {
|
||||||
@ -40,4 +57,6 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
const WUPSConfigAPIBackend::WUPSConfigItem *mItem;
|
const WUPSConfigAPIBackend::WUPSConfigItem *mItem;
|
||||||
|
std::string mCurItemText;
|
||||||
|
bool mNeedsDraw = true;
|
||||||
};
|
};
|
@ -12,6 +12,16 @@ public:
|
|||||||
drawGenericBoxAndText(yOffset, mCategory->getName(), isHighlighted);
|
drawGenericBoxAndText(yOffset, mCategory->getName(), isHighlighted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Update(bool) override {
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] bool NeedsRedraw() const override {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResetNeedsRedraw() override {
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const WUPSConfigAPIBackend::WUPSConfigCategory *mCategory;
|
const WUPSConfigAPIBackend::WUPSConfigCategory *mCategory;
|
||||||
};
|
};
|
@ -20,6 +20,12 @@ public:
|
|||||||
|
|
||||||
virtual void Draw(uint32_t yOffset, bool isHighlighted) const = 0;
|
virtual void Draw(uint32_t yOffset, bool isHighlighted) const = 0;
|
||||||
|
|
||||||
|
virtual void Update(bool) = 0;
|
||||||
|
|
||||||
|
[[nodiscard]] virtual bool NeedsRedraw() const = 0;
|
||||||
|
|
||||||
|
virtual void ResetNeedsRedraw() = 0;
|
||||||
|
|
||||||
virtual void SetIsSelected(bool) {
|
virtual void SetIsSelected(bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,7 +174,11 @@ void ConfigUtils::displayMenu() {
|
|||||||
if (subState != SUB_STATE_RUNNING) {
|
if (subState != SUB_STATE_RUNNING) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (renderer.NeedsRedraw()) {
|
||||||
renderer.Render();
|
renderer.Render();
|
||||||
|
}
|
||||||
|
renderer.ResetNeedsRedraw();
|
||||||
|
|
||||||
auto diffTime = OSTicksToMicroseconds(OSGetTime() - startTime);
|
auto diffTime = OSTicksToMicroseconds(OSGetTime() - startTime);
|
||||||
if (diffTime < 16000) {
|
if (diffTime < 16000) {
|
||||||
OSSleepTicks(OSMicrosecondsToTicks(16000 - diffTime));
|
OSSleepTicks(OSMicrosecondsToTicks(16000 - diffTime));
|
||||||
|
Loading…
Reference in New Issue
Block a user