renpy/launcher/game/gui7.rpy

451 lines
13 KiB
Plaintext
Raw Normal View History

2023-01-18 22:13:55 +00:00
# Copyright 2004-2022 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.
define gui.project_system_font = None
define gui.asian = False
init -1 python:
import gui7
from gui7 import translate_define, translate_copy, translate_code
import os
from store import config
def translate_font(language, font):
"""
Selects the font file that is used when translating `language`.
`font`
Is the name of the font file used for both the launcher and
the new GUI template. This should be a string giving the name
of the font file.
"""
def callback():
gui.REGULAR_FONT = font
gui.LIGHT_FONT = font
gui.REGULAR_BOLD = True
style._default.font = font
style.default.font = font
gui.system_font = font
gui.project_system_font = font
config.language_callbacks[language].append(callback)
def s(s):
return '"' + s + '"'
gui7.translate_copy(language, "sdk-fonts/" + font, font)
gui7.translate_define(language, "gui.text_font", s(font))
gui7.translate_define(language, "gui.name_text_font", s(font))
gui7.translate_define(language, "gui.interface_text_font", s(font))
for fn in [ "gui.rpy", "options.rpy", "screens.rpy" ]:
fn = os.path.join(config.renpy_base, "gui", "game", fn)
if os.path.exists(fn):
config.translate_files.append(fn)
config.translate_comments = config.translate_files
DARK_COLORS = [
"#0099cc",
"#99ccff",
"#66cc00",
"#cccc00",
"#cc6600",
# "#cc3300",
"#0066cc",
"#9933ff",
"#00cc99",
"#cc0066",
"#cc0000",
]
LIGHT_COLORS = [
"#003366", # Dark Blue
"#0099ff", # Light Blue
"#336600", # Green
"#000000", # Black
"#cc6600", # Orange
"#000066", # Darkest Blue
"#660066", # Purple
"#006666", # Dark Green
"#cc0066", # Pinkish
"#990000", # Red
]
# LIGHT_COLORS = DARK_COLORS
COLOR_OPTIONS = [
(i, "#000000", False) for i in DARK_COLORS
] + [
(i, "#ffffff", True) for i in LIGHT_COLORS
]
screen gui_swatches():
grid 5 4:
for accent, bg, light in COLOR_OPTIONS:
frame:
style "empty"
xysize (85, 60)
add Color(accent).replace_hsv_saturation(.25).replace_value(.5)
if light:
add Color(bg).opacity(.9)
else:
add Color(bg).opacity(.8)
button:
style "empty"
if light:
selected_background "#000"
else:
selected_background "#fff"
xpadding 3
ypadding 3
xmargin 10
ymargin 10
action SetVariable("gui_color", (accent, bg, light))
idle_child Solid(accent)
hover_child Solid(Color(accent).tint(.6))
screen gui_demo(accent, boring, light, display):
$ p = gui7.GuiParameters(
"-",
"-",
1280,
720,
accent,
boring,
light,
None,
False,
False,
False,
"-"
)
frame:
style "empty"
add p.menu_color
if light:
add Solid(p.boring_color.opacity(.9))
else:
add Solid(p.boring_color.opacity(.8))
frame:
style "empty"
xpadding 10
ypadding 10
has vbox
text _("Display"):
style "empty"
font (gui.system_font or "DejaVuSans.ttf")
color p.accent_color
size 24
for i in [ _("Window"), _("Fullscreen"), _("Planetarium") ]:
textbutton i:
action (None if i == "Planetarium" else SetScreenVariable("display", i))
style "empty"
text_style "empty"
text_font (gui.system_font or "DejaVuSans.ttf")
text_size 24
text_color p.idle_color
text_hover_color p.hover_color
text_selected_color p.selected_color
text_insensitive_color p.insensitive_color
xmargin 4
ymargin 4
left_padding 21
selected_background Solid(p.accent_color, xsize=5)
null height 30
text _("Text Speed"):
style "empty"
color p.accent_color
size 24
font (gui.system_font or "DejaVuSans.ttf")
bar:
value ScreenVariableValue("value", 1.0)
style "empty"
base_bar Solid(p.muted_color)
hover_base_bar Solid(p.hover_muted_color)
thumb Solid(p.accent_color, xsize=10)
hover_thumb Solid(p.hover_color, xsize=10)
ysize 30
screen choose_gui_color():
default display = "Window"
default value = 0.5
frame:
style_group "l"
style "l_root"
window:
has vbox
label _("Select Accent and Background Colors")
frame:
style "l_indent"
has hbox:
yfill True
frame:
style "l_default"
xsize 425
has vbox
text _("Please click on the color scheme you wish to use, then click Continue. These colors can be changed and customized later.")
add SPACER
use gui_swatches()
# Preview
frame:
xsize 350
style "l_default"
background Frame(PATTERN, 0, 0, tile=True)
xpadding 5
ypadding 5
xfill True
yfill True
xmargin 20
bottom_margin 6
use gui_demo(gui_color[0], gui_color[1], gui_color[2], display)
textbutton _("Return") action Jump("front_page") style "l_left_button"
if gui_color:
textbutton _("Continue") action Return(True) style "l_right_button"
key "input_enter" action Return(True)
label change_gui:
python:
gui_new = False
gui_replace_images = True
gui_update_code = True
gui_replace_code = False
project.current.update_dump(True)
gui_size = tuple(project.current.dump["size"])
project_dir = project.current.path
project_name = project.current.name
mode = interface.choice(
__("{b}Warning{/b}\nContinuing will overwrite customized bar, button, save slot, scrollbar, and slider images.\n\nWhat would you like to do?") +
__("{size=-4}\n\nThis will not overwrite gui/main_menu.png, gui/game_menu.png, and gui/window_icon.png, but will create files that do not exist.{/size}"),
[
("change", _("Choose new colors, then regenerate image files.")),
("regenerate", _("Regenerate the image files using the colors in gui.rpy.")),
],
None,
cancel=Jump("front_page"),
)
if mode == "change":
jump gui_project_common
else:
jump gui_generate_images
label new_gui_project:
python:
gui_new = True
gui_replace_images = True
gui_replace_code = True
gui_update_code = True
label gui_project_size:
python:
default_size = (1920, 1080)
gui_size = interface.choice(
_("What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of [default_size[0]]x[default_size[1]] is a reasonable compromise."),
[
((1280, 720), "1280x720"),
((1920, 1080), "1920x1080"),
((2560, 1440), "2560x1440"),
((3840, 2160), "3840x2160"),
("custom", _("Custom. The GUI is optimized for a 16:9 aspect ratio.")),
],
default_size,
cancel=Jump("front_page"),
)
if gui_size == "custom":
gui_width = ""
while True:
gui_width = interface.input(
_("WIDTH"),
_("Please enter the width of your game, in pixels."),
cancel=Jump("front_page"),
allow=interface.DIGITS_LETTERS,
)
try:
gui_width = int(gui_width)
except Exception:
interface.error(_("The width must be a number."), label=None)
continue
break
gui_height = ""
while True:
gui_height = interface.input(
_("HEIGHT"),
_("Please enter the height of your game, in pixels."),
cancel=Jump("front_page"),
allow=interface.DIGITS_LETTERS,
)
try:
gui_height = int(gui_height)
except Exception:
interface.error(_("The height must be a number."), label=None)
continue
break
gui_size = (gui_width, gui_height)
label gui_project_common:
$ gui_color = (DARK_COLORS[0], "#000000", False)
call screen choose_gui_color
python hide:
width, height = gui_size
accent, boring, light = gui_color
prefix = os.path.join(project_dir, "game")
if not os.path.isdir(prefix) and not gui_new:
interface.error("{} does not appear to be a Ren'Py game.".format(prefix))
template = os.path.join(config.renpy_base, "gui", "game")
if not os.path.isdir(template):
interface.error("{} does not appear to be a Ren'Py game.".format(template))
p = gui7.GuiParameters(
prefix,
template,
width,
height,
accent,
boring,
light,
_preferences.language,
gui_replace_images,
gui_replace_code,
gui_update_code,
project_name,
)
if gui_new:
interface.processing(_("Creating the new project..."))
else:
interface.processing(_("Updating the project..."))
with interface.error_handling(_("creating a new project")):
gui7.generate_gui(p)
# Activate the project.
with interface.error_handling(_("activating the new project")):
project.manager.scan()
project.Select(project.manager.get(project_name))()
if gui_new:
call update_renpy_strings_common
python hide:
if gui.project_system_font:
with open(os.path.join(project.current.gamedir, "tl/None/common.rpym"), "ab") as f:
f.write("define gui.system_font = {!r}\r\n".format(gui.project_system_font).encode("utf-8"))
label gui_generate_images:
python:
interface.processing(_("Updating the project..."))
project.current.launch([ 'gui_images' ], env={ "RENPY_VARIANT" : "small phone" }, wait=True)
project.current.launch([ 'gui_images' ], wait=True)
jump front_page