diff --git a/README.md b/README.md
index 286037a..a3ac6ee 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,9 @@
+
+
# 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"""
+
+
+
+
+
+
+
+
+
+
+ \n""")
+ while(True):
+ # reading from frame
+ ret,frame = cam.read()
+
+ if ret:
+ # if video is still left continue creating images
+ name = 'assets/' + str(currentframe) + '.jpg'
+ if update_label:
+ update_label('Creating...' + name)
+ else:
+ print ('Creating...' + name)
+
+ # writing the extracted images
+ cv2.imwrite(os.path.join(output_file, name), frame)
+ caml.write(f"\t\t\t\n")
+
+ # increasing counter so that it will
+ # show how many frames are created
+ currentframe += 1
+ else:
+ break
+ caml.write("""
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+""")
+
+ # 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...")