diff --git a/img/refresh_icon.png b/img/refresh_icon.png new file mode 100644 index 00000000..c5acad15 Binary files /dev/null and b/img/refresh_icon.png differ diff --git a/main.py b/main.py index 5a35e54c..303a7671 100644 --- a/main.py +++ b/main.py @@ -668,5 +668,8 @@ view.register( }, ) +if config.UPDATE_FLAG is True: + view.showUpdateAvailableButton() + if __name__ == "__main__": view.startMainLoop() \ No newline at end of file diff --git a/view.py b/view.py index 60a654a9..174e883f 100644 --- a/view.py +++ b/view.py @@ -91,6 +91,9 @@ class View(): VAR_LABEL_TEXTBOX_RECEIVED=StringVar(value="Received"), # JA: 受信 VAR_LABEL_TEXTBOX_SYSTEM=StringVar(value="System"), # JA: システム + VAR_UPDATE_AVAILABLE=StringVar(value="New version is here!"), # JA: 新しいバージョンが出ました! + # VAR_UPDATE_AVAILABLE=StringVar(value="新しいバージョンが出ました!"), + # Selectable Language Window VAR_TITLE_LABEL_SELECTABLE_LANGUAGE=StringVar(value=""), @@ -389,6 +392,9 @@ class View(): # self._insertSampleConversationToTextbox() + @staticmethod + def showUpdateAvailableButton(): + vrct_gui.update_available_container.grid() @staticmethod def setMainWindowAllWidgetsStatusToNormal(): diff --git a/vrct_gui/main_window/createMainWindowWidgets.py b/vrct_gui/main_window/createMainWindowWidgets.py index 2a6f6e84..b10bdb16 100644 --- a/vrct_gui/main_window/createMainWindowWidgets.py +++ b/vrct_gui/main_window/createMainWindowWidgets.py @@ -1,9 +1,10 @@ from .widgets import createSidebar, createMinimizeSidebarButton, createTextbox, createEntryMessageBox -from customtkinter import CTkFrame +from customtkinter import CTkFrame, CTkLabel, CTkFont, CTkImage -from ..ui_utils import createButtonWithImage, getImagePath +from ..ui_utils import createButtonWithImage, getImagePath, bindButtonFunctionAndColor +import webbrowser def createMainWindowWidgets(vrct_gui, settings, view_variable): vrct_gui.protocol("WM_DELETE_WINDOW", vrct_gui.quitVRCT) @@ -41,6 +42,57 @@ def createMainWindowWidgets(vrct_gui, settings, view_variable): + # Update Available Button + vrct_gui.update_available_container = CTkFrame( + vrct_gui.main_topbar_container, + corner_radius=settings.uism.UPDATE_AVAILABLE_BUTTON_CORNER_RADIUS, + fg_color=settings.ctm.MAIN_BG_COLOR, + cursor="hand2", + ) + vrct_gui.update_available_container.grid(row=0, column=3, padx=settings.uism.UPDATE_AVAILABLE_BUTTON_PADX, pady=settings.uism.TOP_BAR_BUTTON_PADY, sticky="nse") + vrct_gui.update_available_container.grid_remove() + + + vrct_gui.update_available_container.rowconfigure((0,2), weight=1) + + vrct_gui.update_available_icon = CTkLabel( + vrct_gui.update_available_container, + text=None, + corner_radius=0, + height=0, + image=CTkImage(settings.image_file.REFRESH_ICON.rotate(25), size=settings.uism.UPDATE_AVAILABLE_BUTTON_SIZE) + ) + vrct_gui.update_available_icon.grid(row=1, column=0, padx=(settings.uism.UPDATE_AVAILABLE_BUTTON_IPADX, settings.uism.UPDATE_AVAILABLE_PADX_BETWEEN_LABEL_AND_ICON), pady=0) + + + vrct_gui.update_available_label = CTkLabel( + vrct_gui.update_available_container, + textvariable=view_variable.VAR_UPDATE_AVAILABLE, + height=0, + corner_radius=0, + font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.UPDATE_AVAILABLE_BUTTON_FONT_SIZE, weight="normal"), + anchor="e", + text_color=settings.ctm.UPDATE_AVAILABLE_BUTTON_TEXT_COLOR, + ) + # This "right padx +1" is for fixing a bug that sticks out from the frame. I don't know why that happens... + vrct_gui.update_available_label.grid(row=1, column=1, padx=(0,settings.uism.UPDATE_AVAILABLE_BUTTON_IPADX+1), pady=0) + + + bindButtonFunctionAndColor( + target_widgets=[ + vrct_gui.update_available_container, + vrct_gui.update_available_label, + vrct_gui.update_available_icon, + ], + enter_color=settings.ctm.UPDATE_AVAILABLE_BUTTON_HOVERED_BG_COLOR, + leave_color=settings.ctm.UPDATE_AVAILABLE_BUTTON_BG_COLOR, + clicked_color=settings.ctm.UPDATE_AVAILABLE_BUTTON_CLICKED_BG_COLOR, + buttonReleasedFunction=lambda e: webbrowser.open_new_tab("https://booth.pm/ja/items/4814313"), + ) + + + + # Help and Info button vrct_gui.help_and_info_button_container = createButtonWithImage( @@ -54,7 +106,7 @@ def createMainWindowWidgets(vrct_gui, settings, view_variable): button_command=vrct_gui.openHelpAndInfoWindow, corner_radius=settings.uism.HELP_AND_INFO_BUTTON_CORNER_RADIUS, ) - vrct_gui.help_and_info_button_container.grid(row=0, column=3, padx=settings.uism.HELP_AND_INFO_BUTTON_PADX, pady=settings.uism.HELP_AND_INFO_BUTTON_PADY, sticky="e") + vrct_gui.help_and_info_button_container.grid(row=0, column=4, padx=settings.uism.HELP_AND_INFO_BUTTON_PADX, pady=settings.uism.TOP_BAR_BUTTON_PADY, sticky="e") createSidebar(settings, vrct_gui, view_variable) diff --git a/vrct_gui/main_window/widgets/create_sidebar.py b/vrct_gui/main_window/widgets/create_sidebar.py index 95e4eec6..51f7ddab 100644 --- a/vrct_gui/main_window/widgets/create_sidebar.py +++ b/vrct_gui/main_window/widgets/create_sidebar.py @@ -60,6 +60,16 @@ def createSidebar(settings, main_window, view_variable): main_window.sidebar_config_button.grid(row=0, column=0, padx=0, pady=settings.uism.SIDEBAR_CONFIG_BUTTON_IPADY) + # main_window.sidebar_config_button_update_badge = CTkFrame( + # main_window.sidebar_config_button, + # corner_radius=3, + # fg_color="#ca5361", + # width=6, + # height=6, + # ) + # main_window.sidebar_config_button_update_badge.place(relx=0.9, rely=0.1, anchor="center") + + bindButtonFunctionAndColor( target_widgets=[main_window.sidebar_config_button_wrapper, main_window.sidebar_config_button], enter_color=settings.ctm.CONFIG_BUTTON_HOVERED_BG_COLOR, diff --git a/vrct_gui/ui_managers/ColorThemeManager.py b/vrct_gui/ui_managers/ColorThemeManager.py index 9c288b55..2b5833ef 100644 --- a/vrct_gui/ui_managers/ColorThemeManager.py +++ b/vrct_gui/ui_managers/ColorThemeManager.py @@ -172,10 +172,23 @@ class ColorThemeManager(): self.main.MINIMIZE_SIDEBAR_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR # self.main.MINIMIZE_SIDEBAR_BUTTON_DISABLE_COLOR = self.DARK_900_COLOR - self.main.HELP_AND_INFO_BUTTON_BG_COLOR = self.main.MAIN_BG_COLOR - self.main.HELP_AND_INFO_BUTTON_HOVERED_BG_COLOR = self.DARK_850_COLOR - self.main.HELP_AND_INFO_BUTTON_CLICKED_BG_COLOR = self.DARK_950_COLOR - # self.main.HELP_AND_INFO_BUTTON_DISABLE_COLOR = self.DARK_900_COLOR + + + self.main.TOP_BAR_BUTTON_BG_COLOR = self.main.MAIN_BG_COLOR + self.main.TOP_BAR_BUTTON_HOVERED_BG_COLOR = self.DARK_850_COLOR + self.main.TOP_BAR_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR + # self.main.TOP_BAR_BUTTON_DISABLE_COLOR = self.DARK_900_COLOR + + self.main.UPDATE_AVAILABLE_BUTTON_BG_COLOR = self.main.TOP_BAR_BUTTON_BG_COLOR + self.main.UPDATE_AVAILABLE_BUTTON_HOVERED_BG_COLOR = self.main.TOP_BAR_BUTTON_HOVERED_BG_COLOR + self.main.UPDATE_AVAILABLE_BUTTON_CLICKED_BG_COLOR = self.main.TOP_BAR_BUTTON_CLICKED_BG_COLOR + # self.main.UPDATE_AVAILABLE_BUTTON_DISABLE_COLOR = self.main.TOP_BAR_BUTTON_DISABLE_COLOR + self.main.UPDATE_AVAILABLE_BUTTON_TEXT_COLOR = self.PRIMARY_300_COLOR + + self.main.HELP_AND_INFO_BUTTON_BG_COLOR = self.main.TOP_BAR_BUTTON_BG_COLOR + self.main.HELP_AND_INFO_BUTTON_HOVERED_BG_COLOR = self.main.TOP_BAR_BUTTON_HOVERED_BG_COLOR + self.main.HELP_AND_INFO_BUTTON_CLICKED_BG_COLOR = self.main.TOP_BAR_BUTTON_CLICKED_BG_COLOR + # self.main.HELP_AND_INFO_BUTTON_DISABLE_COLOR = self.main.TOP_BAR_BUTTON_DISABLE_COLOR diff --git a/vrct_gui/ui_managers/ImageFileManager.py b/vrct_gui/ui_managers/ImageFileManager.py index 62dcc122..8bb71b4a 100644 --- a/vrct_gui/ui_managers/ImageFileManager.py +++ b/vrct_gui/ui_managers/ImageFileManager.py @@ -30,6 +30,7 @@ class ImageFileManager(): self.ARROW_LEFT = getImageFileFromUiUtils("arrow_left_white.png") self.ARROW_LEFT_DISABLED = getImageFileFromUiUtils("arrow_left_disabled.png") + self.REFRESH_ICON = getImageFileFromUiUtils("refresh_icon.png") self.HELP_ICON = getImageFileFromUiUtils("help_icon_white.png") def _createLightModeImages(self): diff --git a/vrct_gui/ui_managers/UiScalingManager.py b/vrct_gui/ui_managers/UiScalingManager.py index a5769c12..ebac9bec 100644 --- a/vrct_gui/ui_managers/UiScalingManager.py +++ b/vrct_gui/ui_managers/UiScalingManager.py @@ -75,11 +75,21 @@ class UiScalingManager(): self.main.SIDEBAR_CONFIG_BUTTON_PADY = self._calculateUiSize(10) self.main.SIDEBAR_CONFIG_BUTTON_IPADY = self._calculateUiSize(8) + self.main.TOP_BAR_BUTTON_PADY = (self._calculateUiSize(6),0) + + self.main.UPDATE_AVAILABLE_BUTTON_CORNER_RADIUS = self._calculateUiSize(6) + self.main.UPDATE_AVAILABLE_BUTTON_SIZE = (self._calculateUiSize(18), self._calculateUiSize(18)) + self.main.UPDATE_AVAILABLE_BUTTON_FONT_SIZE = self._calculateUiSize(12) + self.main.UPDATE_AVAILABLE_BUTTON_PADX = (0, self._calculateUiSize(4)) + self.main.UPDATE_AVAILABLE_BUTTON_IPADX = self._calculateUiSize(6) + self.main.UPDATE_AVAILABLE_ICON_PADX = (self._calculateUiSize(6), self._calculateUiSize(4)) + self.main.UPDATE_AVAILABLE_PADX_BETWEEN_LABEL_AND_ICON = self._calculateUiSize(4) + + self.main.HELP_AND_INFO_BUTTON_CORNER_RADIUS = self._calculateUiSize(6) self.main.HELP_AND_INFO_BUTTON_SIZE = self._calculateUiSize(24) self.main.HELP_AND_INFO_BUTTON_PADX = (0, self._calculateUiSize(6)) - self.main.HELP_AND_INFO_BUTTON_PADY = (self._calculateUiSize(6),0) self.main.HELP_AND_INFO_BUTTON_IPADXY = self._calculateUiSize(6) self.main.MINIMIZE_SIDEBAR_BUTTON_ICON_SIZE_X = int(self.main.TEXTBOX_PADX/2+self.main.TEXTBOX_CORNER_RADIUS*2)