mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-15 16:59:18 +01:00
Android: Add graphics mods support to CheatsActivity
This commit is contained in:
parent
45f6d36c45
commit
8f410bff15
@ -24,10 +24,13 @@ public class CheatsViewModel extends ViewModel
|
|||||||
private final MutableLiveData<Integer> mGeckoCheatsDownloadedEvent = new MutableLiveData<>(null);
|
private final MutableLiveData<Integer> mGeckoCheatsDownloadedEvent = new MutableLiveData<>(null);
|
||||||
private final MutableLiveData<Boolean> mOpenDetailsViewEvent = new MutableLiveData<>(false);
|
private final MutableLiveData<Boolean> mOpenDetailsViewEvent = new MutableLiveData<>(false);
|
||||||
|
|
||||||
|
private GraphicsModGroup mGraphicsModGroup;
|
||||||
|
private ArrayList<GraphicsMod> mGraphicsMods;
|
||||||
private ArrayList<PatchCheat> mPatchCheats;
|
private ArrayList<PatchCheat> mPatchCheats;
|
||||||
private ArrayList<ARCheat> mARCheats;
|
private ArrayList<ARCheat> mARCheats;
|
||||||
private ArrayList<GeckoCheat> mGeckoCheats;
|
private ArrayList<GeckoCheat> mGeckoCheats;
|
||||||
|
|
||||||
|
private boolean mGraphicsModsNeedSaving = false;
|
||||||
private boolean mPatchCheatsNeedSaving = false;
|
private boolean mPatchCheatsNeedSaving = false;
|
||||||
private boolean mARCheatsNeedSaving = false;
|
private boolean mARCheatsNeedSaving = false;
|
||||||
private boolean mGeckoCheatsNeedSaving = false;
|
private boolean mGeckoCheatsNeedSaving = false;
|
||||||
@ -37,13 +40,23 @@ public class CheatsViewModel extends ViewModel
|
|||||||
if (mLoaded)
|
if (mLoaded)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
mGraphicsModGroup = GraphicsModGroup.load(gameID);
|
||||||
|
mGraphicsMods = new ArrayList<>();
|
||||||
|
Collections.addAll(mGraphicsMods, mGraphicsModGroup.getMods());
|
||||||
|
|
||||||
mPatchCheats = new ArrayList<>();
|
mPatchCheats = new ArrayList<>();
|
||||||
Collections.addAll(mPatchCheats, PatchCheat.loadCodes(gameID, revision));
|
Collections.addAll(mPatchCheats, PatchCheat.loadCodes(gameID, revision));
|
||||||
|
|
||||||
mARCheats = new ArrayList<>();
|
mARCheats = new ArrayList<>();
|
||||||
Collections.addAll(mARCheats, ARCheat.loadCodes(gameID, revision));
|
Collections.addAll(mARCheats, ARCheat.loadCodes(gameID, revision));
|
||||||
|
|
||||||
mGeckoCheats = new ArrayList<>();
|
mGeckoCheats = new ArrayList<>();
|
||||||
Collections.addAll(mGeckoCheats, GeckoCheat.loadCodes(gameID, revision));
|
Collections.addAll(mGeckoCheats, GeckoCheat.loadCodes(gameID, revision));
|
||||||
|
|
||||||
|
for (GraphicsMod mod : mGraphicsMods)
|
||||||
|
{
|
||||||
|
mod.setChangedCallback(() -> mGraphicsModsNeedSaving = true);
|
||||||
|
}
|
||||||
for (PatchCheat cheat : mPatchCheats)
|
for (PatchCheat cheat : mPatchCheats)
|
||||||
{
|
{
|
||||||
cheat.setChangedCallback(() -> mPatchCheatsNeedSaving = true);
|
cheat.setChangedCallback(() -> mPatchCheatsNeedSaving = true);
|
||||||
@ -62,6 +75,12 @@ public class CheatsViewModel extends ViewModel
|
|||||||
|
|
||||||
public void saveIfNeeded(String gameID, int revision)
|
public void saveIfNeeded(String gameID, int revision)
|
||||||
{
|
{
|
||||||
|
if (mGraphicsModsNeedSaving)
|
||||||
|
{
|
||||||
|
mGraphicsModGroup.save();
|
||||||
|
mGraphicsModsNeedSaving = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (mPatchCheatsNeedSaving)
|
if (mPatchCheatsNeedSaving)
|
||||||
{
|
{
|
||||||
PatchCheat.saveCodes(gameID, revision, mPatchCheats.toArray(new PatchCheat[0]));
|
PatchCheat.saveCodes(gameID, revision, mPatchCheats.toArray(new PatchCheat[0]));
|
||||||
@ -280,6 +299,11 @@ public class CheatsViewModel extends ViewModel
|
|||||||
mOpenDetailsViewEvent.setValue(false);
|
mOpenDetailsViewEvent.setValue(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ArrayList<GraphicsMod> getGraphicsMods()
|
||||||
|
{
|
||||||
|
return mGraphicsMods;
|
||||||
|
}
|
||||||
|
|
||||||
public ArrayList<PatchCheat> getPatchCheats()
|
public ArrayList<PatchCheat> getPatchCheats()
|
||||||
{
|
{
|
||||||
return mPatchCheats;
|
return mPatchCheats;
|
||||||
|
@ -0,0 +1,61 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
package org.dolphinemu.dolphinemu.features.cheats.model;
|
||||||
|
|
||||||
|
import androidx.annotation.Keep;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
public class GraphicsMod extends ReadOnlyCheat
|
||||||
|
{
|
||||||
|
@Keep
|
||||||
|
private final long mPointer;
|
||||||
|
|
||||||
|
// When a C++ GraphicsModGroup object is destroyed, it also destroys the GraphicsMods it owns.
|
||||||
|
// To avoid getting dangling pointers, we keep a reference to the GraphicsModGroup here.
|
||||||
|
@Keep
|
||||||
|
private final GraphicsModGroup mParent;
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
private GraphicsMod(long pointer, GraphicsModGroup parent)
|
||||||
|
{
|
||||||
|
mPointer = pointer;
|
||||||
|
mParent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportsCreator()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportsNotes()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportsCode()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public native String getName();
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public native String getCreator();
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public native String getNotes();
|
||||||
|
|
||||||
|
public boolean getUserDefined()
|
||||||
|
{
|
||||||
|
// Technically graphics mods can be user defined, but we don't support editing graphics mods
|
||||||
|
// in the GUI, and editability is what this really controls
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public native boolean getEnabled();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected native void setEnabledImpl(boolean enabled);
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package org.dolphinemu.dolphinemu.features.cheats.model;
|
||||||
|
|
||||||
|
import androidx.annotation.Keep;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
public class GraphicsModGroup
|
||||||
|
{
|
||||||
|
@Keep
|
||||||
|
private final long mPointer;
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
private GraphicsModGroup(long pointer)
|
||||||
|
{
|
||||||
|
mPointer = pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public native void finalize();
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public native GraphicsMod[] getMods();
|
||||||
|
|
||||||
|
public native void save();
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public static native GraphicsModGroup load(String gameId);
|
||||||
|
}
|
@ -13,6 +13,7 @@ import org.dolphinemu.dolphinemu.R;
|
|||||||
import org.dolphinemu.dolphinemu.features.cheats.model.ARCheat;
|
import org.dolphinemu.dolphinemu.features.cheats.model.ARCheat;
|
||||||
import org.dolphinemu.dolphinemu.features.cheats.model.CheatsViewModel;
|
import org.dolphinemu.dolphinemu.features.cheats.model.CheatsViewModel;
|
||||||
import org.dolphinemu.dolphinemu.features.cheats.model.GeckoCheat;
|
import org.dolphinemu.dolphinemu.features.cheats.model.GeckoCheat;
|
||||||
|
import org.dolphinemu.dolphinemu.features.cheats.model.GraphicsMod;
|
||||||
import org.dolphinemu.dolphinemu.features.cheats.model.PatchCheat;
|
import org.dolphinemu.dolphinemu.features.cheats.model.PatchCheat;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -90,8 +91,8 @@ public class CheatsAdapter extends RecyclerView.Adapter<CheatItemViewHolder>
|
|||||||
@Override
|
@Override
|
||||||
public int getItemCount()
|
public int getItemCount()
|
||||||
{
|
{
|
||||||
return mViewModel.getARCheats().size() + mViewModel.getGeckoCheats().size() +
|
return mViewModel.getGraphicsMods().size() + mViewModel.getPatchCheats().size() +
|
||||||
mViewModel.getPatchCheats().size() + 7;
|
mViewModel.getARCheats().size() + mViewModel.getGeckoCheats().size() + 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -108,6 +109,17 @@ public class CheatsAdapter extends RecyclerView.Adapter<CheatItemViewHolder>
|
|||||||
|
|
||||||
private CheatItem getItemAt(int position)
|
private CheatItem getItemAt(int position)
|
||||||
{
|
{
|
||||||
|
// Graphics mods
|
||||||
|
|
||||||
|
if (position == 0)
|
||||||
|
return new CheatItem(CheatItem.TYPE_HEADER, R.string.cheats_header_graphics_mod);
|
||||||
|
position -= 1;
|
||||||
|
|
||||||
|
ArrayList<GraphicsMod> graphicsMods = mViewModel.getGraphicsMods();
|
||||||
|
if (position < graphicsMods.size())
|
||||||
|
return new CheatItem(graphicsMods.get(position));
|
||||||
|
position -= graphicsMods.size();
|
||||||
|
|
||||||
// Patches
|
// Patches
|
||||||
|
|
||||||
if (position == 0)
|
if (position == 0)
|
||||||
|
@ -490,6 +490,7 @@
|
|||||||
<string name="cheats_header_ar">AR Codes</string>
|
<string name="cheats_header_ar">AR Codes</string>
|
||||||
<string name="cheats_header_gecko">Gecko Codes</string>
|
<string name="cheats_header_gecko">Gecko Codes</string>
|
||||||
<string name="cheats_header_patch">Patches</string>
|
<string name="cheats_header_patch">Patches</string>
|
||||||
|
<string name="cheats_header_graphics_mod">Graphics Mods</string>
|
||||||
<string name="cheats_add_ar">Add New AR Code</string>
|
<string name="cheats_add_ar">Add New AR Code</string>
|
||||||
<string name="cheats_add_gecko">Add New Gecko Code</string>
|
<string name="cheats_add_gecko">Add New Gecko Code</string>
|
||||||
<string name="cheats_add_patch">Add New Patch</string>
|
<string name="cheats_add_patch">Add New Patch</string>
|
||||||
|
@ -70,6 +70,14 @@ static jclass s_patch_cheat_class;
|
|||||||
static jfieldID s_patch_cheat_pointer;
|
static jfieldID s_patch_cheat_pointer;
|
||||||
static jmethodID s_patch_cheat_constructor;
|
static jmethodID s_patch_cheat_constructor;
|
||||||
|
|
||||||
|
static jclass s_graphics_mod_group_class;
|
||||||
|
static jfieldID s_graphics_mod_group_pointer;
|
||||||
|
static jmethodID s_graphics_mod_group_constructor;
|
||||||
|
|
||||||
|
static jclass s_graphics_mod_class;
|
||||||
|
static jfieldID s_graphics_mod_pointer;
|
||||||
|
static jmethodID s_graphics_mod_constructor;
|
||||||
|
|
||||||
static jclass s_riivolution_patches_class;
|
static jclass s_riivolution_patches_class;
|
||||||
static jfieldID s_riivolution_patches_pointer;
|
static jfieldID s_riivolution_patches_pointer;
|
||||||
|
|
||||||
@ -331,6 +339,36 @@ jmethodID GetPatchCheatConstructor()
|
|||||||
return s_patch_cheat_constructor;
|
return s_patch_cheat_constructor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jclass GetGraphicsModClass()
|
||||||
|
{
|
||||||
|
return s_graphics_mod_class;
|
||||||
|
}
|
||||||
|
|
||||||
|
jfieldID GetGraphicsModPointer()
|
||||||
|
{
|
||||||
|
return s_graphics_mod_pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
jmethodID GetGraphicsModConstructor()
|
||||||
|
{
|
||||||
|
return s_graphics_mod_constructor;
|
||||||
|
}
|
||||||
|
|
||||||
|
jclass GetGraphicsModGroupClass()
|
||||||
|
{
|
||||||
|
return s_graphics_mod_group_class;
|
||||||
|
}
|
||||||
|
|
||||||
|
jfieldID GetGraphicsModGroupPointer()
|
||||||
|
{
|
||||||
|
return s_graphics_mod_group_pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
jmethodID GetGraphicsModGroupConstructor()
|
||||||
|
{
|
||||||
|
return s_graphics_mod_group_constructor;
|
||||||
|
}
|
||||||
|
|
||||||
jclass GetRiivolutionPatchesClass()
|
jclass GetRiivolutionPatchesClass()
|
||||||
{
|
{
|
||||||
return s_riivolution_patches_class;
|
return s_riivolution_patches_class;
|
||||||
@ -480,6 +518,23 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
|
|||||||
s_patch_cheat_constructor = env->GetMethodID(patch_cheat_class, "<init>", "(J)V");
|
s_patch_cheat_constructor = env->GetMethodID(patch_cheat_class, "<init>", "(J)V");
|
||||||
env->DeleteLocalRef(patch_cheat_class);
|
env->DeleteLocalRef(patch_cheat_class);
|
||||||
|
|
||||||
|
const jclass graphics_mod_group_class =
|
||||||
|
env->FindClass("org/dolphinemu/dolphinemu/features/cheats/model/GraphicsModGroup");
|
||||||
|
s_graphics_mod_group_class =
|
||||||
|
reinterpret_cast<jclass>(env->NewGlobalRef(graphics_mod_group_class));
|
||||||
|
s_graphics_mod_group_pointer = env->GetFieldID(graphics_mod_group_class, "mPointer", "J");
|
||||||
|
s_graphics_mod_group_constructor = env->GetMethodID(graphics_mod_group_class, "<init>", "(J)V");
|
||||||
|
env->DeleteLocalRef(graphics_mod_group_class);
|
||||||
|
|
||||||
|
const jclass graphics_mod_class =
|
||||||
|
env->FindClass("org/dolphinemu/dolphinemu/features/cheats/model/GraphicsMod");
|
||||||
|
s_graphics_mod_class = reinterpret_cast<jclass>(env->NewGlobalRef(graphics_mod_class));
|
||||||
|
s_graphics_mod_pointer = env->GetFieldID(graphics_mod_class, "mPointer", "J");
|
||||||
|
s_graphics_mod_constructor =
|
||||||
|
env->GetMethodID(graphics_mod_class, "<init>",
|
||||||
|
"(JLorg/dolphinemu/dolphinemu/features/cheats/model/GraphicsModGroup;)V");
|
||||||
|
env->DeleteLocalRef(graphics_mod_class);
|
||||||
|
|
||||||
const jclass riivolution_patches_class =
|
const jclass riivolution_patches_class =
|
||||||
env->FindClass("org/dolphinemu/dolphinemu/features/riivolution/model/RiivolutionPatches");
|
env->FindClass("org/dolphinemu/dolphinemu/features/riivolution/model/RiivolutionPatches");
|
||||||
s_riivolution_patches_class =
|
s_riivolution_patches_class =
|
||||||
@ -516,6 +571,8 @@ JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved)
|
|||||||
env->DeleteGlobalRef(s_ar_cheat_class);
|
env->DeleteGlobalRef(s_ar_cheat_class);
|
||||||
env->DeleteGlobalRef(s_gecko_cheat_class);
|
env->DeleteGlobalRef(s_gecko_cheat_class);
|
||||||
env->DeleteGlobalRef(s_patch_cheat_class);
|
env->DeleteGlobalRef(s_patch_cheat_class);
|
||||||
|
env->DeleteGlobalRef(s_graphics_mod_group_class);
|
||||||
|
env->DeleteGlobalRef(s_graphics_mod_class);
|
||||||
env->DeleteGlobalRef(s_riivolution_patches_class);
|
env->DeleteGlobalRef(s_riivolution_patches_class);
|
||||||
env->DeleteGlobalRef(s_wii_update_cb_class);
|
env->DeleteGlobalRef(s_wii_update_cb_class);
|
||||||
}
|
}
|
||||||
|
@ -69,6 +69,14 @@ jclass GetPatchCheatClass();
|
|||||||
jfieldID GetPatchCheatPointer();
|
jfieldID GetPatchCheatPointer();
|
||||||
jmethodID GetPatchCheatConstructor();
|
jmethodID GetPatchCheatConstructor();
|
||||||
|
|
||||||
|
jclass GetGraphicsModGroupClass();
|
||||||
|
jfieldID GetGraphicsModGroupPointer();
|
||||||
|
jmethodID GetGraphicsModGroupConstructor();
|
||||||
|
|
||||||
|
jclass GetGraphicsModClass();
|
||||||
|
jfieldID GetGraphicsModPointer();
|
||||||
|
jmethodID GetGraphicsModConstructor();
|
||||||
|
|
||||||
jclass GetRiivolutionPatchesClass();
|
jclass GetRiivolutionPatchesClass();
|
||||||
jfieldID GetRiivolutionPatchesPointer();
|
jfieldID GetRiivolutionPatchesPointer();
|
||||||
|
|
||||||
|
@ -2,6 +2,8 @@ add_library(main SHARED
|
|||||||
Cheats/ARCheat.cpp
|
Cheats/ARCheat.cpp
|
||||||
Cheats/Cheats.h
|
Cheats/Cheats.h
|
||||||
Cheats/GeckoCheat.cpp
|
Cheats/GeckoCheat.cpp
|
||||||
|
Cheats/GraphicsMod.cpp
|
||||||
|
Cheats/GraphicsModGroup.cpp
|
||||||
Cheats/PatchCheat.cpp
|
Cheats/PatchCheat.cpp
|
||||||
Config/NativeConfig.cpp
|
Config/NativeConfig.cpp
|
||||||
Config/PostProcessing.cpp
|
Config/PostProcessing.cpp
|
||||||
|
53
Source/Android/jni/Cheats/GraphicsMod.cpp
Normal file
53
Source/Android/jni/Cheats/GraphicsMod.cpp
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
// Copyright 2022 Dolphin Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <jni.h>
|
||||||
|
|
||||||
|
#include "VideoCommon/GraphicsModSystem/Config/GraphicsMod.h"
|
||||||
|
#include "jni/AndroidCommon/AndroidCommon.h"
|
||||||
|
#include "jni/AndroidCommon/IDCache.h"
|
||||||
|
|
||||||
|
static GraphicsModConfig* GetPointer(JNIEnv* env, jobject obj)
|
||||||
|
{
|
||||||
|
return reinterpret_cast<GraphicsModConfig*>(
|
||||||
|
env->GetLongField(obj, IDCache::GetGraphicsModPointer()));
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL
|
||||||
|
Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsMod_getName(JNIEnv* env, jobject obj)
|
||||||
|
{
|
||||||
|
return ToJString(env, GetPointer(env, obj)->m_title);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL
|
||||||
|
Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsMod_getCreator(JNIEnv* env,
|
||||||
|
jobject obj)
|
||||||
|
{
|
||||||
|
return ToJString(env, GetPointer(env, obj)->m_author);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL
|
||||||
|
Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsMod_getNotes(JNIEnv* env, jobject obj)
|
||||||
|
{
|
||||||
|
return ToJString(env, GetPointer(env, obj)->m_description);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL
|
||||||
|
Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsMod_getEnabled(JNIEnv* env,
|
||||||
|
jobject obj)
|
||||||
|
{
|
||||||
|
return static_cast<jboolean>(GetPointer(env, obj)->m_enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsMod_setEnabledImpl(JNIEnv* env,
|
||||||
|
jobject obj,
|
||||||
|
jboolean enabled)
|
||||||
|
{
|
||||||
|
GetPointer(env, obj)->m_enabled = static_cast<bool>(enabled);
|
||||||
|
}
|
||||||
|
}
|
92
Source/Android/jni/Cheats/GraphicsModGroup.cpp
Normal file
92
Source/Android/jni/Cheats/GraphicsModGroup.cpp
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
// Copyright 2022 Dolphin Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include <jni.h>
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "VideoCommon/GraphicsModSystem/Config/GraphicsMod.h"
|
||||||
|
#include "VideoCommon/GraphicsModSystem/Config/GraphicsModGroup.h"
|
||||||
|
#include "jni/AndroidCommon/AndroidCommon.h"
|
||||||
|
#include "jni/AndroidCommon/IDCache.h"
|
||||||
|
|
||||||
|
static GraphicsModGroupConfig* GetPointer(JNIEnv* env, jobject obj)
|
||||||
|
{
|
||||||
|
return reinterpret_cast<GraphicsModGroupConfig*>(
|
||||||
|
env->GetLongField(obj, IDCache::GetGraphicsModGroupPointer()));
|
||||||
|
}
|
||||||
|
|
||||||
|
jobject GraphicsModToJava(JNIEnv* env, GraphicsModConfig* mod, jobject jGraphicsModGroup)
|
||||||
|
{
|
||||||
|
return env->NewObject(IDCache::GetGraphicsModClass(), IDCache::GetGraphicsModConstructor(),
|
||||||
|
reinterpret_cast<jlong>(mod), jGraphicsModGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsModGroup_finalize(JNIEnv* env,
|
||||||
|
jobject obj)
|
||||||
|
{
|
||||||
|
delete GetPointer(env, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jobjectArray JNICALL
|
||||||
|
Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsModGroup_getMods(JNIEnv* env,
|
||||||
|
jobject obj)
|
||||||
|
{
|
||||||
|
GraphicsModGroupConfig* mod_group = GetPointer(env, obj);
|
||||||
|
|
||||||
|
std::set<std::string> groups;
|
||||||
|
|
||||||
|
for (const GraphicsModConfig& mod : mod_group->GetMods())
|
||||||
|
{
|
||||||
|
for (const GraphicsTargetGroupConfig& group : mod.m_groups)
|
||||||
|
groups.insert(group.m_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<GraphicsModConfig*> mods;
|
||||||
|
|
||||||
|
for (GraphicsModConfig& mod : mod_group->GetMods())
|
||||||
|
{
|
||||||
|
// If no group matches the mod's features, or if the mod has no features, skip it
|
||||||
|
if (std::none_of(mod.m_features.begin(), mod.m_features.end(),
|
||||||
|
[&groups](const GraphicsModFeatureConfig& feature) {
|
||||||
|
return groups.count(feature.m_group) == 1;
|
||||||
|
}))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
mods.push_back(&mod);
|
||||||
|
}
|
||||||
|
|
||||||
|
const jobjectArray array =
|
||||||
|
env->NewObjectArray(static_cast<jsize>(mods.size()), IDCache::GetGraphicsModClass(), nullptr);
|
||||||
|
|
||||||
|
jsize i = 0;
|
||||||
|
for (GraphicsModConfig* mod : mods)
|
||||||
|
env->SetObjectArrayElement(array, i++, GraphicsModToJava(env, mod, obj));
|
||||||
|
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsModGroup_save(JNIEnv* env, jobject obj)
|
||||||
|
{
|
||||||
|
GetPointer(env, obj)->Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jobject JNICALL
|
||||||
|
Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsModGroup_load(JNIEnv* env, jclass,
|
||||||
|
jstring jGameId)
|
||||||
|
{
|
||||||
|
auto* mod_group = new GraphicsModGroupConfig(GetJString(env, jGameId));
|
||||||
|
|
||||||
|
mod_group->Load();
|
||||||
|
|
||||||
|
return env->NewObject(IDCache::GetGraphicsModGroupClass(),
|
||||||
|
IDCache::GetGraphicsModGroupConstructor(), mod_group);
|
||||||
|
}
|
||||||
|
}
|
@ -120,24 +120,15 @@ void GraphicsModListWidget::RefreshModList()
|
|||||||
|
|
||||||
std::set<std::string> groups;
|
std::set<std::string> groups;
|
||||||
|
|
||||||
for (const auto& mod : m_mod_group.GetMods())
|
for (const GraphicsModConfig& mod : m_mod_group.GetMods())
|
||||||
{
|
|
||||||
if (mod.m_groups.empty())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for (const auto& group : mod.m_groups)
|
|
||||||
{
|
{
|
||||||
|
for (const GraphicsTargetGroupConfig& group : mod.m_groups)
|
||||||
groups.insert(group.m_name);
|
groups.insert(group.m_name);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for (const auto& mod : m_mod_group.GetMods())
|
for (const GraphicsModConfig& mod : m_mod_group.GetMods())
|
||||||
{
|
{
|
||||||
// Group only mods shouldn't be shown
|
// If no group matches the mod's features, or if the mod has no features, skip it
|
||||||
if (mod.m_features.empty())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// If the group doesn't exist in the available mod's features, skip
|
|
||||||
if (std::none_of(mod.m_features.begin(), mod.m_features.end(),
|
if (std::none_of(mod.m_features.begin(), mod.m_features.end(),
|
||||||
[&groups](const GraphicsModFeatureConfig& feature) {
|
[&groups](const GraphicsModFeatureConfig& feature) {
|
||||||
return groups.count(feature.m_group) == 1;
|
return groups.count(feature.m_group) == 1;
|
||||||
|
@ -168,6 +168,11 @@ const std::vector<GraphicsModConfig>& GraphicsModGroupConfig::GetMods() const
|
|||||||
return m_graphics_mods;
|
return m_graphics_mods;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<GraphicsModConfig>& GraphicsModGroupConfig::GetMods()
|
||||||
|
{
|
||||||
|
return m_graphics_mods;
|
||||||
|
}
|
||||||
|
|
||||||
GraphicsModConfig* GraphicsModGroupConfig::GetMod(const std::string& absolute_path) const
|
GraphicsModConfig* GraphicsModGroupConfig::GetMod(const std::string& absolute_path) const
|
||||||
{
|
{
|
||||||
if (const auto iter = m_path_to_graphics_mod.find(absolute_path);
|
if (const auto iter = m_path_to_graphics_mod.find(absolute_path);
|
||||||
|
@ -32,6 +32,7 @@ public:
|
|||||||
u32 GetChangeCount() const;
|
u32 GetChangeCount() const;
|
||||||
|
|
||||||
const std::vector<GraphicsModConfig>& GetMods() const;
|
const std::vector<GraphicsModConfig>& GetMods() const;
|
||||||
|
std::vector<GraphicsModConfig>& GetMods();
|
||||||
|
|
||||||
GraphicsModConfig* GetMod(const std::string& absolute_path) const;
|
GraphicsModConfig* GetMod(const std::string& absolute_path) const;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user