working
This commit is contained in:
parent
f7e794774d
commit
09d181eba8
37 changed files with 1898 additions and 5 deletions
|
|
@ -0,0 +1,5 @@
|
|||
from ui.dialogs.equipment_dialog import EquipmentDialog
|
||||
from ui.dialogs.celestial_dialog import CelestialDialog
|
||||
from ui.dialogs.instructions_dialog import InstructionsDialog
|
||||
|
||||
__all__ = ['EquipmentDialog', 'CelestialDialog', 'InstructionsDialog']
|
||||
BIN
ui/dialogs/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
ui/dialogs/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
ui/dialogs/__pycache__/celestial_dialog.cpython-313.pyc
Normal file
BIN
ui/dialogs/__pycache__/celestial_dialog.cpython-313.pyc
Normal file
Binary file not shown.
BIN
ui/dialogs/__pycache__/equipment_dialog.cpython-313.pyc
Normal file
BIN
ui/dialogs/__pycache__/equipment_dialog.cpython-313.pyc
Normal file
Binary file not shown.
BIN
ui/dialogs/__pycache__/instructions_dialog.cpython-313.pyc
Normal file
BIN
ui/dialogs/__pycache__/instructions_dialog.cpython-313.pyc
Normal file
Binary file not shown.
|
|
@ -0,0 +1,160 @@
|
|||
"""
|
||||
CelestialDialog - диалог управления небесными телами
|
||||
Аналог CelestialBodiesDialogController из JavaFX версии
|
||||
"""
|
||||
from PySide6.QtWidgets import (
|
||||
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QListWidget,
|
||||
QPushButton, QLineEdit, QInputDialog, QMessageBox
|
||||
)
|
||||
from PySide6.QtCore import Qt
|
||||
from PySide6.QtGui import QFont
|
||||
|
||||
from services.config_service import ConfigService
|
||||
|
||||
|
||||
class CelestialDialog(QDialog):
|
||||
"""Диалог для управления списком небесных тел"""
|
||||
|
||||
def __init__(self, parent, config_service: ConfigService):
|
||||
super().__init__(parent)
|
||||
|
||||
self.config_service = config_service
|
||||
self.setWindowTitle("Небесные тела")
|
||||
self.setMinimumSize(400, 500)
|
||||
self.resize(450, 550)
|
||||
|
||||
# Загружаем текущий список
|
||||
self.celestial_bodies = self.config_service.get_celestial_bodies()
|
||||
|
||||
self._create_ui()
|
||||
self._update_list()
|
||||
|
||||
def _create_ui(self):
|
||||
"""Создаёт интерфейс диалога"""
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setSpacing(15)
|
||||
layout.setContentsMargins(20, 20, 20, 20)
|
||||
|
||||
# Заголовок
|
||||
title_label = QLabel("Управление небесными телами")
|
||||
title_font = QFont()
|
||||
title_font.setPointSize(16)
|
||||
title_font.setBold(True)
|
||||
title_label.setFont(title_font)
|
||||
title_label.setAlignment(Qt.AlignCenter)
|
||||
layout.addWidget(title_label)
|
||||
|
||||
# Подпись
|
||||
subtitle_label = QLabel("Список объектов для наблюдения")
|
||||
subtitle_font = QFont()
|
||||
subtitle_font.setPointSize(11)
|
||||
subtitle_font.setBold(True)
|
||||
subtitle_label.setFont(subtitle_font)
|
||||
layout.addWidget(subtitle_label)
|
||||
|
||||
# Список небесных тел
|
||||
self.bodies_list = QListWidget()
|
||||
self.bodies_list.itemClicked.connect(lambda item: self._select_body(item.text()))
|
||||
layout.addWidget(self.bodies_list)
|
||||
|
||||
# Поле для добавления нового
|
||||
add_layout = QHBoxLayout()
|
||||
|
||||
self.new_body_entry = QLineEdit()
|
||||
self.new_body_entry.setPlaceholderText("Название объекта (например: M31, NGC 224)")
|
||||
self.new_body_entry.returnPressed.connect(self._add_celestial_body)
|
||||
add_layout.addWidget(self.new_body_entry)
|
||||
|
||||
add_btn = QPushButton("➕ Добавить")
|
||||
add_btn.clicked.connect(self._add_celestial_body)
|
||||
add_layout.addWidget(add_btn)
|
||||
|
||||
layout.addLayout(add_layout)
|
||||
|
||||
# Кнопки удаления и редактирования
|
||||
buttons_layout = QHBoxLayout()
|
||||
|
||||
self.remove_btn = QPushButton("❌ Удалить выбранный")
|
||||
self.remove_btn.setEnabled(False)
|
||||
self.remove_btn.clicked.connect(self._remove_celestial_body)
|
||||
buttons_layout.addWidget(self.remove_btn)
|
||||
|
||||
self.edit_btn = QPushButton("✏ Редактировать")
|
||||
self.edit_btn.setEnabled(False)
|
||||
self.edit_btn.clicked.connect(self._edit_celestial_body)
|
||||
buttons_layout.addWidget(self.edit_btn)
|
||||
|
||||
layout.addLayout(buttons_layout)
|
||||
|
||||
# Кнопка закрытия
|
||||
close_btn = QPushButton("Закрыть")
|
||||
close_btn.clicked.connect(self.accept)
|
||||
close_layout = QHBoxLayout()
|
||||
close_layout.addStretch()
|
||||
close_layout.addWidget(close_btn)
|
||||
layout.addLayout(close_layout)
|
||||
|
||||
def _update_list(self):
|
||||
"""Обновляет отображение списка небесных тел"""
|
||||
self.bodies_list.clear()
|
||||
for body in self.celestial_bodies:
|
||||
self.bodies_list.addItem(body)
|
||||
self._selected_body = None
|
||||
self.remove_btn.setEnabled(False)
|
||||
self.edit_btn.setEnabled(False)
|
||||
|
||||
def _select_body(self, body: str):
|
||||
"""Выделяет объект в списке"""
|
||||
self._selected_body = body
|
||||
self.remove_btn.setEnabled(True)
|
||||
self.edit_btn.setEnabled(True)
|
||||
|
||||
def _add_celestial_body(self):
|
||||
"""Добавляет новое небесное тело"""
|
||||
new_body = self.new_body_entry.text()
|
||||
if not new_body or not new_body.strip():
|
||||
QMessageBox.warning(self, "Ошибка", "Введите название объекта")
|
||||
return
|
||||
|
||||
new_name = new_body.strip()
|
||||
if new_name in self.celestial_bodies:
|
||||
QMessageBox.warning(self, "Ошибка", f"Объект '{new_name}' уже существует!")
|
||||
return
|
||||
|
||||
self.celestial_bodies.append(new_name)
|
||||
self.config_service.add_celestial_body(new_name)
|
||||
self._update_list()
|
||||
self.new_body_entry.clear()
|
||||
QMessageBox.information(self, "Успех", f"Объект '{new_name}' добавлен")
|
||||
|
||||
def _remove_celestial_body(self):
|
||||
"""Удаляет выбранное небесное тело"""
|
||||
if hasattr(self, '_selected_body') and self._selected_body:
|
||||
reply = QMessageBox.question(self, "Подтверждение",
|
||||
f"Удалить объект '{self._selected_body}'?",
|
||||
QMessageBox.Yes | QMessageBox.No)
|
||||
if reply == QMessageBox.Yes:
|
||||
self.celestial_bodies.remove(self._selected_body)
|
||||
self.config_service.remove_celestial_body(self._selected_body)
|
||||
self._update_list()
|
||||
QMessageBox.information(self, "Успех", f"Объект '{self._selected_body}' удалён")
|
||||
|
||||
def _edit_celestial_body(self):
|
||||
"""Редактирует выбранное небесное тело"""
|
||||
if hasattr(self, '_selected_body') and self._selected_body:
|
||||
new_name, ok = QInputDialog.getText(self, "Редактировать",
|
||||
f"Изменить '{self._selected_body}' на:",
|
||||
text=self._selected_body)
|
||||
if ok and new_name and new_name.strip():
|
||||
new_name = new_name.strip()
|
||||
if new_name != self._selected_body:
|
||||
if new_name in self.celestial_bodies:
|
||||
QMessageBox.warning(self, "Ошибка", f"Объект '{new_name}' уже существует!")
|
||||
return
|
||||
|
||||
idx = self.celestial_bodies.index(self._selected_body)
|
||||
old_name = self.celestial_bodies[idx]
|
||||
self.celestial_bodies[idx] = new_name
|
||||
self.config_service.update_celestial_body(old_name, new_name)
|
||||
self._update_list()
|
||||
QMessageBox.information(self, "Успех", f"Объект переименован в '{new_name}'")
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
"""
|
||||
EquipmentDialog - диалог управления оборудованием (камеры и объективы)
|
||||
Аналог EquipmentDialogController из JavaFX версии
|
||||
"""
|
||||
from PySide6.QtWidgets import (
|
||||
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QListWidget,
|
||||
QPushButton, QInputDialog, QMessageBox, QListWidgetItem
|
||||
)
|
||||
from PySide6.QtCore import Qt
|
||||
from PySide6.QtGui import QFont
|
||||
|
||||
from services.config_service import ConfigService
|
||||
|
||||
|
||||
class EquipmentDialog(QDialog):
|
||||
"""Диалог для управления списками камер и объективов"""
|
||||
|
||||
def __init__(self, parent, config_service: ConfigService):
|
||||
super().__init__(parent)
|
||||
|
||||
self.config_service = config_service
|
||||
self.setWindowTitle("Управление оборудованием")
|
||||
self.setMinimumSize(600, 400)
|
||||
self.resize(650, 450)
|
||||
|
||||
# Загружаем текущие списки
|
||||
self.cameras = self.config_service.get_cameras()
|
||||
self.lenses = self.config_service.get_lenses()
|
||||
|
||||
self._create_ui()
|
||||
self._update_cameras_list()
|
||||
self._update_lenses_list()
|
||||
|
||||
def _create_ui(self):
|
||||
"""Создаёт интерфейс диалога"""
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setSpacing(15)
|
||||
layout.setContentsMargins(20, 20, 20, 20)
|
||||
|
||||
# Заголовок
|
||||
title_label = QLabel("Управление оборудованием")
|
||||
title_font = QFont()
|
||||
title_font.setPointSize(16)
|
||||
title_font.setBold(True)
|
||||
title_label.setFont(title_font)
|
||||
title_label.setAlignment(Qt.AlignCenter)
|
||||
layout.addWidget(title_label)
|
||||
|
||||
# Контейнер для двух колонок
|
||||
columns_layout = QHBoxLayout()
|
||||
columns_layout.setSpacing(20)
|
||||
|
||||
# Левая колонка - Камеры
|
||||
left_layout = QVBoxLayout()
|
||||
|
||||
cameras_label = QLabel("Камеры")
|
||||
cameras_font = QFont()
|
||||
cameras_font.setPointSize(12)
|
||||
cameras_font.setBold(True)
|
||||
cameras_label.setFont(cameras_font)
|
||||
left_layout.addWidget(cameras_label)
|
||||
|
||||
self.cameras_list = QListWidget()
|
||||
self.cameras_list.itemClicked.connect(lambda item: self._select_camera(item.text()))
|
||||
left_layout.addWidget(self.cameras_list)
|
||||
|
||||
cameras_buttons_layout = QHBoxLayout()
|
||||
|
||||
add_camera_btn = QPushButton("➕ Добавить")
|
||||
add_camera_btn.clicked.connect(self._add_camera)
|
||||
cameras_buttons_layout.addWidget(add_camera_btn)
|
||||
|
||||
self.remove_camera_btn = QPushButton("❌ Удалить")
|
||||
self.remove_camera_btn.setEnabled(False)
|
||||
self.remove_camera_btn.clicked.connect(self._remove_camera)
|
||||
cameras_buttons_layout.addWidget(self.remove_camera_btn)
|
||||
|
||||
left_layout.addLayout(cameras_buttons_layout)
|
||||
|
||||
# Правая колонка - Объективы
|
||||
right_layout = QVBoxLayout()
|
||||
|
||||
lenses_label = QLabel("Объективы")
|
||||
lenses_label.setFont(cameras_font)
|
||||
right_layout.addWidget(lenses_label)
|
||||
|
||||
self.lenses_list = QListWidget()
|
||||
self.lenses_list.itemClicked.connect(lambda item: self._select_lens(item.text()))
|
||||
right_layout.addWidget(self.lenses_list)
|
||||
|
||||
lenses_buttons_layout = QHBoxLayout()
|
||||
|
||||
add_lens_btn = QPushButton("➕ Добавить")
|
||||
add_lens_btn.clicked.connect(self._add_lens)
|
||||
lenses_buttons_layout.addWidget(add_lens_btn)
|
||||
|
||||
self.remove_lens_btn = QPushButton("❌ Удалить")
|
||||
self.remove_lens_btn.setEnabled(False)
|
||||
self.remove_lens_btn.clicked.connect(self._remove_lens)
|
||||
lenses_buttons_layout.addWidget(self.remove_lens_btn)
|
||||
|
||||
right_layout.addLayout(lenses_buttons_layout)
|
||||
|
||||
columns_layout.addLayout(left_layout)
|
||||
columns_layout.addLayout(right_layout)
|
||||
layout.addLayout(columns_layout)
|
||||
|
||||
# Кнопка закрытия
|
||||
close_btn = QPushButton("Закрыть")
|
||||
close_btn.clicked.connect(self.accept)
|
||||
close_layout = QHBoxLayout()
|
||||
close_layout.addStretch()
|
||||
close_layout.addWidget(close_btn)
|
||||
layout.addLayout(close_layout)
|
||||
|
||||
def _update_cameras_list(self):
|
||||
"""Обновляет отображение списка камер"""
|
||||
self.cameras_list.clear()
|
||||
for camera in self.cameras:
|
||||
self.cameras_list.addItem(camera)
|
||||
self._selected_camera = None
|
||||
self.remove_camera_btn.setEnabled(False)
|
||||
|
||||
def _update_lenses_list(self):
|
||||
"""Обновляет отображение списка объективов"""
|
||||
self.lenses_list.clear()
|
||||
for lens in self.lenses:
|
||||
self.lenses_list.addItem(lens)
|
||||
self._selected_lens = None
|
||||
self.remove_lens_btn.setEnabled(False)
|
||||
|
||||
def _select_camera(self, camera: str):
|
||||
"""Выделяет камеру в списке"""
|
||||
self._selected_camera = camera
|
||||
self.remove_camera_btn.setEnabled(True)
|
||||
|
||||
# Снимаем выделение с объективов
|
||||
self.lenses_list.clearSelection()
|
||||
self._selected_lens = None
|
||||
self.remove_lens_btn.setEnabled(False)
|
||||
|
||||
def _select_lens(self, lens: str):
|
||||
"""Выделяет объектив в списке"""
|
||||
self._selected_lens = lens
|
||||
self.remove_lens_btn.setEnabled(True)
|
||||
|
||||
# Снимаем выделение с камер
|
||||
self.cameras_list.clearSelection()
|
||||
self._selected_camera = None
|
||||
self.remove_camera_btn.setEnabled(False)
|
||||
|
||||
def _add_camera(self):
|
||||
"""Добавляет новую камеру"""
|
||||
new_camera, ok = QInputDialog.getText(self, "Добавить камеру", "Введите название камеры:")
|
||||
if ok and new_camera and new_camera.strip():
|
||||
new_name = new_camera.strip()
|
||||
if new_name in self.cameras:
|
||||
QMessageBox.warning(self, "Ошибка", "Такая камера уже существует!")
|
||||
return
|
||||
|
||||
self.cameras.append(new_name)
|
||||
self.config_service.add_camera(new_name)
|
||||
self._update_cameras_list()
|
||||
QMessageBox.information(self, "Успех", f"Камера '{new_name}' добавлена")
|
||||
|
||||
def _remove_camera(self):
|
||||
"""Удаляет выбранную камеру"""
|
||||
if hasattr(self, '_selected_camera') and self._selected_camera:
|
||||
reply = QMessageBox.question(self, "Подтверждение",
|
||||
f"Удалить камеру '{self._selected_camera}'?",
|
||||
QMessageBox.Yes | QMessageBox.No)
|
||||
if reply == QMessageBox.Yes:
|
||||
self.cameras.remove(self._selected_camera)
|
||||
self.config_service.remove_camera(self._selected_camera)
|
||||
self._update_cameras_list()
|
||||
QMessageBox.information(self, "Успех", f"Камера '{self._selected_camera}' удалена")
|
||||
|
||||
def _add_lens(self):
|
||||
"""Добавляет новый объектив"""
|
||||
new_lens, ok = QInputDialog.getText(self, "Добавить объектив", "Введите название объектива:")
|
||||
if ok and new_lens and new_lens.strip():
|
||||
new_name = new_lens.strip()
|
||||
if new_name in self.lenses:
|
||||
QMessageBox.warning(self, "Ошибка", "Такой объектив уже существует!")
|
||||
return
|
||||
|
||||
self.lenses.append(new_name)
|
||||
self.config_service.add_lens(new_name)
|
||||
self._update_lenses_list()
|
||||
QMessageBox.information(self, "Успех", f"Объектив '{new_name}' добавлен")
|
||||
|
||||
def _remove_lens(self):
|
||||
"""Удаляет выбранный объектив"""
|
||||
if hasattr(self, '_selected_lens') and self._selected_lens:
|
||||
reply = QMessageBox.question(self, "Подтверждение",
|
||||
f"Удалить объектив '{self._selected_lens}'?",
|
||||
QMessageBox.Yes | QMessageBox.No)
|
||||
if reply == QMessageBox.Yes:
|
||||
self.lenses.remove(self._selected_lens)
|
||||
self.config_service.remove_lens(self._selected_lens)
|
||||
self._update_lenses_list()
|
||||
QMessageBox.information(self, "Успех", f"Объектив '{self._selected_lens}' удалён")
|
||||
|
|
@ -0,0 +1,164 @@
|
|||
"""
|
||||
InstructionsDialog - диалог с инструкцией по использованию
|
||||
"""
|
||||
from PySide6.QtWidgets import (
|
||||
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QTextEdit,
|
||||
QPushButton, QScrollArea
|
||||
)
|
||||
from PySide6.QtCore import Qt
|
||||
from PySide6.QtGui import QFont
|
||||
|
||||
|
||||
class InstructionsDialog(QDialog):
|
||||
"""Диалог с подробной инструкцией пользователя"""
|
||||
|
||||
def __init__(self, parent):
|
||||
super().__init__(parent)
|
||||
|
||||
self.setWindowTitle("Инструкция по использованию")
|
||||
self.setMinimumSize(700, 500)
|
||||
self.resize(750, 550)
|
||||
|
||||
self._create_ui()
|
||||
|
||||
def _create_ui(self):
|
||||
"""Создаёт интерфейс диалога"""
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setSpacing(10)
|
||||
layout.setContentsMargins(15, 15, 15, 15)
|
||||
|
||||
# Заголовок
|
||||
title_label = QLabel("Astro Session Watcher - Руководство пользователя")
|
||||
title_font = QFont()
|
||||
title_font.setPointSize(16)
|
||||
title_font.setBold(True)
|
||||
title_label.setFont(title_font)
|
||||
title_label.setAlignment(Qt.AlignCenter)
|
||||
layout.addWidget(title_label)
|
||||
|
||||
# Текст инструкции
|
||||
text_edit = QTextEdit()
|
||||
text_edit.setReadOnly(True)
|
||||
text_edit.setFont(QFont("Consolas", 10))
|
||||
|
||||
instructions = """
|
||||
======================= ASTRO SESSION WATCHER =======================
|
||||
|
||||
Приложение автоматически отслеживает появление новых фотографий в указанной папке,
|
||||
сортирует их по объектам съемки и ведет подробный лог всего процесса.
|
||||
|
||||
📸 ДЛЯ ЧЕГО ЭТО НУЖНО?
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Когда вы снимаете астрономические объекты через EOS Utility или аналогичное ПО,
|
||||
все фотографии сохраняются в одну папку. Astro Session Watcher помогает:
|
||||
|
||||
• Автоматически распределять снимки по папкам объектов
|
||||
• Вести лог каждой сессии
|
||||
• Не пропустить ни одного кадра при смене объекта
|
||||
• Хранить историю оборудования и небесных тел
|
||||
|
||||
🚀 КАК ЭТО РАБОТАЕТ?
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
1. Вы выбираете папку, куда камера сохраняет снимки
|
||||
2. Приложение создает папку сессии: "AstroSession_ГГГГ-ММ-ДД"
|
||||
3. Каждый объект съемки получает свою подпапку внутри папки сессии
|
||||
4. Когда вы меняете объект (нажимаете "Новая цель"), все накопленные
|
||||
в папке наблюдения файлы автоматически ПЕРЕМЕЩАЮТСЯ в папку предыдущего объекта
|
||||
5. При завершении сессии оставшиеся файлы также перемещаются в папку последнего объекта
|
||||
|
||||
📝 ПОШАГОВАЯ ИНСТРУКЦИЯ
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
█ 1. ПЕРВЫЙ ЗАПУСК (НАСТРОЙКА)
|
||||
───────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
• Откройте меню "Файл" → "Оборудование" и добавьте ваши камеры и объективы
|
||||
• Откройте меню "Файл" → "Небесные тела" и добавьте объекты для наблюдения
|
||||
• Все данные сохраняются автоматически в файлах настроек
|
||||
|
||||
█ 2. ЗАПУСК СЕССИИ
|
||||
───────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
1. Нажмите "Обзор" и выберите папку, куда камера сохраняет снимки
|
||||
2. Выберите камеру и объектив из выпадающих списков
|
||||
3. Введите название цели (или выберите из списка небесных тел)
|
||||
4. Нажмите ▶ "Начать отслеживание"
|
||||
|
||||
✅ После запуска:
|
||||
• Статус изменится на "● ON AIR" с мигающим красным текстом
|
||||
• Кнопка "Новая цель" начнет мигать красным контуром
|
||||
• В папке наблюдения создастся папка "AstroSession_дата"
|
||||
• Внутри - папка с вашей первой целью
|
||||
|
||||
█ 3. СМЕНА ОБЪЕКТА ВО ВРЕМЯ СЕССИИ
|
||||
───────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
Когда вы заканчиваете снимать один объект и переходите к другому:
|
||||
|
||||
1. Нажмите кнопку "Новая цель" (или Ctrl+Shift+N)
|
||||
2. Введите название нового объекта
|
||||
3. Приложение автоматически:
|
||||
• Переместит все накопленные файлы в папку предыдущего объекта
|
||||
• Создаст новую папку для следующего объекта
|
||||
• Сбросит счетчик файлов
|
||||
• Продолжит отслеживание
|
||||
|
||||
💡 ВАЖНО: Если перед сменой объекта в папке наблюдения уже есть файлы,
|
||||
они НЕ ПОТЕРЯЮТСЯ - все будут перемещены в папку текущего объекта!
|
||||
|
||||
█ 4. ЗАВЕРШЕНИЕ СЕССИИ
|
||||
───────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
1. Нажмите ■ "Остановить" (или Ctrl+X)
|
||||
2. Приложение:
|
||||
• Переместит все оставшиеся файлы в папку последнего объекта
|
||||
• Запишет итоговый лог сессии
|
||||
• Покажет диалог с предложением открыть папку сессии
|
||||
• Восстановит интерфейс для новой сессии
|
||||
|
||||
⌨️ ГОРЯЧИЕ КЛАВИШИ
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Ctrl + O → Выбрать папку наблюдения
|
||||
Ctrl + E → Управление оборудованием
|
||||
Ctrl + B → Управление небесными телами
|
||||
Ctrl + S → Начать сессию
|
||||
Ctrl + X → Остановить сессию
|
||||
Ctrl + F → Открыть папку текущей сессии
|
||||
Ctrl + Shift+N → Создать новый объект
|
||||
F1 → О программе
|
||||
F2 → Эта инструкция
|
||||
|
||||
🔧 ФАЙЛЫ НАСТРОЕК
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
📄 astro_settings.json ← камеры, объективы, последняя папка
|
||||
📄 celestial_bodies.json ← список небесных тел
|
||||
|
||||
Все файлы хранятся в папке с программой. Вы можете редактировать их вручную.
|
||||
|
||||
📧 ТЕХНИЧЕСКАЯ ПОДДЕРЖКА
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Разработчик: Vic Sergeev
|
||||
Версия: 0.3.0-alpha
|
||||
|
||||
При обнаружении ошибок или для предложений по улучшению:
|
||||
• Сообщите разработчику
|
||||
• Приложите файлы логов (SessionLog.txt, ObjectLog.txt)
|
||||
"""
|
||||
|
||||
text_edit.setText(instructions)
|
||||
layout.addWidget(text_edit)
|
||||
|
||||
# Кнопка закрытия
|
||||
close_layout = QHBoxLayout()
|
||||
close_layout.addStretch()
|
||||
|
||||
close_btn = QPushButton("Закрыть")
|
||||
close_btn.clicked.connect(self.accept)
|
||||
close_layout.addWidget(close_btn)
|
||||
|
||||
layout.addLayout(close_layout)
|
||||
Loading…
Add table
Add a link
Reference in a new issue