diff --git a/plugins/darkmode/patch.py b/plugins/darkmode/patch.py index eaf1801..6245e08 100644 --- a/plugins/darkmode/patch.py +++ b/plugins/darkmode/patch.py @@ -56,6 +56,30 @@ def patch_cross_point_settings_h(repo_dir): print(" CrossPointSettings.h patched.") +def patch_settings_list_h(repo_dir): + path = find_first("SettingsList.h", repo_dir) + content = read_file(path) + + if "darkModeState" in content: + print(" SettingsList.h already patched, skipping.") + return + + entries = ( + ' SettingInfo::Enum(StrId::STR_NONE_OPT, &CrossPointSettings::darkModeState,\n' + ' {StrId::STR_NONE_OPT, StrId::STR_NONE_OPT}, "darkModeState"),\n' + ' SettingInfo::Enum(StrId::STR_NONE_OPT, &CrossPointSettings::smallerFontsMode,\n' + ' {StrId::STR_NONE_OPT, StrId::STR_NONE_OPT, StrId::STR_NONE_OPT}, "smallerFontsMode"),\n' + ) + + content = content.replace( + ' };\n return list;\n}\n', + entries + ' };\n return list;\n}\n' + ) + + write_file(path, content) + print(" SettingsList.h patched.") + + def patch_settings_h(repo_dir): path = find_first("SettingsActivity.h", repo_dir) content = read_file(path) @@ -373,6 +397,9 @@ def patch(repo_dir: str): print(" Patching CrossPointSettings.h...") patch_cross_point_settings_h(repo_dir) + print(" Patching SettingsList.h...") + patch_settings_list_h(repo_dir) + print(" Patching SettingsActivity.h...") patch_settings_h(repo_dir) diff --git a/plugins/smallerfonts/patch.py b/plugins/smallerfonts/patch.py index 67e857e..d25da01 100644 --- a/plugins/smallerfonts/patch.py +++ b/plugins/smallerfonts/patch.py @@ -56,8 +56,6 @@ def generate_fonts(repo_dir): generated.append((family, size, style, out_path)) continue src_path = os.path.join(source_dir, folder, f"{folder}-{style}.{ext}") - if not os.path.exists(src_path): - src_path = os.path.join(source_dir, folder, f"{folder.replace('NotoSans','NotoSans')}-{style}.{ext}") extra = ["--2bit", "--compress"] if family != "ubuntu" else [] with open(out_path, "w") as f: result = subprocess.run( @@ -236,26 +234,56 @@ def patch_cross_point_settings_cpp(repo_dir): print(" CrossPointSettings.cpp patched.") +def patch_settings_list_h(repo_dir): + path = find_first("SettingsList.h", repo_dir) + content = read_file(path) + + if "smallerFontsMode" in content: + print(" SettingsList.h already patched, skipping.") + return + + entry = ( + ' SettingInfo::Enum(StrId::STR_NONE_OPT, &CrossPointSettings::smallerFontsMode,\n' + ' {StrId::STR_NONE_OPT, StrId::STR_NONE_OPT, StrId::STR_NONE_OPT}, "smallerFontsMode"),\n' + ) + + content = content.replace( + ' };\n return list;\n}\n', + entry + ' };\n return list;\n}\n' + ) + + write_file(path, content) + print(" SettingsList.h patched.") + + def patch_settings_h(repo_dir): path = find_first("SettingsActivity.h", repo_dir) content = read_file(path) - if "pluginsSettings" in content: + already_has_plugins_tab = "categoryCount = 5" in content + already_has_plugins_vec = "pluginsSettings" in content + + if already_has_plugins_tab and already_has_plugins_vec: print(" SettingsActivity.h already patched, skipping.") return - content = content.replace( - '#include ', - '#include \n#include "SmallerFontsPlugin.h"' - ) - content = content.replace( - 'static constexpr int categoryCount = 4;', - 'static constexpr int categoryCount = 5;' - ) - content = content.replace( - ' std::vector systemSettings;', - ' std::vector systemSettings;\n std::vector pluginsSettings;' - ) + if '"SmallerFontsPlugin.h"' not in content: + content = content.replace( + '#include ', + '#include \n#include "SmallerFontsPlugin.h"' + ) + + if not already_has_plugins_tab: + content = content.replace( + 'static constexpr int categoryCount = 4;', + 'static constexpr int categoryCount = 5;' + ) + + if not already_has_plugins_vec: + content = content.replace( + ' std::vector systemSettings;', + ' std::vector systemSettings;\n std::vector pluginsSettings;' + ) write_file(path, content) print(" SettingsActivity.h patched.") @@ -265,52 +293,140 @@ def patch_settings_cpp(repo_dir): path = find_first("SettingsActivity.cpp", repo_dir) content = read_file(path) - if "pluginsSettings" in content: + if "SmallerFontsPlugin::modeName" in content and "smallerFontsMode" in content: print(" SettingsActivity.cpp already patched, skipping.") return - content = content.replace( - 'const StrId SettingsActivity::categoryNames[categoryCount] = {StrId::STR_CAT_DISPLAY, StrId::STR_CAT_READER,\n StrId::STR_CAT_CONTROLS, StrId::STR_CAT_SYSTEM};', - 'const StrId SettingsActivity::categoryNames[categoryCount] = {StrId::STR_CAT_DISPLAY, StrId::STR_CAT_READER,\n StrId::STR_CAT_CONTROLS, StrId::STR_CAT_SYSTEM,\n StrId::STR_NONE_OPT};' + if "STR_NONE_OPT" not in content: + content = content.replace( + 'const StrId SettingsActivity::categoryNames[categoryCount] = {StrId::STR_CAT_DISPLAY, StrId::STR_CAT_READER,\n' + ' StrId::STR_CAT_CONTROLS, StrId::STR_CAT_SYSTEM};', + 'const StrId SettingsActivity::categoryNames[categoryCount] = {StrId::STR_CAT_DISPLAY, StrId::STR_CAT_READER,\n' + ' StrId::STR_CAT_CONTROLS, StrId::STR_CAT_SYSTEM,\n' + ' StrId::STR_NONE_OPT};' + ) + + if "pluginsSettings.clear();" not in content: + content = content.replace( + ' systemSettings.clear();', + ' systemSettings.clear();\n pluginsSettings.clear();' + ) + + plugins_block = ( + ' pluginsSettings.push_back(SettingInfo::Enum(\n' + ' StrId::STR_NONE_OPT, &CrossPointSettings::darkModeState,\n' + ' {StrId::STR_NONE_OPT, StrId::STR_NONE_OPT}, "darkModeState"\n' + ' ));\n' + ' pluginsSettings.push_back(SettingInfo::Enum(\n' + ' StrId::STR_NONE_OPT, &CrossPointSettings::smallerFontsMode,\n' + ' {StrId::STR_NONE_OPT, StrId::STR_NONE_OPT, StrId::STR_NONE_OPT}, "smallerFontsMode"\n' + ' ));\n' ) - content = content.replace( - ' systemSettings.clear();', - ' systemSettings.clear();\n pluginsSettings.clear();' + + sf_only_block = ( + ' pluginsSettings.push_back(SettingInfo::Enum(\n' + ' StrId::STR_NONE_OPT, &CrossPointSettings::smallerFontsMode,\n' + ' {StrId::STR_NONE_OPT, StrId::STR_NONE_OPT, StrId::STR_NONE_OPT}, "smallerFontsMode"\n' + ' ));\n' ) - content = content.replace( - ' readerSettings.push_back(SettingInfo::Action(StrId::STR_CUSTOMISE_STATUS_BAR, SettingAction::CustomiseStatusBar));', - ' readerSettings.push_back(SettingInfo::Action(StrId::STR_CUSTOMISE_STATUS_BAR, SettingAction::CustomiseStatusBar));\n\n' + + broken_old_block = ( ' pluginsSettings.push_back(SettingInfo::Enum(\n' ' StrId::STR_NONE_OPT,\n' ' &CrossPointSettings::smallerFontsMode,\n' ' {StrId::STR_NONE_OPT, StrId::STR_NONE_OPT, StrId::STR_NONE_OPT},\n' ' "smallerFontsMode"\n' - ' ));' - ) - content = content.replace( - ' case 3:\n currentSettings = &systemSettings;\n break;', - ' case 3:\n currentSettings = &systemSettings;\n break;\n case 4:\n currentSettings = &pluginsSettings;\n break;' - ) - content = content.replace( - ' std::vector tabs;\n tabs.reserve(categoryCount);\n for (int i = 0; i < categoryCount; i++) {\n tabs.push_back({I18N.get(categoryNames[i]), selectedCategoryIndex == i});\n }', - ' std::vector tabs;\n tabs.reserve(categoryCount);\n for (int i = 0; i < categoryCount; i++) {\n const char* tabLabel = (i == 4) ? "Plugins" : I18N.get(categoryNames[i]);\n tabs.push_back({tabLabel, selectedCategoryIndex == i});\n }' - ) - content = content.replace( - ' const auto confirmLabel = (selectedSettingIndex == 0)\n ? I18N.get(categoryNames[(selectedCategoryIndex + 1) % categoryCount])\n : tr(STR_TOGGLE);', - ' const int nextCatIndex = (selectedCategoryIndex + 1) % categoryCount;\n const char* nextCatLabel = (nextCatIndex == 4) ? "Plugins" : I18N.get(categoryNames[nextCatIndex]);\n const auto confirmLabel = (selectedSettingIndex == 0) ? nextCatLabel : tr(STR_TOGGLE);' - ) - content = content.replace( - ' [&settings](int index) { return std::string(I18N.get(settings[index].nameId)); },', - ' [&settings, this](int index) -> std::string {\n' - ' if (selectedCategoryIndex == 4) return "Smaller Fonts";\n' - ' return std::string(I18N.get(settings[index].nameId));\n' - ' },' - ) - content = content.replace( - ' } else if (setting.type == SettingType::ENUM && setting.valuePtr != nullptr) {\n const uint8_t value = SETTINGS.*(setting.valuePtr);\n valueText = I18N.get(setting.enumValues[value]);\n }', - ' } else if (setting.type == SettingType::ENUM && setting.valuePtr != nullptr) {\n const uint8_t value = SETTINGS.*(setting.valuePtr);\n if (setting.key && std::string(setting.key) == "smallerFontsMode") {\n valueText = SmallerFontsPlugin::modeName(static_cast(value));\n } else {\n valueText = I18N.get(setting.enumValues[value]);\n }\n }' + ' ));\n' ) + if broken_old_block in content: + content = content.replace(broken_old_block, sf_only_block) + elif '"darkModeState"' in content and '"smallerFontsMode"' not in content: + content = content.replace( + ' pluginsSettings.push_back(SettingInfo::Enum(\n' + ' StrId::STR_NONE_OPT, &CrossPointSettings::darkModeState,\n' + ' {StrId::STR_NONE_OPT, StrId::STR_NONE_OPT}, "darkModeState"\n' + ' ));\n', + plugins_block + ) + elif '"smallerFontsMode"' not in content: + content = content.replace( + ' readerSettings.push_back(SettingInfo::Action(StrId::STR_CUSTOMISE_STATUS_BAR, SettingAction::CustomiseStatusBar));\n', + ' readerSettings.push_back(SettingInfo::Action(StrId::STR_CUSTOMISE_STATUS_BAR, SettingAction::CustomiseStatusBar));\n' + + sf_only_block + ) + + if 'case 4:\n currentSettings = &pluginsSettings;' not in content: + content = content.replace( + ' case 3:\n currentSettings = &systemSettings;\n break;', + ' case 3:\n currentSettings = &systemSettings;\n break;\n' + ' case 4:\n currentSettings = &pluginsSettings;\n break;' + ) + + if '"Plugins"' not in content: + content = content.replace( + ' std::vector tabs;\n' + ' tabs.reserve(categoryCount);\n' + ' for (int i = 0; i < categoryCount; i++) {\n' + ' tabs.push_back({I18N.get(categoryNames[i]), selectedCategoryIndex == i});\n' + ' }', + ' std::vector tabs;\n' + ' tabs.reserve(categoryCount);\n' + ' for (int i = 0; i < categoryCount; i++) {\n' + ' const char* tabLabel = (i == 4) ? "Plugins" : I18N.get(categoryNames[i]);\n' + ' tabs.push_back({tabLabel, selectedCategoryIndex == i});\n' + ' }' + ) + + if 'nextCatLabel' not in content: + content = content.replace( + ' const auto confirmLabel = (selectedSettingIndex == 0)\n' + ' ? I18N.get(categoryNames[(selectedCategoryIndex + 1) % categoryCount])\n' + ' : tr(STR_TOGGLE);', + ' const int nextCatIndex = (selectedCategoryIndex + 1) % categoryCount;\n' + ' const char* nextCatLabel = (nextCatIndex == 4) ? "Plugins" : I18N.get(categoryNames[nextCatIndex]);\n' + ' const auto confirmLabel = (selectedSettingIndex == 0) ? nextCatLabel : tr(STR_TOGGLE);' + ) + + if 'selectedCategoryIndex == 4' not in content: + content = content.replace( + ' [&settings](int index) { return std::string(I18N.get(settings[index].nameId)); },', + ' [&settings, this](int index) -> std::string {\n' + ' if (selectedCategoryIndex == 4) {\n' + ' const auto& s = settings[index];\n' + ' if (s.key && std::string(s.key) == "darkModeState") return "Dark Mode";\n' + ' if (s.key && std::string(s.key) == "smallerFontsMode") return "Smaller Fonts";\n' + ' }\n' + ' return std::string(I18N.get(settings[index].nameId));\n' + ' },' + ) + + if "SmallerFontsPlugin::modeName" not in content: + if "DarkModePlugin::stateName" in content: + content = content.replace( + ' if (setting.key && std::string(setting.key) == "darkModeState") {\n' + ' valueText = DarkModePlugin::stateName(static_cast(value));\n' + ' } else {\n' + ' valueText = I18N.get(setting.enumValues[value]);\n' + ' }', + ' if (setting.key && std::string(setting.key) == "darkModeState") {\n' + ' valueText = DarkModePlugin::stateName(static_cast(value));\n' + ' } else if (setting.key && std::string(setting.key) == "smallerFontsMode") {\n' + ' valueText = SmallerFontsPlugin::modeName(static_cast(value));\n' + ' } else {\n' + ' valueText = I18N.get(setting.enumValues[value]);\n' + ' }' + ) + else: + content = content.replace( + ' valueText = I18N.get(setting.enumValues[value]);', + ' if (setting.key && std::string(setting.key) == "smallerFontsMode") {\n' + ' valueText = SmallerFontsPlugin::modeName(static_cast(value));\n' + ' } else {\n' + ' valueText = I18N.get(setting.enumValues[value]);\n' + ' }' + ) + write_file(path, content) print(" SettingsActivity.cpp patched.") @@ -344,6 +460,9 @@ def patch(repo_dir: str): print(" Patching CrossPointSettings.cpp...") patch_cross_point_settings_cpp(repo_dir) + print(" Patching SettingsList.h...") + patch_settings_list_h(repo_dir) + print(" Patching SettingsActivity.h...") patch_settings_h(repo_dir)