Polish settings UI layout and spacing

This commit is contained in:
2026-02-24 22:42:19 +03:00
parent 1236ba09ac
commit 3459521594

113
main.py
View File

@@ -360,20 +360,17 @@ class BackgroundFileCopyApp:
title_label.pack(pady=8) title_label.pack(pady=8)
toolbar = ttk.Frame(settings_tab) toolbar = ttk.Frame(settings_tab)
toolbar.pack(fill=tk.X, pady=4) toolbar.pack(fill=tk.X, pady=2)
toolbar_row1 = ttk.Frame(toolbar) toolbar_row1 = ttk.Frame(toolbar)
toolbar_row1.pack(fill=tk.X, pady=2) toolbar_row1.pack(fill=tk.X, pady=1)
toolbar_row2 = ttk.Frame(toolbar) toolbar_row2 = ttk.Frame(toolbar)
toolbar_row2.pack(fill=tk.X, pady=2) toolbar_row2.pack(fill=tk.X, pady=1)
ttk.Button(toolbar_row1, text=" Добавить", command=self.add_path_pair).pack(side=tk.LEFT, padx=4) ttk.Button(toolbar_row1, text=" Добавить", command=self.add_path_pair).pack(side=tk.LEFT, padx=4)
ttk.Button(toolbar_row1, text="❌ Удалить", command=self.remove_selected_pair).pack(side=tk.LEFT, padx=4) ttk.Button(toolbar_row1, text="❌ Удалить", command=self.remove_selected_pair).pack(side=tk.LEFT, padx=4)
ttk.Button(toolbar_row1, text="📂 Источник", command=lambda: self.pick_folder_for_item(self.selected_pair_id, "source", "Выберите папку источника")).pack(side=tk.LEFT, padx=4) ttk.Button(toolbar_row1, text="📂 Источник", command=lambda: self.pick_folder_for_item(self.selected_pair_id, "source", "Выберите папку источника")).pack(side=tk.LEFT, padx=4)
ttk.Button(toolbar_row1, text="📂 Назначение", command=lambda: self.pick_folder_for_item(self.selected_pair_id, "dest", "Выберите папку назначения")).pack(side=tk.LEFT, padx=4) ttk.Button(toolbar_row1, text="📂 Назначение", command=lambda: self.pick_folder_for_item(self.selected_pair_id, "dest", "Выберите папку назначения")).pack(side=tk.LEFT, padx=4)
ttk.Button(toolbar_row1, text="▶ Запустить", command=self.start_manual_copy).pack(side=tk.LEFT, padx=4)
ttk.Button(toolbar_row1, text="⏹ Остановить", command=self.stop_copying).pack(side=tk.LEFT, padx=4)
ttk.Button(toolbar_row1, text="💾 Сохранить", command=self.check_and_save).pack(side=tk.LEFT, padx=4)
self.search_var = tk.StringVar(value="") self.search_var = tk.StringVar(value="")
self.filter_status_var = tk.StringVar(value="Все") self.filter_status_var = tk.StringVar(value="Все")
@@ -412,7 +409,12 @@ class BackgroundFileCopyApp:
schedule_frame = ttk.LabelFrame(settings_tab, text="Расписание и поведение", padding="10") schedule_frame = ttk.LabelFrame(settings_tab, text="Расписание и поведение", padding="10")
schedule_frame.pack(fill=tk.X, pady=5) schedule_frame.pack(fill=tk.X, pady=5)
time_frame = ttk.Frame(schedule_frame) scheduler_box = ttk.LabelFrame(schedule_frame, text="Планировщик", padding="8")
scheduler_box.pack(fill=tk.X, pady=(0, 6))
behavior_box = ttk.LabelFrame(schedule_frame, text="Параметры копирования", padding="8")
behavior_box.pack(fill=tk.X)
time_frame = ttk.Frame(scheduler_box)
time_frame.pack(fill=tk.X, pady=5) time_frame.pack(fill=tk.X, pady=5)
self.hour_var = tk.StringVar(value="03") self.hour_var = tk.StringVar(value="03")
@@ -429,19 +431,19 @@ class BackgroundFileCopyApp:
font=("Arial", 9, "italic")) font=("Arial", 9, "italic"))
self.scheduler_status.pack(side=tk.LEFT, padx=10) self.scheduler_status.pack(side=tk.LEFT, padx=10)
schedule_summary_frame = ttk.Frame(schedule_frame) schedule_summary_frame = ttk.Frame(scheduler_box)
schedule_summary_frame.pack(fill=tk.X, pady=4) schedule_summary_frame.pack(fill=tk.X, pady=4)
self.schedule_summary_label = ttk.Label(schedule_summary_frame, text="Расписание: —") self.schedule_summary_label = ttk.Label(schedule_summary_frame, text="Расписание: —")
self.schedule_summary_label.pack(side=tk.LEFT) self.schedule_summary_label.pack(side=tk.LEFT)
ttk.Button(schedule_summary_frame, text="Расписание...", command=self.open_schedule_dialog).pack(side=tk.LEFT, padx=8) ttk.Button(schedule_summary_frame, text="Расписание...", command=self.open_schedule_dialog).pack(side=tk.LEFT, padx=8)
options_frame = ttk.Frame(schedule_frame) options_frame = ttk.Frame(behavior_box)
options_frame.pack(fill=tk.X, pady=5) options_frame.pack(fill=tk.X, pady=5)
options_row1 = ttk.Frame(options_frame) options_row1 = ttk.Frame(options_frame)
options_row1.pack(fill=tk.X, pady=2) options_row1.pack(fill=tk.X, pady=3)
options_row2 = ttk.Frame(options_frame) options_row2 = ttk.Frame(options_frame)
options_row2.pack(fill=tk.X, pady=2) options_row2.pack(fill=tk.X, pady=3)
self.autostart_check = ttk.Checkbutton( self.autostart_check = ttk.Checkbutton(
options_row1, options_row1,
@@ -449,64 +451,75 @@ class BackgroundFileCopyApp:
variable=self.autostart_enabled, variable=self.autostart_enabled,
command=self.toggle_autostart command=self.toggle_autostart
) )
self.autostart_check.pack(side=tk.LEFT) autostart_help = ttk.Button(
options_row1,
ttk.Button(options_row1, text="?", width=2, text="?",
command=lambda: self.show_hint("Автозапуск", width=2,
"Добавляет программу в автозапуск Windows.")).pack(side=tk.LEFT, padx=4) command=lambda: self.show_hint("Автозапуск", "Добавляет программу в автозапуск Windows.")
)
self.minimize_check = ttk.Checkbutton( self.minimize_check = ttk.Checkbutton(
options_row1, options_row1,
text="Сворачивать в трей при закрытии", text="Сворачивать в трей при закрытии",
variable=self.minimize_to_tray_enabled variable=self.minimize_to_tray_enabled
) )
self.minimize_check.pack(side=tk.LEFT, padx=10) minimize_help = ttk.Button(
options_row1,
text="?",
width=2,
command=lambda: self.show_hint("Сворачивание", "По крестику окно скрывается в трей.")
)
ttk.Button(options_row1, text="?", width=2, self.autostart_check.grid(row=0, column=0, sticky="w", padx=(0, 4))
command=lambda: self.show_hint("Сворачивание", autostart_help.grid(row=0, column=1, sticky="w", padx=(0, 12))
"По крестику окно скрывается в трей.")).pack(side=tk.LEFT, padx=4) self.minimize_check.grid(row=0, column=2, sticky="w", padx=(0, 4))
minimize_help.grid(row=0, column=3, sticky="w")
self.verify_check = ttk.Checkbutton( self.verify_check = ttk.Checkbutton(
options_row2, options_row2,
text="Только проверка (без копирования)", text="Только проверка (без копирования)",
variable=self.verify_only variable=self.verify_only
) )
self.verify_check.pack(side=tk.LEFT) verify_help = ttk.Button(
options_row2,
ttk.Button(options_row2, text="?", width=2, text="?",
command=lambda: self.show_hint("Проверка", width=2,
"Проверяет совпадение контрольных сумм без копирования.")).pack(side=tk.LEFT, padx=4) command=lambda: self.show_hint("Проверка", "Проверяет совпадение контрольных сумм без копирования.")
)
self.cleanup_check = ttk.Checkbutton( self.cleanup_check = ttk.Checkbutton(
options_row2, options_row2,
text="Удалять старые файлы в назначении", text="Удалять старые файлы в назначении",
variable=self.cleanup_old_var, variable=self.cleanup_old_var,
command=self.on_cleanup_toggle command=self.on_cleanup_toggle
) )
self.cleanup_check.pack(side=tk.LEFT, padx=10) cleanup_help = ttk.Button(
options_row2,
text="?",
width=2,
command=lambda: self.show_hint("Очистка", "В режиме 'последний файл' удаляет старые файлы в папке назначения.")
)
ttk.Button(options_row2, text="?", width=2, self.verify_check.grid(row=0, column=0, sticky="w", padx=(0, 4))
command=lambda: self.show_hint("Очистка", verify_help.grid(row=0, column=1, sticky="w", padx=(0, 12))
"В режиме 'последний файл' удаляет старые файлы в папке назначения.")).pack(side=tk.LEFT, padx=4) self.cleanup_check.grid(row=0, column=2, sticky="w", padx=(0, 4))
cleanup_help.grid(row=0, column=3, sticky="w")
ttk.Label(options_row2, text="Хранить последних:").pack(side=tk.LEFT, padx=(10, 4)) perf_frame = ttk.Frame(behavior_box)
self.keep_files_spin = ttk.Spinbox(options_row2, from_=1, to=999, width=4, textvariable=self.keep_files_var) perf_frame.pack(fill=tk.X, pady=4)
self.keep_files_spin.pack(side=tk.LEFT) ttk.Label(perf_frame, text="Мин. свободно, ГБ:", width=20, anchor=tk.W).pack(side=tk.LEFT)
self.min_free_entry = ttk.Entry(perf_frame, textvariable=self.min_free_gb_var, width=6)
self.min_free_entry.pack(side=tk.LEFT, padx=(2, 6))
self.min_free_entry.bind("<KeyRelease>", lambda _e: self.request_autosave())
ttk.Label(perf_frame, text="Параллельных потоков:", width=23, anchor=tk.W).pack(side=tk.LEFT, padx=(4, 0))
self.max_workers_entry = ttk.Entry(perf_frame, textvariable=self.max_workers_var, width=4)
self.max_workers_entry.pack(side=tk.LEFT, padx=(2, 6))
self.max_workers_entry.bind("<KeyRelease>", lambda _e: self.request_autosave())
ttk.Label(perf_frame, text="Хранить последних:", width=19, anchor=tk.W).pack(side=tk.LEFT, padx=(4, 0))
self.keep_files_spin = ttk.Spinbox(perf_frame, from_=1, to=999, width=4, textvariable=self.keep_files_var)
self.keep_files_spin.pack(side=tk.LEFT, padx=(2, 0))
self.keep_files_spin.bind("<KeyRelease>", lambda _e: self.request_autosave()) self.keep_files_spin.bind("<KeyRelease>", lambda _e: self.request_autosave())
self.keep_files_spin.bind("<FocusOut>", lambda _e: self.request_autosave()) self.keep_files_spin.bind("<FocusOut>", lambda _e: self.request_autosave())
perf_frame = ttk.Frame(schedule_frame) masks_frame = ttk.Frame(behavior_box)
perf_frame.pack(fill=tk.X, pady=4)
ttk.Label(perf_frame, text="Мин. свободно, ГБ:").pack(side=tk.LEFT)
self.min_free_entry = ttk.Entry(perf_frame, textvariable=self.min_free_gb_var, width=6)
self.min_free_entry.pack(side=tk.LEFT, padx=4)
self.min_free_entry.bind("<KeyRelease>", lambda _e: self.request_autosave())
ttk.Label(perf_frame, text="Параллельных потоков:").pack(side=tk.LEFT, padx=8)
self.max_workers_entry = ttk.Entry(perf_frame, textvariable=self.max_workers_var, width=4)
self.max_workers_entry.pack(side=tk.LEFT, padx=4)
self.max_workers_entry.bind("<KeyRelease>", lambda _e: self.request_autosave())
masks_frame = ttk.Frame(schedule_frame)
masks_frame.pack(fill=tk.X, pady=4) masks_frame.pack(fill=tk.X, pady=4)
ttk.Label(masks_frame, text="Включать маски:").pack(side=tk.LEFT) ttk.Label(masks_frame, text="Включать маски:").pack(side=tk.LEFT)
self.include_entry = ttk.Entry(masks_frame, textvariable=self.include_masks_var) self.include_entry = ttk.Entry(masks_frame, textvariable=self.include_masks_var)
@@ -518,15 +531,17 @@ class BackgroundFileCopyApp:
self.exclude_entry.bind("<KeyRelease>", lambda _e: self.request_autosave()) self.exclude_entry.bind("<KeyRelease>", lambda _e: self.request_autosave())
ttk.Button(masks_frame, text="Шаблоны", command=self.show_mask_templates).pack(side=tk.LEFT, padx=6) ttk.Button(masks_frame, text="Шаблоны", command=self.show_mask_templates).pack(side=tk.LEFT, padx=6)
buttons_frame = ttk.Frame(schedule_frame) buttons_frame = ttk.Frame(behavior_box)
buttons_frame.pack(fill=tk.X, pady=5) buttons_frame.pack(fill=tk.X, pady=5)
ttk.Button(buttons_frame, text="🧭 Мастер настройки", ttk.Button(buttons_frame, text="🧭 Мастер настройки",
command=self.open_wizard).pack(side=tk.LEFT, padx=5) command=self.open_wizard).pack(side=tk.LEFT, padx=5)
ttk.Button(buttons_frame, text="💾 Сохранить",
command=self.check_and_save).pack(side=tk.LEFT, padx=5)
ttk.Button(buttons_frame, text="▶ Запустить сейчас", ttk.Button(buttons_frame, text="▶ Запустить сейчас",
command=self.start_manual_copy).pack(side=tk.LEFT, padx=5) command=self.start_manual_copy).pack(side=tk.LEFT, padx=5)
ttk.Button(buttons_frame, text="⏹ Остановить",
command=self.stop_copying).pack(side=tk.LEFT, padx=5)
ttk.Button(buttons_frame, text="💾 Сохранить",
command=self.check_and_save).pack(side=tk.LEFT, padx=5)
paths_frame = ttk.LabelFrame(settings_tab, text="Пары копирования", padding="10") paths_frame = ttk.LabelFrame(settings_tab, text="Пары копирования", padding="10")
paths_frame.pack(fill=tk.BOTH, expand=True, pady=5) paths_frame.pack(fill=tk.BOTH, expand=True, pady=5)