Cleans up the gallery

This commit is contained in:
GManon 2023-01-01 20:49:56 -03:00
parent 67a17705aa
commit ddd003dce0
2 changed files with 64 additions and 223 deletions

View File

@ -1265,7 +1265,7 @@ screen extrasnavigation():
[ [
[ "Help", ShowMenu("help") ], [ "Help", ShowMenu("help") ],
[ "About", ShowMenu("about") ], [ "About", ShowMenu("about") ],
[ "Gallery", ShowMenu("cg_gallery_0") ], [ "Gallery", ShowMenu("cg_gallery") ],
[ "Mods", ShowMenu("mod_menu") ], [ "Mods", ShowMenu("mod_menu") ],
[ "Return", ShowMenu("main_menu") ] [ "Return", ShowMenu("main_menu") ]
] ) ] )
@ -1784,7 +1784,7 @@ screen extrasnavigation(): #Updates are removed (not even supported by Ren'Py)
[ [
[ "Help", ShowMenu("help") ], [ "Help", ShowMenu("help") ],
[ "About", ShowMenu("about") ], [ "About", ShowMenu("about") ],
[ "Gallery", ShowMenu("cg_gallery_0") ], [ "Gallery", ShowMenu("cg_gallery") ],
[ "Mods", ShowMenu("mod_menu") ], [ "Mods", ShowMenu("mod_menu") ],
[ "Return", ShowMenu("main_menu") ] [ "Return", ShowMenu("main_menu") ]
] ) ] )

View File

