[Update] Config Window: Add About VRCT Tab. This is The Credit Page.

*The button that is supposed to open the link is not working yet.
This commit is contained in:
Sakamoto Shiina
2024-04-06 21:53:29 +09:00
parent fc5f9b24c3
commit 1b6fa4c3e8
62 changed files with 934 additions and 23 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 763 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 939 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1013 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 959 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

View File

@@ -1,3 +1,4 @@
import random
from typing import Union
from os import path as os_path, rename as os_rename
from PIL.Image import open as Image_open
@@ -55,4 +56,12 @@ def isUniqueStrings(unique_strings:Union[str, list], input_string:str, require=F
def renameWeightFolder(path):
weight_path = os_path.join(path, "weight")
if os_path.exists(weight_path):
os_rename(weight_path, os_path.join(path, "weights"))
os_rename(weight_path, os_path.join(path, "weights"))
def splitListRandomly(lst, split_count):
random.shuffle(lst)
split_lists = []
for i in range(0, len(lst), split_count):
sub_list = lst[i:i+split_count]
split_lists.append(sub_list)
return split_lists

65
view.py
View File

@@ -6,7 +6,7 @@ import webbrowser
import i18n
from customtkinter import StringVar, IntVar, BooleanVar, get_appearance_mode
from vrct_gui.ui_managers import ColorThemeManager, UiScalingManager
from vrct_gui.ui_managers import ColorThemeManager, UiScalingManager, AboutVrctManager
from vrct_gui import vrct_gui
from utils import callFunctionIfCallable, intToPctStr
@@ -62,9 +62,11 @@ class View():
**common_args
)
about_vrct = AboutVrctManager(config.UI_SCALING, config.UI_LANGUAGE, all_ctm.config_window)
self.settings.config_window = SimpleNamespace(
ctm=all_ctm.config_window,
uism=all_uism.config_window,
about_vrct=about_vrct,
**common_args
)
@@ -198,7 +200,8 @@ class View():
# Config Window
ACTIVE_SETTING_BOX_TAB_ATTR_NAME="side_menu_tab_appearance",
ACTIVE_SETTING_BOX_TAB_ATTR_NAME="side_menu_tab_about_vrct",
# ACTIVE_SETTING_BOX_TAB_ATTR_NAME="side_menu_tab_appearance",
CALLBACK_SELECTED_SETTING_BOX_TAB=None,
VAR_ERROR_MESSAGE=StringVar(value=""),
VAR_VERSION=StringVar(value=VERSION_TEXT),
@@ -219,6 +222,9 @@ class View():
VAR_SIDE_MENU_LABEL_OTHERS=StringVar(value=i18n.t("config_window.side_menu_labels.others")),
VAR_SIDE_MENU_LABEL_ADVANCED_SETTINGS=StringVar(value=i18n.t("config_window.side_menu_labels.advanced_settings")),
VAR_SIDE_MENU_LABEL_ABOUT_VRCT=StringVar(value="About VRCT"),
# VAR_SIDE_MENU_LABEL_ABOUT_VRCT=StringVar(value=i18n.t("config_window.side_menu_labels.advanced_settings")),
VAR_CURRENT_ACTIVE_CONFIG_TITLE=StringVar(value=""),
# Appearance Tab
@@ -521,6 +527,14 @@ class View():
VAR_LABEL_OPEN_CONFIG_FILEPATH=StringVar(value=i18n.t("config_window.open_config_filepath.label")),
VAR_DESC_OPEN_CONFIG_FILEPATH=None,
# About VRCT Tab
CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT=self.openWebPage_AboutVrct,
CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON=None,
CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON=None,
CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST=None,
CALLBACK_ABOUT_VRCT_POSTER_SHOWCASE_CURRENT_PAGE_NUM=0,
)
@@ -985,6 +999,53 @@ class View():
def openWebPage_DeepL_Auth_Key(self):
self.openWebPage(config.DEEPL_AUTH_KEY_PAGE_URL)
def openWebPage_AboutVrct(self, target_type:str):
url = ""
match (target_type):
case ("X_MISYA"):
url = "https://twitter.com/misya_ai"
case ("GITHUB_MISYA"):
url = "https://github.com/misyaguziya"
case ("X_SHIINA"):
url = "https://twitter.com/Shiina_12siy"
case ("X_DONE_SAN"):
url = "https://twitter.com/done_vrc"
case ("X_IYA"):
url = "https://twitter.com/IYAA_HHHH"
case ("X_RERA"):
url = "https://twitter.com/rerassi"
case ("GITHUB_RERA"):
url = "https://github.com/soumt-r"
case ("X_POPOSUKE"):
url = "https://twitter.com/sig_popo"
case ("X_KUMAGUMA"):
url = "https://twitter.com/K_kumaguma_A"
case ("BOOTH"):
url = "https://misyaguziya.booth.pm/items/5155325"
case ("VRCT_DOCUMENTS"):
url = config.DOCUMENTS_URL
case ("VRCT_GITHUB"):
url = "https://github.com/misyaguziya/VRCT"
case ("CONTACT_US"):
url = "https://docs.google.com/forms/d/e/1FAIpQLSei-xoydOY60ivXqhOjaTzNN8PiBQIDcNhzfy6cw2sjYkcg_g/viewform"
case ("SUPPORTER_REGISTRATION"):
url = "https://docs.google.com/forms/d/e/1FAIpQLSepLzdEOTJQFVHdOOxAA0dix3zCmnNBlmH4XWon5FldXkIiqw/viewform"
case "TEMP":
print("here is still under construction.")
return
case (_):
raise ValueError(f"No matching case for target_type: {target_type}")
self.openWebPage(url)
# Widget Control
# Common

View File

@@ -163,6 +163,6 @@ class _PrintToTextbox():
case "RECEIVED":
target_textbox = self.vrct_gui.textbox_received
case (_):
raise ValueError(f"No matching case for target_type: {target_type}")
raise ValueError(f"No matching case for target_type: {target_type}")
return target_textbox

View File

@@ -41,9 +41,9 @@ class ConfigWindow(CTkToplevel):
self.side_menu_bg_container.grid_columnconfigure(0, weight=0, minsize=l_width+1)
# for fixing 1px bug
self.side_menu_bg_container.grid_rowconfigure(2, weight=1)
sls__box_optionmenu_wrapper_fix_1px_bug = CTkFrame(self.side_menu_bg_container, corner_radius=0, width=0, height=0)
sls__box_optionmenu_wrapper_fix_1px_bug.grid(row=3, column=0, sticky="sew")
# self.side_menu_bg_container.grid_rowconfigure(2, weight=1)
# sls__box_optionmenu_wrapper_fix_1px_bug = CTkFrame(self.side_menu_bg_container, corner_radius=0, width=0, height=0)
# sls__box_optionmenu_wrapper_fix_1px_bug.grid(row=3, column=0, sticky="sew")
# for fixing 1px bug
l_width = getLatestWidth(self.side_menu_bg_container)

