Files
renpy/launcher/game/preferences.rpy
T
2025-01-02 18:48:44 -05:00

474 lines
16 KiB
Plaintext

# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
#
# 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.
default persistent.show_edit_funcs = True
default persistent.windows_console = False
default persistent.lint_options = set()
default persistent.use_web_doc = False
init python:
from math import ceil
def scan_translations(piglatin=True):
languages = renpy.known_languages()
if not languages:
return None
languages.remove("piglatin")
rv = [(i, renpy.translate_string("{#language name and font}", i)) for i in languages ]
rv.sort(key=lambda a : renpy.filter_text_tags(a[1], allow=[]).lower())
rv.insert(0, (None, "English"))
if piglatin:
rv.append(("piglatin", "Igpay Atinlay"))
bound = ceil(len(rv)/3.)
return (rv[:bound], rv[bound:2*bound], rv[2*bound:])
class RestartAtPreferences(Action):
def __call__(self):
renpy.session["launcher_start_label"] = "preferences"
renpy.utter_restart()
class EnsureProjectsTxt(Action):
"""
Ensures the projects.txt file exists before it's opened.
"""
def __call__(self):
fn = os.path.join(project.manager.projects_directory, "projects.txt")
if os.path.exists(fn):
return
with open(fn, "w") as f:
f.write("""\
# This file can be used to add projects not in the projects directory
# by listing the full path to each project, one per line.
""")
default persistent.force_new_tutorial = False
default persistent.sponsor_message = True
default persistent.daily_update_check = True
default persistent.daily_update_check_once = False
# Keep the default update check from triggering until tomorrow.
default persistent.last_update_check = datetime.date.today()
# Should we try to skip the splashscreen?
default persistent.skip_splashscreen = False
# Should we prefer rpu updates?
default persistent.prefer_rpu = True
init python:
if not persistent.daily_update_check_once:
persistent.daily_update_check_once = True
persistent.daily_update_check = True
default preference_tab = "general"
define preference_tabs = (
("general", _("General")),
("options", _("Options")),
("theme", _("Theme")),
("install", _("Install Libraries")),
("actions", _("Actions")),
("lint", _("Lint")),
)
screen preferences():
default translations = scan_translations()
frame:
style_group "l"
style "l_root"
alt "Preferences"
window:
has vbox
label _("Launcher Preferences")
add HALF_SPACER
hbox:
frame:
style "l_indent"
xmaximum ONETHIRD
xfill True
has vbox
add SEPARATOR2
add HALF_SPACER
for i, l in preference_tabs:
textbutton l action SetVariable("preference_tab", i) style "l_list"
if preference_tab == "general":
frame:
style "l_indent"
xmaximum TWOTHIRDS
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Projects Directory:")
add HALF_SPACER
frame style "l_indent":
if persistent.projects_directory:
textbutton _("[persistent.projects_directory!q]"):
action Jump("projects_directory_preference")
alt _("Projects directory: [text]")
else:
textbutton _("Not Set"):
action Jump("projects_directory_preference")
alt _("Projects directory: [text]")
add SPACER
# Text editor selection.
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Text Editor:")
add HALF_SPACER
frame style "l_indent":
textbutton (persistent.editor or _("Not Set")) action Jump("editor_preference") alt _("Text editor: [text]")
add SPACER
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Language:")
add HALF_SPACER
hbox:
for tran in translations:
vbox:
for tlid, tlname in tran:
textbutton tlname:
xmaximum (TWOTHIRDS//3)
action [Language(tlid), project.SelectTutorial(True)]
style "l_list"
elif preference_tab == "options":
frame:
style "l_indent"
xmaximum TWOTHIRDS
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Navigation Options:")
add HALF_SPACER
textbutton _("Include private names") style "l_checkbox" action ToggleField(persistent, "navigate_private")
textbutton _("Include library names") style "l_checkbox" action ToggleField(persistent, "navigate_library")
add SPACER
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Game Options:")
add HALF_SPACER
if renpy.windows:
textbutton _("Console output") style "l_checkbox" action ToggleField(persistent, "windows_console")
textbutton _("Skip splashscreen") style "l_checkbox" action ToggleField(persistent, "skip_splashscreen")
add SPACER
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Launcher Options:")
add HALF_SPACER
textbutton _("Show edit file section") style "l_checkbox" action ToggleField(persistent, "show_edit_funcs")
textbutton _("Large fonts") style "l_checkbox" action [ ToggleField(persistent, "large_print"), renpy.utter_restart ]
if interface.local_doc_exists:
textbutton _("Prefer the web documentation") style "l_checkbox" action ToggleField(persistent, "use_web_doc")
textbutton _("Sponsor message") style "l_checkbox" action ToggleField(persistent, "sponsor_message")
textbutton _("Restore window position") style "l_checkbox" action Preference("restore window position", "toggle")
if ability.can_update:
textbutton _("Daily check for update") style "l_checkbox" action [ToggleField(persistent, "daily_update_check"), SetField(persistent, "last_update_check", None)] selected persistent.daily_update_check
textbutton _("Prefer RPU updates") style "l_checkbox" action ToggleField(persistent, "prefer_rpu")
elif preference_tab == "theme":
frame:
style "l_indent"
xmaximum TWOTHIRDS
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Launcher Theme:")
add HALF_SPACER
textbutton _("Default theme") style "l_checkbox" action [SetField(persistent, "theme", None), RestartAtPreferences() ]
textbutton _("Dark theme") style "l_checkbox" action [SetField(persistent, "theme", "dark"), RestartAtPreferences()]
textbutton _("Custom theme") style "l_checkbox" action [SetField(persistent, "theme", "custom"), RestartAtPreferences()]
add SPACER
$ skins_url = interface.get_doc_url("skins.html")
text _("Information about creating a custom theme can be found {a=[skins_url]}in the Ren'Py Documentation{/a}.")
elif preference_tab == "install":
frame:
style "l_indent"
xmaximum TWOTHIRDS
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Install Libraries:")
add HALF_SPACER
use install_preferences
elif preference_tab == "actions":
frame:
style "l_indent"
xmaximum TWOTHIRDS
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Actions:")
add HALF_SPACER
textbutton _("Open launcher project") style "l_nonbox" action [ project.Select("launcher"), Jump("front_page") ]
textbutton _("Open projects.txt"):
style "l_nonbox"
if project.manager.projects_directory:
action [
EnsureProjectsTxt(),
editor.EditAbsolute(os.path.join(project.manager.projects_directory, "projects.txt"))
]
textbutton _("Reset window size") style "l_nonbox" action Preference("display", 1.0)
textbutton _("Clean temporary files") style "l_nonbox" action Jump("clean_tmp")
elif preference_tab == "lint":
frame:
style "l_indent"
xmaximum TWOTHIRDS
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Lint toggles:")
add HALF_SPACER
textbutton _("Check for orphan/obsolete translations"):
style "l_checkbox"
action InvertSelected(ToggleSetMembership(persistent.lint_options, "--no-orphan-tl"))
textbutton _("Check parameters shadowing reserved names"):
style "l_checkbox"
action ToggleSetMembership(persistent.lint_options, "--reserved-parameters")
textbutton _("Print block, word, and character counts by speaking character."):
style "l_checkbox"
action ToggleSetMembership(persistent.lint_options, "--by-character")
textbutton _("Unclosed text tags"):
style "l_checkbox"
action ToggleSetMembership(persistent.lint_options, "--check-unclosed-tags")
textbutton _("Show all unreachable blocks and orphaned translations."):
style "l_checkbox"
action ToggleSetMembership(persistent.lint_options, "--all-problems")
textbutton _("Return") action Jump("front_page") style "l_left_button"
label clean_tmp:
python hide:
installer.processing(_("Cleaning temporary files..."))
installer._clean("renpy:tmp", 0)
time.sleep(0.5)
jump preferences
label projects_directory_preference:
call choose_projects_directory
jump preferences
label preferences:
call screen preferences
jump preferences
screen choose_language():
default local_lang = _preferences.language
default chosen_lang = _preferences.language
default translations = scan_translations(piglatin=False)
add BACKGROUND
vbox:
xalign .5
yalign .5
fixed:
ysize 0
text renpy.translate_string(_("{#in language font}Welcome! Please choose a language"), local_lang):
xalign .5
yanchor 1.0
ypos 1.0
style "l_label_text"
size 36
textalign .5
layout "subtitle"
add SPACER
add SPACER
hbox:
xalign .5
for tran in translations:
vbox:
for tlid, tlname in tran:
textbutton tlname:
xmaximum (TWOTHIRDS//3)
action [ SetScreenVariable("chosen_lang", tlid), Language(tlid), project.SelectTutorial(True), Return() ]
hovered SetScreenVariable("local_lang", tlid)
unhovered SetScreenVariable("local_lang", chosen_lang)
style "l_list"
text_xalign .5
add SPACER
add SPACER
$ lang_name = renpy.translate_string("{#language name and font}", local_lang)
fixed:
ysize 0
textbutton renpy.translate_string(_("{#in language font}Start using Ren'Py in [lang_name]"), local_lang):
xalign .5
action [Language(chosen_lang), project.SelectTutorial(True), Return()]
style "l_default"
text_style "l_default"
text_size 30
text_textalign .5
text_layout "subtitle"
label choose_language:
call screen choose_language
return
translate None strings:
# game/new_project.rpy:77
old "{#language name and font}"
new "English"