@ -1,9 +1,9 @@
init 2 python: init 2 python:
import json import json
import pygame
# CONST PARAMS # CONST PARAMS
ALLOW_ZOOM = False
GALLERY_COLS = 4 GALLERY_COLS = 4
PREFERRED_WIDTH = 432 #px (1920 * 0.225) PREFERRED_WIDTH = 432 #px (1920 * 0.225)
PREFERRED_HEIGHT = 243 #px (1080 * 0.225) PREFERRED_HEIGHT = 243 #px (1080 * 0.225)
@ -11,219 +11,108 @@ init 2 python:
DEFAULT_WIDTH_SCALE_RATIO = round(float(PREFERRED_WIDTH) / float(1920), 4) DEFAULT_WIDTH_SCALE_RATIO = round(float(PREFERRED_WIDTH) / float(1920), 4)
DEFAULT_HEIGHT_SCALE_RATIO = round(float(PREFERRED_HEIGHT) / float(1080), 4) DEFAULT_HEIGHT_SCALE_RATIO = round(float(PREFERRED_HEIGHT) / float(1080), 4)
NOT_UNLOCKED_COVER = im.FactorScale("gui/gallery/unlocked_cg_button_cover.png", DEFAULT_WIDTH_SCALE_RATIO, DEFAULT_HEIGHT_SCALE_RATIO) NOT_UNLOCKED_COVER = im.FactorScale("gui/gallery/unlocked_cg_button_cover.png", DEFAULT_WIDTH_SCALE_RATIO, DEFAULT_HEIGHT_SCALE_RATIO)
ACCEPTED_EXTENSIONS = ["jpg", "png", "webm"]
CG_PATHS = [] CG_PATHS = []
#path: folder, name: shows up in gallery, eval: runs eval() on string #path: folder, name: shows up in gallery, eval: runs eval() on string
""" """
Data structure that holds the data for each cg and button Data structure that holds the data for each cg and button
item is name, fn is fullpath item is name, cg is the image definition
ext is the file extension { item: str; cg: Displayable; }
{ item: str; fn: str; cg: Displayable; ext: str; wh: [] }[]
(reference in this init python, actually used in screens) (reference in this init python, actually used in screens)
""" """
gallery_items = []
# key dict pair, cg <-> cgs' galleryitems [] gallery_dic = {}
gallery_dic = {} #
for cp in CG_PATHS:
gallery_dic[cp['name']] = [] #
# Makes a scaled down cg button
def cg_(fname, w):
# Make a scaled cg button
# (cg: string; ext: string; w: float
def cg_(fname, ext, w):
scale = PREFERRED_WIDTH / w scale = PREFERRED_WIDTH / w
#scale = box_ratio(wh)
#image = im.FactorScale(fname, scale, scale, True)
if type(fname) is str: if type(fname) is str:
image = im.FactorScale(fname, scale, scale, True) image = im.FactorScale(fname, scale, scale, True)
return image return image
else: else:
return Transform(fname, zoom=scale) return Transform(fname, zoom=scale)
#return Transform(fname, crop=(0,0,1920,1080), zoom=scale)
# For testing purposes, unlocks all images in the gallery (And by extension the bonus chapters)
def unlock_all():
for key in gallery_dic.keys():
for image in gallery_dic[key]:
renpy.mark_image_seen(image["item"])
# Reads /images/cgs dir for all image files # Reads /images/cgs dir for all image files
# Populates galleryItems # Populates galleryItems
# () -> None # () -> None
def add_(str, _str, ext, cpname):
image = renpy.image_size(Image(_str))
item = {
"item": str,
"fn": _str,
"cg": cg_(_str, ext, image[0]),
"ext": ext,
"wh": image
}
gallery_dic[cpname].append(item)
pass
def loadGallery():
list_img = renpy.list_images()
#if ext is "webm":
# Add each image to the gallery
for str in list_img:
for cp in CG_PATHS:
for ext in ACCEPTED_EXTENSIONS:
path = cp['path']
_str = path+str+"."+ext
if renpy.loadable(_str): #brute force
add_(str, _str, ext, cp['name'])
return
# Call to loading the gallery
#loadGallery()
#renpy.start_predict_screen("cg_gallery")
#sort
#for zooming in and out
zoom_arr = [0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0, 1.125, 1.25, 1.5, 1.75, 2.0]
"""
for x in range(1,5):
_zoom = 1.0
_zoom *= 1+(x*0.25)
zoom_arr.append(_zoom)
for y in range(9,1,-1):
_zoom = 1.0
_zoom *= (y*0.125)
zoom_arr.append(_zoom)
zoom_arr.sort()
"""
def jsonloadandpop(): def jsonloadandpop():
#CACHE_PATH = config.basedir.replace("\\","/") + "/game/cache/"
FILENAME = os.path.join(config.basedir, 'game/src/gallery_dataset.json')
#CACHE_PATH = config.basedir.replace("\\","/") + "/game/cache/"
fp = renpy.open_file('src/gallery_dataset.json') fp = renpy.open_file('src/gallery_dataset.json')
data = json.load(fp) data = json.load(fp)
list_img = renpy.list_images() list_img = renpy.list_images()
for x in data['tabs']: for tab in data['tabs']:
tab_name = _(x['tab_name']) tab_name = _(tab['tab_name'])
_eval = None _eval = None
if 'eval' in x.keys(): if 'eval' in tab.keys():
_eval = x['eval'] _eval = tab['eval']
CG_PATHS.append({'path': None, 'name': tab_name, 'eval': _eval}) CG_PATHS.append({'name': tab_name, 'eval': _eval})
gallery_dic[tab_name] = [] gallery_dic[tab_name] = []
#gallery_dataset #gallery_dataset
if 'items' in x.keys(): if 'items' in tab.keys():
for y in x['items']: for image in tab['items']:
name = y["name"] name = image["name"]
cg = y["image"] cg = image["image"]
rcg = renpy.get_registered_image(cg) rcg = renpy.get_registered_image(cg)
#print(rcg.get_size())
image_dimensions = (1920, 1080) #renpy.image_size(rcg)
item = { item = {
"item": name, "item": name,
"fn": rcg, "cg": cg_(rcg, 1920),
"cg": cg_(rcg, None, image_dimensions[0]),
"ext": None,
"wh": image_dimensions
} }
gallery_dic[tab_name].append(item) gallery_dic[tab_name].append(item)
elif 'folders' in x.keys(): #folders
for str in list_img:
for cp in x['folders']:
for ext in ACCEPTED_EXTENSIONS:
path = cp #cp['path']
_str = path+str+"."+ext
#print(_str)
if renpy.loadable(_str): #brute force
add_(str, _str, ext, tab_name) #cp['name'])
#print(data)
pass pass
jsonloadandpop() jsonloadandpop()
# hard code the webm because renpy is really dumb and doesn't add Movies properly until much later
fang_webm = 'fang thumb'
webm_rcg = Fixed(Color("#000"), Text("Fang", size=280, xalign=0.5, yalign=0.5), xsize=1920)
renpy.seen_label('fang_movie')
gallery_dic['Animations'] = [{ gallery_dic['Animations'] = [{
"item": 'fang tail', "item": 'fang tail',
"fn": 'images/animations/fang tail.webm',
"cg": 'images/animations/fang tail thumbnail.webp', "cg": 'images/animations/fang tail thumbnail.webp',
"ext": 'webm',
"wh": [1920, 1080]
}] }]
renpy.image("fang tail", Movie(loop=True,play='images/animations/fang tail.webm')) # Since we are hard-coding might as well. renpy.image("fang tail", Movie(loop=True,play='images/animations/fang tail.webm')) # Since we are hard-coding might as well.
pass pass
# Bullshit for the scrollbar to reset back to the beggining. Bless the renpy Discord :pray:
default adjust = ui.adjustment()
"""
'Recursive' / Loopable / Roundtrip Screens
_0 <-> _1
"""
#There is renpy.restart_interaction but since I wrote all this, it's too late
#screen cg_gallery(flag, __yoffset = 0, origin = 'CG'):
screen cg_gallery_0(__yoffset = 0, origin = 'CG'):
tag menu
use cg_gallery('1', __yoffset, origin)
screen cg_gallery_1( __yoffset = 0, origin = 'CG'):
tag menu
use cg_gallery('0', __yoffset, origin)
#screen view_image(fn, _origin, zoom=1):
screen view_image_a(fn, _origin = 0, zoom = zoom_arr.index(1.0)):
tag menu
use view_image(fn, _origin, zoom, 'b')
screen view_image_b(fn, _origin, zoom = zoom_arr.index(1.0)):
tag menu
use view_image(fn, _origin, zoom, 'a')
""" """
CG Gallery screen - A screen that shows the image gallery CG Gallery screen - A screen that shows the image gallery
Basically Gallery Object has terrible defaults, so I just wrote my own stuff Built-in Gallery Object has terrible defaults, so I just wrote my own stuff
""" """
screen cg_gallery(flag, __yoffset = 0, origin = 'CG'): screen cg_gallery(origin = 'CG'):
if main_menu: if main_menu:
key "game_menu" action ShowMenu("main_menu") key "game_menu" action ShowMenu("main_menu")
# Bg for frame
frame:
pass
add gui.main_menu_background add gui.main_menu_background
# Frame
add gui.game_menu_background add gui.game_menu_background
tag menu tag menu
python: python:
empty_spaces = gallery_rows = item_counter = 0
empty_spaces = gallery_rows = item_counter = 0
gallery_items = gallery_dic[origin] gallery_items = gallery_dic[origin]
items = len(gallery_items) items = len(gallery_items)
gallery_rows = (items / GALLERY_COLS) + 1 gallery_rows = (items / GALLERY_COLS) + 1
empty_spaces = GALLERY_COLS - (items % GALLERY_COLS) empty_spaces = GALLERY_COLS - (items % GALLERY_COLS)
vbox id "vbx":
vbox:
transform: transform:
zoom 0.95 zoom 0.95
hbox: hbox:
@ -237,69 +126,54 @@ screen cg_gallery(flag, __yoffset = 0, origin = 'CG'):
textbutton _(cp['name']) text_color gui.selected_color text_xalign 0.5 textbutton _(cp['name']) text_color gui.selected_color text_xalign 0.5
else: else:
if cp['eval'] is None: if cp['eval'] is None:
textbutton _(cp['name']) activate_sound "audio/ui/uiClick.wav" action ShowMenu('cg_gallery_'+flag, 0, cp['name']) text_xalign 0.5 textbutton _(cp['name']) text_color gui.idle_color text_hover_color gui.hover_color activate_sound "audio/ui/uiClick.wav" action (ShowMenu('cg_gallery', cp['name']),SetField(adjust, 'value', 0)) text_xalign 0.5
elif eval(cp['eval']): elif eval(cp['eval']):
textbutton _(cp['name']) activate_sound "audio/ui/uiClick.wav" action ShowMenu('cg_gallery_'+flag, 0, cp['name']) text_xalign 0.5 textbutton _(cp['name']) text_color gui.idle_color text_hover_color gui.hover_color activate_sound "audio/ui/uiClick.wav" action (ShowMenu('cg_gallery', cp['name']),SetField(adjust, 'value', 0)) text_xalign 0.5
else: else:
textbutton _(cp['name']) text_xalign 0.5 textbutton _(cp['name']) text_xalign 0.5
textbutton _("Return") activate_sound "audio/ui/uiBack.wav" action ShowMenu('main_menu') text_xalign 0.5 textbutton _("Return") activate_sound "audio/ui/uiBack.wav" action ShowMenu('main_menu') text_xalign 0.5
if _in_replay:
textbutton _("End Replay") activate_sound "audio/ui/uiBack.wav" action EndReplay(confirm=True)
elif not main_menu:
textbutton _("Main Menu") activate_sound "audio/ui/uiBack.wav" action MainMenu()
transform: transform:
zoom 0.95 zoom 0.95
xcenter 0.525 xcenter 0.525
ycenter 0.525 ycenter 0.525
vpgrid id "vpg": vpgrid id "vpg":
#yinitial __yoffset if gallery_rows>=4:
scrollbars "vertical" scrollbars "vertical"
mousewheel True mousewheel True
draggable True draggable True
pagekeys True pagekeys True
xfill True xfill True
yadjustment adjust
xcenter 0.5 xcenter 0.5
#ycenter 0.5
spacing 20 spacing 20
#rows gallery_rows
cols GALLERY_COLS cols GALLERY_COLS
for item in gallery_items: for item in gallery_items:
# Should properly fix with actual margin difference but good
# enough or the actual position
python:
item_counter += 1
#yoffset = int( yoffset + (PREFERRED_HEIGHT * 1.15))
yoffset = int(item_counter / 3 * PREFERRED_HEIGHT + ((item_counter / 3)))
use flag_button(item, yoffset, origin) use flag_button(item, origin)
for i in range(0, empty_spaces): for i in range(0, empty_spaces):
null height 20 null height 20
""" """
if/else flow control & extra parameters for Buttons if/else flow control & extra parameters for Buttons
""" """
screen flag_button(item, yoffset, origin): screen flag_button(item, origin):
python:
flag = renpy.seen_image(item['item']) $ flag = renpy.seen_image(item['item'])
if flag: if flag:
button: button:
if item['ext'] == "webm": if item in gallery_dic['Animations']:
#action Replay('fang_movie') action ShowMenu('view_movie', item, ShowMenu('cg_gallery', origin))
action ShowMenu('view_movie', item, ShowMenu('cg_gallery_0', yoffset, origin))
else: else:
action ShowMenu('view_image_a', item, ShowMenu('cg_gallery_0', yoffset, origin)) action ShowMenu('view_image', item, ShowMenu('cg_gallery',origin))
#action Show('view_image', None, item, ShowMenu('cg_gallery_0', yoffset, origin), _zorder=1)
xcenter 0.5 ycenter 0.5 xcenter 0.5 ycenter 0.5
vbox: vbox:
yminimum PREFERRED_HEIGHT xminimum PREFERRED_WIDTH yminimum PREFERRED_HEIGHT xminimum PREFERRED_WIDTH
@ -310,25 +184,16 @@ screen flag_button(item, yoffset, origin):
xcenter 0.5 ycenter 0.5 xcenter 0.5 ycenter 0.5
add NOT_UNLOCKED_COVER add NOT_UNLOCKED_COVER
screen view_movie(item, _origin): screen view_movie(item, _origin):
tag menu tag menu
key "game_menu" action [Hide('view_movie'), _origin ] key "game_menu" action [Hide('view_movie'), _origin ]
key "button_alternate" action [Hide('view_movie'), _origin ] key "button_alternate" action [Hide('view_movie'), _origin ]
add item['item'] add item['item']
hbox: if renpy.variant("small"):
style_prefix "quick" hbox:
xalign 0.5 style_prefix "quick"
yalign 0.975 xalign 0.5
if (ALLOW_ZOOM) and renpy.variant("small"): yalign 0.975
use quick_buttons("gui/button/uioptionbuttons/template_idle.png",
[
[ "+", zoom_a_f ],
[ "-", zoom_b_f ],
[ "Return", zoom_b_f ]
] )
elif renpy.variant("small"):
use quick_buttons("gui/button/uioptionbuttons/template_idle.png", use quick_buttons("gui/button/uioptionbuttons/template_idle.png",
[ [
[ "Return", _origin ] [ "Return", _origin ]
@ -337,27 +202,10 @@ screen view_movie(item, _origin):
""" """
view_image, Loads the image in fullscreen with viewport control. view_image, Loads the image in fullscreen with viewport control.
""" """
screen view_image(item, _origin, zoom = zoom_arr.index(1.0), flag='a'): screen view_image(item, _origin):
python:
#_origin = Show('cg_gallery_0', 0, _origin)
zoom_a = zoom+1
zoom_a_f = ShowMenu('view_image_'+flag, item, _origin, zoom_a)
zoom_b = zoom-1
zoom_b_f = ShowMenu('view_image_'+flag, item, _origin, zoom_b)
tag menu tag menu
key "game_menu" action [Hide('view_image'), _origin ] #Show('cg_gallery_0')] #_origin key "game_menu" action (Hide('view_image'), _origin)
key "button_alternate" action [Hide('view_image'), _origin ] # Show('cg_gallery_0')] key "button_alternate" action (Hide('view_image'), _origin)
#key "button_alternate" action _origin
# mousewheel & insert+delete
if (ALLOW_ZOOM):
if zoom < len(zoom_arr)-1: #zoom in
key 'mousedown_4' action zoom_a_f
key 'K_INSERT' action zoom_a_f
if zoom > 0: #and (item['wh'][0] <= 1920 or item['wh'][1] <= 1080):
key 'mousedown_5' action zoom_b_f
key 'K_DELETE' action zoom_b_f
viewport id "vie": viewport id "vie":
#Ren'Py isn't smart enough to not edgescroll while pressed, #Ren'Py isn't smart enough to not edgescroll while pressed,
@ -369,23 +217,16 @@ screen view_image(item, _origin, zoom = zoom_arr.index(1.0), flag='a'):
pagekeys True pagekeys True
xfill False xfill False
yfill False yfill False
add item['fn'] zoom zoom_arr[zoom] anchor (0.55, 0.55) add item['item'] zoom 1.0 anchor (0.55, 0.55)
#Reuse quick buttons, Ren'Py handles touch input lazy, it doesn't have #Reuse quick buttons. Ren'Py handles touch input lazy, it doesn't have
#double finger pinch zoom, it translates taps as mouse events - have to use #double finger pinch zoom, it translates taps as mouse events - have to use
#buttons #buttons
hbox: if renpy.variant("small"):
style_prefix "quick" hbox:
xalign 0.5 style_prefix "quick"
yalign 0.975 xalign 0.5
if (ALLOW_ZOOM) and renpy.variant("small"): yalign 0.975
use quick_buttons("gui/button/uioptionbuttons/template_idle.png",
[
[ "+", zoom_a_f ],
[ "-", zoom_b_f ],
[ "Return", zoom_b_f ]
] )
elif renpy.variant("small"):
use quick_buttons("gui/button/uioptionbuttons/template_idle.png", use quick_buttons("gui/button/uioptionbuttons/template_idle.png",
[ [
[ "Return", _origin ] [ "Return", _origin ]