View File

@@ -30,7 +30,13 @@ def _createSettingBoxContainer(config_window, settings, view_variable, setting_b
setting_box_row=0
for setting_box_setting in setting_box_container_settings["setting_boxes"]:
# Top-Padding that can be container the section title
setting_box_top_padding = CTkFrame(setting_box_container_widget, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=settings.uism.SB__TOP_PADY)
if setting_box_setting.get("about_vrct", False) is True:
setting_box_top_padding = CTkFrame(setting_box_container_widget, corner_radius=0, fg_color=settings.ctm.ABOUT_VRCT_BG, width=0, height=settings.uism.ABOUT_VRCT_SB__TOP_PADY)
setting_box_wrapper = CTkFrame(setting_box_container_widget, fg_color=settings.ctm.MAIN_BG_COLOR, corner_radius=0, width=0, height=0)
else:
setting_box_top_padding = CTkFrame(setting_box_container_widget, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=settings.uism.SB__TOP_PADY)
setting_box_wrapper = CTkFrame(setting_box_container_widget, fg_color=settings.ctm.SB__WRAPPER_BG_COLOR, corner_radius=0, width=0, height=0)
setting_box_top_padding.grid(row=setting_box_row, column=0, sticky="ew", padx=0, pady=0)
setting_box_top_padding.grid_columnconfigure(0, weight=1)
setting_box_row+=1
@@ -47,7 +53,6 @@ def _createSettingBoxContainer(config_window, settings, view_variable, setting_b
setting_box_wrapper_section_title.place(relx=0, rely=0.4, anchor="nw")
setting_box_wrapper = CTkFrame(setting_box_container_widget, fg_color=settings.ctm.SB__WRAPPER_BG_COLOR, corner_radius=0, width=0, height=0)
setting_box_wrapper.grid(row=setting_box_row, column=0, sticky="ew")
setting_box_wrapper.grid_columnconfigure(0, weight=1)
setting_box_row+=1

View File

@@ -12,6 +12,8 @@ from .setting_box_containers.setting_box_others import createSettingBox_Others,
from .setting_box_containers.setting_box_advanced_settings import createSettingBox_AdvancedSettings
from .setting_box_containers.setting_box_translation import createSettingBox_Translation
from .setting_box_containers.setting_box_about_vrct import createSettingBox_AboutVrct
def createSideMenuAndSettingsBoxContainers(config_window, settings, view_variable):
@@ -30,9 +32,9 @@ def createSideMenuAndSettingsBoxContainers(config_window, settings, view_variabl
config_window.side_menu_bg_container = CTkFrame(config_window, corner_radius=0, fg_color=settings.ctm.SIDE_MENU_BG_COLOR, width=0, height=0)
config_window.side_menu_bg_container.grid(row=1, column=0, sticky="nsew")
config_window.side_menu_bg_container.grid_columnconfigure(0, weight=1)
config_window.side_menu_bg_container.grid_rowconfigure(0, weight=1)
config_window.side_menu_container = CTkFrame(config_window.side_menu_bg_container, corner_radius=0, fg_color=settings.ctm.SIDE_MENU_LABELS_BG_FOR_FAKE_BORDER_COLOR, width=0, height=0)
config_window.side_menu_container.grid(row=0, column=0, padx=settings.uism.TOP_BAR_SIDE__TITLE_PADX, pady=(settings.uism.SIDE_MENU_TOP_PADY, 0), sticky="nsew")
config_window.side_menu_container.grid(row=0, column=0, padx=settings.uism.TOP_BAR_SIDE__TITLE_PADX, pady=settings.uism.SIDE_MENU_TOP_PADY, sticky="nsew")
@@ -128,12 +130,36 @@ def createSideMenuAndSettingsBoxContainers(config_window, settings, view_variabl
]
},
},
# About VRCT. It is separated from the others.
{
"side_menu_tab_attr_name": "side_menu_tab_about_vrct",
"label_attr_name": "label_about_vrct",
"selected_mark_attr_name": "selected_mark_about_vrct",
"textvariable": view_variable.VAR_SIDE_MENU_LABEL_ABOUT_VRCT,
"setting_box_container_settings": {
"setting_box_container_attr_name": "setting_box_container_about_vrct",
"setting_boxes": [
{ "var_section_title": None, "setting_box": createSettingBox_AboutVrct, "about_vrct": True },
]
},
},
]
SEPARATE_ROW_COUNT=1 # It's just count the row and separate from below.
SEPARATE_ROW_NUMBER = len(side_menu_and_setting_box_containers_settings) - SEPARATE_ROW_COUNT
all_side_menu_tab_attr_name = [item["side_menu_tab_attr_name"] for item in side_menu_and_setting_box_containers_settings]
side_menu_row=0
for sm_and_sbc_setting in side_menu_and_setting_box_containers_settings:
if side_menu_row == SEPARATE_ROW_NUMBER:
side_menu_separator = CTkFrame(config_window.side_menu_container, corner_radius=0, fg_color=settings.ctm.SIDE_MENU_LABELS_BG_COLOR, width=0, height=0)
config_window.side_menu_container.grid_rowconfigure(side_menu_row, weight=1, minsize=settings.uism.SIDE_MENU_LABELS_SEPARATE_MIN_HEIGHT)
side_menu_separator.grid(row=side_menu_row, column=0, sticky="nsew")
side_menu_row+=1
_addConfigSideMenuItem(
config_window=config_window,
settings=settings,

View File

@@ -0,0 +1 @@
from .createSettingBox_AboutVrct import createSettingBox_AboutVrct

View File

@@ -0,0 +1,578 @@
from types import SimpleNamespace
from customtkinter import CTkFrame, CTkLabel, CTkImage, CTkFont
from utils import callFunctionIfCallable, splitListRandomly
from ......ui_utils import bindButtonFunctionAndColor, animateRotation, bindEnterAndLeaveFunction
def createSettingBox_AboutVrct(setting_box_wrapper, config_window, settings, view_variable):
setting_box_wrapper.grid_columnconfigure(0, weight=1, minsize=settings.uism.MAIN_AREA_MIN_WIDTH)
about_vrct_uism = settings.about_vrct.uism
ABOUT_VRCT_BG = settings.ctm.ABOUT_VRCT_BG
# For padding left. without this, setting_box_wrapper's bg shows...
about_vrct_container_wrapper = CTkFrame(setting_box_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
about_vrct_container_wrapper.grid(column=0, row=0, padx=0, pady=0, sticky="nsew")
about_vrct_container_wrapper.grid_columnconfigure(0, weight=1)
about_vrct_container = CTkFrame(about_vrct_container_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
about_vrct_container.grid(column=0, row=0, padx=about_vrct_uism.ABOUT_VRCT_CONTAINER_LEFT_PADX, pady=0, sticky="nsew")
about_vrct_container.grid_columnconfigure(0, weight=1)
def createSectionContainer(section_row, section_title_image_file_name:str=None, section_bottom_padding:int=0, section_title_bottom_padding:int=0):
section_container = CTkFrame(about_vrct_container, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
section_container.grid(column=0, row=section_row, padx=0, pady=(0, section_bottom_padding), sticky="nsew")
section_container.grid_columnconfigure(0, weight=1)
contents_row=0
if section_title_image_file_name is not None:
section_title_frame = settings.about_vrct.embedImageCTkLabel(section_container, section_title_image_file_name)
section_title_frame.grid(column=0, row=contents_row, padx=0, pady=(0,section_title_bottom_padding), sticky="nw")
contents_row = 1
section_contents_wrapper = CTkFrame(section_container, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
section_contents_wrapper.grid(column=0, row=contents_row, padx=0, pady=0, sticky="nsew")
section_contents_wrapper.grid_columnconfigure(0, weight=1)
return (section_container, section_contents_wrapper)
def createImageButtonRows(parent_frame, image_buttons_settings:list, bottom_pady, directly_type:str=None, corner_radius:int=0, ipadx:int=0, ipady:int=0):
button_row=0
setting_length = len(image_buttons_settings)
for index, each_setting in enumerate(image_buttons_settings):
each_button = settings.about_vrct.embedImageButtonCTkLabel(
parent_frame=parent_frame,
image_file_name=each_setting["image_file_name"],
callback=each_setting["callback"],
directly_type=directly_type,
corner_radius=corner_radius,
)
each_button.grid(column=0, row=button_row, padx=0, pady=(0, bottom_pady), sticky="nsew")
each_button.img_label.grid(padx=ipadx, pady=ipady, sticky="nsew")
if index == setting_length-1:
each_button.grid(pady=0)
button_row+=1
def createContactButton(parent_frame, image_file_name, callback_arg, fg_color=ABOUT_VRCT_BG):
frame = settings.about_vrct.embedImageButtonCTkLabel(
parent_frame=parent_frame,
image_file_name=image_file_name,
callback=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, callback_arg),
fg_color=fg_color,
hovered_color=fg_color,
clicked_color=fg_color,
)
return frame
def createTellUsButton(parent_frame, image_file_name, callback):
tell_us_button_frame = settings.about_vrct.embedImageButtonCTkLabel(
parent_frame=parent_frame,
image_file_name=image_file_name,
callback=callback,
corner_radius=about_vrct_uism.TELL_US_BUTTON_CORNER_RADIUS,
)
tell_us_button_frame.img_label.grid(padx=about_vrct_uism.TELL_US_BUTTON_PADX, pady=about_vrct_uism.TELL_US_BUTTON_PADY, sticky="nsew")
tell_us_button_frame.configure(border_width=about_vrct_uism.TELL_US_BUTTON_BORDER_WIDTH, border_color=settings.ctm.ABOUT_VRCT_TELL_US_BUTTON_BORDER_COLOR)
return tell_us_button_frame
section_row=0
# The Developers ----------------------------------
_the_developers, the_developers_contents_wrapper = createSectionContainer(
section_row=section_row,
section_title_image_file_name="dev_section_title.png",
section_bottom_padding=about_vrct_uism.SECTION_BOTTOM_PADY,
section_title_bottom_padding=about_vrct_uism.THE_DEVELOPERS_SECTION_TITLE_BOTTOM_PADY
)
dev_misya_label = settings.about_vrct.embedImageCTkLabel(the_developers_contents_wrapper, "dev_misya.png")
dev_misya_label.grid(column=0, row=0, padx=0, pady=0, sticky="nsw")
dev_misya_x = createContactButton(
parent_frame=dev_misya_label,
image_file_name="dev_x_icon.png",
callback_arg="X_MISYA",
fg_color=settings.ctm.ABOUT_VRCT_DEV_BG
)
dev_misya_x.place(x=about_vrct_uism.DEVS_MISYA_X_X, y=about_vrct_uism.DEVS_CONTACTS_Y1, anchor="nw")
dev_misya_github = createContactButton(
parent_frame=dev_misya_label,
image_file_name="dev_github_icon.png",
callback_arg="GITHUB_MISYA",
fg_color=settings.ctm.ABOUT_VRCT_DEV_BG
)
dev_misya_github.place(x=about_vrct_uism.DEVS_MISYA_GITHUB_X, y=about_vrct_uism.DEVS_CONTACTS_Y1, anchor="nw")
dev_shiina_label = settings.about_vrct.embedImageCTkLabel(the_developers_contents_wrapper, "dev_shiina.png")
dev_shiina_label.grid(column=1, row=0, padx=0, pady=0, sticky="nse")
dev_shiina_x = createContactButton(
parent_frame=dev_shiina_label,
image_file_name="dev_x_icon.png",
callback_arg="X_SHIINA",
fg_color=settings.ctm.ABOUT_VRCT_DEV_BG
)
dev_shiina_x.place(x=about_vrct_uism.DEVS_SHIINA_X_X, y=about_vrct_uism.DEVS_CONTACTS_Y1, anchor="nw")
section_row+=1
# Project Links And Logo ----------------------------------
_project_links_and_logo, project_links_and_logo_contents_wrapper = createSectionContainer(
section_bottom_padding=about_vrct_uism.PROJECT_LINKS_SECTION_BOTTOM_PADDING,
section_row=section_row,
)
project_links_and_logo_wrapper = CTkFrame(project_links_and_logo_contents_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
project_links_and_logo_wrapper.grid(column=0, row=0, padx=about_vrct_uism.PROJECT_LINK_CONTENTS_PADX, pady=0, sticky="nsew")
project_links_and_logo_wrapper.grid_columnconfigure(1, weight=1)
vrct_logo_label = settings.about_vrct.embedImageCTkLabel(project_links_and_logo_wrapper, "vrct_logo_for_about_vrct.png")
vrct_logo_label.grid(column=0, row=0, padx=0, pady=0, sticky="nsw")
project_links_wrapper = CTkFrame(project_links_and_logo_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
project_links_wrapper.grid(column=2, row=0, padx=0, pady=0, sticky="nse")
project_link_settings = [
{
"image_file_name": "project_link_booth.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "BOOTH")
},
{
"image_file_name": "project_link_documents.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "VRCT_DOCUMENTS")
},
{
"image_file_name": "project_link_vrct_github.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "VRCT_GITHUB")
},
{
"image_file_name": "project_link_contact_us.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "CONTACT_US")
},
]
createImageButtonRows(
parent_frame=project_links_wrapper,
image_buttons_settings=project_link_settings,
bottom_pady=about_vrct_uism.PROJECT_LINK_BOTTOM_PADY,
corner_radius=about_vrct_uism.PROJECT_LINK_CORNER_RADIUS,
ipadx=about_vrct_uism.PROJECT_LINK_ITEM_IPADX,
ipady=about_vrct_uism.PROJECT_LINK_ITEM_IPADY,
)
section_row+=1
# Contributors ----------------------------------
_contributors, contributors_contents_wrapper = createSectionContainer(
section_row=section_row,
section_title_image_file_name="contributors_section_title.png",
section_bottom_padding=about_vrct_uism.SECTION_BOTTOM_PADY,
section_title_bottom_padding=about_vrct_uism.CONTRIBUTORS_SECTION_TITLE_BOTTOM_PADY
)
contributors_members = settings.about_vrct.embedImageCTkLabel(contributors_contents_wrapper, "contributors_members.png")
contributors_members.grid(column=0, row=0, padx=0, pady=0, sticky="nsew")
# done_san
contributors_done_san_x = createContactButton(
parent_frame=contributors_members,
image_file_name="contributors_x_icon.png",
callback_arg="X_DONE_SAN",
)
contributors_done_san_x.place(x=about_vrct_uism.CONTRIBUTORS_DONE_SAN_X_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y1, anchor="nw")
# IYA
contributors_iya_x = createContactButton(
parent_frame=contributors_members,
image_file_name="contributors_x_icon.png",
callback_arg="X_IYA",
)
contributors_iya_x.place(x=about_vrct_uism.CONTRIBUTORS_IYA_X_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y1, anchor="nw")
# RERA
contributors_rera_x = createContactButton(
parent_frame=contributors_members,
image_file_name="contributors_x_icon.png",
callback_arg="X_RERA",
)
contributors_rera_x.place(x=about_vrct_uism.CONTRIBUTORS_RERA_X_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y1, anchor="nw")
contributors_rera_github = createContactButton(
parent_frame=contributors_members,
image_file_name="contributors_github_icon.png",
callback_arg="GITHUB_RERA",
)
contributors_rera_github.place(x=about_vrct_uism.CONTRIBUTORS_RERA_GITHUB_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y1, anchor="nw")
# POPOSUKE
contributors_poposuke_x = createContactButton(
parent_frame=contributors_members,
image_file_name="contributors_x_icon.png",
callback_arg="X_POPOSUKE",
)
contributors_poposuke_x.place(x=about_vrct_uism.CONTRIBUTORS_POPOSUKE_X_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y2, anchor="nw")
# KUMAGUMA
contributors_kumaguma_x = createContactButton(
parent_frame=contributors_members,
image_file_name="contributors_x_icon.png",
callback_arg="X_KUMAGUMA",
)
contributors_kumaguma_x.place(x=about_vrct_uism.CONTRIBUTORS_KUMAGUMA_X_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y2, anchor="nw")
section_row+=1
# Special Thanks & Supporters ----------------------------------
_special_thanks, special_thanks_contents_wrapper = createSectionContainer(
section_row=section_row,
section_title_image_file_name="special_thanks_section_title.png",
section_bottom_padding=about_vrct_uism.SECTION_BOTTOM_PADY,
section_title_bottom_padding=about_vrct_uism.SPECIAL_THANKS_SECTION_TITLE_BOTTOM_PADY
)
special_thanks_members = settings.about_vrct.embedImageCTkLabel(special_thanks_contents_wrapper, "special_thanks_members.png")
special_thanks_members.grid(column=0, row=0, padx=0, pady=(0,about_vrct_uism.SPECIAL_THANKS_MEMBERS_BOTTOM_PADY), sticky="nsew")
special_thanks_message = settings.about_vrct.embedImageCTkLabel(special_thanks_contents_wrapper, settings.about_vrct.image_file.SPECIAL_THANKS_MESSAGE)
special_thanks_message.grid(column=0, row=1, padx=0, pady=(0,about_vrct_uism.SPECIAL_THANKS_MESSAGE_BOTTOM_PADY), sticky="nsew")
special_thanks_message_and_you = settings.about_vrct.embedImageCTkLabel(special_thanks_contents_wrapper, "special_thanks_message_and_you.png")
special_thanks_message_and_you.grid(column=0, row=2, padx=0, pady=(0,about_vrct_uism.SPECIAL_THANKS_MESSAGE_AND_YOU_BOTTOM_PADY), sticky="nsw")
special_thanks_tell_us_message = createTellUsButton(
parent_frame=special_thanks_contents_wrapper,
image_file_name=settings.about_vrct.image_file.SPECIAL_THANKS_TELL_US_MESSAGE,
callback=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "SUPPORTER_REGISTRATION"),
)
special_thanks_tell_us_message.grid(column=0, row=3)
section_row+=1
# Special Thanks & Supporters ----------------------------------
_poster_showcase, poster_showcase_contents_wrapper = createSectionContainer(
section_row=section_row,
section_title_image_file_name="poster_showcase_section_title.png",
section_bottom_padding=about_vrct_uism.SECTION_BOTTOM_PADY,
section_title_bottom_padding=about_vrct_uism.POSTER_SHOWCASE_SECTION_TITLE_BOTTOM_PADY
)
poster_showcase_worlds_wrapper = CTkFrame(poster_showcase_contents_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
poster_showcase_worlds_wrapper.grid(column=0, row=0, padx=0, pady=0, sticky="nsew")
poster_showcase_worlds_wrapper.grid_columnconfigure(0, weight=1)
poster_showcase_worlds = CTkFrame(poster_showcase_worlds_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
poster_showcase_worlds.grid(column=0, row=0, padx=0, pady=(0,about_vrct_uism.POSTER_SHOWCASE_WORLD_BOTTOM_PADY), sticky="nsew")
poster_showcase_worlds.grid_columnconfigure(0, weight=1)
poster_showcase_worlds_settings = [
{
"image_file_name": "ehon_no_heikousekai_jimusho.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "ikoiba.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "ippaidou.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "japanese_culture_osenbeito.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "kimodameshi.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "kokekkopiyopiyo.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "kuroinu_work_room.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "language_exchange_tervern.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "nihongokurabu.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "parallel_collar.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "re_yatuha_room.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "silakan_datang_ke_rumahku.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "study_japanese_world_japanichijou.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "uj_club.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "usanezumi_shrine2.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
{
"image_file_name": "yuttari_eikaiwa.png",
"callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP")
},
]
result = splitListRandomly(poster_showcase_worlds_settings, 8)
poster_showcase_worlds_frame_list = []
for split_poster_showcase_worlds_settings in result:
poster_showcase_worlds_frame = CTkFrame(poster_showcase_worlds_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
poster_showcase_worlds_frame.grid_columnconfigure(0, weight=1)
createImageButtonRows(
parent_frame=poster_showcase_worlds_frame,
image_buttons_settings=split_poster_showcase_worlds_settings,
bottom_pady=about_vrct_uism.POSTER_SHOWCASE_WORLD_ITEM_BOTTOM_PADY,
directly_type="showcased_worlds",
corner_radius=about_vrct_uism.POSTER_SHOWCASE_WORLD_CORNER_RADIUS,
ipadx=about_vrct_uism.POSTER_SHOWCASE_WORLD_ITEM_IPADX,
ipady=about_vrct_uism.POSTER_SHOWCASE_WORLD_ITEM_IPADY,
)
poster_showcase_worlds_frame_list.append(poster_showcase_worlds_frame)
pagination_button_settings = settings.about_vrct.image_file.POSTER_SHOWCASE_WORLD_PAGINATION_BUTTON
def toNextPagePosterShowcase(current_function_index):
view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST=None
poster_showcase_worlds_frame_list[current_function_index].grid_remove()
current_function_index = (current_function_index + 1) % len(poster_showcase_worlds_frame_list)
poster_showcase_worlds_frame_list[current_function_index].grid(column=0, row=0, padx=0, pady=(0,about_vrct_uism.POSTER_SHOWCASE_WORLD_BOTTOM_PADY), sticky="nsew")
view_variable.CALLBACK_ABOUT_VRCT_POSTER_SHOWCASE_CURRENT_PAGE_NUM = current_function_index
start_angle = 0
goal_angle = 180
if current_function_index == 0:
start_angle = 180
goal_angle = 360
animateRotation(
tk_root=config_window,
img_frame=config_window.poster_showcase_pagination_button.img_label,
img=pagination_button_settings.img,
img_width=pagination_button_settings.width,
img_height=pagination_button_settings.height,
start_angle=start_angle,
goal_angle=goal_angle,
duration=0.5,
)
view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST=toNextPagePosterShowcase
# Initialize
view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST=toNextPagePosterShowcase
poster_showcase_worlds_frame_list[0].grid(column=0, row=0, padx=0, pady=(0,about_vrct_uism.POSTER_SHOWCASE_WORLD_BOTTOM_PADY), sticky="nsew")
poster_showcase_worlds_wrapper.grid_rowconfigure(1, weight=1)
poster_showcase_pagination_button_wrapper = CTkFrame(poster_showcase_worlds_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
poster_showcase_pagination_button_wrapper.grid(column=0, row=2, padx=0, pady=0, sticky="nsew")
poster_showcase_pagination_button_wrapper.grid_columnconfigure((0,2), weight=1)
config_window.poster_showcase_pagination_button = settings.about_vrct.embedImageButtonCTkLabel(
parent_frame=poster_showcase_pagination_button_wrapper,
image_file_name="poster_showcase_pagination_button.png",
callback=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST, view_variable.CALLBACK_ABOUT_VRCT_POSTER_SHOWCASE_CURRENT_PAGE_NUM),
hovered_color="transparent",
clicked_color="transparent",
)
config_window.poster_showcase_pagination_button.grid(column=1, row=0, padx=0, pady=0, sticky="nsew")
# poster_showcase_pagination_button_wrapper.grid_columnconfigure((0,2), weight=1)
poster_showcase_pagination_button_chato = settings.about_vrct.embedImageButtonCTkLabel(
parent_frame=poster_showcase_pagination_button_wrapper,
image_file_name="poster_showcase_pagination_button_chato.png",
callback=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST, view_variable.CALLBACK_ABOUT_VRCT_POSTER_SHOWCASE_CURRENT_PAGE_NUM),
hovered_color="transparent",
clicked_color="transparent",
)
poster_showcase_pagination_button_chato.place(relx=0.5, rely=0.5, anchor="center")
pagination_button_chato_settings = settings.about_vrct.image_file.POSTER_SHOWCASE_WORLD_PAGINATION_BUTTON_CHATO
def rotateChatoAnimation():
view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_BUTTON_HOVERED = None
animateRotation(
tk_root=config_window,
img_frame=poster_showcase_pagination_button_chato.img_label,
img=pagination_button_chato_settings.img,
img_width=pagination_button_chato_settings.width,
img_height=pagination_button_chato_settings.height,
start_angle=0,
goal_angle=360,
duration=0.5,
)
view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_BUTTON_HOVERED = rotateChatoAnimation
view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_BUTTON_HOVERED = rotateChatoAnimation
bindEnterAndLeaveFunction(
target_widgets=[config_window.poster_showcase_pagination_button.img_label,poster_showcase_pagination_button_chato.img_label],
enterFunction=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_BUTTON_HOVERED),
leaveFunction=None,
)
poster_container = CTkFrame(poster_showcase_contents_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
poster_container.grid(column=1, row=0, padx=0, pady=0, sticky="nsew")
poster_container.grid_columnconfigure(1, weight=1)
poster_images_wrapper = CTkFrame(poster_container, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
poster_images_wrapper.grid(column=0, row=0, padx=0, pady=(0,about_vrct_uism.POSTER_SHOWCASE_POSTER_IMAGES_BOTTOM_PADY), sticky="nsew")
poster_images_wrapper.grid_columnconfigure(1, weight=1)
poster_image_arrow_left = settings.about_vrct.embedImageButtonCTkLabel(poster_images_wrapper, "arrow_left.png", lambda _e: callFunctionIfCallable(view_variable.CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON))
poster_image_arrow_left.grid(column=0, row=0, padx=0, pady=0, sticky="nsew")
poster_image_arrow_left.configure(corner_radius=about_vrct_uism.POSTER_CHANGE_BUTTON_CORNER_RADIUS)
bindButtonFunctionAndColor(
target_widgets=[poster_image_arrow_left],
enter_color=settings.ctm.ABOUT_VRCT_BUTTON_HOVERED_BG_COLOR,
leave_color=ABOUT_VRCT_BG,
clicked_color=settings.ctm.ABOUT_VRCT_BUTTON_CLICKED_BG_COLOR,
buttonReleasedFunction=None,
)
# For change the image, register to config_window
config_window.poster_image_frame__iya_vrct_poster_ja = settings.about_vrct.embedImageCTkLabel(poster_images_wrapper, "iya_vrct_poster_ja.png", directly_type="vrct_posters")
config_window.poster_image_frame__iya_vrct_poster_en = settings.about_vrct.embedImageCTkLabel(poster_images_wrapper, "iya_vrct_poster_en.png", directly_type="vrct_posters")
config_window.poster_image_frame__iya_vrct_poster_cn = settings.about_vrct.embedImageCTkLabel(poster_images_wrapper, "iya_vrct_poster_cn.png", directly_type="vrct_posters")
config_window.poster_image_frame_dict = {
"iya_vrct_poster_ja": config_window.poster_image_frame__iya_vrct_poster_ja,
"iya_vrct_poster_en": config_window.poster_image_frame__iya_vrct_poster_en,
"iya_vrct_poster_cn": config_window.poster_image_frame__iya_vrct_poster_cn,
}
def vrctPostersGridRemove():
for poster_frame in config_window.poster_image_frame_dict.values():
poster_frame.grid_remove()
def gridVrctPoster_Ja():
vrctPostersGridRemove()
config_window.poster_image_frame_dict["iya_vrct_poster_ja"].grid(column=1, row=0, padx=0, pady=0, sticky="nsew")
view_variable.CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON=gridVrctPoster_Cn
view_variable.CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON=gridVrctPoster_En
def gridVrctPoster_En():
vrctPostersGridRemove()
config_window.poster_image_frame_dict["iya_vrct_poster_en"].grid(column=1, row=0, padx=0, pady=0, sticky="nsew")
view_variable.CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON=gridVrctPoster_Ja
view_variable.CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON=gridVrctPoster_Cn
def gridVrctPoster_Cn():
vrctPostersGridRemove()
config_window.poster_image_frame_dict["iya_vrct_poster_cn"].grid(column=1, row=0, padx=0, pady=0, sticky="nsew")
view_variable.CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON=gridVrctPoster_En
view_variable.CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON=gridVrctPoster_Ja
gridVrctPoster_Ja()
poster_image_arrow_right = settings.about_vrct.embedImageButtonCTkLabel(poster_images_wrapper, "arrow_right.png", lambda _e: callFunctionIfCallable(view_variable.CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON))
poster_image_arrow_right.grid(column=2, row=0, padx=0, pady=0, sticky="nsew")
poster_image_arrow_right.configure(corner_radius=about_vrct_uism.POSTER_CHANGE_BUTTON_CORNER_RADIUS)
bindButtonFunctionAndColor(
target_widgets=[poster_image_arrow_right],
enter_color=settings.ctm.ABOUT_VRCT_BUTTON_HOVERED_BG_COLOR,
leave_color=ABOUT_VRCT_BG,
clicked_color=settings.ctm.ABOUT_VRCT_BUTTON_CLICKED_BG_COLOR,
buttonReleasedFunction=None,
)
poster_images_authors_wrapper = CTkFrame(poster_container, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0)
poster_images_authors_wrapper.grid(column=0, row=1, padx=0, pady=0, sticky="nsew")
poster_images_authors = settings.about_vrct.embedImageCTkLabel(poster_images_authors_wrapper, "poster_images_authors.png")
poster_images_authors.grid(column=0, row=0, padx=0, pady=0, sticky="nsew")
poster_tell_us_message = createTellUsButton(
parent_frame=poster_showcase_contents_wrapper,
image_file_name=settings.about_vrct.image_file.POSTER_TELL_US_MESSAGE,
callback=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "TEMP"),
)
poster_tell_us_message.grid(column=0, row=1, columnspan=2, padx=0, pady=(about_vrct_uism.POSTER_TELL_US_MESSAGE_TOP_PADY,0), sticky="nse")
section_row+=1
# VRChat disclaimer ----------------------------------
vrchat_disclaimer, vrchat_disclaimer_contents_wrapper = createSectionContainer(
section_row=section_row,
)
vrchat_disclaimer_label = settings.about_vrct.embedImageCTkLabel(vrchat_disclaimer_contents_wrapper, "vrchat_disclaimer.png")
vrchat_disclaimer_label.grid(column=0, row=0, padx=0, pady=(about_vrct_uism.VRCHAT_DISCLAIMER_SECTION_TOP_PADDING, 0), sticky="nsew")

View File

@@ -0,0 +1,179 @@
from types import SimpleNamespace
from ..ui_utils import calculateUiSize, getImageFileFromUiUtils_AboutVrct, bindButtonReleaseFunction, createButtonWithImage, bindButtonFunctionAndColor
from customtkinter import CTkFrame, CTkLabel, CTkImage, CTkFont
IMAGE_STANDARD_SCALING = 2
class AboutVrctManager():
def __init__(self, scaling_percentage, ui_language, ctm):
self.ctm = ctm
scaling_float = int(scaling_percentage.replace("%", "")) / 100
self.SCALING_FLOAT = max(scaling_float, 0.4)
self.uism = SimpleNamespace()
self.uism.ABOUT_VRCT_CONTAINER_LEFT_PADX = self.dupTuple(self._calculateUiSize(32))
self.uism.SECTION_BOTTOM_PADY = self._calculateUiSize(22)
self.uism.PROJECT_LINKS_SECTION_BOTTOM_PADDING = self._calculateUiSize(18) # Exception pady
self.uism.VRCHAT_DISCLAIMER_SECTION_TOP_PADDING = self._calculateUiSize(80) # Exception pady
self.uism.THE_DEVELOPERS_SECTION_TITLE_BOTTOM_PADY = self._calculateUiSize(8)
self.uism.DEVS_CONTACTS_Y1 = self._calculateUiSize(118)
self.uism.DEVS_MISYA_X_X = self._calculateUiSize(269)
self.uism.DEVS_MISYA_GITHUB_X = self._calculateUiSize(297)
self.uism.DEVS_SHIINA_X_X = self._calculateUiSize(298)
self.uism.PROJECT_LINK_BOTTOM_PADY = self._calculateUiSize(2)
self.uism.PROJECT_LINK_CORNER_RADIUS = self._calculateUiSize(4)
self.uism.PROJECT_LINK_CONTENTS_PADX = self._calculateUiSize(55)
self.uism.PROJECT_LINK_ITEM_IPADX = self._calculateUiSize(10)
self.uism.PROJECT_LINK_ITEM_IPADY = self._calculateUiSize(4)
self.uism.CONTRIBUTORS_SECTION_TITLE_BOTTOM_PADY = self._calculateUiSize(10)
self.uism.CONTRIBUTORS_CONTACTS_Y1 = self._calculateUiSize(66)
self.uism.CONTRIBUTORS_DONE_SAN_X_X = self._calculateUiSize(25)
self.uism.CONTRIBUTORS_IYA_X_X = self._calculateUiSize(281)
self.uism.CONTRIBUTORS_RERA_X_X = self._calculateUiSize(530)
self.uism.CONTRIBUTORS_RERA_GITHUB_X = self._calculateUiSize(554)
self.uism.CONTRIBUTORS_CONTACTS_Y2 = self._calculateUiSize(170)
self.uism.CONTRIBUTORS_POPOSUKE_X_X = self._calculateUiSize(154)
self.uism.CONTRIBUTORS_KUMAGUMA_X_X = self._calculateUiSize(413)
self.uism.TELL_US_BUTTON_CORNER_RADIUS = self._calculateUiSize(6)
self.uism.TELL_US_BUTTON_PADX = self._calculateUiSize(8)
self.uism.TELL_US_BUTTON_PADY = self._calculateUiSize(8)
self.uism.TELL_US_BUTTON_BORDER_WIDTH = self._calculateUiSize(1)
self.uism.SPECIAL_THANKS_SECTION_TITLE_BOTTOM_PADY = self._calculateUiSize(6)
self.uism.SPECIAL_THANKS_MEMBERS_BOTTOM_PADY = self._calculateUiSize(4)
self.uism.SPECIAL_THANKS_MESSAGE_BOTTOM_PADY = self._calculateUiSize(0)
self.uism.SPECIAL_THANKS_MESSAGE_AND_YOU_BOTTOM_PADY = self._calculateUiSize(8)
self.uism.POSTER_SHOWCASE_SECTION_TITLE_BOTTOM_PADY = self._calculateUiSize(6)
self.uism.POSTER_SHOWCASE_POSTER_IMAGES_BOTTOM_PADY = self._calculateUiSize(18)
self.uism.POSTER_SHOWCASE_WORLD_ITEM_BOTTOM_PADY = self._calculateUiSize(4)
self.uism.POSTER_SHOWCASE_WORLD_ITEM_IPADX = self._calculateUiSize(12)
self.uism.POSTER_SHOWCASE_WORLD_ITEM_IPADY = self._calculateUiSize(4)
self.uism.POSTER_SHOWCASE_WORLD_BOTTOM_PADY = self._calculateUiSize(4)
self.uism.POSTER_SHOWCASE_WORLD_CORNER_RADIUS = self._calculateUiSize(4)
self.uism.POSTER_TELL_US_MESSAGE_TOP_PADY = self._calculateUiSize(20)
self.uism.POSTER_CHANGE_BUTTON_CORNER_RADIUS = self._calculateUiSize(6)
self.image_file = SimpleNamespace()
if ui_language == "ja":
self.image_file.SPECIAL_THANKS_MESSAGE = "special_thanks_message_ja.png"
self.image_file.SPECIAL_THANKS_TELL_US_MESSAGE = "special_thanks_tell_us_message_ja.png"
self.image_file.POSTER_TELL_US_MESSAGE = "poster_tell_us_message_ja.png"
else:
self.image_file.SPECIAL_THANKS_MESSAGE = "special_thanks_message_en.png"
self.image_file.SPECIAL_THANKS_TELL_US_MESSAGE = "special_thanks_tell_us_message_en.png"
self.image_file.POSTER_TELL_US_MESSAGE = "poster_tell_us_message_en.png"
poster_showcase_pagination_button_image = getImageFileFromUiUtils_AboutVrct("poster_showcase_pagination_button.png")
self.image_file.POSTER_SHOWCASE_WORLD_PAGINATION_BUTTON = SimpleNamespace(
img = poster_showcase_pagination_button_image,
width = calculateUiSize(
default_size = int(poster_showcase_pagination_button_image.width / IMAGE_STANDARD_SCALING),
scaling_float=self.SCALING_FLOAT,
is_allowed_odd=True,
),
height = calculateUiSize(
default_size = int(poster_showcase_pagination_button_image.height / IMAGE_STANDARD_SCALING),
scaling_float=self.SCALING_FLOAT,
is_allowed_odd=True,
),
)
poster_showcase_pagination_button_chato_image = getImageFileFromUiUtils_AboutVrct("poster_showcase_pagination_button_chato.png")
self.image_file.POSTER_SHOWCASE_WORLD_PAGINATION_BUTTON_CHATO = SimpleNamespace(
img = poster_showcase_pagination_button_chato_image,
width = calculateUiSize(
default_size = int(poster_showcase_pagination_button_chato_image.width / IMAGE_STANDARD_SCALING),
scaling_float=self.SCALING_FLOAT,
is_allowed_odd=True,
),
height = calculateUiSize(
default_size = int(poster_showcase_pagination_button_chato_image.height / IMAGE_STANDARD_SCALING),
scaling_float=self.SCALING_FLOAT,
is_allowed_odd=True,
),
)
def _calculateUiSize(self, default_size, is_allowed_odd:bool=True, is_zero_allowed:bool=False):
size = calculateUiSize(default_size, self.SCALING_FLOAT, is_allowed_odd, is_zero_allowed)
return size
def embedImageCTkLabel(self, parent_frame, image_file_name, image_scaling=IMAGE_STANDARD_SCALING, directly_type:str=None, fg_color:str="transparent", anchor:str="w"):
img = getImageFileFromUiUtils_AboutVrct(image_file_name, directly_type)
image_width = calculateUiSize(
default_size = int(img.width / image_scaling),
scaling_float=self.SCALING_FLOAT,
is_allowed_odd=True,
)
image_height = calculateUiSize(
default_size = int(img.height / image_scaling),
scaling_float=self.SCALING_FLOAT,
is_allowed_odd=True,
)
img_label = CTkLabel(
parent_frame,
text=None,
corner_radius=0,
height=image_height,
fg_color=fg_color,
anchor=anchor,
image=CTkImage((img), size=(image_width, image_height))
)
return img_label
def embedImageButtonCTkLabel(self, parent_frame, image_file_name, callback, image_scaling=IMAGE_STANDARD_SCALING, directly_type:str=None, fg_color:str=None, hovered_color:str=None, clicked_color:str=None, anchor:str="w", corner_radius:int=0):
fg_color = self.ctm.ABOUT_VRCT_BG if fg_color is None else fg_color
if hovered_color is None:
hovered_color = self.ctm.ABOUT_VRCT_BUTTON_HOVERED_BG_COLOR
if clicked_color is None:
clicked_color = self.ctm.ABOUT_VRCT_BUTTON_CLICKED_BG_COLOR
img_label_frame = CTkFrame(parent_frame, fg_color=fg_color, corner_radius=corner_radius, width=0, height=0)
img_label = self.embedImageCTkLabel(img_label_frame, image_file_name, image_scaling, directly_type, fg_color, anchor)
img_label_frame.configure(cursor="hand2")
img_label.configure(cursor="hand2")
img_label._canvas.configure(cursor="hand2")
bindButtonFunctionAndColor(
target_widgets=[img_label_frame, img_label],
enter_color=hovered_color,
leave_color=fg_color,
clicked_color=clicked_color,
buttonReleasedFunction=callback,
)
img_label.grid()
img_label_frame.img_label = img_label
return img_label_frame
@staticmethod
def dupTuple(value):
return (value, value)

View File

@@ -296,6 +296,16 @@ def _darkTheme(base_color):
SB__ERROR_MESSAGE_BG_COLOR = "#bb4448",
SB__SUCCESS_MESSAGE_BG_COLOR = "#368777",
SB__ERROR_MESSAGE_TEXT_COLOR = "#fff",
# About VRCT
ABOUT_VRCT_BG = base_color.DARK_950_COLOR,
ABOUT_VRCT_DEV_BG = base_color.DARK_888_COLOR,
ABOUT_VRCT_BUTTON_HOVERED_BG_COLOR = base_color.DARK_900_COLOR,
ABOUT_VRCT_BUTTON_CLICKED_BG_COLOR = base_color.DARK_925_COLOR,
ABOUT_VRCT_TELL_US_BUTTON_BORDER_COLOR = base_color.DARK_888_COLOR,
),

View File

@@ -6,6 +6,7 @@ class UiScalingManager():
def __init__(self, scaling_percentage):
scaling_float = int(scaling_percentage.replace("%", "")) / 100
self.SCALING_FLOAT = max(scaling_float, 0.4)
self.common = SimpleNamespace()
self.main = SimpleNamespace()
self.config_window = SimpleNamespace()
@@ -222,7 +223,8 @@ class UiScalingManager():
# Side menu
self.config_window.SIDE_MENU_TOP_PADY = self._calculateUiSize(54)
self.config_window.SIDE_MENU_TOP_PADY = (self._calculateUiSize(54), self._calculateUiSize(60))
self.config_window.SIDE_MENU_LABELS_SEPARATE_MIN_HEIGHT = self._calculateUiSize(40)
self.config_window.SIDE_MENU_LABELS_IPADX = self._calculateUiSize(20)
self.config_window.SIDE_MENU_LABELS_IPADY = self._calculateUiSize(8)
self.config_window.SIDE_MENU_LABELS_FONT_SIZE = self._calculateUiSize(18)
@@ -237,7 +239,10 @@ class UiScalingManager():
# Setting Box
self.config_window.MAIN_AREA_MIN_WIDTH = self._calculateUiSize(720)
self.config_window.SB__TOP_PADY = (self._calculateUiSize(60))
self.config_window.ABOUT_VRCT_SB__TOP_PADY = self._calculateUiSize(42) # Exception
self.config_window.SB__TOP_PADY = self._calculateUiSize(60)
self.config_window.SB__IPADX = self._calculateUiSize(20)
self.config_window.SB__IPADY = self._calculateUiSize(12)
self.config_window.SB__BOTTOM_MARGIN = (0, self._calculateUiSize(60))

View File

@@ -1,2 +1,4 @@
from .ColorThemeManager import ColorThemeManager
from .UiScalingManager import UiScalingManager
from .UiScalingManager import UiScalingManager
from .AboutVrctManager import AboutVrctManager

View File

@@ -1,6 +1,7 @@
from os import path as os_path
from PIL.Image import open as Image_open, LANCZOS
from time import sleep
from time import sleep, time
import math
from customtkinter import CTkFrame, CTkLabel, CTkImage, CTkFont
@@ -10,8 +11,17 @@ def getImagePath(file_name):
def getImageFileFromUiUtils(file_name):
# root\img\file_name
img = Image_open(os_path.join(os_path.dirname(os_path.dirname(os_path.dirname(__file__))), "img", file_name))
return img
return Image_open(os_path.join(os_path.dirname(os_path.dirname(os_path.dirname(__file__))), "img", file_name))
def getImageFileFromUiUtils_AboutVrct(file_name, directly_type:str=None):
# root\img\about_vrct\file_name or directly_name...
directly_path = ["img", "about_vrct"]
if directly_type == "showcased_worlds":
directly_path.append("showcased_worlds")
elif directly_type == "vrct_posters":
directly_path.append("vrct_posters")
return Image_open(os_path.join(os_path.dirname(os_path.dirname(os_path.dirname(__file__))), *directly_path, file_name))
def openImageKeepAspectRatio(image_file, desired_width):
wpercent = (desired_width/float(image_file.size[0]))
@@ -54,12 +64,12 @@ def getLongestText_Dict(text_dict:dict):
return longest_text
def calculateUiSize(default_size, scaling_float, is_allowed_odd:bool=False, is_zero_allowed:bool=False):
size = int(default_size * scaling_float)
size += 1 if not is_allowed_odd and size % 2 != 0 else 0
if size <= 0:
size = 0 if is_zero_allowed else 1
size = int(default_size * scaling_float)
size += 1 if not is_allowed_odd and size % 2 != 0 else 0
if size <= 0:
size = 0 if is_zero_allowed else 1
return size
return size
def bindEnterAndLeaveColor(target_widgets, enter_color, leave_color):
for target_widget in target_widgets:
@@ -372,4 +382,29 @@ def fadeInAnimation(root_widget, steps:int=10, interval:float=0.1, max_alpha:flo
root_widget.update()
sleep(interval)
num += step_size
root_widget.attributes("-alpha", max_alpha)
root_widget.attributes("-alpha", max_alpha)
def rotateImage(image, angle, to_expand=False):
rotated_image = image.rotate(angle, expand=to_expand)
return rotated_image
def animateRotation(tk_root, img_frame, img, img_width, img_height, start_angle:int, goal_angle:int, duration=0.5, to_expand:bool=False):
start_time = time()
while True:
elapsed_time = time() - start_time
progress = min(elapsed_time / duration, 1.0)
eased_progress = 1 - math.pow(1 - progress, 4)
angle = start_angle + (goal_angle - start_angle) * eased_progress
angle = -angle
rotated_img = rotateImage(img, angle, to_expand)
img_frame.configure(image=CTkImage(rotated_img, size=(img_width, img_height)))
tk_root.update()
if elapsed_time >= duration:
break
sleep(0.01)