diff --git a/README.md b/README.md index 286037a..a3ac6ee 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ +![Artboard](https://github.com/leminlimez/Nugget/blob/d383d2af50ed12382b2e19d0d95dd815f1b15d4f/credits/big_nugget.png) + # Nugget Unlock your device's full potential! -Sparserestore works on all versions iOS 17.0-18.2 developer beta 2. There is partial support for iOS 18.2 developer beta 3 and newer. +Sparserestore works on all versions iOS 17.0-18.1.1. There is partial support for iOS 18.2 developer beta 3 and newer not using any exploits. **Mobilegestalt and AI Enabler tweaks are not supported on iOS 18.2+.** It will never be supported, do not make issues asking for when it is supported. @@ -9,25 +11,12 @@ Make sure you have installed the [requirements](#requirements) if you are on Win This uses the sparserestore exploit to write to files outside of the intended restore location, like mobilegestalt. Read the [Getting the File](#getting-the-file) section to learn how to get your mobilegestalt file. -Note: I am not responsible if your device bootloops. Please back up your data before using! +**Note:** I am not responsible if your device bootloops. Please back up your data before using! ## Features -### iOS 17.0+ -- Enable Dynamic Island on any device -- Enable iPhone X gestures on iPhone SEs -- Change Device Model Name (ie what shows in the Settings app) -- Enable Boot Chime -- Enable Charge Limit -- Enable Tap to Wake on unsupported devices (ie iPhone SEs) -- Enable Collision SOS -- Enable Stage Manager -- Disable the Wallpaper Parallax -- Disable Region Restrictions (ie. Shutter Sound) - - Note: This does not include enabling EU sideloading outside the EU. That will come later. -- Show the Apple Pencil options in Settings app -- Show the Action Button options in Settings app -- Show Internal Storage info (Might cause problems on some devices, use at your own risk) -- EU Enabler (iOS 17.6-) +
+iOS 17.0+ + - Springboard Options (from [Cowabunga Lite](https://github.com/leminlimez/CowabungaLite)) - Set Lock Screen Footnote - Disable Lock After Respring @@ -67,14 +56,44 @@ Note: I am not responsible if your device bootloops. Please back up your data be - Disable thermalmonitord - OTA Killer - Custom Resolution -### iOS 18.0+ -- Enable iPhone 16 camera button page in the Settings app -- Enable AOD & AOD Vibrancy on any device +
+
+iOS 17.0 - 18.1.1 + +- Enable Dynamic Island on any device +- Enable iPhone X gestures on iPhone SEs +- Change Device Model Name (ie what shows in the Settings app) +- Enable Boot Chime +- Enable Charge Limit +- Enable Tap to Wake on unsupported devices (ie iPhone SEs) +- Enable Collision SOS +- Enable Stage Manager +- Disable the Wallpaper Parallax +- Disable Region Restrictions (ie. Shutter Sound) + - Note: This does not include enabling EU sideloading outside the EU. That will come later. +- Show the Apple Pencil options in Settings app +- Show the Action Button options in Settings app +- Show Internal Storage info (Might cause problems on some devices, use at your own risk) +- EU Enabler (iOS 17.6-) +
+
+iOS 18.0 - iOS 18.0.1 + - Feature Flags (iOS 18.1b4-): - Enabling lock screen clock animation, lock screen page duplication button, and more! - Disabling the new iOS 18 Photos UI (iOS 18.0 betas only, unknown which patched it) -### iOS 18.1+ -- AI Enabler + Device Spoofing (fixed in iOS 18.2db3) +
+
+iOS 18.0 - iOS 18.1.1 + +- Enable iPhone 16 camera button page in the Settings app +- Enable AOD & AOD Vibrancy on any device +
+
+iOS 18.1 - 18.1.1 + +- AI Enabler + Device Spoofing +
## Requirements: - **Windows:** @@ -101,7 +120,7 @@ Note: It may be either `python`/`pip` or `python3`/`pip3` depending on your path The CLI version can be ran with `python3 cli_app.py`. ## Getting the File -You need to get the mobilegestalt file that is specific to your device. To do that, follow these steps: +On iOS 18.1.1 and below, you may need to get the mobilegestalt file that is specific to your device. To do that, follow these steps: 1. Install the `Shortcuts` app from the iOS app store. 2. Download this shortcut: https://www.icloud.com/shortcuts/d6f0a136ddda4714a80750512911c53b 3. Save the file and share it to your computer. @@ -118,11 +137,13 @@ The application itself can be compiled by running `compile.py`. ## Read More If you would like to read more about the inner workings of the exploit and iOS restore system, I made a write up which you can read [here](https://gist.github.com/leminlimez/c602c067349140fe979410ef69d39c28). +For clarity, up to iOS 18.2 developer beta 2 (public beta 1) is fully supported by Nugget. I said iOS 18.1.1 because mentioning the betas confused people. ## Credits - [JJTech](https://github.com/JJTech0130) for Sparserestore/[TrollRestore](https://github.com/JJTech0130/TrollRestore) - [PosterRestore](https://discord.gg/gWtzTVhMvh) for their help with PosterBoard - Special thanks to dootskyre, [Middo](https://twitter.com/MWRevamped), [dulark](https://github.com/dularkian), forcequitOS, and pingubow for their work on this. It would not have been possible without them! + - Also thanks to [Snoolie for aar handling](https://github.com/0xilis/python-aar-stuff) - [disfordottie](https://x.com/disfordottie) for some global flag features - [Mikasa-san](https://github.com/Mikasa-san) for [Quiet Daemon](https://github.com/Mikasa-san/QuietDaemon) - [sneakyf1shy](https://github.com/f1shy-dev) for [AI Eligibility](https://gist.github.com/f1shy-dev/23b4a78dc283edd30ae2b2e6429129b5) (iOS 18.1 beta 4 and below) diff --git a/controllers/__init__.py b/controllers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/controllers/aar/LICENSE b/controllers/aar/LICENSE new file mode 100644 index 0000000..93866fb --- /dev/null +++ b/controllers/aar/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 0xilis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/controllers/aar/__init__.py b/controllers/aar/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/controllers/aar/aar.py b/controllers/aar/aar.py new file mode 100644 index 0000000..afd4a5b --- /dev/null +++ b/controllers/aar/aar.py @@ -0,0 +1,62 @@ +''' +Created by Snoolie K (0xilis) on 2025 March 18. +Licensed under MIT. Please credit if using. +''' + +import struct + +# make a .aar of one contexts.plist file +def wrap_in_aar(input_file, input_mov, output_file): + # Since I only need to care about a contents.plist (and in the future the mov file), I am hardcoding the header... + header = bytearray.fromhex("4141303125005459503146504154500E00636F6E74656E74732E706C697374444154418E13") + + with open(input_file, 'rb') as f: + file_data = f.read() + + file_size = len(file_data) + + if file_size <= 0xFFFF: + # Our size can fit in a 2 byte AA_FIELD_TYPE_BLOB, yay + header[-2:] = struct.pack(' FRAME_LIMIT: + raise Exception(f"Videos must be under {FRAME_LIMIT} fps to loop. Either reduce the frame rate or make it shorter.") + try: + # creating a folder named data + if not os.path.exists(assets_path): + os.makedirs(assets_path, exist_ok=True) + # if not created then raise error + except OSError: + print ('Error: Creating directory of data') + + # frame + currentframe = 0 + width = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH)) + height = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT)) + + with open(os.path.join(output_file, "main.caml"), "w") as caml: + # write caml header + fps = cam.get(cv2.CAP_PROP_FPS) + duration = frame_count / fps + caml.write(f""" + + + + +""") + + # Release all space and windows once done + cam.release() + cv2.destroyAllWindows() + + # Write the other caml + with open(os.path.join(output_file, "index.xml"), "w") as index: + index.write(f""" + + + + assetManifest + assetManifest.caml + documentHeight + {height} + documentResizesToView + + documentWidth + {width} + dynamicGuidesEnabled + + geometryFlipped + + guidesEnabled + + interactiveMouseEventsEnabled + + interactiveShowsCursor + + interactiveTouchEventsEnabled + + loopEnd + 0.0 + loopStart + 0.0 + loopingEnabled + + multitouchDisablesMouse + + multitouchEnabled + + presentationMouseEventsEnabled + + presentationShowsCursor + + presentationTouchEventsEnabled + + rootDocument + main.caml + savesWindowFrame + + scalesToFitInPlayer + + showsTouches + + snappingEnabled + + timelineMarkers + [(null)] + touchesColor + 1 1 0 0.8 + unitsInPixelsInPlayer + + + +""") \ No newline at end of file diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 60bbae2..73981fe 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -3,7 +3,7 @@ import plistlib from tempfile import TemporaryDirectory from PySide6.QtWidgets import QMessageBox -from PySide6.QtCore import QSettings +from PySide6.QtCore import QSettings, QThread from pymobiledevice3 import usbmux from pymobiledevice3.lockdown import create_using_usbmux @@ -12,6 +12,7 @@ from pymobiledevice3.exceptions import MuxException, PasswordRequiredError from devicemanagement.constants import Device, Version from devicemanagement.data_singleton import DataSingleton +from gui.apply_worker import ApplyAlertMessage from controllers.path_handler import fix_windows_path from tweaks.tweaks import tweaks, FeatureFlagTweak, EligibilityTweak, AITweak, BasicPlistTweak, AdvancedPlistTweak, RdarFixTweak, NullifyFileTweak @@ -20,31 +21,31 @@ from tweaks.posterboard_tweak import PosterboardTweak from tweaks.basic_plist_locations import FileLocationsList, RiskyFileLocationsList from Sparserestore.restore import restore_files, FileToRestore -def show_error_msg(txt: str, detailed_txt: str = None): +def show_error_msg(txt: str, title: str = "Error!", icon = QMessageBox.Critical, detailed_txt: str = None): detailsBox = QMessageBox() - detailsBox.setIcon(QMessageBox.Critical) - detailsBox.setWindowTitle("Error!") + detailsBox.setIcon(icon) + detailsBox.setWindowTitle(title) detailsBox.setText(txt) if detailed_txt != None: detailsBox.setDetailedText(detailed_txt) detailsBox.exec() def show_apply_error(e: Exception, update_label=lambda x: None): - if "Find My" in str(e): - show_error_msg("Find My must be disabled in order to use this tool.", - detailed_txt="Disable Find My from Settings (Settings -> [Your Name] -> Find My) and then try again.") - elif "Encrypted Backup MDM" in str(e): - show_error_msg("Nugget cannot be used on this device. Click Show Details for more info.", - detailed_txt="Your device is managed and MDM backup encryption is on. This must be turned off in order for Nugget to work. Please do not use Nugget on your school/work device!") - elif "SessionInactive" in str(e): - show_error_msg("The session was terminated. Refresh the device list and try again.") - elif "PasswordRequiredError" in str(e): - show_error_msg("Device is password protected! You must trust the computer on your device.", - detailed_txt="Unlock your device. On the popup, click \"Trust\", enter your password, then try again.") - else: - show_error_msg(type(e).__name__ + ": " + repr(e), detailed_txt=str(traceback.format_exc())) print(traceback.format_exc()) update_label("Failed to restore") + if "Find My" in str(e): + return ApplyAlertMessage("Find My must be disabled in order to use this tool.", + detailed_txt="Disable Find My from Settings (Settings -> [Your Name] -> Find My) and then try again.") + elif "Encrypted Backup MDM" in str(e): + return ApplyAlertMessage("Nugget cannot be used on this device. Click Show Details for more info.", + detailed_txt="Your device is managed and MDM backup encryption is on. This must be turned off in order for Nugget to work. Please do not use Nugget on your school/work device!") + elif "SessionInactive" in str(e): + return ApplyAlertMessage("The session was terminated. Refresh the device list and try again.") + elif "PasswordRequiredError" in str(e): + return ApplyAlertMessage("Device is password protected! You must trust the computer on your device.", + detailed_txt="Unlock your device. On the popup, click \"Trust\", enter your password, then try again.") + else: + return ApplyAlertMessage(type(e).__name__ + ": " + repr(e), detailed_txt=str(traceback.format_exc())) class DeviceManager: ## Class Functions @@ -58,7 +59,6 @@ class DeviceManager: self.apply_over_wifi = False self.auto_reboot = True self.allow_risky_tweaks = False - self.windows_path_fix = True self.show_all_spoofable_models = False self.skip_setup = True self.supervised = False @@ -244,9 +244,9 @@ class DeviceManager: domain="ManagedPreferencesDomain" )) - def get_domain_for_path(self, path: str, owner: int = 501) -> str: + def get_domain_for_path(self, path: str, owner: int = 501, uses_domains: bool = False) -> str: # returns Domain: str?, Path: str - if self.get_current_device_supported() and not path.startswith("/var/mobile/") and not owner == 0: + if self.get_current_device_supported() and not path.startswith("/var/mobile/") and not owner == 0 and not uses_domains: # don't do anything on sparserestore versions return path, "" fully_patched = self.get_current_device_patched() @@ -278,9 +278,9 @@ class DeviceManager: return new_path, new_domain return path, "" - def concat_file(self, contents: str, path: str, files_to_restore: list[FileToRestore], owner: int = 501, group: int = 501): + def concat_file(self, contents: str, path: str, files_to_restore: list[FileToRestore], owner: int = 501, group: int = 501, uses_domains: bool = False): # TODO: try using inodes here instead - file_path, domain = self.get_domain_for_path(path, owner=owner) + file_path, domain = self.get_domain_for_path(path, owner=owner, uses_domains=uses_domains) files_to_restore.append(FileToRestore( contents=contents, restore_path=file_path, @@ -289,7 +289,7 @@ class DeviceManager: )) ## APPLYING OR REMOVING TWEAKS AND RESTORING - def apply_changes(self, resetting: bool = False, update_label=lambda x: None): + def apply_changes(self, resetting: bool = False, update_label=lambda x: None, show_alert=lambda x: None): try: # set the tweaks and apply # first open the file in read mode @@ -333,8 +333,8 @@ class DeviceManager: elif isinstance(tweak, PosterboardTweak): tmp_pb_dir = TemporaryDirectory() tweak.apply_tweak( - files_to_restore=files_to_restore, output_dir=fix_windows_path(tmp_pb_dir.name), - version=self.get_current_device_version() + files_to_restore=files_to_restore, output_dir=tmp_pb_dir.name, + version=self.get_current_device_version(), update_label=update_label ) if tweak.enabled: uses_domains = True @@ -343,7 +343,7 @@ class DeviceManager: gestalt_plist = tweak.apply_tweak(gestalt_plist) elif tweak.enabled: # no mobilegestalt file provided but applying mga tweaks, give warning - show_error_msg("No mobilegestalt file provided! Please select your file to apply mobilegestalt tweaks.") + show_alert(show_error_msg("No mobilegestalt file provided! Please select your file to apply mobilegestalt tweaks.", exec=False)) update_label("Failed.") return # set the custom gestalt keys @@ -368,7 +368,7 @@ class DeviceManager: self.concat_file( contents=gestalt_data, path="/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist", - files_to_restore=files_to_restore + files_to_restore=files_to_restore, uses_domains=uses_domains ) if eligibility_files: new_eligibility_files: dict[FileToRestore] = [] @@ -422,7 +422,7 @@ class DeviceManager: ) # restore to the device - update_label("Restoring to device...") + update_label("Restoring to device...\nDo NOT Unplug") restore_files(files=files_to_restore, reboot=self.auto_reboot, lockdown_client=self.data_singleton.current_device.ld) if tmp_pb_dir != None: try: @@ -430,10 +430,10 @@ class DeviceManager: except Exception as e: # ignore clean up errors print(str(e)) - msg = "Your device will now restart." + msg = "Your device will now restart.\n\nRemember to turn Find My back on!" if not self.auto_reboot: msg = "Please restart your device to see changes." - QMessageBox.information(None, "Success!", "All done! " + msg) + show_alert(ApplyAlertMessage(txt="All done! " + msg, title="Success!", icon=QMessageBox.Information)) update_label("Success!") except Exception as e: if tmp_pb_dir != None: @@ -442,7 +442,7 @@ class DeviceManager: except Exception as e2: # ignore clean up errors print(str(e2)) - show_apply_error(e, update_label) + show_alert(show_apply_error(e, update_label)) ## RESETTING MOBILE GESTALT def reset_mobilegestalt(self, settings: QSettings, update_label=lambda x: None): @@ -467,4 +467,4 @@ class DeviceManager: QMessageBox.information(None, "Success!", "All done! " + msg) update_label("Success!") except Exception as e: - show_apply_error(e) + show_error_msg(str(e)) diff --git a/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/com.apple.posterkit.provider.descriptor.identifier b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/com.apple.posterkit.provider.descriptor.identifier new file mode 100644 index 0000000..a2e6e55 --- /dev/null +++ b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/com.apple.posterkit.provider.descriptor.identifier @@ -0,0 +1 @@ +88D1F444-E2B3-43C4-BB15-790C67EDEA56 \ No newline at end of file diff --git a/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/providerInfo.plist b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/providerInfo.plist new file mode 100644 index 0000000..a4dcac9 Binary files /dev/null and b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/providerInfo.plist differ diff --git a/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/.com.apple.posterkit.provider.contents.configurableOptions.plist b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/.com.apple.posterkit.provider.contents.configurableOptions.plist new file mode 100755 index 0000000..164e1ac Binary files /dev/null and b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/.com.apple.posterkit.provider.contents.configurableOptions.plist differ diff --git a/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/0EFB6A0F-7052-4D24-8859-AB22BADF2E93/input.segmentation/asset.resource/contents.plist b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/0EFB6A0F-7052-4D24-8859-AB22BADF2E93/input.segmentation/asset.resource/contents.plist new file mode 100644 index 0000000..130747c Binary files /dev/null and b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/0EFB6A0F-7052-4D24-8859-AB22BADF2E93/input.segmentation/asset.resource/contents.plist differ diff --git a/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/0EFB6A0F-7052-4D24-8859-AB22BADF2E93/output.layerStack/Contents.json b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/0EFB6A0F-7052-4D24-8859-AB22BADF2E93/output.layerStack/Contents.json new file mode 100644 index 0000000..f269806 --- /dev/null +++ b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/0EFB6A0F-7052-4D24-8859-AB22BADF2E93/output.layerStack/Contents.json @@ -0,0 +1,68 @@ +{ + "version" : 10, + "layers" : [ + { + "frame" : { + "Width" : 1042.4546142208774, + "Height" : 2868.5230711043873, + "Y" : -0.52307110438732707, + "X" : 174.92435703479578 + }, + "filename" : "portrait-layer_background.HEIC", + "zPosition" : 5, + "identifier" : "background" + }, + { + "frame" : { + "Width" : 1182.5, + "Height" : 2569.25, + "Y" : 149.37503513892489, + "X" : 68.749995738267913 + }, + "filename" : "portrait-layer_settling-video.MOV", + "zPosition" : 5, + "identifier" : "settling-video" + } + ], + "properties" : { + "portraitLayout" : { + "clockIntersection" : 2, + "deviceResolution" : { + "Width" : 750, + "Height" : 1334 + }, + "visibleFrame" : { + "Width" : 886.43178410794587, + "Height" : 2569.25, + "Y" : 149.37496486107506, + "X" : 252.31008241168968 + }, + "timeFrame" : { + "Width" : 763.51324337831068, + "Height" : 227.26499250374812, + "Y" : 2135.0546874997553, + "X" : 313.76935277650728 + }, + "clockLayerOrder" : "ClockAboveForeground", + "hasTopEdgeContact" : false, + "inactiveFrame" : { + "Width" : 913.02473763118462, + "Height" : 2646.3274999999999, + "Y" : 149.39630414678933, + "X" : 239.01360565007042 + }, + "imageSize" : { + "Width" : 1320, + "Height" : 2868 + }, + "parallaxPadding" : { + "Width" : 61.45927036481757, + "Height" : 151.28435782108946 + } + }, + "settlingEffectEnabled" : true, + "depthEnabled" : false, + "clockAreaLuminance" : 0.64877637987012982, + "parallaxDisabled" : false + } +} \ No newline at end of file diff --git a/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/0EFB6A0F-7052-4D24-8859-AB22BADF2E93/style.plist b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/0EFB6A0F-7052-4D24-8859-AB22BADF2E93/style.plist new file mode 100644 index 0000000..1456084 --- /dev/null +++ b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/0EFB6A0F-7052-4D24-8859-AB22BADF2E93/style.plist @@ -0,0 +1,23 @@ + + + + + colorSuggestions + + kind + Original + parameters + + clockColor + + 1 + 1 + 1 + + clockVibrancy + 0.0 + headroomLook + 2 + + + diff --git a/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/DescriptorModel.plist b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/DescriptorModel.plist new file mode 100755 index 0000000..c479736 Binary files /dev/null and b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/DescriptorModel.plist differ diff --git a/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/com.apple.posterkit.provider.contents.galleryOptions b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/com.apple.posterkit.provider.contents.galleryOptions new file mode 100755 index 0000000..da08896 Binary files /dev/null and b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/com.apple.posterkit.provider.contents.galleryOptions differ diff --git a/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/com.apple.posterkit.provider.contents.userInfo b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/com.apple.posterkit.provider.contents.userInfo new file mode 100755 index 0000000..c01adfe Binary files /dev/null and b/files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721/versions/0/contents/com.apple.posterkit.provider.contents.userInfo differ diff --git a/files/posterboard/VideoCAML/com.apple.posterkit.provider.descriptor.identifier b/files/posterboard/VideoCAML/com.apple.posterkit.provider.descriptor.identifier new file mode 100644 index 0000000..5018e06 --- /dev/null +++ b/files/posterboard/VideoCAML/com.apple.posterkit.provider.descriptor.identifier @@ -0,0 +1 @@ +9183 \ No newline at end of file diff --git a/files/posterboard/VideoCAML/com.apple.posterkit.role.identifier b/files/posterboard/VideoCAML/com.apple.posterkit.role.identifier new file mode 100644 index 0000000..b92284b --- /dev/null +++ b/files/posterboard/VideoCAML/com.apple.posterkit.role.identifier @@ -0,0 +1 @@ +PRPosterRoleLockScreen \ No newline at end of file diff --git a/files/posterboard/VideoCAML/providerInfo.plist b/files/posterboard/VideoCAML/providerInfo.plist new file mode 100644 index 0000000..81447ad Binary files /dev/null and b/files/posterboard/VideoCAML/providerInfo.plist differ diff --git a/files/posterboard/VideoCAML/versions/1/contents/9183.Custom-810w-1080h@2x~ipad.wallpaper/9183.Custom_Floating-810w-1080h@2x~ipad.ca/index.xml b/files/posterboard/VideoCAML/versions/1/contents/9183.Custom-810w-1080h@2x~ipad.wallpaper/9183.Custom_Floating-810w-1080h@2x~ipad.ca/index.xml new file mode 100644 index 0000000..5fa23a9 --- /dev/null +++ b/files/posterboard/VideoCAML/versions/1/contents/9183.Custom-810w-1080h@2x~ipad.wallpaper/9183.Custom_Floating-810w-1080h@2x~ipad.ca/index.xml @@ -0,0 +1,58 @@ + + + + + assetManifest + assetManifest.caml + documentHeight + 3176 + documentResizesToView + + documentWidth + 3176 + dynamicGuidesEnabled + + geometryFlipped + + guidesEnabled + + interactiveMouseEventsEnabled + + interactiveShowsCursor + + interactiveTouchEventsEnabled + + loopEnd + 0.0 + loopStart + 0.0 + loopingEnabled + + multitouchDisablesMouse + + multitouchEnabled + + presentationMouseEventsEnabled + + presentationShowsCursor + + presentationTouchEventsEnabled + + rootDocument + main.caml + savesWindowFrame + + scalesToFitInPlayer + + showsTouches + + snappingEnabled + + timelineMarkers + [(null)] + touchesColor + 1 1 0 0.8 + unitsInPixelsInPlayer + + + diff --git a/files/posterboard/VideoCAML/versions/1/contents/9183.Custom-810w-1080h@2x~ipad.wallpaper/9183.Custom_Floating-810w-1080h@2x~ipad.ca/main.caml b/files/posterboard/VideoCAML/versions/1/contents/9183.Custom-810w-1080h@2x~ipad.wallpaper/9183.Custom_Floating-810w-1080h@2x~ipad.ca/main.caml new file mode 100644 index 0000000..bb97379 --- /dev/null +++ b/files/posterboard/VideoCAML/versions/1/contents/9183.Custom-810w-1080h@2x~ipad.wallpaper/9183.Custom_Floating-810w-1080h@2x~ipad.ca/main.caml @@ -0,0 +1,40 @@ + + + + + diff --git a/files/posterboard/VideoCAML/versions/1/contents/9183.Custom-810w-1080h@2x~ipad.wallpaper/Wallpaper.plist b/files/posterboard/VideoCAML/versions/1/contents/9183.Custom-810w-1080h@2x~ipad.wallpaper/Wallpaper.plist new file mode 100644 index 0000000..54f1f1b --- /dev/null +++ b/files/posterboard/VideoCAML/versions/1/contents/9183.Custom-810w-1080h@2x~ipad.wallpaper/Wallpaper.plist @@ -0,0 +1,46 @@ + + + + + appearanceAware + + assets + + lockAndHome + + default + + backgroundAnimationFileName + 9183.Custom_Background-810w-1080h@2x~ipad.ca + floatingAnimationFileNameKey + 9183.Custom_Floating-810w-1080h@2x~ipad.ca + identifier + 9183 + name + Chip + type + LayeredAnimation + + + + contentVersion + 2.01 + family + Chip + identifier + 9183 + logicalScreenClass + 810w-1080h@2x~ipad + name + Chip + preferredProminentColor + + dark + #00000 + default + #FFFFFF + + version + 1 + + diff --git a/files/posterboard/VideoCAML/versions/1/contents/com.apple.posterkit.provider.contents.userInfo b/files/posterboard/VideoCAML/versions/1/contents/com.apple.posterkit.provider.contents.userInfo new file mode 100644 index 0000000..f94f23a --- /dev/null +++ b/files/posterboard/VideoCAML/versions/1/contents/com.apple.posterkit.provider.contents.userInfo @@ -0,0 +1,14 @@ + + + + + posterEnvironmentOverrides + + e30= + + wallpaperRepresentingFileName + 9183.Custom-810w-1080h@2x~ipad.wallpaper + wallpaperRepresentingIdentifier + 9999 + + diff --git a/files/posterboard/contents.plist b/files/posterboard/contents.plist new file mode 100644 index 0000000..a201823 Binary files /dev/null and b/files/posterboard/contents.plist differ diff --git a/gui/apply_worker.py b/gui/apply_worker.py new file mode 100644 index 0000000..6c0c586 --- /dev/null +++ b/gui/apply_worker.py @@ -0,0 +1,29 @@ +from PySide6.QtCore import Signal, QThread +from PySide6.QtWidgets import QMessageBox + +class ApplyAlertMessage: + def __init__(self, txt: str, title: str = "Error!", icon = QMessageBox.Critical, detailed_txt: str = None): + self.txt = txt + self.title = title + self.icon = icon + self.detailed_txt = detailed_txt + +class ApplyThread(QThread): + progress = Signal(str) + alert = Signal(ApplyAlertMessage) + + def update_label(self, txt: str): + self.progress.emit(txt) + def alert_window(self, msg: ApplyAlertMessage): + self.alert.emit(msg) + + def __init__(self, manager, resetting: bool = False): + super().__init__() + self.manager = manager + self.resetting = resetting + + def do_work(self): + self.manager.apply_changes(self.resetting, self.update_label, self.alert_window) + + def run(self): + self.do_work() \ No newline at end of file diff --git a/gui/main_window.py b/gui/main_window.py index efa0eac..876fcbc 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -14,12 +14,13 @@ from devicemanagement.constants import Version from devicemanagement.device_manager import DeviceManager from gui.dialogs import GestaltDialog, UpdateAppDialog, PBHelpDialog +from gui.apply_worker import ApplyThread, ApplyAlertMessage from tweaks.tweaks import tweaks from tweaks.custom_gestalt_tweaks import CustomGestaltTweaks, ValueTypeStrings from tweaks.daemons_tweak import Daemon -App_Version = "5.0.3" +App_Version = "5.1" App_Build = 0 class Page(Enum): @@ -43,6 +44,8 @@ class MainWindow(QtWidgets.QMainWindow): self.ui.setupUi(self) self.show_uuid = False self.pb_mainLayout = None + self.applying_in_progress = False + self.threadpool = QtCore.QThreadPool() self.loadSettings() # Check for an update @@ -83,6 +86,7 @@ class MainWindow(QtWidgets.QMainWindow): self.ui.leminKoFiBtn.clicked.connect(self.on_leminKoFiBtn_clicked) self.ui.posterRestoreBtn.clicked.connect(self.on_posterRestoreBtn_clicked) + self.ui.snoolieBtn.clicked.connect(self.on_snoolieBtn_clicked) self.ui.disfordottieBtn.clicked.connect(self.on_disfordottieBtn_clicked) self.ui.mikasaBtn.clicked.connect(self.on_mikasaBtn_clicked) @@ -162,9 +166,21 @@ class MainWindow(QtWidgets.QMainWindow): ## POSTERBOARD PAGE ACTIONS self.ui.modifyPosterboardsChk.toggled.connect(self.on_modifyPosterboardsChk_clicked) + self.ui.tendiesPageBtn.clicked.connect(self.on_tendiesPageBtn_clicked) + self.ui.videoPageBtn.clicked.connect(self.on_videoPageBtn_clicked) + self.ui.importTendiesBtn.clicked.connect(self.on_importTendiesBtn_clicked) self.ui.resetPRBExtBtn.clicked.connect(self.on_resetPRBExtBtn_clicked) self.ui.deleteAllDescriptorsBtn.clicked.connect(self.on_deleteAllDescriptorsBtn_clicked) + + self.ui.chooseVideoBtn.clicked.connect(self.on_chooseVideoBtn_clicked) + self.ui.reverseLoopChk.toggled.connect(self.on_reverseLoopChk_toggled) + self.ui.useForegroundChk.toggled.connect(self.on_useForegroundChk_toggled) + self.ui.caVideoChk.hide() + self.ui.clearSuggestedBtn.hide() + self.ui.chooseThumbBtn.hide() + self.ui.pbVideoThumbLbl.hide() + self.ui.findPBBtn.clicked.connect(self.on_findPBBtn_clicked) self.ui.pbHelpBtn.clicked.connect(self.on_pbHelpBtn_clicked) @@ -184,9 +200,6 @@ class MainWindow(QtWidgets.QMainWindow): self.ui.allowWifiApplyingChk.toggled.connect(self.on_allowWifiApplyingChk_toggled) self.ui.autoRebootChk.toggled.connect(self.on_autoRebootChk_toggled) self.ui.showRiskyChk.toggled.connect(self.on_showRiskyChk_toggled) - # windows path fix toggle (depreciated) - # TODO: Remove this from the UI and everything - self.ui.windowsPathFixChk.hide() self.ui.showAllSpoofableChk.toggled.connect(self.on_showAllSpoofableChk_toggled) self.ui.revertRdarChk.toggled.connect(self.on_revertRdarChk_toggled) @@ -545,6 +558,8 @@ class MainWindow(QtWidgets.QMainWindow): def on_posterRestoreBtn_clicked(self): webbrowser.open_new_tab("https://discord.gg/gWtzTVhMvh") + def on_snoolieBtn_clicked(self): + webbrowser.open_new_tab("https://github.com/0xilis/python-aar-stuff") def on_disfordottieBtn_clicked(self): webbrowser.open_new_tab("https://twitter.com/disfordottie") def on_mikasaBtn_clicked(self): @@ -909,7 +924,7 @@ class MainWindow(QtWidgets.QMainWindow): spacer = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) # main layout layout = QtWidgets.QHBoxLayout(widget) - layout.setContentsMargins(0, 0, 0, 9) + layout.setContentsMargins(0, 0, 0, 3) layout.addWidget(titleBtn) layout.addItem(spacer) layout.addWidget(delBtn) @@ -920,7 +935,19 @@ class MainWindow(QtWidgets.QMainWindow): def on_modifyPosterboardsChk_clicked(self, checked: bool): tweaks["PosterBoard"].set_enabled(checked) - self.ui.posterboardPageContent.setDisabled(not checked) + self.ui.pbPages.setDisabled(not checked) + + # PB Pages Selectors + def on_tendiesPageBtn_clicked(self): + self.ui.tendiesPageBtn.setChecked(True) + self.ui.videoPageBtn.setChecked(False) + self.ui.pbPages.setCurrentIndex(0) + def on_videoPageBtn_clicked(self): + self.ui.tendiesPageBtn.setChecked(False) + self.ui.videoPageBtn.setChecked(True) + self.ui.pbPages.setCurrentIndex(1) + + # Tendies Page def on_importTendiesBtn_clicked(self): selected_files, _ = QtWidgets.QFileDialog.getOpenFileNames(self, "Select PosterBoard Files", "", "Zip Files (*.tendies)", options=QtWidgets.QFileDialog.ReadOnly) tweaks["PosterBoard"].resetting = False @@ -935,8 +962,8 @@ class MainWindow(QtWidgets.QMainWindow): detailsBox.setWindowTitle("Error!") detailsBox.setText("You selected too many descriptors! The limit is 10.") detailsBox.exec() + break self.load_posterboard() - def on_deleteAllDescriptorsBtn_clicked(self): if tweaks["PosterBoard"].resetting and tweaks["PosterBoard"].resetType == 0: tweaks["PosterBoard"].resetting = False @@ -944,7 +971,7 @@ class MainWindow(QtWidgets.QMainWindow): else: tweaks["PosterBoard"].resetting = True tweaks["PosterBoard"].resetType = 0 - self.ui.pbActionLbl.setText("! Clearing Collections Wallpapers") + self.ui.pbActionLbl.setText("! Set to Clear Collections Wallpapers") self.ui.pbActionLbl.show() def on_resetPRBExtBtn_clicked(self): if tweaks["PosterBoard"].resetting and tweaks["PosterBoard"].resetType == 1: @@ -953,8 +980,56 @@ class MainWindow(QtWidgets.QMainWindow): else: tweaks["PosterBoard"].resetting = True tweaks["PosterBoard"].resetType = 1 - self.ui.pbActionLbl.setText("! Resetting PRB Extension") + self.ui.pbActionLbl.setText("! Set to Reset PRB Extension") self.ui.pbActionLbl.show() + + # Video Page + def on_chooseThumbBtn_clicked(self): + selected_file, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Select Image File", "", "Image Files (*.heic)", options=QtWidgets.QFileDialog.ReadOnly) + tweaks["PosterBoard"].resetting = False + if selected_file != None and selected_file != "": + tweaks["PosterBoard"].videoThumbnail = selected_file + self.ui.pbVideoThumbLbl.setText(f"Current Thumbnail: {selected_file}") + else: + tweaks["PosterBoard"].videoThumbnail = None + self.ui.pbVideoThumbLbl.setText("Current Thumbnail: None") + def on_chooseVideoBtn_clicked(self): + selected_file, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Select Video File", "", "Video Files (*.mov *.mp4)", options=QtWidgets.QFileDialog.ReadOnly) + tweaks["PosterBoard"].resetting = False + if selected_file != None and selected_file != "": + tweaks["PosterBoard"].videoFile = selected_file + self.ui.pbVideoLbl.setText(f"Current Video: {selected_file}") + else: + tweaks["PosterBoard"].videoFile = None + self.ui.pbVideoLbl.setText("Current Video: None") + def on_clearSuggestedBtn_clicked(self): + if tweaks["PosterBoard"].resetting and tweaks["PosterBoard"].resetType == 2: + tweaks["PosterBoard"].resetting = False + self.ui.pbActionLbl.hide() + else: + tweaks["PosterBoard"].resetting = True + tweaks["PosterBoard"].resetType = 2 + self.ui.pbActionLbl.setText("! Set to Clear Suggested Photos") + self.ui.pbActionLbl.show() + def on_caVideoChk_toggled(self, checked: bool): + tweaks["PosterBoard"].loop_video = checked + # hide thumbnail button and label + if checked: + self.ui.chooseThumbBtn.hide() + self.ui.pbVideoThumbLbl.hide() + self.ui.clearSuggestedBtn.hide() + self.ui.reverseLoopChk.show() + self.ui.useForegroundChk.show() + else: + self.ui.chooseThumbBtn.show() + self.ui.pbVideoThumbLbl.show() + self.ui.clearSuggestedBtn.show() + self.ui.reverseLoopChk.hide() + self.ui.useForegroundChk.hide() + def on_reverseLoopChk_toggled(self, checked: bool): + tweaks["PosterBoard"].reverse_video = checked + def on_useForegroundChk_toggled(self, checked: bool): + tweaks["PosterBoard"].use_foreground = checked def on_findPBBtn_clicked(self): webbrowser.open_new_tab("https://cowabun.ga/wallpapers") @@ -1017,10 +1092,6 @@ class MainWindow(QtWidgets.QMainWindow): else: self.ui.advancedPageBtn.hide() self.ui.resetPRBExtBtn.hide() - def on_windowsPathFixChk_toggled(self, checked: bool): - self.device_manager.windows_path_fix = checked - # save the setting - self.settings.setValue("windows_path_fix", checked) def on_showAllSpoofableChk_toggled(self, checked: bool): self.device_manager.show_all_spoofable_models = checked # save the setting @@ -1101,12 +1172,31 @@ class MainWindow(QtWidgets.QMainWindow): def update_bar(self, percent): self.ui.restoreProgressBar.setValue(int(percent)) def on_removeTweaksBtn_clicked(self): - # TODO: Add threading here - self.device_manager.apply_changes(resetting=True, update_label=self.update_label) + self.apply_changes(resetting=True) def on_resetGestaltBtn_clicked(self): self.device_manager.reset_mobilegestalt(self.settings, update_label=self.update_label) @QtCore.Slot() def on_applyTweaksBtn_clicked(self): - # TODO: Add threading here - self.device_manager.apply_changes(update_label=self.update_label) + self.apply_changes() + + def apply_changes(self, resetting: bool = False): + if not self.applying_in_progress: + self.applying_in_progress = True + self.worker_thread = ApplyThread(manager=self.device_manager, resetting=resetting) + self.worker_thread.progress.connect(self.ui.statusLbl.setText) + self.worker_thread.alert.connect(self.alert_message) + self.worker_thread.finished.connect(self.finish_apply_thread) + self.worker_thread.finished.connect(self.worker_thread.deleteLater) + self.worker_thread.start() + def alert_message(self, alert: ApplyAlertMessage): + print(alert.txt) + detailsBox = QtWidgets.QMessageBox() + detailsBox.setIcon(alert.icon) + detailsBox.setWindowTitle(alert.title) + detailsBox.setText(alert.txt) + if alert.detailed_txt != None: + detailsBox.setDetailedText(alert.detailed_txt) + detailsBox.exec() + def finish_apply_thread(self): + self.applying_in_progress = False diff --git a/mainwindow_ui.py b/mainwindow_ui.py index 8d78de5..210d43b 100644 --- a/mainwindow_ui.py +++ b/mainwindow_ui.py @@ -2243,12 +2243,63 @@ class Ui_Nugget(object): self.verticalLayout_143.addWidget(self.line_123) - self.posterboardPageContent = QWidget(self.posterboardPage) - self.posterboardPageContent.setObjectName(u"posterboardPageContent") - self.posterboardPageContent.setEnabled(False) - self.verticalLayout_133 = QVBoxLayout(self.posterboardPageContent) - self.verticalLayout_133.setObjectName(u"verticalLayout_133") - self.verticalLayout_133.setContentsMargins(0, 0, 0, 0) + self.pbPagePicker = QWidget(self.posterboardPage) + self.pbPagePicker.setObjectName(u"pbPagePicker") + sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) + sizePolicy5.setHorizontalStretch(0) + sizePolicy5.setVerticalStretch(0) + sizePolicy5.setHeightForWidth(self.pbPagePicker.sizePolicy().hasHeightForWidth()) + self.pbPagePicker.setSizePolicy(sizePolicy5) + self.pbPagePicker.setMinimumSize(QSize(0, 30)) + self.horizontalLayout_14 = QHBoxLayout(self.pbPagePicker) + self.horizontalLayout_14.setObjectName(u"horizontalLayout_14") + self.horizontalLayout_14.setContentsMargins(-1, 0, -1, 0) + self.horizontalSpacer_20 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_14.addItem(self.horizontalSpacer_20) + + self.tendiesPageBtn = QToolButton(self.pbPagePicker) + self.tendiesPageBtn.setObjectName(u"tendiesPageBtn") + sizePolicy6 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding) + sizePolicy6.setHorizontalStretch(0) + sizePolicy6.setVerticalStretch(0) + sizePolicy6.setHeightForWidth(self.tendiesPageBtn.sizePolicy().hasHeightForWidth()) + self.tendiesPageBtn.setSizePolicy(sizePolicy6) + self.tendiesPageBtn.setMinimumSize(QSize(0, 35)) + icon22 = QIcon() + icon22.addFile(u":/icon/file-earmark-zip.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.tendiesPageBtn.setIcon(icon22) + self.tendiesPageBtn.setCheckable(True) + self.tendiesPageBtn.setChecked(True) + self.tendiesPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_14.addWidget(self.tendiesPageBtn) + + self.videoPageBtn = QToolButton(self.pbPagePicker) + self.videoPageBtn.setObjectName(u"videoPageBtn") + icon23 = QIcon() + icon23.addFile(u":/icon/photo.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.videoPageBtn.setIcon(icon23) + self.videoPageBtn.setCheckable(True) + self.videoPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_14.addWidget(self.videoPageBtn) + + self.horizontalSpacer_21 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_14.addItem(self.horizontalSpacer_21) + + + self.verticalLayout_143.addWidget(self.pbPagePicker) + + self.pbPages = QStackedWidget(self.posterboardPage) + self.pbPages.setObjectName(u"pbPages") + self.pbPages.setEnabled(False) + self.pbTendiesPage = QWidget() + self.pbTendiesPage.setObjectName(u"pbTendiesPage") + self.verticalLayout_38 = QVBoxLayout(self.pbTendiesPage) + self.verticalLayout_38.setObjectName(u"verticalLayout_38") + self.verticalLayout_38.setContentsMargins(-1, 0, -1, 0) self.horizontalLayout_12 = QHBoxLayout() self.horizontalLayout_12.setObjectName(u"horizontalLayout_12") self.horizontalLayout_12.setContentsMargins(-1, -1, -1, 0) @@ -2256,26 +2307,26 @@ class Ui_Nugget(object): self.horizontalLayout_12.addItem(self.horizontalSpacer_18) - self.importTendiesBtn = QToolButton(self.posterboardPageContent) + self.importTendiesBtn = QToolButton(self.pbTendiesPage) self.importTendiesBtn.setObjectName(u"importTendiesBtn") self.importTendiesBtn.setLayoutDirection(Qt.RightToLeft) - icon22 = QIcon() - icon22.addFile(u":/icon/import.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.importTendiesBtn.setIcon(icon22) + icon24 = QIcon() + icon24.addFile(u":/icon/import.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.importTendiesBtn.setIcon(icon24) self.importTendiesBtn.setIconSize(QSize(20, 20)) self.importTendiesBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self.horizontalLayout_12.addWidget(self.importTendiesBtn) - self.verticalLayout_133.addLayout(self.horizontalLayout_12) + self.verticalLayout_38.addLayout(self.horizontalLayout_12) - self.pbActionLbl = QLabel(self.posterboardPageContent) + self.pbActionLbl = QLabel(self.pbTendiesPage) self.pbActionLbl.setObjectName(u"pbActionLbl") - self.verticalLayout_133.addWidget(self.pbActionLbl) + self.verticalLayout_38.addWidget(self.pbActionLbl) - self.line_27 = QFrame(self.posterboardPageContent) + self.line_27 = QFrame(self.pbTendiesPage) self.line_27.setObjectName(u"line_27") self.line_27.setStyleSheet(u"QFrame {\n" " color: #414141;\n" @@ -2283,51 +2334,97 @@ class Ui_Nugget(object): self.line_27.setFrameShadow(QFrame.Plain) self.line_27.setFrameShape(QFrame.Shape.HLine) - self.verticalLayout_133.addWidget(self.line_27) + self.verticalLayout_38.addWidget(self.line_27) - self.pbFilesList = QWidget(self.posterboardPageContent) + self.pbFilesList = QWidget(self.pbTendiesPage) self.pbFilesList.setObjectName(u"pbFilesList") - sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - sizePolicy5.setHorizontalStretch(0) - sizePolicy5.setVerticalStretch(0) - sizePolicy5.setHeightForWidth(self.pbFilesList.sizePolicy().hasHeightForWidth()) - self.pbFilesList.setSizePolicy(sizePolicy5) + sizePolicy7 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy7.setHorizontalStretch(0) + sizePolicy7.setVerticalStretch(0) + sizePolicy7.setHeightForWidth(self.pbFilesList.sizePolicy().hasHeightForWidth()) + self.pbFilesList.setSizePolicy(sizePolicy7) self.pbFilesList.setMinimumSize(QSize(200, 35)) - self.verticalLayout_133.addWidget(self.pbFilesList) + self.verticalLayout_38.addWidget(self.pbFilesList) - self.horizontalLayout_14 = QHBoxLayout() - self.horizontalLayout_14.setObjectName(u"horizontalLayout_14") - self.horizontalLayout_14.setContentsMargins(-1, -1, -1, 0) - self.horizontalSpacer_19 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + self.horizontalLayout_32 = QHBoxLayout() + self.horizontalLayout_32.setObjectName(u"horizontalLayout_32") + self.horizontalLayout_32.setContentsMargins(-1, -1, -1, 10) + self.horizontalSpacer_22 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) - self.horizontalLayout_14.addItem(self.horizontalSpacer_19) + self.horizontalLayout_32.addItem(self.horizontalSpacer_22) - self.deleteAllDescriptorsBtn = QToolButton(self.posterboardPageContent) + self.deleteAllDescriptorsBtn = QToolButton(self.pbTendiesPage) self.deleteAllDescriptorsBtn.setObjectName(u"deleteAllDescriptorsBtn") - icon23 = QIcon() - icon23.addFile(u":/icon/arrow.clockwise.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.deleteAllDescriptorsBtn.setIcon(icon23) + icon25 = QIcon() + icon25.addFile(u":/icon/arrow.clockwise.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.deleteAllDescriptorsBtn.setIcon(icon25) self.deleteAllDescriptorsBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) - self.horizontalLayout_14.addWidget(self.deleteAllDescriptorsBtn) + self.horizontalLayout_32.addWidget(self.deleteAllDescriptorsBtn) - self.resetPRBExtBtn = QToolButton(self.posterboardPageContent) + self.resetPRBExtBtn = QToolButton(self.pbTendiesPage) self.resetPRBExtBtn.setObjectName(u"resetPRBExtBtn") - self.resetPRBExtBtn.setIcon(icon23) + self.resetPRBExtBtn.setIcon(icon25) self.resetPRBExtBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) - self.horizontalLayout_14.addWidget(self.resetPRBExtBtn) + self.horizontalLayout_32.addWidget(self.resetPRBExtBtn) - self.horizontalSpacer_20 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + self.horizontalSpacer_23 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) - self.horizontalLayout_14.addItem(self.horizontalSpacer_20) + self.horizontalLayout_32.addItem(self.horizontalSpacer_23) - self.verticalLayout_133.addLayout(self.horizontalLayout_14) + self.verticalLayout_38.addLayout(self.horizontalLayout_32) + + self.pbPages.addWidget(self.pbTendiesPage) + self.pbVideoPage = QWidget() + self.pbVideoPage.setObjectName(u"pbVideoPage") + self.verticalLayout_39 = QVBoxLayout(self.pbVideoPage) + self.verticalLayout_39.setObjectName(u"verticalLayout_39") + self.pbVideoThumbLbl = QLabel(self.pbVideoPage) + self.pbVideoThumbLbl.setObjectName(u"pbVideoThumbLbl") + + self.verticalLayout_39.addWidget(self.pbVideoThumbLbl) + + self.pbVideoLbl = QLabel(self.pbVideoPage) + self.pbVideoLbl.setObjectName(u"pbVideoLbl") + + self.verticalLayout_39.addWidget(self.pbVideoLbl) + + self.horizontalLayout_30 = QHBoxLayout() + self.horizontalLayout_30.setObjectName(u"horizontalLayout_30") + self.chooseThumbBtn = QToolButton(self.pbVideoPage) + self.chooseThumbBtn.setObjectName(u"chooseThumbBtn") + + self.horizontalLayout_30.addWidget(self.chooseThumbBtn) + + self.chooseVideoBtn = QToolButton(self.pbVideoPage) + self.chooseVideoBtn.setObjectName(u"chooseVideoBtn") + + self.horizontalLayout_30.addWidget(self.chooseVideoBtn) + + self.clearSuggestedBtn = QToolButton(self.pbVideoPage) + self.clearSuggestedBtn.setObjectName(u"clearSuggestedBtn") + self.clearSuggestedBtn.setIcon(icon25) + self.clearSuggestedBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_30.addWidget(self.clearSuggestedBtn) + + self.horizontalSpacer_19 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_30.addItem(self.horizontalSpacer_19) - self.verticalLayout_143.addWidget(self.posterboardPageContent) + self.verticalLayout_39.addLayout(self.horizontalLayout_30) + + self.verticalSpacer_22 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_39.addItem(self.verticalSpacer_22) + + self.pbPages.addWidget(self.pbVideoPage) + + self.verticalLayout_143.addWidget(self.pbPages) self.pages.addWidget(self.posterboardPage) self.advancedOptionsPage = QWidget() @@ -2394,13 +2491,13 @@ class Ui_Nugget(object): self.advancedOptionsPageContent = QWidget(self.advancedOptionsPage) self.advancedOptionsPageContent.setObjectName(u"advancedOptionsPageContent") self.advancedOptionsPageContent.setEnabled(True) - self.verticalLayout_134 = QVBoxLayout(self.advancedOptionsPageContent) - self.verticalLayout_134.setObjectName(u"verticalLayout_134") - self.verticalLayout_134.setContentsMargins(0, 0, 0, 0) + self.verticalLayout_133 = QVBoxLayout(self.advancedOptionsPageContent) + self.verticalLayout_133.setObjectName(u"verticalLayout_133") + self.verticalLayout_133.setContentsMargins(0, 0, 0, 0) self.label_17 = QLabel(self.advancedOptionsPageContent) self.label_17.setObjectName(u"label_17") - self.verticalLayout_134.addWidget(self.label_17) + self.verticalLayout_133.addWidget(self.label_17) self.line_191 = QFrame(self.advancedOptionsPageContent) self.line_191.setObjectName(u"line_191") @@ -2410,17 +2507,17 @@ class Ui_Nugget(object): self.line_191.setFrameShadow(QFrame.Plain) self.line_191.setFrameShape(QFrame.Shape.HLine) - self.verticalLayout_134.addWidget(self.line_191) + self.verticalLayout_133.addWidget(self.line_191) self.disableOTAChk = QCheckBox(self.advancedOptionsPageContent) self.disableOTAChk.setObjectName(u"disableOTAChk") - self.verticalLayout_134.addWidget(self.disableOTAChk) + self.verticalLayout_133.addWidget(self.disableOTAChk) self.thermalmonitordChk = QCheckBox(self.advancedOptionsPageContent) self.thermalmonitordChk.setObjectName(u"thermalmonitordChk") - self.verticalLayout_134.addWidget(self.thermalmonitordChk) + self.verticalLayout_133.addWidget(self.thermalmonitordChk) self.line_181 = QFrame(self.advancedOptionsPageContent) self.line_181.setObjectName(u"line_181") @@ -2430,12 +2527,12 @@ class Ui_Nugget(object): self.line_181.setFrameShadow(QFrame.Plain) self.line_181.setFrameShape(QFrame.Shape.HLine) - self.verticalLayout_134.addWidget(self.line_181) + self.verticalLayout_133.addWidget(self.line_181) self.enableResolutionChk = QCheckBox(self.advancedOptionsPageContent) self.enableResolutionChk.setObjectName(u"enableResolutionChk") - self.verticalLayout_134.addWidget(self.enableResolutionChk) + self.verticalLayout_133.addWidget(self.enableResolutionChk) self.resChangerContent = QWidget(self.advancedOptionsPageContent) self.resChangerContent.setObjectName(u"resChangerContent") @@ -2511,11 +2608,11 @@ class Ui_Nugget(object): self.verticalLayout_35.addLayout(self.resolutionContent) - self.verticalLayout_134.addWidget(self.resChangerContent) + self.verticalLayout_133.addWidget(self.resChangerContent) self.verticalSpacer_63 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) - self.verticalLayout_134.addItem(self.verticalSpacer_63) + self.verticalLayout_133.addItem(self.verticalSpacer_63) self.verticalLayout_144.addWidget(self.advancedOptionsPageContent) @@ -2609,9 +2706,9 @@ class Ui_Nugget(object): self.horizontalLayout_7.setContentsMargins(-1, 10, -1, 0) self.chooseGestaltBtn = QToolButton(self.verticalWidget2) self.chooseGestaltBtn.setObjectName(u"chooseGestaltBtn") - icon24 = QIcon() - icon24.addFile(u":/icon/folder.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.chooseGestaltBtn.setIcon(icon24) + icon26 = QIcon() + icon26.addFile(u":/icon/folder.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.chooseGestaltBtn.setIcon(icon26) self.chooseGestaltBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self.horizontalLayout_7.addWidget(self.chooseGestaltBtn) @@ -3025,9 +3122,9 @@ class Ui_Nugget(object): " padding-right: 5px;\n" " border-radius: 0px;\n" "}") - icon25 = QIcon() - icon25.addFile(u":/icon/pencil.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.toolButton_12.setIcon(icon25) + icon27 = QIcon() + icon27.addFile(u":/icon/pencil.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.toolButton_12.setIcon(icon27) self.toolButton_12.setIconSize(QSize(25, 25)) self.horizontalLayout_22.addWidget(self.toolButton_12) @@ -3088,7 +3185,7 @@ class Ui_Nugget(object): self.importOperationBtn = QToolButton(self.customOperationsPageContent) self.importOperationBtn.setObjectName(u"importOperationBtn") self.importOperationBtn.setEnabled(True) - self.importOperationBtn.setIcon(icon22) + self.importOperationBtn.setIcon(icon24) self.importOperationBtn.setIconSize(QSize(20, 20)) self.importOperationBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) @@ -3114,8 +3211,8 @@ class Ui_Nugget(object): self.operationsCnt = QWidget(self.customOperationsPageContent) self.operationsCnt.setObjectName(u"operationsCnt") self.operationsCnt.setEnabled(True) - sizePolicy5.setHeightForWidth(self.operationsCnt.sizePolicy().hasHeightForWidth()) - self.operationsCnt.setSizePolicy(sizePolicy5) + sizePolicy7.setHeightForWidth(self.operationsCnt.sizePolicy().hasHeightForWidth()) + self.operationsCnt.setSizePolicy(sizePolicy7) self.verticalLayout_19.addWidget(self.operationsCnt) @@ -3144,9 +3241,9 @@ class Ui_Nugget(object): " padding-right: 5px;\n" " border-radius: 0px;\n" "}") - icon26 = QIcon() - icon26.addFile(u":/icon/compass.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.toolButton_16.setIcon(icon26) + icon28 = QIcon() + icon28.addFile(u":/icon/compass.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.toolButton_16.setIcon(icon28) self.horizontalLayout_31.addWidget(self.toolButton_16) @@ -3189,8 +3286,8 @@ class Ui_Nugget(object): self.exploreThemesCnt = QWidget(self.explorePage) self.exploreThemesCnt.setObjectName(u"exploreThemesCnt") - sizePolicy5.setHeightForWidth(self.exploreThemesCnt.sizePolicy().hasHeightForWidth()) - self.exploreThemesCnt.setSizePolicy(sizePolicy5) + sizePolicy7.setHeightForWidth(self.exploreThemesCnt.sizePolicy().hasHeightForWidth()) + self.exploreThemesCnt.setSizePolicy(sizePolicy7) self.verticalLayout_31.addWidget(self.exploreThemesCnt) @@ -3256,15 +3353,13 @@ class Ui_Nugget(object): self.importThemeFolderBtn = QToolButton(self.horizontalWidget7) self.importThemeFolderBtn.setObjectName(u"importThemeFolderBtn") - self.importThemeFolderBtn.setIcon(icon24) + self.importThemeFolderBtn.setIcon(icon26) self.horizontalLayout_26.addWidget(self.importThemeFolderBtn) self.importThemeZipBtn = QToolButton(self.horizontalWidget7) self.importThemeZipBtn.setObjectName(u"importThemeZipBtn") - icon27 = QIcon() - icon27.addFile(u":/icon/file-earmark-zip.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.importThemeZipBtn.setIcon(icon27) + self.importThemeZipBtn.setIcon(icon22) self.horizontalLayout_26.addWidget(self.importThemeZipBtn) @@ -3679,6 +3774,8 @@ class Ui_Nugget(object): self.modifyPosterboardsChk.setText(QCoreApplication.translate("Nugget", u"Modify", None)) self.findPBBtn.setText(QCoreApplication.translate("Nugget", u" Find Wallpapers", None)) self.pbHelpBtn.setText(QCoreApplication.translate("Nugget", u"...", None)) + self.tendiesPageBtn.setText(QCoreApplication.translate("Nugget", u" Tendies", None)) + self.videoPageBtn.setText(QCoreApplication.translate("Nugget", u" Live", None)) #if QT_CONFIG(tooltip) self.importTendiesBtn.setToolTip(QCoreApplication.translate("Nugget", u"Select a wallpaper file with the .tendies extension.", None)) #endif // QT_CONFIG(tooltip) @@ -3694,6 +3791,11 @@ class Ui_Nugget(object): "Warning: This will remove all of your wallpapers and will restrict you from adding new ones until you restore again.", None)) #endif // QT_CONFIG(tooltip) self.resetPRBExtBtn.setText(QCoreApplication.translate("Nugget", u" Remove All Wallpapers", None)) + self.pbVideoThumbLbl.setText(QCoreApplication.translate("Nugget", u"Current Thumbnail: None", None)) + self.pbVideoLbl.setText(QCoreApplication.translate("Nugget", u"Current Video: None", None)) + self.chooseThumbBtn.setText(QCoreApplication.translate("Nugget", u"Choose Thumbnail (.HEIC)", None)) + self.chooseVideoBtn.setText(QCoreApplication.translate("Nugget", u"Choose Video (.MOV)", None)) + self.clearSuggestedBtn.setText(QCoreApplication.translate("Nugget", u" Clear Suggested Photos", None)) self.advancedOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Risky Options", None)) self.label_17.setText(QCoreApplication.translate("Nugget", u"Disclaimer:\n" "\n" diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index ab69095..0a349f1 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -1385,7 +1385,7 @@ QToolButton:pressed { - 150 + 145 35 @@ -1435,6 +1435,27 @@ Posterboard + + + + QToolButton { + border-radius: 0px; + background: none; + border: 1px solid #3b3b3b; + border-left: none; +} + +QToolButton:pressed { + background-color: #535353; + color: #FFFFFF; +} + + + Snoolie +.aar Handling + + + @@ -1464,7 +1485,7 @@ QToolButton:pressed { disfordottie -Clock Anim, Photos UI +Feature Flags @@ -1530,7 +1551,7 @@ Quiet Daemon - 150 + 145 35 @@ -4127,7 +4148,7 @@ To work properly, also disable the daemon using the toggle above. 0 - 9 + 0 @@ -4249,6 +4270,123 @@ To work properly, also disable the daemon using the toggle above. + + + + + 0 + 0 + + + + + 0 + 20 + + + + + 16777215 + 25 + + + + QToolButton { + min-height: 25px; + border-radius: 5px; +} + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + Tendies + + + + :/icon/file-earmark-zip.svg:/icon/file-earmark-zip.svg + + + true + + + true + + + Qt::ToolButtonTextBesideIcon + + + + + + + + 0 + 25 + + + + Live + + + + :/icon/photo.svg:/icon/photo.svg + + + true + + + Qt::ToolButtonTextBesideIcon + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + @@ -4265,177 +4403,300 @@ To work properly, also disable the daemon using the toggle above. - + + + None + + + + + false - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Select a wallpaper file with the .tendies extension. - - - Qt::RightToLeft - - - Import Files (.tendies) - - - - :/icon/import.svg:/icon/import.svg - - - - 20 - 20 - - - - Qt::ToolButtonTextBesideIcon - - - - - - - - - None - - - - - - - QFrame { + + + + 0 + + + 0 + + + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Select a wallpaper file with the .tendies extension. + + + Qt::RightToLeft + + + Import Files (.tendies) + + + + :/icon/import.svg:/icon/import.svg + + + + 20 + 20 + + + + Qt::ToolButtonTextBesideIcon + + + + + + + + + QFrame { color: #414141; } - - - QFrame::Plain - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 200 - 35 - - - - - - - - 0 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Clears all the wallpapers in the Collections section so that you can import more. - - - Clear Collections Wallpapers - - - - :/icon/arrow.clockwise.svg:/icon/arrow.clockwise.svg - - - Qt::ToolButtonTextBesideIcon - - - - - - - Wipes the PRB Extension folder. + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 200 + 35 + + + + + + + + 10 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Clears all the wallpapers in the Collections section so that you can import more. + + + Clear Collections Wallpapers + + + + :/icon/arrow.clockwise.svg:/icon/arrow.clockwise.svg + + + Qt::ToolButtonTextBesideIcon + + + + + + + Wipes the PRB Extension folder. Warning: This will remove all of your wallpapers and will restrict you from adding new ones until you restore again. - - - Remove All Wallpapers - - - - :/icon/arrow.clockwise.svg:/icon/arrow.clockwise.svg - - - Qt::ToolButtonTextBesideIcon - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - + + + Remove All Wallpapers + + + + :/icon/arrow.clockwise.svg:/icon/arrow.clockwise.svg + + + Qt::ToolButtonTextBesideIcon + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + Uses the CoreAnimation file to play the video (300 fps limit) +Will show up in Collections + + + Loop (use CoreAnimation method) + + + + + + + Reverse on Loop + + + + + + + Make Foreground (hides clock) + + + + + + + + + Choose a photo for the wallpaper to freeze on when finished (.heic files only) + + + Choose Freeze Frame (.HEIC) + + + + + + + Choose a video file for the wallpaper (.mov or .mp4) + + + Choose Video + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Current Thumbnail: None + + + + + + + Current Video: None + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 0 + + + + + Clear Suggested Photos + + + + :/icon/arrow.clockwise.svg:/icon/arrow.clockwise.svg + + + Qt::ToolButtonTextBesideIcon + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + @@ -5344,16 +5605,6 @@ Warning: Disabling will cause the battery to show "Unknown Part" or &q - - - - Use Windows Path Fix (for Posterboard) - - - true - - - diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index 40483c4..1611e47 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -756,7 +756,7 @@ class Ui_Nugget(object): self.helpFromBtn = QToolButton(self.horizontalWidget_21) self.helpFromBtn.setObjectName(u"helpFromBtn") self.helpFromBtn.setEnabled(True) - self.helpFromBtn.setMinimumSize(QSize(150, 35)) + self.helpFromBtn.setMinimumSize(QSize(145, 35)) self.helpFromBtn.setStyleSheet(u"QToolButton {\n" " background: none;\n" "}") @@ -783,6 +783,22 @@ class Ui_Nugget(object): self.horizontalLayout_2.addWidget(self.posterRestoreBtn) + self.snoolieBtn = QToolButton(self.horizontalWidget_21) + self.snoolieBtn.setObjectName(u"snoolieBtn") + self.snoolieBtn.setStyleSheet(u"QToolButton {\n" +" border-radius: 0px;\n" +" background: none;\n" +" border: 1px solid #3b3b3b;\n" +" border-left: none;\n" +"}\n" +"\n" +"QToolButton:pressed {\n" +" background-color: #535353;\n" +" color: #FFFFFF;\n" +"}") + + self.horizontalLayout_2.addWidget(self.snoolieBtn) + self.disfordottieBtn = QToolButton(self.horizontalWidget_21) self.disfordottieBtn.setObjectName(u"disfordottieBtn") sizePolicy2.setHeightForWidth(self.disfordottieBtn.sizePolicy().hasHeightForWidth()) @@ -834,7 +850,7 @@ class Ui_Nugget(object): self.toolButton_15 = QToolButton(self.horizontalWidget3) self.toolButton_15.setObjectName(u"toolButton_15") self.toolButton_15.setEnabled(False) - self.toolButton_15.setMinimumSize(QSize(150, 35)) + self.toolButton_15.setMinimumSize(QSize(145, 35)) self.toolButton_15.setStyleSheet(u"QToolButton {\n" " background: none;\n" "}") @@ -2171,7 +2187,7 @@ class Ui_Nugget(object): self.horizontalLayout_203 = QHBoxLayout(self.horizontalWidget_53) self.horizontalLayout_203.setSpacing(10) self.horizontalLayout_203.setObjectName(u"horizontalLayout_203") - self.horizontalLayout_203.setContentsMargins(0, 9, 0, 9) + self.horizontalLayout_203.setContentsMargins(0, 9, 0, 0) self.toolButton_103 = QToolButton(self.horizontalWidget_53) self.toolButton_103.setObjectName(u"toolButton_103") self.toolButton_103.setEnabled(True) @@ -2233,6 +2249,61 @@ class Ui_Nugget(object): self.verticalLayout_143.addWidget(self.horizontalWidget_53) + self.pbPagePicker = QWidget(self.posterboardPage) + self.pbPagePicker.setObjectName(u"pbPagePicker") + sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) + sizePolicy5.setHorizontalStretch(0) + sizePolicy5.setVerticalStretch(0) + sizePolicy5.setHeightForWidth(self.pbPagePicker.sizePolicy().hasHeightForWidth()) + self.pbPagePicker.setSizePolicy(sizePolicy5) + self.pbPagePicker.setMinimumSize(QSize(0, 20)) + self.pbPagePicker.setMaximumSize(QSize(16777215, 25)) + self.pbPagePicker.setStyleSheet(u"QToolButton {\n" +" min-height: 25px;\n" +" border-radius: 5px;\n" +"}") + self.horizontalLayout_14 = QHBoxLayout(self.pbPagePicker) + self.horizontalLayout_14.setObjectName(u"horizontalLayout_14") + self.horizontalLayout_14.setContentsMargins(-1, 0, -1, 0) + self.horizontalSpacer_20 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_14.addItem(self.horizontalSpacer_20) + + self.tendiesPageBtn = QToolButton(self.pbPagePicker) + self.tendiesPageBtn.setObjectName(u"tendiesPageBtn") + sizePolicy6 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding) + sizePolicy6.setHorizontalStretch(0) + sizePolicy6.setVerticalStretch(0) + sizePolicy6.setHeightForWidth(self.tendiesPageBtn.sizePolicy().hasHeightForWidth()) + self.tendiesPageBtn.setSizePolicy(sizePolicy6) + self.tendiesPageBtn.setMinimumSize(QSize(0, 25)) + icon22 = QIcon() + icon22.addFile(u":/icon/file-earmark-zip.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.tendiesPageBtn.setIcon(icon22) + self.tendiesPageBtn.setCheckable(True) + self.tendiesPageBtn.setChecked(True) + self.tendiesPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_14.addWidget(self.tendiesPageBtn) + + self.videoPageBtn = QToolButton(self.pbPagePicker) + self.videoPageBtn.setObjectName(u"videoPageBtn") + self.videoPageBtn.setMinimumSize(QSize(0, 25)) + icon23 = QIcon() + icon23.addFile(u":/icon/photo.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.videoPageBtn.setIcon(icon23) + self.videoPageBtn.setCheckable(True) + self.videoPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_14.addWidget(self.videoPageBtn) + + self.horizontalSpacer_21 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_14.addItem(self.horizontalSpacer_21) + + + self.verticalLayout_143.addWidget(self.pbPagePicker) + self.line_123 = QFrame(self.posterboardPage) self.line_123.setObjectName(u"line_123") self.line_123.setStyleSheet(u"QFrame {\n" @@ -2243,12 +2314,19 @@ class Ui_Nugget(object): self.verticalLayout_143.addWidget(self.line_123) - self.posterboardPageContent = QWidget(self.posterboardPage) - self.posterboardPageContent.setObjectName(u"posterboardPageContent") - self.posterboardPageContent.setEnabled(False) - self.verticalLayout_133 = QVBoxLayout(self.posterboardPageContent) - self.verticalLayout_133.setObjectName(u"verticalLayout_133") - self.verticalLayout_133.setContentsMargins(0, 0, 0, 0) + self.pbActionLbl = QLabel(self.posterboardPage) + self.pbActionLbl.setObjectName(u"pbActionLbl") + + self.verticalLayout_143.addWidget(self.pbActionLbl) + + self.pbPages = QStackedWidget(self.posterboardPage) + self.pbPages.setObjectName(u"pbPages") + self.pbPages.setEnabled(False) + self.pbTendiesPage = QWidget() + self.pbTendiesPage.setObjectName(u"pbTendiesPage") + self.verticalLayout_38 = QVBoxLayout(self.pbTendiesPage) + self.verticalLayout_38.setObjectName(u"verticalLayout_38") + self.verticalLayout_38.setContentsMargins(-1, 0, -1, 0) self.horizontalLayout_12 = QHBoxLayout() self.horizontalLayout_12.setObjectName(u"horizontalLayout_12") self.horizontalLayout_12.setContentsMargins(-1, -1, -1, 0) @@ -2256,26 +2334,21 @@ class Ui_Nugget(object): self.horizontalLayout_12.addItem(self.horizontalSpacer_18) - self.importTendiesBtn = QToolButton(self.posterboardPageContent) + self.importTendiesBtn = QToolButton(self.pbTendiesPage) self.importTendiesBtn.setObjectName(u"importTendiesBtn") self.importTendiesBtn.setLayoutDirection(Qt.RightToLeft) - icon22 = QIcon() - icon22.addFile(u":/icon/import.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.importTendiesBtn.setIcon(icon22) + icon24 = QIcon() + icon24.addFile(u":/icon/import.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.importTendiesBtn.setIcon(icon24) self.importTendiesBtn.setIconSize(QSize(20, 20)) self.importTendiesBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self.horizontalLayout_12.addWidget(self.importTendiesBtn) - self.verticalLayout_133.addLayout(self.horizontalLayout_12) + self.verticalLayout_38.addLayout(self.horizontalLayout_12) - self.pbActionLbl = QLabel(self.posterboardPageContent) - self.pbActionLbl.setObjectName(u"pbActionLbl") - - self.verticalLayout_133.addWidget(self.pbActionLbl) - - self.line_27 = QFrame(self.posterboardPageContent) + self.line_27 = QFrame(self.pbTendiesPage) self.line_27.setObjectName(u"line_27") self.line_27.setStyleSheet(u"QFrame {\n" " color: #414141;\n" @@ -2283,51 +2356,122 @@ class Ui_Nugget(object): self.line_27.setFrameShadow(QFrame.Plain) self.line_27.setFrameShape(QFrame.Shape.HLine) - self.verticalLayout_133.addWidget(self.line_27) + self.verticalLayout_38.addWidget(self.line_27) - self.pbFilesList = QWidget(self.posterboardPageContent) + self.pbFilesList = QWidget(self.pbTendiesPage) self.pbFilesList.setObjectName(u"pbFilesList") - sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - sizePolicy5.setHorizontalStretch(0) - sizePolicy5.setVerticalStretch(0) - sizePolicy5.setHeightForWidth(self.pbFilesList.sizePolicy().hasHeightForWidth()) - self.pbFilesList.setSizePolicy(sizePolicy5) + sizePolicy7 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy7.setHorizontalStretch(0) + sizePolicy7.setVerticalStretch(0) + sizePolicy7.setHeightForWidth(self.pbFilesList.sizePolicy().hasHeightForWidth()) + self.pbFilesList.setSizePolicy(sizePolicy7) self.pbFilesList.setMinimumSize(QSize(200, 35)) - self.verticalLayout_133.addWidget(self.pbFilesList) + self.verticalLayout_38.addWidget(self.pbFilesList) - self.horizontalLayout_14 = QHBoxLayout() - self.horizontalLayout_14.setObjectName(u"horizontalLayout_14") - self.horizontalLayout_14.setContentsMargins(-1, -1, -1, 0) - self.horizontalSpacer_19 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + self.horizontalLayout_32 = QHBoxLayout() + self.horizontalLayout_32.setObjectName(u"horizontalLayout_32") + self.horizontalLayout_32.setContentsMargins(-1, -1, -1, 10) + self.horizontalSpacer_22 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) - self.horizontalLayout_14.addItem(self.horizontalSpacer_19) + self.horizontalLayout_32.addItem(self.horizontalSpacer_22) - self.deleteAllDescriptorsBtn = QToolButton(self.posterboardPageContent) + self.deleteAllDescriptorsBtn = QToolButton(self.pbTendiesPage) self.deleteAllDescriptorsBtn.setObjectName(u"deleteAllDescriptorsBtn") - icon23 = QIcon() - icon23.addFile(u":/icon/arrow.clockwise.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.deleteAllDescriptorsBtn.setIcon(icon23) + icon25 = QIcon() + icon25.addFile(u":/icon/arrow.clockwise.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.deleteAllDescriptorsBtn.setIcon(icon25) self.deleteAllDescriptorsBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) - self.horizontalLayout_14.addWidget(self.deleteAllDescriptorsBtn) + self.horizontalLayout_32.addWidget(self.deleteAllDescriptorsBtn) - self.resetPRBExtBtn = QToolButton(self.posterboardPageContent) + self.resetPRBExtBtn = QToolButton(self.pbTendiesPage) self.resetPRBExtBtn.setObjectName(u"resetPRBExtBtn") - self.resetPRBExtBtn.setIcon(icon23) + self.resetPRBExtBtn.setIcon(icon25) self.resetPRBExtBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) - self.horizontalLayout_14.addWidget(self.resetPRBExtBtn) + self.horizontalLayout_32.addWidget(self.resetPRBExtBtn) - self.horizontalSpacer_20 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + self.horizontalSpacer_23 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) - self.horizontalLayout_14.addItem(self.horizontalSpacer_20) + self.horizontalLayout_32.addItem(self.horizontalSpacer_23) - self.verticalLayout_133.addLayout(self.horizontalLayout_14) + self.verticalLayout_38.addLayout(self.horizontalLayout_32) + + self.pbPages.addWidget(self.pbTendiesPage) + self.pbVideoPage = QWidget() + self.pbVideoPage.setObjectName(u"pbVideoPage") + self.verticalLayout_39 = QVBoxLayout(self.pbVideoPage) + self.verticalLayout_39.setObjectName(u"verticalLayout_39") + self.caVideoChk = QCheckBox(self.pbVideoPage) + self.caVideoChk.setObjectName(u"caVideoChk") + + self.verticalLayout_39.addWidget(self.caVideoChk) + + self.reverseLoopChk = QCheckBox(self.pbVideoPage) + self.reverseLoopChk.setObjectName(u"reverseLoopChk") + + self.verticalLayout_39.addWidget(self.reverseLoopChk) + + self.useForegroundChk = QCheckBox(self.pbVideoPage) + self.useForegroundChk.setObjectName(u"useForegroundChk") + + self.verticalLayout_39.addWidget(self.useForegroundChk) + + self.horizontalLayout_30 = QHBoxLayout() + self.horizontalLayout_30.setObjectName(u"horizontalLayout_30") + self.chooseThumbBtn = QToolButton(self.pbVideoPage) + self.chooseThumbBtn.setObjectName(u"chooseThumbBtn") + + self.horizontalLayout_30.addWidget(self.chooseThumbBtn) + + self.chooseVideoBtn = QToolButton(self.pbVideoPage) + self.chooseVideoBtn.setObjectName(u"chooseVideoBtn") + + self.horizontalLayout_30.addWidget(self.chooseVideoBtn) + + self.horizontalSpacer_19 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_30.addItem(self.horizontalSpacer_19) - self.verticalLayout_143.addWidget(self.posterboardPageContent) + self.verticalLayout_39.addLayout(self.horizontalLayout_30) + + self.pbVideoThumbLbl = QLabel(self.pbVideoPage) + self.pbVideoThumbLbl.setObjectName(u"pbVideoThumbLbl") + + self.verticalLayout_39.addWidget(self.pbVideoThumbLbl) + + self.pbVideoLbl = QLabel(self.pbVideoPage) + self.pbVideoLbl.setObjectName(u"pbVideoLbl") + + self.verticalLayout_39.addWidget(self.pbVideoLbl) + + self.verticalSpacer_22 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_39.addItem(self.verticalSpacer_22) + + self.horizontalLayout_34 = QHBoxLayout() + self.horizontalLayout_34.setObjectName(u"horizontalLayout_34") + self.horizontalLayout_34.setContentsMargins(-1, 0, -1, -1) + self.clearSuggestedBtn = QToolButton(self.pbVideoPage) + self.clearSuggestedBtn.setObjectName(u"clearSuggestedBtn") + self.clearSuggestedBtn.setIcon(icon25) + self.clearSuggestedBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_34.addWidget(self.clearSuggestedBtn) + + self.horizontalSpacer_24 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_34.addItem(self.horizontalSpacer_24) + + + self.verticalLayout_39.addLayout(self.horizontalLayout_34) + + self.pbPages.addWidget(self.pbVideoPage) + + self.verticalLayout_143.addWidget(self.pbPages) self.pages.addWidget(self.posterboardPage) self.advancedOptionsPage = QWidget() @@ -2394,13 +2538,13 @@ class Ui_Nugget(object): self.advancedOptionsPageContent = QWidget(self.advancedOptionsPage) self.advancedOptionsPageContent.setObjectName(u"advancedOptionsPageContent") self.advancedOptionsPageContent.setEnabled(True) - self.verticalLayout_134 = QVBoxLayout(self.advancedOptionsPageContent) - self.verticalLayout_134.setObjectName(u"verticalLayout_134") - self.verticalLayout_134.setContentsMargins(0, 0, 0, 0) + self.verticalLayout_133 = QVBoxLayout(self.advancedOptionsPageContent) + self.verticalLayout_133.setObjectName(u"verticalLayout_133") + self.verticalLayout_133.setContentsMargins(0, 0, 0, 0) self.label_17 = QLabel(self.advancedOptionsPageContent) self.label_17.setObjectName(u"label_17") - self.verticalLayout_134.addWidget(self.label_17) + self.verticalLayout_133.addWidget(self.label_17) self.line_191 = QFrame(self.advancedOptionsPageContent) self.line_191.setObjectName(u"line_191") @@ -2410,17 +2554,17 @@ class Ui_Nugget(object): self.line_191.setFrameShadow(QFrame.Plain) self.line_191.setFrameShape(QFrame.Shape.HLine) - self.verticalLayout_134.addWidget(self.line_191) + self.verticalLayout_133.addWidget(self.line_191) self.disableOTAChk = QCheckBox(self.advancedOptionsPageContent) self.disableOTAChk.setObjectName(u"disableOTAChk") - self.verticalLayout_134.addWidget(self.disableOTAChk) + self.verticalLayout_133.addWidget(self.disableOTAChk) self.thermalmonitordChk = QCheckBox(self.advancedOptionsPageContent) self.thermalmonitordChk.setObjectName(u"thermalmonitordChk") - self.verticalLayout_134.addWidget(self.thermalmonitordChk) + self.verticalLayout_133.addWidget(self.thermalmonitordChk) self.line_181 = QFrame(self.advancedOptionsPageContent) self.line_181.setObjectName(u"line_181") @@ -2430,12 +2574,12 @@ class Ui_Nugget(object): self.line_181.setFrameShadow(QFrame.Plain) self.line_181.setFrameShape(QFrame.Shape.HLine) - self.verticalLayout_134.addWidget(self.line_181) + self.verticalLayout_133.addWidget(self.line_181) self.enableResolutionChk = QCheckBox(self.advancedOptionsPageContent) self.enableResolutionChk.setObjectName(u"enableResolutionChk") - self.verticalLayout_134.addWidget(self.enableResolutionChk) + self.verticalLayout_133.addWidget(self.enableResolutionChk) self.resChangerContent = QWidget(self.advancedOptionsPageContent) self.resChangerContent.setObjectName(u"resChangerContent") @@ -2511,11 +2655,11 @@ class Ui_Nugget(object): self.verticalLayout_35.addLayout(self.resolutionContent) - self.verticalLayout_134.addWidget(self.resChangerContent) + self.verticalLayout_133.addWidget(self.resChangerContent) self.verticalSpacer_63 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) - self.verticalLayout_134.addItem(self.verticalSpacer_63) + self.verticalLayout_133.addItem(self.verticalSpacer_63) self.verticalLayout_144.addWidget(self.advancedOptionsPageContent) @@ -2609,9 +2753,9 @@ class Ui_Nugget(object): self.horizontalLayout_7.setContentsMargins(-1, 10, -1, 0) self.chooseGestaltBtn = QToolButton(self.verticalWidget2) self.chooseGestaltBtn.setObjectName(u"chooseGestaltBtn") - icon24 = QIcon() - icon24.addFile(u":/icon/folder.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.chooseGestaltBtn.setIcon(icon24) + icon26 = QIcon() + icon26.addFile(u":/icon/folder.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.chooseGestaltBtn.setIcon(icon26) self.chooseGestaltBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self.horizontalLayout_7.addWidget(self.chooseGestaltBtn) @@ -2776,12 +2920,6 @@ class Ui_Nugget(object): self._21.addWidget(self.showRiskyChk) - self.windowsPathFixChk = QCheckBox(self.settingsPageContent) - self.windowsPathFixChk.setObjectName(u"windowsPathFixChk") - self.windowsPathFixChk.setChecked(True) - - self._21.addWidget(self.windowsPathFixChk) - self.showAllSpoofableChk = QCheckBox(self.settingsPageContent) self.showAllSpoofableChk.setObjectName(u"showAllSpoofableChk") @@ -3031,9 +3169,9 @@ class Ui_Nugget(object): " padding-right: 5px;\n" " border-radius: 0px;\n" "}") - icon25 = QIcon() - icon25.addFile(u":/icon/pencil.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.toolButton_12.setIcon(icon25) + icon27 = QIcon() + icon27.addFile(u":/icon/pencil.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.toolButton_12.setIcon(icon27) self.toolButton_12.setIconSize(QSize(25, 25)) self.horizontalLayout_22.addWidget(self.toolButton_12) @@ -3094,7 +3232,7 @@ class Ui_Nugget(object): self.importOperationBtn = QToolButton(self.customOperationsPageContent) self.importOperationBtn.setObjectName(u"importOperationBtn") self.importOperationBtn.setEnabled(True) - self.importOperationBtn.setIcon(icon22) + self.importOperationBtn.setIcon(icon24) self.importOperationBtn.setIconSize(QSize(20, 20)) self.importOperationBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) @@ -3120,8 +3258,8 @@ class Ui_Nugget(object): self.operationsCnt = QWidget(self.customOperationsPageContent) self.operationsCnt.setObjectName(u"operationsCnt") self.operationsCnt.setEnabled(True) - sizePolicy5.setHeightForWidth(self.operationsCnt.sizePolicy().hasHeightForWidth()) - self.operationsCnt.setSizePolicy(sizePolicy5) + sizePolicy7.setHeightForWidth(self.operationsCnt.sizePolicy().hasHeightForWidth()) + self.operationsCnt.setSizePolicy(sizePolicy7) self.verticalLayout_19.addWidget(self.operationsCnt) @@ -3150,9 +3288,9 @@ class Ui_Nugget(object): " padding-right: 5px;\n" " border-radius: 0px;\n" "}") - icon26 = QIcon() - icon26.addFile(u":/icon/compass.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.toolButton_16.setIcon(icon26) + icon28 = QIcon() + icon28.addFile(u":/icon/compass.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.toolButton_16.setIcon(icon28) self.horizontalLayout_31.addWidget(self.toolButton_16) @@ -3195,8 +3333,8 @@ class Ui_Nugget(object): self.exploreThemesCnt = QWidget(self.explorePage) self.exploreThemesCnt.setObjectName(u"exploreThemesCnt") - sizePolicy5.setHeightForWidth(self.exploreThemesCnt.sizePolicy().hasHeightForWidth()) - self.exploreThemesCnt.setSizePolicy(sizePolicy5) + sizePolicy7.setHeightForWidth(self.exploreThemesCnt.sizePolicy().hasHeightForWidth()) + self.exploreThemesCnt.setSizePolicy(sizePolicy7) self.verticalLayout_31.addWidget(self.exploreThemesCnt) @@ -3262,15 +3400,13 @@ class Ui_Nugget(object): self.importThemeFolderBtn = QToolButton(self.horizontalWidget7) self.importThemeFolderBtn.setObjectName(u"importThemeFolderBtn") - self.importThemeFolderBtn.setIcon(icon24) + self.importThemeFolderBtn.setIcon(icon26) self.horizontalLayout_26.addWidget(self.importThemeFolderBtn) self.importThemeZipBtn = QToolButton(self.horizontalWidget7) self.importThemeZipBtn.setObjectName(u"importThemeZipBtn") - icon27 = QIcon() - icon27.addFile(u":/icon/file-earmark-zip.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.importThemeZipBtn.setIcon(icon27) + self.importThemeZipBtn.setIcon(icon22) self.horizontalLayout_26.addWidget(self.importThemeZipBtn) @@ -3425,8 +3561,10 @@ class Ui_Nugget(object): self.helpFromBtn.setText(QCoreApplication.translate("Nugget", u"With Help From", None)) self.posterRestoreBtn.setText(QCoreApplication.translate("Nugget", u"PosterRestore Team\n" "Posterboard", None)) + self.snoolieBtn.setText(QCoreApplication.translate("Nugget", u"Snoolie\n" +".aar Handling", None)) self.disfordottieBtn.setText(QCoreApplication.translate("Nugget", u"disfordottie\n" -"Clock Anim, Photos UI", None)) +"Feature Flags", None)) self.mikasaBtn.setText(QCoreApplication.translate("Nugget", u"Mikasa\n" "Quiet Daemon", None)) self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) @@ -3685,11 +3823,13 @@ class Ui_Nugget(object): self.modifyPosterboardsChk.setText(QCoreApplication.translate("Nugget", u"Modify", None)) self.findPBBtn.setText(QCoreApplication.translate("Nugget", u" Find Wallpapers", None)) self.pbHelpBtn.setText(QCoreApplication.translate("Nugget", u"...", None)) + self.tendiesPageBtn.setText(QCoreApplication.translate("Nugget", u" Tendies", None)) + self.videoPageBtn.setText(QCoreApplication.translate("Nugget", u" Live", None)) + self.pbActionLbl.setText(QCoreApplication.translate("Nugget", u"None", None)) #if QT_CONFIG(tooltip) self.importTendiesBtn.setToolTip(QCoreApplication.translate("Nugget", u"Select a wallpaper file with the .tendies extension.", None)) #endif // QT_CONFIG(tooltip) self.importTendiesBtn.setText(QCoreApplication.translate("Nugget", u" Import Files (.tendies)", None)) - self.pbActionLbl.setText(QCoreApplication.translate("Nugget", u"None", None)) #if QT_CONFIG(tooltip) self.deleteAllDescriptorsBtn.setToolTip(QCoreApplication.translate("Nugget", u"Clears all the wallpapers in the Collections section so that you can import more.", None)) #endif // QT_CONFIG(tooltip) @@ -3700,6 +3840,24 @@ class Ui_Nugget(object): "Warning: This will remove all of your wallpapers and will restrict you from adding new ones until you restore again.", None)) #endif // QT_CONFIG(tooltip) self.resetPRBExtBtn.setText(QCoreApplication.translate("Nugget", u" Remove All Wallpapers", None)) +#if QT_CONFIG(tooltip) + self.caVideoChk.setToolTip(QCoreApplication.translate("Nugget", u"Uses the CoreAnimation file to play the video (300 fps limit)\n" +"Will show up in Collections", None)) +#endif // QT_CONFIG(tooltip) + self.caVideoChk.setText(QCoreApplication.translate("Nugget", u"Loop (use CoreAnimation method)", None)) + self.reverseLoopChk.setText(QCoreApplication.translate("Nugget", u"Reverse on Loop", None)) + self.useForegroundChk.setText(QCoreApplication.translate("Nugget", u"Make Foreground (hides clock)", None)) +#if QT_CONFIG(tooltip) + self.chooseThumbBtn.setToolTip(QCoreApplication.translate("Nugget", u"Choose a photo for the wallpaper to freeze on when finished (.heic files only)", None)) +#endif // QT_CONFIG(tooltip) + self.chooseThumbBtn.setText(QCoreApplication.translate("Nugget", u"Choose Freeze Frame (.HEIC)", None)) +#if QT_CONFIG(tooltip) + self.chooseVideoBtn.setToolTip(QCoreApplication.translate("Nugget", u"Choose a video file for the wallpaper (.mov or .mp4)", None)) +#endif // QT_CONFIG(tooltip) + self.chooseVideoBtn.setText(QCoreApplication.translate("Nugget", u"Choose Video", None)) + self.pbVideoThumbLbl.setText(QCoreApplication.translate("Nugget", u"Current Thumbnail: None", None)) + self.pbVideoLbl.setText(QCoreApplication.translate("Nugget", u"Current Video: None", None)) + self.clearSuggestedBtn.setText(QCoreApplication.translate("Nugget", u" Clear Suggested Photos", None)) self.advancedOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Risky Options", None)) self.label_17.setText(QCoreApplication.translate("Nugget", u"Disclaimer:\n" "\n" @@ -3741,7 +3899,6 @@ class Ui_Nugget(object): self.allowWifiApplyingChk.setText(QCoreApplication.translate("Nugget", u"Allow Applying Over WiFi", None)) self.autoRebootChk.setText(QCoreApplication.translate("Nugget", u"Auto Reboot After Applying", None)) self.showRiskyChk.setText(QCoreApplication.translate("Nugget", u"Show Risky Tweak Options", None)) - self.windowsPathFixChk.setText(QCoreApplication.translate("Nugget", u"Use Windows Path Fix (for Posterboard)", None)) #if QT_CONFIG(tooltip) self.showAllSpoofableChk.setToolTip(QCoreApplication.translate("Nugget", u"Show models for other device types in the AI device spoofing tab.", None)) #endif // QT_CONFIG(tooltip) diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index a2c7988..f878bd8 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -756,7 +756,7 @@ class Ui_Nugget(object): self.helpFromBtn = QToolButton(self.horizontalWidget_21) self.helpFromBtn.setObjectName(u"helpFromBtn") self.helpFromBtn.setEnabled(True) - self.helpFromBtn.setMinimumSize(QSize(150, 35)) + self.helpFromBtn.setMinimumSize(QSize(145, 35)) self.helpFromBtn.setStyleSheet(u"QToolButton {\n" " background: none;\n" "}") @@ -783,6 +783,22 @@ class Ui_Nugget(object): self.horizontalLayout_2.addWidget(self.posterRestoreBtn) + self.snoolieBtn = QToolButton(self.horizontalWidget_21) + self.snoolieBtn.setObjectName(u"snoolieBtn") + self.snoolieBtn.setStyleSheet(u"QToolButton {\n" +" border-radius: 0px;\n" +" background: none;\n" +" border: 1px solid #3b3b3b;\n" +" border-left: none;\n" +"}\n" +"\n" +"QToolButton:pressed {\n" +" background-color: #535353;\n" +" color: #FFFFFF;\n" +"}") + + self.horizontalLayout_2.addWidget(self.snoolieBtn) + self.disfordottieBtn = QToolButton(self.horizontalWidget_21) self.disfordottieBtn.setObjectName(u"disfordottieBtn") sizePolicy2.setHeightForWidth(self.disfordottieBtn.sizePolicy().hasHeightForWidth()) @@ -834,7 +850,7 @@ class Ui_Nugget(object): self.toolButton_15 = QToolButton(self.horizontalWidget3) self.toolButton_15.setObjectName(u"toolButton_15") self.toolButton_15.setEnabled(False) - self.toolButton_15.setMinimumSize(QSize(150, 35)) + self.toolButton_15.setMinimumSize(QSize(145, 35)) self.toolButton_15.setStyleSheet(u"QToolButton {\n" " background: none;\n" "}") @@ -2171,7 +2187,7 @@ class Ui_Nugget(object): self.horizontalLayout_203 = QHBoxLayout(self.horizontalWidget_53) self.horizontalLayout_203.setSpacing(10) self.horizontalLayout_203.setObjectName(u"horizontalLayout_203") - self.horizontalLayout_203.setContentsMargins(0, 9, 0, 9) + self.horizontalLayout_203.setContentsMargins(0, 9, 0, 0) self.toolButton_103 = QToolButton(self.horizontalWidget_53) self.toolButton_103.setObjectName(u"toolButton_103") self.toolButton_103.setEnabled(True) @@ -2233,6 +2249,61 @@ class Ui_Nugget(object): self.verticalLayout_143.addWidget(self.horizontalWidget_53) + self.pbPagePicker = QWidget(self.posterboardPage) + self.pbPagePicker.setObjectName(u"pbPagePicker") + sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) + sizePolicy5.setHorizontalStretch(0) + sizePolicy5.setVerticalStretch(0) + sizePolicy5.setHeightForWidth(self.pbPagePicker.sizePolicy().hasHeightForWidth()) + self.pbPagePicker.setSizePolicy(sizePolicy5) + self.pbPagePicker.setMinimumSize(QSize(0, 20)) + self.pbPagePicker.setMaximumSize(QSize(16777215, 25)) + self.pbPagePicker.setStyleSheet(u"QToolButton {\n" +" min-height: 25px;\n" +" border-radius: 5px;\n" +"}") + self.horizontalLayout_14 = QHBoxLayout(self.pbPagePicker) + self.horizontalLayout_14.setObjectName(u"horizontalLayout_14") + self.horizontalLayout_14.setContentsMargins(-1, 0, -1, 0) + self.horizontalSpacer_20 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_14.addItem(self.horizontalSpacer_20) + + self.tendiesPageBtn = QToolButton(self.pbPagePicker) + self.tendiesPageBtn.setObjectName(u"tendiesPageBtn") + sizePolicy6 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding) + sizePolicy6.setHorizontalStretch(0) + sizePolicy6.setVerticalStretch(0) + sizePolicy6.setHeightForWidth(self.tendiesPageBtn.sizePolicy().hasHeightForWidth()) + self.tendiesPageBtn.setSizePolicy(sizePolicy6) + self.tendiesPageBtn.setMinimumSize(QSize(0, 25)) + icon22 = QIcon() + icon22.addFile(u":/icon/file-earmark-zip.svg", QSize(), QIcon.Normal, QIcon.Off) + self.tendiesPageBtn.setIcon(icon22) + self.tendiesPageBtn.setCheckable(True) + self.tendiesPageBtn.setChecked(True) + self.tendiesPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_14.addWidget(self.tendiesPageBtn) + + self.videoPageBtn = QToolButton(self.pbPagePicker) + self.videoPageBtn.setObjectName(u"videoPageBtn") + self.videoPageBtn.setMinimumSize(QSize(0, 25)) + icon23 = QIcon() + icon23.addFile(u":/icon/photo.svg", QSize(), QIcon.Normal, QIcon.Off) + self.videoPageBtn.setIcon(icon23) + self.videoPageBtn.setCheckable(True) + self.videoPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_14.addWidget(self.videoPageBtn) + + self.horizontalSpacer_21 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_14.addItem(self.horizontalSpacer_21) + + + self.verticalLayout_143.addWidget(self.pbPagePicker) + self.line_123 = QFrame(self.posterboardPage) self.line_123.setObjectName(u"line_123") self.line_123.setStyleSheet(u"QFrame {\n" @@ -2243,12 +2314,19 @@ class Ui_Nugget(object): self.verticalLayout_143.addWidget(self.line_123) - self.posterboardPageContent = QWidget(self.posterboardPage) - self.posterboardPageContent.setObjectName(u"posterboardPageContent") - self.posterboardPageContent.setEnabled(False) - self.verticalLayout_133 = QVBoxLayout(self.posterboardPageContent) - self.verticalLayout_133.setObjectName(u"verticalLayout_133") - self.verticalLayout_133.setContentsMargins(0, 0, 0, 0) + self.pbActionLbl = QLabel(self.posterboardPage) + self.pbActionLbl.setObjectName(u"pbActionLbl") + + self.verticalLayout_143.addWidget(self.pbActionLbl) + + self.pbPages = QStackedWidget(self.posterboardPage) + self.pbPages.setObjectName(u"pbPages") + self.pbPages.setEnabled(False) + self.pbTendiesPage = QWidget() + self.pbTendiesPage.setObjectName(u"pbTendiesPage") + self.verticalLayout_38 = QVBoxLayout(self.pbTendiesPage) + self.verticalLayout_38.setObjectName(u"verticalLayout_38") + self.verticalLayout_38.setContentsMargins(-1, 0, -1, 0) self.horizontalLayout_12 = QHBoxLayout() self.horizontalLayout_12.setObjectName(u"horizontalLayout_12") self.horizontalLayout_12.setContentsMargins(-1, -1, -1, 0) @@ -2256,26 +2334,21 @@ class Ui_Nugget(object): self.horizontalLayout_12.addItem(self.horizontalSpacer_18) - self.importTendiesBtn = QToolButton(self.posterboardPageContent) + self.importTendiesBtn = QToolButton(self.pbTendiesPage) self.importTendiesBtn.setObjectName(u"importTendiesBtn") self.importTendiesBtn.setLayoutDirection(Qt.RightToLeft) - icon22 = QIcon() - icon22.addFile(u":/icon/import.svg", QSize(), QIcon.Normal, QIcon.Off) - self.importTendiesBtn.setIcon(icon22) + icon24 = QIcon() + icon24.addFile(u":/icon/import.svg", QSize(), QIcon.Normal, QIcon.Off) + self.importTendiesBtn.setIcon(icon24) self.importTendiesBtn.setIconSize(QSize(20, 20)) self.importTendiesBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self.horizontalLayout_12.addWidget(self.importTendiesBtn) - self.verticalLayout_133.addLayout(self.horizontalLayout_12) + self.verticalLayout_38.addLayout(self.horizontalLayout_12) - self.pbActionLbl = QLabel(self.posterboardPageContent) - self.pbActionLbl.setObjectName(u"pbActionLbl") - - self.verticalLayout_133.addWidget(self.pbActionLbl) - - self.line_27 = QFrame(self.posterboardPageContent) + self.line_27 = QFrame(self.pbTendiesPage) self.line_27.setObjectName(u"line_27") self.line_27.setStyleSheet(u"QFrame {\n" " color: #414141;\n" @@ -2283,51 +2356,122 @@ class Ui_Nugget(object): self.line_27.setFrameShadow(QFrame.Plain) self.line_27.setFrameShape(QFrame.HLine) - self.verticalLayout_133.addWidget(self.line_27) + self.verticalLayout_38.addWidget(self.line_27) - self.pbFilesList = QWidget(self.posterboardPageContent) + self.pbFilesList = QWidget(self.pbTendiesPage) self.pbFilesList.setObjectName(u"pbFilesList") - sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - sizePolicy5.setHorizontalStretch(0) - sizePolicy5.setVerticalStretch(0) - sizePolicy5.setHeightForWidth(self.pbFilesList.sizePolicy().hasHeightForWidth()) - self.pbFilesList.setSizePolicy(sizePolicy5) + sizePolicy7 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy7.setHorizontalStretch(0) + sizePolicy7.setVerticalStretch(0) + sizePolicy7.setHeightForWidth(self.pbFilesList.sizePolicy().hasHeightForWidth()) + self.pbFilesList.setSizePolicy(sizePolicy7) self.pbFilesList.setMinimumSize(QSize(200, 35)) - self.verticalLayout_133.addWidget(self.pbFilesList) + self.verticalLayout_38.addWidget(self.pbFilesList) - self.horizontalLayout_14 = QHBoxLayout() - self.horizontalLayout_14.setObjectName(u"horizontalLayout_14") - self.horizontalLayout_14.setContentsMargins(-1, -1, -1, 0) - self.horizontalSpacer_19 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + self.horizontalLayout_32 = QHBoxLayout() + self.horizontalLayout_32.setObjectName(u"horizontalLayout_32") + self.horizontalLayout_32.setContentsMargins(-1, -1, -1, 10) + self.horizontalSpacer_22 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) - self.horizontalLayout_14.addItem(self.horizontalSpacer_19) + self.horizontalLayout_32.addItem(self.horizontalSpacer_22) - self.deleteAllDescriptorsBtn = QToolButton(self.posterboardPageContent) + self.deleteAllDescriptorsBtn = QToolButton(self.pbTendiesPage) self.deleteAllDescriptorsBtn.setObjectName(u"deleteAllDescriptorsBtn") - icon23 = QIcon() - icon23.addFile(u":/icon/arrow.clockwise.svg", QSize(), QIcon.Normal, QIcon.Off) - self.deleteAllDescriptorsBtn.setIcon(icon23) + icon25 = QIcon() + icon25.addFile(u":/icon/arrow.clockwise.svg", QSize(), QIcon.Normal, QIcon.Off) + self.deleteAllDescriptorsBtn.setIcon(icon25) self.deleteAllDescriptorsBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) - self.horizontalLayout_14.addWidget(self.deleteAllDescriptorsBtn) + self.horizontalLayout_32.addWidget(self.deleteAllDescriptorsBtn) - self.resetPRBExtBtn = QToolButton(self.posterboardPageContent) + self.resetPRBExtBtn = QToolButton(self.pbTendiesPage) self.resetPRBExtBtn.setObjectName(u"resetPRBExtBtn") - self.resetPRBExtBtn.setIcon(icon23) + self.resetPRBExtBtn.setIcon(icon25) self.resetPRBExtBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) - self.horizontalLayout_14.addWidget(self.resetPRBExtBtn) + self.horizontalLayout_32.addWidget(self.resetPRBExtBtn) - self.horizontalSpacer_20 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + self.horizontalSpacer_23 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) - self.horizontalLayout_14.addItem(self.horizontalSpacer_20) + self.horizontalLayout_32.addItem(self.horizontalSpacer_23) - self.verticalLayout_133.addLayout(self.horizontalLayout_14) + self.verticalLayout_38.addLayout(self.horizontalLayout_32) + + self.pbPages.addWidget(self.pbTendiesPage) + self.pbVideoPage = QWidget() + self.pbVideoPage.setObjectName(u"pbVideoPage") + self.verticalLayout_39 = QVBoxLayout(self.pbVideoPage) + self.verticalLayout_39.setObjectName(u"verticalLayout_39") + self.caVideoChk = QCheckBox(self.pbVideoPage) + self.caVideoChk.setObjectName(u"caVideoChk") + + self.verticalLayout_39.addWidget(self.caVideoChk) + + self.reverseLoopChk = QCheckBox(self.pbVideoPage) + self.reverseLoopChk.setObjectName(u"reverseLoopChk") + + self.verticalLayout_39.addWidget(self.reverseLoopChk) + + self.useForegroundChk = QCheckBox(self.pbVideoPage) + self.useForegroundChk.setObjectName(u"useForegroundChk") + + self.verticalLayout_39.addWidget(self.useForegroundChk) + + self.horizontalLayout_30 = QHBoxLayout() + self.horizontalLayout_30.setObjectName(u"horizontalLayout_30") + self.chooseThumbBtn = QToolButton(self.pbVideoPage) + self.chooseThumbBtn.setObjectName(u"chooseThumbBtn") + + self.horizontalLayout_30.addWidget(self.chooseThumbBtn) + + self.chooseVideoBtn = QToolButton(self.pbVideoPage) + self.chooseVideoBtn.setObjectName(u"chooseVideoBtn") + + self.horizontalLayout_30.addWidget(self.chooseVideoBtn) + + self.horizontalSpacer_19 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_30.addItem(self.horizontalSpacer_19) - self.verticalLayout_143.addWidget(self.posterboardPageContent) + self.verticalLayout_39.addLayout(self.horizontalLayout_30) + + self.pbVideoThumbLbl = QLabel(self.pbVideoPage) + self.pbVideoThumbLbl.setObjectName(u"pbVideoThumbLbl") + + self.verticalLayout_39.addWidget(self.pbVideoThumbLbl) + + self.pbVideoLbl = QLabel(self.pbVideoPage) + self.pbVideoLbl.setObjectName(u"pbVideoLbl") + + self.verticalLayout_39.addWidget(self.pbVideoLbl) + + self.verticalSpacer_22 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_39.addItem(self.verticalSpacer_22) + + self.horizontalLayout_34 = QHBoxLayout() + self.horizontalLayout_34.setObjectName(u"horizontalLayout_34") + self.horizontalLayout_34.setContentsMargins(-1, 0, -1, -1) + self.clearSuggestedBtn = QToolButton(self.pbVideoPage) + self.clearSuggestedBtn.setObjectName(u"clearSuggestedBtn") + self.clearSuggestedBtn.setIcon(icon25) + self.clearSuggestedBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_34.addWidget(self.clearSuggestedBtn) + + self.horizontalSpacer_24 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_34.addItem(self.horizontalSpacer_24) + + + self.verticalLayout_39.addLayout(self.horizontalLayout_34) + + self.pbPages.addWidget(self.pbVideoPage) + + self.verticalLayout_143.addWidget(self.pbPages) self.pages.addWidget(self.posterboardPage) self.advancedOptionsPage = QWidget() @@ -2394,13 +2538,13 @@ class Ui_Nugget(object): self.advancedOptionsPageContent = QWidget(self.advancedOptionsPage) self.advancedOptionsPageContent.setObjectName(u"advancedOptionsPageContent") self.advancedOptionsPageContent.setEnabled(True) - self.verticalLayout_134 = QVBoxLayout(self.advancedOptionsPageContent) - self.verticalLayout_134.setObjectName(u"verticalLayout_134") - self.verticalLayout_134.setContentsMargins(0, 0, 0, 0) + self.verticalLayout_133 = QVBoxLayout(self.advancedOptionsPageContent) + self.verticalLayout_133.setObjectName(u"verticalLayout_133") + self.verticalLayout_133.setContentsMargins(0, 0, 0, 0) self.label_17 = QLabel(self.advancedOptionsPageContent) self.label_17.setObjectName(u"label_17") - self.verticalLayout_134.addWidget(self.label_17) + self.verticalLayout_133.addWidget(self.label_17) self.line_191 = QFrame(self.advancedOptionsPageContent) self.line_191.setObjectName(u"line_191") @@ -2410,17 +2554,17 @@ class Ui_Nugget(object): self.line_191.setFrameShadow(QFrame.Plain) self.line_191.setFrameShape(QFrame.HLine) - self.verticalLayout_134.addWidget(self.line_191) + self.verticalLayout_133.addWidget(self.line_191) self.disableOTAChk = QCheckBox(self.advancedOptionsPageContent) self.disableOTAChk.setObjectName(u"disableOTAChk") - self.verticalLayout_134.addWidget(self.disableOTAChk) + self.verticalLayout_133.addWidget(self.disableOTAChk) self.thermalmonitordChk = QCheckBox(self.advancedOptionsPageContent) self.thermalmonitordChk.setObjectName(u"thermalmonitordChk") - self.verticalLayout_134.addWidget(self.thermalmonitordChk) + self.verticalLayout_133.addWidget(self.thermalmonitordChk) self.line_181 = QFrame(self.advancedOptionsPageContent) self.line_181.setObjectName(u"line_181") @@ -2430,12 +2574,12 @@ class Ui_Nugget(object): self.line_181.setFrameShadow(QFrame.Plain) self.line_181.setFrameShape(QFrame.HLine) - self.verticalLayout_134.addWidget(self.line_181) + self.verticalLayout_133.addWidget(self.line_181) self.enableResolutionChk = QCheckBox(self.advancedOptionsPageContent) self.enableResolutionChk.setObjectName(u"enableResolutionChk") - self.verticalLayout_134.addWidget(self.enableResolutionChk) + self.verticalLayout_133.addWidget(self.enableResolutionChk) self.resChangerContent = QWidget(self.advancedOptionsPageContent) self.resChangerContent.setObjectName(u"resChangerContent") @@ -2511,11 +2655,11 @@ class Ui_Nugget(object): self.verticalLayout_35.addLayout(self.resolutionContent) - self.verticalLayout_134.addWidget(self.resChangerContent) + self.verticalLayout_133.addWidget(self.resChangerContent) self.verticalSpacer_63 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) - self.verticalLayout_134.addItem(self.verticalSpacer_63) + self.verticalLayout_133.addItem(self.verticalSpacer_63) self.verticalLayout_144.addWidget(self.advancedOptionsPageContent) @@ -2609,9 +2753,9 @@ class Ui_Nugget(object): self.horizontalLayout_7.setContentsMargins(-1, 10, -1, 0) self.chooseGestaltBtn = QToolButton(self.verticalWidget2) self.chooseGestaltBtn.setObjectName(u"chooseGestaltBtn") - icon24 = QIcon() - icon24.addFile(u":/icon/folder.svg", QSize(), QIcon.Normal, QIcon.Off) - self.chooseGestaltBtn.setIcon(icon24) + icon26 = QIcon() + icon26.addFile(u":/icon/folder.svg", QSize(), QIcon.Normal, QIcon.Off) + self.chooseGestaltBtn.setIcon(icon26) self.chooseGestaltBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self.horizontalLayout_7.addWidget(self.chooseGestaltBtn) @@ -2776,12 +2920,6 @@ class Ui_Nugget(object): self._21.addWidget(self.showRiskyChk) - self.windowsPathFixChk = QCheckBox(self.settingsPageContent) - self.windowsPathFixChk.setObjectName(u"windowsPathFixChk") - self.windowsPathFixChk.setChecked(True) - - self._21.addWidget(self.windowsPathFixChk) - self.showAllSpoofableChk = QCheckBox(self.settingsPageContent) self.showAllSpoofableChk.setObjectName(u"showAllSpoofableChk") @@ -3031,9 +3169,9 @@ class Ui_Nugget(object): " padding-right: 5px;\n" " border-radius: 0px;\n" "}") - icon25 = QIcon() - icon25.addFile(u":/icon/pencil.svg", QSize(), QIcon.Normal, QIcon.Off) - self.toolButton_12.setIcon(icon25) + icon27 = QIcon() + icon27.addFile(u":/icon/pencil.svg", QSize(), QIcon.Normal, QIcon.Off) + self.toolButton_12.setIcon(icon27) self.toolButton_12.setIconSize(QSize(25, 25)) self.horizontalLayout_22.addWidget(self.toolButton_12) @@ -3094,7 +3232,7 @@ class Ui_Nugget(object): self.importOperationBtn = QToolButton(self.customOperationsPageContent) self.importOperationBtn.setObjectName(u"importOperationBtn") self.importOperationBtn.setEnabled(True) - self.importOperationBtn.setIcon(icon22) + self.importOperationBtn.setIcon(icon24) self.importOperationBtn.setIconSize(QSize(20, 20)) self.importOperationBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) @@ -3120,8 +3258,8 @@ class Ui_Nugget(object): self.operationsCnt = QWidget(self.customOperationsPageContent) self.operationsCnt.setObjectName(u"operationsCnt") self.operationsCnt.setEnabled(True) - sizePolicy5.setHeightForWidth(self.operationsCnt.sizePolicy().hasHeightForWidth()) - self.operationsCnt.setSizePolicy(sizePolicy5) + sizePolicy7.setHeightForWidth(self.operationsCnt.sizePolicy().hasHeightForWidth()) + self.operationsCnt.setSizePolicy(sizePolicy7) self.verticalLayout_19.addWidget(self.operationsCnt) @@ -3150,9 +3288,9 @@ class Ui_Nugget(object): " padding-right: 5px;\n" " border-radius: 0px;\n" "}") - icon26 = QIcon() - icon26.addFile(u":/icon/compass.svg", QSize(), QIcon.Normal, QIcon.Off) - self.toolButton_16.setIcon(icon26) + icon28 = QIcon() + icon28.addFile(u":/icon/compass.svg", QSize(), QIcon.Normal, QIcon.Off) + self.toolButton_16.setIcon(icon28) self.horizontalLayout_31.addWidget(self.toolButton_16) @@ -3195,8 +3333,8 @@ class Ui_Nugget(object): self.exploreThemesCnt = QWidget(self.explorePage) self.exploreThemesCnt.setObjectName(u"exploreThemesCnt") - sizePolicy5.setHeightForWidth(self.exploreThemesCnt.sizePolicy().hasHeightForWidth()) - self.exploreThemesCnt.setSizePolicy(sizePolicy5) + sizePolicy7.setHeightForWidth(self.exploreThemesCnt.sizePolicy().hasHeightForWidth()) + self.exploreThemesCnt.setSizePolicy(sizePolicy7) self.verticalLayout_31.addWidget(self.exploreThemesCnt) @@ -3262,15 +3400,13 @@ class Ui_Nugget(object): self.importThemeFolderBtn = QToolButton(self.horizontalWidget7) self.importThemeFolderBtn.setObjectName(u"importThemeFolderBtn") - self.importThemeFolderBtn.setIcon(icon24) + self.importThemeFolderBtn.setIcon(icon26) self.horizontalLayout_26.addWidget(self.importThemeFolderBtn) self.importThemeZipBtn = QToolButton(self.horizontalWidget7) self.importThemeZipBtn.setObjectName(u"importThemeZipBtn") - icon27 = QIcon() - icon27.addFile(u":/icon/file-earmark-zip.svg", QSize(), QIcon.Normal, QIcon.Off) - self.importThemeZipBtn.setIcon(icon27) + self.importThemeZipBtn.setIcon(icon22) self.horizontalLayout_26.addWidget(self.importThemeZipBtn) @@ -3425,8 +3561,10 @@ class Ui_Nugget(object): self.helpFromBtn.setText(QCoreApplication.translate("Nugget", u"With Help From", None)) self.posterRestoreBtn.setText(QCoreApplication.translate("Nugget", u"PosterRestore Team\n" "Posterboard", None)) + self.snoolieBtn.setText(QCoreApplication.translate("Nugget", u"Snoolie\n" +".aar Handling", None)) self.disfordottieBtn.setText(QCoreApplication.translate("Nugget", u"disfordottie\n" -"Clock Anim, Photos UI", None)) +"Feature Flags", None)) self.mikasaBtn.setText(QCoreApplication.translate("Nugget", u"Mikasa\n" "Quiet Daemon", None)) self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) @@ -3685,11 +3823,13 @@ class Ui_Nugget(object): self.modifyPosterboardsChk.setText(QCoreApplication.translate("Nugget", u"Modify", None)) self.findPBBtn.setText(QCoreApplication.translate("Nugget", u" Find Wallpapers", None)) self.pbHelpBtn.setText(QCoreApplication.translate("Nugget", u"...", None)) + self.tendiesPageBtn.setText(QCoreApplication.translate("Nugget", u" Tendies", None)) + self.videoPageBtn.setText(QCoreApplication.translate("Nugget", u" Live", None)) + self.pbActionLbl.setText(QCoreApplication.translate("Nugget", u"None", None)) #if QT_CONFIG(tooltip) self.importTendiesBtn.setToolTip(QCoreApplication.translate("Nugget", u"Select a wallpaper file with the .tendies extension.", None)) #endif // QT_CONFIG(tooltip) self.importTendiesBtn.setText(QCoreApplication.translate("Nugget", u" Import Files (.tendies)", None)) - self.pbActionLbl.setText(QCoreApplication.translate("Nugget", u"None", None)) #if QT_CONFIG(tooltip) self.deleteAllDescriptorsBtn.setToolTip(QCoreApplication.translate("Nugget", u"Clears all the wallpapers in the Collections section so that you can import more.", None)) #endif // QT_CONFIG(tooltip) @@ -3700,6 +3840,24 @@ class Ui_Nugget(object): "Warning: This will remove all of your wallpapers and will restrict you from adding new ones until you restore again.", None)) #endif // QT_CONFIG(tooltip) self.resetPRBExtBtn.setText(QCoreApplication.translate("Nugget", u" Remove All Wallpapers", None)) +#if QT_CONFIG(tooltip) + self.caVideoChk.setToolTip(QCoreApplication.translate("Nugget", u"Uses the CoreAnimation file to play the video (300 fps limit)\n" +"Will show up in Collections", None)) +#endif // QT_CONFIG(tooltip) + self.caVideoChk.setText(QCoreApplication.translate("Nugget", u"Loop (use CoreAnimation method)", None)) + self.reverseLoopChk.setText(QCoreApplication.translate("Nugget", u"Reverse on Loop", None)) + self.useForegroundChk.setText(QCoreApplication.translate("Nugget", u"Make Foreground (hides clock)", None)) +#if QT_CONFIG(tooltip) + self.chooseThumbBtn.setToolTip(QCoreApplication.translate("Nugget", u"Choose a photo for the wallpaper to freeze on when finished (.heic files only)", None)) +#endif // QT_CONFIG(tooltip) + self.chooseThumbBtn.setText(QCoreApplication.translate("Nugget", u"Choose Freeze Frame (.HEIC)", None)) +#if QT_CONFIG(tooltip) + self.chooseVideoBtn.setToolTip(QCoreApplication.translate("Nugget", u"Choose a video file for the wallpaper (.mov or .mp4)", None)) +#endif // QT_CONFIG(tooltip) + self.chooseVideoBtn.setText(QCoreApplication.translate("Nugget", u"Choose Video", None)) + self.pbVideoThumbLbl.setText(QCoreApplication.translate("Nugget", u"Current Thumbnail: None", None)) + self.pbVideoLbl.setText(QCoreApplication.translate("Nugget", u"Current Video: None", None)) + self.clearSuggestedBtn.setText(QCoreApplication.translate("Nugget", u" Clear Suggested Photos", None)) self.advancedOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Risky Options", None)) self.label_17.setText(QCoreApplication.translate("Nugget", u"Disclaimer:\n" "\n" @@ -3741,7 +3899,6 @@ class Ui_Nugget(object): self.allowWifiApplyingChk.setText(QCoreApplication.translate("Nugget", u"Allow Applying Over WiFi", None)) self.autoRebootChk.setText(QCoreApplication.translate("Nugget", u"Auto Reboot After Applying", None)) self.showRiskyChk.setText(QCoreApplication.translate("Nugget", u"Show Risky Tweak Options", None)) - self.windowsPathFixChk.setText(QCoreApplication.translate("Nugget", u"Use Windows Path Fix (for Posterboard)", None)) #if QT_CONFIG(tooltip) self.showAllSpoofableChk.setToolTip(QCoreApplication.translate("Nugget", u"Show models for other device types in the AI device spoofing tab.", None)) #endif // QT_CONFIG(tooltip) diff --git a/requirements.txt b/requirements.txt index 8aef6d6..ad2d924 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,6 @@ pymobiledevice3 PySide6-Essentials -PyInstaller \ No newline at end of file +PyInstaller +ffmpeg +ffmpeg-python +opencv-python diff --git a/resources_rc.py b/resources_rc.py index af9d6f1..ebcc967 100644 --- a/resources_rc.py +++ b/resources_rc.py @@ -1,6 +1,6 @@ # Resource object code (Python 3) # Created by: object code -# Created by: The Resource Compiler for Qt version 6.6.3 +# Created by: The Resource Compiler for Qt version 6.8.2 # WARNING! All changes made in this file will be lost! from PySide6 import QtCore @@ -235598,7 +235598,7 @@ qt_resource_struct = b"\ \x00\x00\x04\x5c\x00\x00\x00\x00\x00\x01\x007d\x95\ \x00\x00\x01\x95\x82z\xa7E\ \x00\x00\x03|\x00\x00\x00\x00\x00\x01\x007H\xbf\ -\x00\x00\x01\x95\xc8T\x85\x10\ +\x00\x00\x01\x95\xc8\x82\x5c\xbb\ \x00\x00\x02\x84\x00\x00\x00\x00\x00\x01\x007*\xc4\ \x00\x00\x01\x95\x82z\xa7D\ \x00\x00\x03\xc4\x00\x00\x00\x00\x00\x01\x007O\x1a\ diff --git a/tweaks/eligibility_tweak.py b/tweaks/eligibility_tweak.py index 943534f..f7d9fd3 100644 --- a/tweaks/eligibility_tweak.py +++ b/tweaks/eligibility_tweak.py @@ -1,4 +1,5 @@ from .tweak_classes import Tweak +from controllers.files_handler import get_bundle_files from Sparserestore.restore import FileToRestore from devicemanagement.constants import Version @@ -47,10 +48,7 @@ class EligibilityTweak(Tweak): return None print(f"Applying EU Enabler for region \'{self.code}\'...") # get the plists directory - try: - source_dir = path.join(sys._MEIPASS, "files/eligibility") - except: - source_dir = path.join(getcwd(), "files/eligibility") + source_dir = get_bundle_files("files/eligibility") # start with eligibility.plist file_path = path.join(source_dir, 'eligibility.plist') diff --git a/tweaks/posterboard_tweak.py b/tweaks/posterboard_tweak.py index 928b0f5..db4d834 100644 --- a/tweaks/posterboard_tweak.py +++ b/tweaks/posterboard_tweak.py @@ -1,15 +1,16 @@ import os import zipfile import uuid -import re from random import randint -from PySide6 import QtWidgets, QtCore, QtGui +from shutil import copytree +from PySide6 import QtWidgets from .tweak_classes import Tweak from Sparserestore.restore import FileToRestore from controllers.plist_handler import set_plist_value -from controllers.path_handler import fix_windows_path -from qt.ui_mainwindow import Ui_Nugget +from controllers.files_handler import get_bundle_files +from controllers import video_handler +from controllers.aar.aar import wrap_in_aar class TendieFile: path: str @@ -61,9 +62,14 @@ class PosterboardTweak(Tweak): def __init__(self): super().__init__(key=None) self.tendies: list[TendieFile] = [] + self.videoThumbnail = None + self.videoFile = None + self.loop_video = True + self.reverse_video = False + self.use_foreground = False self.bundle_id = "com.apple.PosterBoard" self.resetting = False - self.resetType = 0 # 0 for descriptor 1 for prb + self.resetType = 0 # 0 for descriptor, 1 for prb, 2 for suggested photos self.structure_version = 61 def add_tendie(self, file: str): @@ -106,6 +112,8 @@ class PosterboardTweak(Tweak): isAdding: bool = False, randomizeUUID: bool = False, randomizedID: int = None ): + if not os.path.isdir(curr_path): + return for folder in sorted(os.listdir(curr_path)): if folder.startswith('.') or folder == "__MACOSX": continue @@ -150,10 +158,75 @@ class PosterboardTweak(Tweak): isAdding=True, randomizeUUID=True ) + elif name == "video-descriptor" or name == "video-descriptors": + self.recursive_add( + files_to_restore, + os.path.join(curr_path, folder), + restore_path="/Library/Application Support/PRBPosterExtensionDataStore/61/Extensions/com.apple.PhotosUIPrivate.PhotosPosterProvider/descriptors", + isAdding=True, + randomizeUUID=True + ) else: self.recursive_add(files_to_restore, os.path.join(curr_path, folder), isAdding=False) - def apply_tweak(self, files_to_restore: list[FileToRestore], output_dir: str, version: str): + def create_live_photo_files(self, output_dir: str): + if self.videoFile != None and not self.loop_video: + source_dir = get_bundle_files("files/posterboard/1F20C883-EA98-4CCE-9923-0C9A01359721") + video_output_dir = os.path.join(output_dir, "video-descriptor/1F20C883-EA98-4CCE-9923-0C9A01359721") + copytree(source_dir, video_output_dir, dirs_exist_ok=True) + contents_path = os.path.join(video_output_dir, "versions/0/contents/0EFB6A0F-7052-4D24-8859-AB22BADF2E93") + + # convert the video first + video_contents = None + if self.videoFile.endswith('.mov'): + # no need to convert + with open(self.videoFile, "rb") as vid: + video_contents = vid.read() + else: + # convert to mov + video_contents = video_handler.convert_to_mov(input_file=self.videoFile) + # now replace video + with open(os.path.join(contents_path, "output.layerStack/portrait-layer_settling-video.MOV"), "wb") as overriding: + overriding.write(video_contents) + aar_path = os.path.join(contents_path, "input.segmentation/segmentation.data.aar") + wrap_in_aar(get_bundle_files("files/posterboard/contents.plist"), video_contents, aar_path) + + # replace the heic files + if self.videoThumbnail != None: + del video_contents + with open(self.videoThumbnail, "rb") as thumb: + thumb_contents = thumb.read() + else: + raise Exception("No thumbnail heic selected!") + # get the thumbnail from the video + thumb_contents = video_handler.get_thumbnail_from_contents(contents=video_contents) + del video_contents + to_override = ["input.segmentation/asset.resource/Adjusted.HEIC", "input.segmentation/asset.resource/proxy.heic", "output.layerStack/portrait-layer_background.HEIC"] + for file in to_override: + with open(os.path.join(contents_path, file), "wb") as overriding: + overriding.write(thumb_contents) + del thumb_contents + + def create_video_loop_files(self, output_dir: str, update_label=lambda x: None): + print(f"file: {self.videoFile}, looping: {self.loop_video}") + if self.videoFile and self.loop_video: + source_dir = get_bundle_files("files/posterboard/VideoCAML") + video_output_dir = os.path.join(output_dir, "descriptor/VideoCAML") + copytree(source_dir, video_output_dir, dirs_exist_ok=True) + contents_path = os.path.join(video_output_dir, "versions/1/contents/9183.Custom-810w-1080h@2x~ipad.wallpaper") + if self.use_foreground: + # rename the foreground layer to background + bg_path = os.path.join(contents_path, "9183.Custom_Background-810w-1080h@2x~ipad.ca") + contents_path = os.path.join(contents_path, "9183.Custom_Floating-810w-1080h@2x~ipad.ca") + os.rename(contents_path, bg_path) + else: + contents_path = os.path.join(contents_path, "9183.Custom_Background-810w-1080h@2x~ipad.ca") + print(f"path at {contents_path}, creating caml") + video_handler.create_caml(video_path=self.videoFile, output_file=contents_path, auto_reverses=self.reverse_video, update_label=update_label) + + + + def apply_tweak(self, files_to_restore: list[FileToRestore], output_dir: str, version: str, update_label=lambda x: None): # unzip the file if not self.enabled: return @@ -169,6 +242,9 @@ class PosterboardTweak(Tweak): # resetting descriptors file_paths.append(f"/{self.structure_version}/Extensions/com.apple.WallpaperKit.CollectionsPoster/descriptors") file_paths.append(f"/{self.structure_version}/Extensions/com.apple.MercuryPoster/descriptors") + elif self.resetType == 2: + # resetting suggested photos + file_paths.append(f"/{self.structure_version}/Extensions/com.apple.PhotosUIPrivate.PhotosPosterProvider/descriptors") else: file_paths.append("") for file_path in file_paths: @@ -178,12 +254,17 @@ class PosterboardTweak(Tweak): domain=f"AppDomain-{self.bundle_id}" )) return - elif self.tendies == None or len(self.tendies) == 0: + elif (self.tendies == None or len(self.tendies) == 0) and (self.videoFile == None): return + update_label("Generating PosterBoard Video...") + self.create_video_loop_files(output_dir, update_label=update_label) for tendie in self.tendies: + update_label(f"Extracting {tendie.name}...") zip_output = os.path.join(output_dir, str(uuid.uuid4())) os.makedirs(zip_output) with zipfile.ZipFile(tendie.path, 'r') as zip_ref: zip_ref.extractall(zip_output) # add the files + update_label("Adding tendies...") self.recursive_add(files_to_restore, curr_path=output_dir) + update_label("Adding other tweaks...")