diff --git a/README.md b/README.md index 92de0ef..42f0db3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # mineSquid

- +

@@ -10,7 +10,7 @@

# Описание: -Программа, который поможет вам переключаться между модпаками в майнкрафте. Для этого поместите все ваши модпаки в папку %appdata%/mineSquid/modpacks* (папка доступна с рабочего стола или из меню пуск, ярлык - Папка с модпаками).
+Проект, который поможет вам переключаться между модпаками в майнкрафте. Для этого поместите все ваши модпаки в папку %appdata%/mineSquid/modpacks* (папка доступна с рабочего стола или из меню пуск, ярлык - Папка с модпаками).
*каждый модпак должен находиться в своей собственной папке (например:
/../../minesquid/modpacks/modpack1,
/../../minesquid/modpacks/modpack228,
или /../../minesquid/modpacks/super-puper-modpack)

Навигация:

@@ -52,25 +52,39 @@
Главная

- - + +

Логи

- +

Настройки

- - + +

Диалоговые окна

- - - + + +

+
Примеры цветов оформления +

+ + + + +

+
+
Сравнение компактного и стандартного UI +

+ + +

+
\ No newline at end of file diff --git a/config.ini b/config.ini index dc83ead..cfb8bc1 100644 --- a/config.ini +++ b/config.ini @@ -6,4 +6,5 @@ backup_restore_dlg = True theme = dark window_width = 450 window_height = 750 - +ui_color = cyanaccent200 +compact_ui = True \ No newline at end of file diff --git a/gallery/backup_restored.png b/gallery/backup_restored.png index 2034ca0..002a08e 100644 Binary files a/gallery/backup_restored.png and b/gallery/backup_restored.png differ diff --git a/gallery/compact_ui.png b/gallery/compact_ui.png new file mode 100644 index 0000000..a0ddb8f Binary files /dev/null and b/gallery/compact_ui.png differ diff --git a/gallery/incorrect_settings_warning.png b/gallery/incorrect_settings_warning.png index ad9d2fc..37ebda5 100644 Binary files a/gallery/incorrect_settings_warning.png and b/gallery/incorrect_settings_warning.png differ diff --git a/gallery/light_green.png b/gallery/light_green.png new file mode 100644 index 0000000..e450c43 Binary files /dev/null and b/gallery/light_green.png differ diff --git a/gallery/light_theme.png b/gallery/light_theme.png index 5fde901..a5e0d34 100644 Binary files a/gallery/light_theme.png and b/gallery/light_theme.png differ diff --git a/gallery/log_tab.png b/gallery/log_tab.png index 85e8391..c862ece 100644 Binary files a/gallery/log_tab.png and b/gallery/log_tab.png differ diff --git a/gallery/main_tab.png b/gallery/main_tab.png index 92b5718..9ec7fac 100644 Binary files a/gallery/main_tab.png and b/gallery/main_tab.png differ diff --git a/gallery/modpack_loaded.png b/gallery/modpack_loaded.png index ebc24b1..9a8caa4 100644 Binary files a/gallery/modpack_loaded.png and b/gallery/modpack_loaded.png differ diff --git a/gallery/non_compact_ui.png b/gallery/non_compact_ui.png new file mode 100644 index 0000000..a139b12 Binary files /dev/null and b/gallery/non_compact_ui.png differ diff --git a/gallery/orange.png b/gallery/orange.png new file mode 100644 index 0000000..f787224 Binary files /dev/null and b/gallery/orange.png differ diff --git a/gallery/purple.png b/gallery/purple.png new file mode 100644 index 0000000..0679376 Binary files /dev/null and b/gallery/purple.png differ diff --git a/gallery/settings_tab.png b/gallery/settings_tab.png index 902aae0..b7174f7 100644 Binary files a/gallery/settings_tab.png and b/gallery/settings_tab.png differ diff --git a/gallery/update_check.png b/gallery/update_check.png index 9ee44f5..0f38d2f 100644 Binary files a/gallery/update_check.png and b/gallery/update_check.png differ diff --git a/gallery/yellow.png b/gallery/yellow.png new file mode 100644 index 0000000..f3781d6 Binary files /dev/null and b/gallery/yellow.png differ diff --git a/minesquid.py b/minesquid.py index 291b813..5deb2d8 100644 --- a/minesquid.py +++ b/minesquid.py @@ -3,33 +3,60 @@ import os from tkinter import filedialog from shutil import rmtree, copytree -from datetime import datetime from sys import argv from configparser import ConfigParser import requests from subprocess import Popen -program_version = '3.0' +program_version = '3.1' +build_date = '12.04.2024' class MineSquid: - def __init__(self, minesquid_version): - self.username = os.getlogin() # пользовательское имя, отображается при запуске программы - self.dt = datetime.now() # текущее время + def __init__(self, minesquid_version='nope', minesquid_build_date='nope'): self.mp_list = [] # список модпаков (пуст при запуске) self.game_directory = '' # папка с игрой, по умолчанию не назначена - self.game_directory_exists = False - self.program_directory = os.path.dirname(os.path.abspath(argv[0])) # папка, где расположена сама программа - self.program_version = minesquid_version - self.build_date = '15.03.2024' + self.game_directory_exists = False # существует ли папка с игрой + self.program_directory = os.path.dirname(os.path.abspath(argv[0])) # папка, где расположена программа + self.program_version = minesquid_version # версия программы + self.build_date = minesquid_build_date # дата сборки self.userappdata = f'{os.environ["appdata"]}\\mineSquid' # папка с данными (модпаками, бэкапом, настройками) self.config = ConfigParser() # конфиг - self.default_status = 'готов к работе' def main(self, page: ft.Page): themes = ['dark', 'light'] states = ['ERROR', 'OK'] + colors = { + 'cyanaccent200': ft.colors.CYAN_ACCENT_200, # бирюзовый (стандартный) + 'redaccent700': ft.colors.RED_ACCENT_700, # красный + 'green': ft.colors.GREEN, # зеленый + 'lightgreenaccent400': ft.colors.LIGHT_GREEN_ACCENT_400, # салатовый + 'blue': ft.colors.BLUE, # синий + 'pink': ft.colors.PINK, # розовый + 'pink300': ft.colors.PINK_300, # светло-розовый + 'deeppurple': ft.colors.DEEP_PURPLE, # темно-фиолетовый + 'purple': ft.colors.PURPLE, # фиолетовый + 'purpleaccent': ft.colors.PURPLE_ACCENT, # светло-фиолетовый + 'deeporange': ft.colors.DEEP_ORANGE, # оранжевый + 'orange': ft.colors.ORANGE, # светло-оранжевый + 'yellow': ft.colors.YELLOW, # желтый + } + color_names = { + 'cyanaccent200': "Бирюзовый", + 'redaccent700': "Красный", + 'green': "Зелёный", + 'lightgreenaccent400': 'Салатовый', + 'blue': "Синий", + 'pink': "Розовый", + 'pink300': "Светло-розовый", + 'deeppurple': "Темно-фиолетовый", + 'purple': "Фиолетовый", + 'purpleaccent': "Светло-фиолетовый", + 'deeporange': "Оранжевый", + 'orange': "Светло-оранжевый", + 'yellow': 'Жёлтый', + } error_message = '' page.theme_mode = themes[0] page.title = 'mineSquid' @@ -39,69 +66,93 @@ def main(self, page: ft.Page): page.window_min_width = 375 page.horizontal_alignment = page.vertical_alignment = "center" page.radio = ft.RadioGroup(radio := ft.ListView()) + page.splash = ft.ProgressBar() + page.splash.visible = False def pick_folder(e): folder_field.value = enter_path() folder_field.error_text = '' + check_settings() page.update() def select_folder(e): edit_config('options', 'game_path', a := enter_path()) folder_field.value = a - close_dlg(0) refresh(0) def open_mpfolder(e): Popen(f'explorer {self.userappdata}\\modpacks') - def close_dlg(e): - page.dialog.open = False - page.update() + def close_dlg(e=0): + if page.dialog is not None: + if page.dialog.open: + page.dialog.open = False + page.update() - def open_dlg(e): + def open_dlg(e=0): page.dialog.open = True page.update() - def check_folder_field(e): - if os.path.exists(e.control.value): + def check_settings(e=0): + folder_field_ok = True + width_field_ok = True + height_field_ok = True + + if os.path.exists(folder_field.value): + folder_field_ok = True folder_field.error_text = '' else: + folder_field_ok = False folder_field.error_text = 'Указанный путь не найден' - page.update() - def check_window_size_field(e): - if len(e.control.value) > 0 and int(e.control.value) > 2560: - e.control.error_text = 'Слишком большое значение' - apply_btn.disabled = True - elif (len(e.control.value) > 0 and - ((int(e.control.value) < 375 and e.control.label == 'Ширина окна') or - (int(e.control.value) < 650 and e.control.label == 'Высота окна'))): - e.control.error_text = 'Слишком маленькое значение' - apply_btn.disabled = True - elif len(e.control.value) == 0: - width_and_height_ok = False - apply_btn.disabled = True - e.control.error_text = 'Поле не может быть пустым' + if len(width_field.value) == 0: + width_field.error_text = 'Поле не может быть пустым' + width_field_ok = False + elif int(width_field.value) < 375: + width_field.error_text = 'Слишком маленькое значение' + width_field_ok = False + elif int(width_field.value) > 2560: + width_field.error_text = 'Слишком большое значение' + else: + width_field.error_text = '' + width_field_ok = True + + if len(height_field.value) == 0: + height_field.error_text = 'Поле не может быть пустым' + height_field_ok = False + elif int(height_field.value) < 650: + height_field.error_text = 'Слишком маленькое значение' + height_field_ok = False + elif int(height_field.value) > 2560: + height_field.error_text = 'Слишком большое значение' else: + height_field.error_text = '' + height_field_ok = True + + if folder_field_ok and (width_field_ok and height_field_ok): apply_btn.disabled = False - e.control.error_text = '' + else: + apply_btn.disabled = True + page.update() def apply_settings(e): log_add('*' * 16) log_add('Применение настроек') folder_ok = False - dlg_ok = True # Че может пойти не так? + checkboxes_ok = True # Че может пойти не так? width_and_height_ok = False if os.path.exists(a := folder_field.value): folder_ok = True + else: + folder_field.error_text = 'Указанный путь не найден' if (375 <= int(width_field.value) <= 2560) and (650 <= int(height_field.value) <= 2560): width_and_height_ok = True log_add(f'Папка с игрой...{states[int(folder_ok)]}') - log_add(f'Диалоги...{states[int(dlg_ok)]}') + log_add(f'Чекбоксы...{states[int(checkboxes_ok)]}') log_add(f'Высота и ширина окна...{states[int(width_and_height_ok)]}') - if folder_ok and dlg_ok and width_and_height_ok: + if folder_ok and checkboxes_ok and width_and_height_ok: edit_config('options', 'game_path', a) folder_field.error_text = '' @@ -114,14 +165,18 @@ def apply_settings(e): edit_config('options', 'window_height', str(height_field.value)) edit_config('options', 'window_width', str(width_field.value)) + edit_config('options', 'compact_ui', str(compact_ui_checkbox.value)) + + edit_config('options', 'ui_color', colors[ui_color_dropdown.value]) + log_add('Настройки применены успешно') page.dialog = dlg_settings_applied - open_dlg(0) + open_dlg() read_config() else: log_add('Обнаружены некорректные настройки, не удалось применить') page.dialog = dlg_incorrect_settings - open_dlg(0) + open_dlg() log_add('*' * 16) def reset_settings(e): @@ -131,23 +186,25 @@ def reset_settings(e): log_add("Настройки сброшены") read_config() log_add('*' * 16) - close_dlg(0) + check_settings() + close_dlg() def open_reset_settings_dlg(e): page.dialog = dlg_confirm_reset_settings - open_dlg(0) + open_dlg() def refresh(e): log_add('*' * 16) log_add('Обновление данных') prepare_main_tab() read_config() + check_settings() log_add('Данные обновлены') log_add('*' * 16) def about(e): page.dialog = dlg_about_minesquid - open_dlg(0) + open_dlg() def log_add(what): log.controls.append(ft.Text('- ' + what)) @@ -159,13 +216,15 @@ def open_readme(e): def enter_path(): path = filedialog.askdirectory(initialdir=f'{os.environ["appdata"]}\\.minecraft') if path == '': + close_dlg() page.dialog = dlg_edit_cancel - open_dlg(0) + open_dlg() if self.game_directory != '': return self.game_directory else: return '' else: + close_dlg() return path def build_list(): @@ -187,7 +246,9 @@ def repair_config(**kwargs): 'mp_load_dlg': 'False', 'theme': 'dark', 'window_height': '750', - 'window_width': '450' + 'window_width': '450', + 'ui_color': 'cyanaccent200', + 'compact_ui': 'True' } if 'restore_section' in kwargs: with open(f'{self.userappdata}\\config.ini', 'w') as cfg: @@ -202,7 +263,14 @@ def repair_config(**kwargs): def read_config(): self.config.read(f"{self.userappdata}\\config.ini", encoding="windows-1251") - options = ['game_path', 'mp_load_dlg', 'backup_restore_dlg', 'theme', 'window_width', 'window_height'] + options = ['game_path', + 'mp_load_dlg', + 'backup_restore_dlg', + 'theme', 'window_width', + 'window_height', + 'ui_color', + 'compact_ui' + ] if not self.config.has_section('options'): log_add('Конфиг отсутствует') @@ -220,6 +288,8 @@ def read_config(): config_theme = self.config['options']['theme'] config_width = self.config['options']['window_width'] config_height = self.config['options']['window_height'] + config_ui_color = self.config['options']['ui_color'] + config_compact_ui = self.config['options']['compact_ui'] if os.path.exists(config_game_directory): # Обработка пути к папке с игрой self.game_directory = config_game_directory @@ -258,9 +328,28 @@ def read_config(): width_field.error_text = '' height_field.error_text = '' + ui_color_dropdown.value = colors[config_ui_color] # ставим текущий цвет в выпадающий список + if config_compact_ui == 'True': + page.theme = ft.Theme( + color_scheme_seed=colors[ui_color_dropdown.value], + visual_density=ft.ThemeVisualDensity.COMPACT + ) + compact_ui_checkbox.value = True + else: + page.theme = ft.Theme( + color_scheme_seed=colors[ui_color_dropdown.value], + visual_density=ft.ThemeVisualDensity.COMFORTABLE + ) + compact_ui_checkbox.value = False + page.appbar.bgcolor = colors[ui_color_dropdown.value] # ставим цвет аппбара + page.bottom_appbar.bgcolor = colors[ui_color_dropdown.value] # ставим цвет нижнего аппбара + page.splash.color = colors[ui_color_dropdown.value] # ставим цвет сплэша (прогрессбара) + page.splash.update() # обновляем сплэш (почему он не обновляется сам) + log_add(f"Путь к папке с игрой: {self.game_directory}") log_add(f"Ширина окна: {config_width}") log_add(f"Высота окна: {config_height}") + log_add(f'Цвет интерфейса: {color_names[config_ui_color]}') page.update() @@ -362,8 +451,8 @@ def read_config(): title=ft.Text('О программе'), content=ft.Text( f'mineSquid версии {self.program_version}\n' - f'by Skrepysh\n' - f'Дата сборки: {self.build_date}' + f'Дата сборки: {self.build_date}\n' + f'by Skrepysh' ), actions_alignment=ft.MainAxisAlignment.END, actions=[ @@ -384,7 +473,6 @@ def load_modpack(modpack_number): copytree(f"{self.game_directory}\\mods", f"{self.userappdata}\\backup", dirs_exist_ok=True) log_add('Бэкап создан') - # pb1.finish() else: log_add('Бэкап не требуется') rmtree(f"{self.game_directory}\\mods") @@ -444,7 +532,7 @@ def prepare_main_tab(): page.update() radio.controls.clear() for x in self.mp_list: - a = ft.Radio(value=x, label=x, active_color=ft.colors.CYAN_ACCENT_200) + a = ft.Radio(value=x, label=x, ) radio.controls.append(a) main_tab.content = page.radio page.floating_action_button.disabled = False @@ -462,25 +550,25 @@ def loadmp(e): if not page.radio.value: log_add('Модпак не выбран, отмена операции') page.dialog = dlg_mp - open_dlg(0) + open_dlg() else: page.floating_action_button.disabled = True restore_btn.disabled = True page.update() if self.game_directory_exists: log_add('Все ок, начинаю загрузку...') - progressbar.visible = True + page.splash.visible = True page.update() load_modpack(self.mp_list.index(page.radio.value)) - progressbar.visible = False + page.splash.visible = False if open_dlg_mp_loaded_checkbox.value: page.dialog = dlg_mp_loaded - open_dlg(0) + open_dlg() page.update() else: log_add('Не назначена папка с игрой, отмена операции') page.dialog = dlg_papka - open_dlg(0) + open_dlg() page.floating_action_button.disabled = False restore_btn.disabled = False page.update() @@ -495,20 +583,20 @@ def restore(e): if self.game_directory_exists: if len(os.listdir(f"{self.userappdata}\\backup")) > 0: # Если папка с бэкапом не пуста log_add('Все ок, начинаю восстановление') - progressbar.visible = True + page.splash.visible = True page.update() restore_backup() - progressbar.visible = False + page.splash.visible = False if open_dlg_backup_restored_checkbox.value: page.dialog = dlg_backup_restored - open_dlg(0) + open_dlg() else: log_add('Бэкап отсутствует, отмена операции') page.dialog = dlg_nobackup - open_dlg(0) + open_dlg() else: page.dialog = dlg_papka - open_dlg(0) + open_dlg() log_add('Папка с игрой не назначена, отмена операции') page.floating_action_button.disabled = False restore_btn.disabled = False @@ -518,6 +606,7 @@ def restore(e): def check_for_updates(e): log_add('*' * 16) log_add('Проверка обновлений...') + log_add(f'Текущая версия программы {self.program_version}') global new_version try: repo = 'https://raw.githubusercontent.com/Skrepysh/mineSquid/master/version.txt' @@ -529,27 +618,48 @@ def check_for_updates(e): dlg_update1.content = ft.Text('Не удалось проверить наличие обновлений.\n' 'Проверьте подключение к интернету!') page.dialog = dlg_update1 - open_dlg(0) + open_dlg() return - if float(new_version) > float(self.program_version): - log_add(f"Найдена новая версия программы: {new_version}") + + current_version_major = self.program_version.partition('.')[0] + current_version_minor = self.program_version[len(current_version_major) + 1:] + new_version_major = new_version.partition('.')[0] + new_version_minor = new_version[len(new_version_major) + 1:] + current_version_major = int(current_version_major) + current_version_minor = int(current_version_minor) + new_version_major = int(new_version_major) + new_version_minor = int(new_version_minor) + + def update_available(): + log_add(f'Найдена новая версия программы: {new_version}') dlg_update_available.content = ft.Text(f'Найдена новая версия программы: {new_version}\nУстановить?') page.dialog = dlg_update_available - open_dlg(0) - else: + open_dlg() + + def no_updates(): dlg_update1.title = ft.Text('Информация') dlg_update1.content = ft.Text('У вас установлена последняя версия программы!') page.dialog = dlg_update1 - open_dlg(0) + open_dlg() + + if current_version_major < new_version_major: + update_available() + elif current_version_major == new_version_major: + if new_version_minor > current_version_minor: + update_available() + else: + no_updates() + else: + no_updates() log_add('*' * 16) def install_update(e): log_add('*' * 16) log_add('Начало установки обновления') - progressbar.visible = True + page.splash.visible = True page.update() global new_version - close_dlg(0) + close_dlg() update_url = (f"https://github.com/Skrepysh/mineSquid/releases/download/v{new_version}" f"/mineSquid_v{new_version}_setup.exe") try: @@ -560,7 +670,7 @@ def install_update(e): dlg_update1.title = ft.Text('Ошибка') dlg_update1.content = ft.Text('Не удалось скачать обновление') page.dialog = dlg_update1 - open_dlg(0) + open_dlg() return log_add('Обновление скачано') if os.path.exists(f'{os.environ["temp"]}\\mineSquidUpdate.exe'): @@ -573,23 +683,23 @@ def install_update(e): dlg_update1.title = ft.Text('Ошибка') dlg_update1.content = ft.Text('Не удалось установить обновление') page.dialog = dlg_update1 - open_dlg(0) + open_dlg() else: log_add("Файл обновления потерялся, отмена операции") dlg_update1.title = ft.Text('Ошибка') dlg_update1.content = ft.Text('Не удалось установить обновление') page.dialog = dlg_update1 - open_dlg(0) + open_dlg() log_add('*' * 16) - progressbar.visible = False + page.splash.visible = False page.update() def cancel_update(e): log_add('Обновление отменено пользователем') log_add('*' * 16) - close_dlg(0) + close_dlg() - def check_folders_and_run(): + def check_folders(): if not os.path.exists(f"{self.userappdata}"): os.mkdir(self.userappdata) if not os.path.exists(a := f"{self.userappdata}\\modpacks"): @@ -624,7 +734,6 @@ def check_folders_and_run(): width=25, height=25 ), - bgcolor=ft.colors.CYAN_ACCENT_200, title=ft.Text(f'mineSquid {self.program_version}', color=ft.colors.BLACK), center_title=True, actions=[ @@ -638,7 +747,6 @@ def check_folders_and_run(): ) page.bottom_appbar = ft.BottomAppBar( - bgcolor=ft.colors.CYAN_ACCENT_200, shape=ft.NotchShape.CIRCULAR, content=ft.Row( controls=[ @@ -648,8 +756,6 @@ def check_folders_and_run(): on_click=refresh, tooltip="Обновить данные" ), - progressbar := ft.ProgressBar(width=200, color=ft.colors.BLUE_ACCENT_700, - bgcolor=ft.colors.BLUE_ACCENT_100, visible=False), ft.Container(expand=True), ft.IconButton( tooltip='Папка с модпаками', @@ -660,8 +766,7 @@ def check_folders_and_run(): restore_btn := ft.IconButton(tooltip='Восстановить бэкап', icon=ft.icons.RESTORE, bgcolor=ft.colors.BLACK, - icon_color=ft.colors.CYAN_ACCENT_200, - on_click=restore + on_click=restore, ), theme_btn := ft.IconButton(icon=ft.icons.WB_SUNNY_OUTLINED, icon_color=ft.colors.BLACK, @@ -690,18 +795,17 @@ def check_folders_and_run(): ), ft.Tab( text='Настройки', - content=ft.Column( + content=ft.ListView( controls=[ - ft.Container(), + ft.Container(padding=5), ft.Row( controls=[ folder_field := ft.TextField( hint_text='Введите путь к папке с игрой', label='Путь к папке с игрой', value='', - on_change=check_folder_field, + on_change=check_settings, error_text='', - focused_border_color=ft.colors.CYAN_ACCENT_200, expand=True, border_color=ft.colors.GREY ), @@ -709,10 +813,10 @@ def check_folders_and_run(): text='Обзор...', width=page.window_width * 0.23, on_click=pick_folder, - color=ft.colors.CYAN_ACCENT_200 ), ] ), + ft.Container(padding=5), ft.Row( controls=[ width_field := ft.TextField( @@ -721,10 +825,10 @@ def check_folders_and_run(): value=page.window_width, input_filter=ft.NumbersOnlyInputFilter(), error_text='', - on_change=check_window_size_field, - focused_border_color=ft.colors.CYAN_ACCENT_200, + on_change=check_settings, expand=True, border_color=ft.colors.GREY, + suffix_text='px' ), ft.Text('X', size=24), height_field := ft.TextField( @@ -733,49 +837,56 @@ def check_folders_and_run(): value=page.window_height, input_filter=ft.NumbersOnlyInputFilter(), error_text='', - on_change=check_window_size_field, - focused_border_color=ft.colors.CYAN_ACCENT_200, + on_change=check_settings, expand=True, - border_color=ft.colors.GREY + border_color=ft.colors.GREY, + suffix_text='px' ), ] ), + ft.Container(padding=5), + ui_color_dropdown := ft.Dropdown( + label='Цвет интерфейса', + options=[] + ), + compact_ui_checkbox := ft.Checkbox( + label='Компактный вид интерфейса', + value=True + ), open_dlg_mp_loaded_checkbox := ft.Checkbox( label='Оповещать об успешной загрузке модпака', value=False, - active_color=ft.colors.CYAN_ACCENT_200 ), open_dlg_backup_restored_checkbox := ft.Checkbox( label='Оповещать об успешном восстановлении бэкапа', value=True, - active_color=ft.colors.CYAN_ACCENT_200 ), + ft.Container(padding=5), ft.Row( controls=[ apply_btn := ft.ElevatedButton( text='Применить', expand=True, on_click=apply_settings, - color=ft.colors.CYAN_ACCENT_200 ) ] ), + ft.Container(padding=5), ft.Row( controls=[ ft.ElevatedButton( text='Проверка обновлений', expand=True, on_click=check_for_updates, - color=ft.colors.CYAN_ACCENT_200, ), ft.ElevatedButton( text='О программе', expand=True, on_click=about, - color=ft.colors.CYAN_ACCENT_200 ) ] ), + ft.Container(padding=5), ft.Row( controls=[ ft.ElevatedButton( @@ -785,14 +896,13 @@ def check_folders_and_run(): on_click=open_reset_settings_dlg ) ] - ) + ), + ft.Container(padding=15) # чтобы при слишком маленькой высоте окна кнопка сброса настроек не перекрывалась кнопкой GO ] ), ), ], expand=1, - label_color=ft.colors.CYAN_ACCENT_200, - indicator_color=ft.colors.CYAN_ACCENT_200 ) page.floating_action_button = ft.FloatingActionButton( text='GO', @@ -803,12 +913,19 @@ def check_folders_and_run(): page.floating_action_button_location = ft.FloatingActionButtonLocation.CENTER_DOCKED page.add(t) log_add(f'mineSquid {self.program_version} запущен') - check_folders_and_run() + check_folders() read_config() + check_settings() + for e in colors: + a = ft.dropdown.Option(text=color_names[e], key=colors[e]) + ui_color_dropdown.options.append(a) prepare_main_tab() -program = MineSquid(program_version) +program = MineSquid( + minesquid_version=program_version, + minesquid_build_date=build_date +) if __name__ == "__main__": ft.app(target=program.main) diff --git a/version.txt b/version.txt index f398a20..06a4457 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.0 \ No newline at end of file +3.1 \ No newline at end of file