Compare commits

..

1 Commits

Author SHA1 Message Date
cb3fdc62dc added quotes in the install button 2025-08-05 17:09:13 +06:00
3 changed files with 56 additions and 54 deletions

View File

@ -1,14 +0,0 @@
Лицензионные соглашения использования сторонних компонентов:
Некоторые компоненты, установленные в префикс и необходимые для запуска приложений,
могут быть защищены авторским правом или лицензионными соглашениями. Вы обязаны
самостоятельно убедиться в законности использования этих компонентов в вашей
юрисдикции.
Мы не несём ответственности за нарушение лицензионных соглашений, связанное с
использованием подготовленного префикса, а так же за программное обеспечение,
поставляемое из сторонних источников.
Подтверждая продолжение установки, вы соглашаетесь, что ознакомились с данным
отказом от ответственности и принимаете все риски, связанные с использованием
программного обеспечения.

View File

@ -7,7 +7,7 @@ if [[ $(id -u) -eq 0 ]] ; then
fi
##### DEFAULT PATH #####
export SCRIPT_NAME USER_WORK_PATH RUN_SCRIPT DATA_PATH CHANGELOG_FILE WH_ICON_PATH LICENSE_FILE AGREEMENT
export SCRIPT_NAME USER_WORK_PATH RUN_SCRIPT DATA_PATH CHANGELOG_FILE WH_ICON_PATH LICENSE_FILE
SCRIPT_NAME="$(basename "$0")"
if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
@ -18,7 +18,6 @@ if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
CHANGELOG_FILE="$(realpath "/usr/share/doc/winehelper"-*/CHANGELOG)"
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper.svg"
LICENSE_FILE="$(realpath "/usr/share/doc/winehelper"-*/LICENSE)"
AGREEMENT="$(realpath "/usr/share/doc/winehelper"-*/LICENSE_AGREEMENT)"
else
# переменные для тестового запуска WineHelper из репозитория
USER_WORK_PATH="$HOME/test-$SCRIPT_NAME"
@ -27,7 +26,6 @@ else
CHANGELOG_FILE="$DATA_PATH/CHANGELOG"
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper-devel.svg"
LICENSE_FILE="$DATA_PATH/LICENSE"
AGREEMENT="$DATA_PATH/LICENSE_AGREEMENT"
# минимальная проверка синтаксиса скриптов
for self_check_script in "$RUN_SCRIPT" \
@ -369,14 +367,20 @@ print_license_agreement () {
then return 0
fi
if [[ -f "$AGREEMENT" ]]; then
echo
print_warning "$(cat "$AGREEMENT")"
else
fatal "Файл лицензионного соглашения не найден: $AGREEMENT"
fi
echo
print_warning "Лицензионные соглашения использования сторонних компонентов:
Некоторые компоненты, установленные в префикс и необходимые для запуска приложений, могут
быть защищены авторским правом или лицензионными соглашениями. Вы обязаны самостоятельно
убедиться в законности использования этих компонентов в вашей юрисдикции.
Мы не несём ответственности за нарушение лицензионных соглашений, связанное с использованием
подготовленного префикса, а так же за программное обеспечение поставляемого из сторонних источников.
Подтверждая продолжение установки, вы соглашаетесь что ознакомились с данным отказом от
ответственности и принимаете все риски, связанные с использованием программного обеспечения.
"
if print_confirmation "Подтвердите продолжение установки" ; then
touch "$license_agreement_file"
chmod 600 "$license_agreement_file"

View File

@ -4,7 +4,6 @@ import subprocess
import sys
import shlex
import shutil
import html
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,QPushButton, QLabel, QTabWidget,
QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea,
QGridLayout, QFrame, QDialog, QTextBrowser)
@ -21,7 +20,6 @@ class Var:
CHANGELOG_FILE = os.environ.get("CHANGELOG_FILE")
WH_ICON_PATH = os.environ.get("WH_ICON_PATH")
LICENSE_FILE = os.environ.get("LICENSE_FILE")
LICENSE_AGREEMENT_FILE = os.environ.get("AGREEMENT")
class WineHelperGUI(QMainWindow):
def __init__(self):
@ -66,6 +64,7 @@ class WineHelperGUI(QMainWindow):
self.process = None
self.current_script = None
self.install_process = None
self.current_display_name = None
self.install_dialog = None
self.current_active_button = None
self.installed_buttons = []
@ -164,7 +163,7 @@ class WineHelperGUI(QMainWindow):
# Заголовок
self.script_title = QLabel("Выберите программу")
self.script_title.setFont(QFont('Arial', 14, QFont.Bold)) # Шрифт и размер шрифта в заголовке инф. панели
self.script_title.setFont(QFont('Arial', 12, QFont.Bold)) # Шрифт и размер шрифта в заголовке инф. панели
self.script_title.setAlignment(Qt.AlignCenter)
self.info_panel_layout.addWidget(self.script_title)
@ -200,7 +199,7 @@ class WineHelperGUI(QMainWindow):
install_action_layout = QVBoxLayout()
install_action_layout.setContentsMargins(0, 0, 0, 0)
self.install_button = QPushButton("Установить")
self.install_button.setFont(QFont('Arial', 13, QFont.Bold))
self.install_button.setFont(QFont('Arial', 12, QFont.Bold)) # Шрифт и размер шрифта в кнопке Установить
self.install_button.setStyleSheet("background-color: #4CAF50; color: white;")
self.install_button.clicked.connect(self.install_current_script)
install_action_layout.addWidget(self.install_button)
@ -606,6 +605,7 @@ class WineHelperGUI(QMainWindow):
# Подвкладка "Лицензия"
license_tab = QWidget()
license_layout = QVBoxLayout(license_tab)
import html
license_text = QTextBrowser()
license_text.setOpenExternalLinks(True)
@ -834,6 +834,11 @@ class WineHelperGUI(QMainWindow):
print(f"Error getting prefix name from {desktop_file}: {e}")
return None
def _get_current_app_title(self):
"""Возвращает отображаемое имя для текущей выбранной программы."""
# Если display_name не установлено (например, при ошибке), используем имя скрипта
return self.current_display_name or self.current_script
def backup_prefix_for_app(self):
"""Создает резервную копию префикса для выбранного приложения."""
prefix_name = self._get_prefix_name_for_selected_app()
@ -1207,6 +1212,7 @@ class WineHelperGUI(QMainWindow):
prog_name = self.extract_prog_name_from_script(script_path)
prog_url = self.extract_prog_url_from_script(script_path)
display_name = prog_name if prog_name else script_name
self.current_display_name = display_name
if icon_names:
# Для заголовка используем первую иконку из списка
@ -1229,7 +1235,7 @@ class WineHelperGUI(QMainWindow):
self.install_action_widget.setVisible(True)
self.installed_action_widget.setVisible(False)
self.installed_global_action_widget.setVisible(False)
self.install_button.setText(f"Установить {display_name}")
self.install_button.setText(f"Установить «{display_name}»")
def install_current_script(self):
"""Устанавливает текущий выбранный скрипт"""
@ -1243,7 +1249,8 @@ class WineHelperGUI(QMainWindow):
# Создаем диалоговое окно установки
self.install_dialog = QDialog(self)
self.install_dialog.setWindowTitle(f"Установка {self.current_script}")
title_name = self._get_current_app_title()
self.install_dialog.setWindowTitle(f"Установка «{title_name}»")
self.install_dialog.setMinimumSize(750, 400)
self.install_dialog.setWindowModality(Qt.WindowModal)
@ -1256,32 +1263,38 @@ class WineHelperGUI(QMainWindow):
license_page = QWidget()
license_layout = QVBoxLayout(license_page)
license_found = False
license_text = QTextEdit()
license_text.setReadOnly(True)
license_text = QTextBrowser()
# Получаем текст лицензионного соглашения из файла
# Получаем текст лицензии из скрипта winehelper
script_path = os.path.join(Var.DATA_PATH, "winehelper")
license_content = ""
try:
license_file_path = Var.LICENSE_AGREEMENT_FILE
if not license_file_path or not os.path.exists(license_file_path):
raise FileNotFoundError
with open(script_path, 'r', encoding='utf-8') as f:
capturing = False
for line in f:
if 'print_warning "Лицензионные соглашения использования сторонних компонентов:' in line:
capturing = True
continue
with open(license_file_path, 'r', encoding='utf-8') as f:
license_content = f.read()
escaped_license_content = html.escape(license_content)
if capturing:
if 'Подтверждая продолжение установки' in line:
break
# Очищаем строку от лишних символов
clean_line = line.strip()
clean_line = clean_line.replace('print_warning "', '').replace('\\n', '\n')
clean_line = clean_line.rstrip('"')
license_content += clean_line + '\n'
license_text.setHtml(f"""
<pre style="font-family: sans-serif; font-size: 10pt; white-space: pre-wrap; word-wrap: break-word;">{escaped_license_content}</pre>
<h3>Лицензионные соглашения использования сторонних компонентов:</h3>
<p>{license_content}</p>
""")
license_found = True
except (FileNotFoundError, TypeError):
license_text.setHtml(f'<h3>Лицензионные соглашения</h3><p>Не удалось загрузить файл лицензионного соглашения по пути:<br>{Var.LICENSE_AGREEMENT_FILE}</p>')
except Exception as e:
print(f"Ошибка чтения файла лицензии: {str(e)}")
license_text.setHtml(f"""
print(f"Ошибка чтения файла для извлечения лицензии: {str(e)}")
license_text.setHtml("""
<h3>Лицензионные соглашения</h3>
<p>Произошла ошибка при чтении файла лицензии:<br>{str(e)}</p>
<p>Не удалось загрузить текст лицензионного соглашения.</p>
""")
license_layout.addWidget(license_text)
@ -1328,9 +1341,6 @@ class WineHelperGUI(QMainWindow):
lambda state: self.btn_continue.setEnabled(state == Qt.Checked)
)
if not license_found:
self.license_checkbox.setEnabled(False)
self.install_dialog.show()
def _prepare_installation(self):
@ -1375,7 +1385,8 @@ class WineHelperGUI(QMainWindow):
if install_file:
args.append(install_file)
self.append_log(f"=== Начало установки {self.current_script} ===")
title_name = self._get_current_app_title()
self.append_log(f"=== Начало установки «{title_name}» ===")
self.append_log(f"Исполняемый файл: {winehelper_path}")
self.append_log(f"Аргументы: {' '.join(shlex.quote(a) for a in args)}")
@ -1383,7 +1394,7 @@ class WineHelperGUI(QMainWindow):
self.install_process.start(winehelper_path, args)
if not self.install_process.waitForStarted(3000):
raise RuntimeError("Не удалось запустить процесс установки")
self.append_log("Процесс установки запущен...")
self.append_log("Процесс установки успешно запущен...")
except Exception as e:
self.append_log(f"\n=== ОШИБКА: {str(e)} ===", is_error=True)
QMessageBox.critical(self.install_dialog, "Ошибка", f"Не удалось запустить установку:\n{str(e)}")
@ -1416,7 +1427,8 @@ class WineHelperGUI(QMainWindow):
# Создаем кастомный диалог, чтобы кнопка была на русском
success_box = QMessageBox(self.install_dialog)
success_box.setWindowTitle("Успех")
success_box.setText(f"Программа {self.current_script} установлена успешно!")
title_name = self._get_current_app_title()
success_box.setText(f"Программа «{title_name}» установлена успешно!")
success_box.setIcon(QMessageBox.Information)
success_box.addButton("Готово", QMessageBox.AcceptRole)
success_box.exec_()