Compare commits
2 Commits
0.8.0
...
3451751dcc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3451751dcc | ||
|
|
6f9fd5d984 |
2
ACCORDANCE
Normal file
2
ACCORDANCE
Normal file
@@ -0,0 +1,2 @@
|
||||
Для 10 платформы: https://www.basealt.ru/fileadmin/user_upload/compatibility/P10-view2.html
|
||||
Для 11 платформы: https://www.basealt.ru/fileadmin/user_upload/compatibility/P11-view2.html
|
||||
@@ -1,10 +1,5 @@
|
||||
История изменений:
|
||||
|
||||
0.8.0
|
||||
* добавлено автоопределение .reg и .dll файлов для их добавленния в реестр префикса
|
||||
* во вкладку "Справка" добавлены ссылки на старницы с сертификатами
|
||||
* другие небольшие улучшения и оптимизации скриптов и графического интерфейса
|
||||
|
||||
0.7.0
|
||||
* обновлен графический режим Qt5
|
||||
- добавлена кнопка открытия каталога с резервными копиями и логами
|
||||
@@ -13,7 +8,7 @@
|
||||
- добавлено отображения процесса установки сторонних компонентов с помощью winetricks
|
||||
- добавлена возможность отображения и установки тестовых скриптов (выключено по умолчанию)
|
||||
* добавлены скрипты установки для t-flex версии 18
|
||||
* в CLI добавлен список тестовых скриптов установки ПО
|
||||
* добавлен список тестовых скриптов установки ПО
|
||||
* добавлена возможность ассоциации файлов для передачи в приложения запускаемых в WineHelper
|
||||
|
||||
0.6.0
|
||||
|
||||
7
GENERAL
7
GENERAL
@@ -1,7 +0,0 @@
|
||||
# Руководство пользователя
|
||||
Подробное и актуальное руководство по использованию WineHelper смотрите на сайте: https://www.altlinux.org/Winehelper
|
||||
|
||||
# Совместимость ПО и сертификаты
|
||||
С полным списком совместимого ПО и сертификатами можно ознакомиться по следующим ссылкам:
|
||||
Для 10 платформы: https://www.basealt.ru/fileadmin/user_upload/compatibility/P10-view2.html
|
||||
Для 11 платформы: https://www.basealt.ru/fileadmin/user_upload/compatibility/P11-view2.html
|
||||
@@ -2,16 +2,15 @@
|
||||
# info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций.
|
||||
########################################################################
|
||||
export PROG_URL="https://scadoffice.ru"
|
||||
export WH_WINE_USE="wine-8.8-staging-amd64"
|
||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WINEPREFIX="scadoffice"
|
||||
export PROG_NAME="SCAD Office"
|
||||
export PROG_ICON="scadoffice"
|
||||
export BASE_PFX="none"
|
||||
export BASE_PFX="scadaoffice_pfx_x64_v05"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEARCH="win64"
|
||||
export INSTALL_DLL="dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6" #dotnet20
|
||||
export INSTALL_DLL="dotnet20 dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6"
|
||||
export WH_XDG_OPEN="rtf"
|
||||
|
||||
AUTOINSTALL_EXE="${WH_TMP_DIR}/SCADOffice_installer.exe"
|
||||
SCADOFFICE_ADDONS_URL="https://cloud.linux-gaming.ru/portproton/scadoffice_addons_v02.tar.xz"
|
||||
|
||||
@@ -33,46 +32,50 @@ if [[ -n $2 ]] ; then
|
||||
fi
|
||||
fi
|
||||
|
||||
if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then
|
||||
create_new_dir "$DRIVE_C/SDATA"
|
||||
create_new_dir "$DRIVE_C/SWORK"
|
||||
wine_run_install "$AUTOINSTALL_EXE"
|
||||
# try_remove_file "$AUTOINSTALL_EXE"
|
||||
fi
|
||||
|
||||
print_info "Установка дополнительных компонентов..."
|
||||
|
||||
ADDONS_PACK="${WH_TMP_DIR}/$(basename "$SCADOFFICE_ADDONS_URL")"
|
||||
ADDONS_PATH="${WH_TMP_DIR}/scadoffice_addons"
|
||||
|
||||
if try_download "$SCADOFFICE_ADDONS_URL" "$ADDONS_PACK" ; then
|
||||
ADDONS_PATH="${WH_TMP_DIR}/scadoffice_addons"
|
||||
create_new_dir "$ADDONS_PATH"
|
||||
unpack "$ADDONS_PACK" "$ADDONS_PATH"
|
||||
# try_remove_file "$ADDONS_PACK"
|
||||
ADDONS_PATH_REG="${ADDONS_PATH}/REG"
|
||||
ADDONS_PATH_MDAC="${ADDONS_PATH}/mdac64"
|
||||
ADDONS_PATH_OPENSSH="${ADDONS_PATH}/OpenSSH"
|
||||
|
||||
if try_download "$SCADOFFICE_ADDONS_URL" "${ADDONS_PACK}" ; then
|
||||
create_new_dir "${ADDONS_PATH}"
|
||||
unpack "${ADDONS_PACK}" "${ADDONS_PATH}"
|
||||
wine_run regedit "${ADDONS_PATH_REG}"/*.reg
|
||||
|
||||
# Установка ODBC
|
||||
try_remove_dir "${DRIVE_C}/Program Files/Common Files/System"
|
||||
cp -r "${ADDONS_PATH}/mdac64/System" "${DRIVE_C}/Program Files/Common Files/" || fatal
|
||||
cp -r "${ADDONS_PATH}/mdac64"/*.* "${DRIVE_C}/windows/system32/" || fatal
|
||||
rm -fR "$DRIVE_C/Program Files (x86)/Common Files/System"
|
||||
cp -r "${ADDONS_PATH_MDAC}/System" "$DRIVE_C/Program Files (x86)/Common Files/System"
|
||||
cp -r "${ADDONS_PATH_MDAC}"/*.* "$DRIVE_C/windows/system32/"
|
||||
wine_run regedit "${ADDONS_PATH_MDAC}"/*.reg
|
||||
|
||||
# Установка SSH
|
||||
cp -r "${ADDONS_PATH}/OpenSSH" "${DRIVE_C}/windows/system32/" || fatal
|
||||
|
||||
# Применение .reg файлов для изменения реестра
|
||||
wine_run "${ADDONS_PATH}/mdac64"/*.reg
|
||||
wine_run "${ADDONS_PATH}/REG"/*.reg
|
||||
cp -r "${ADDONS_PATH_OPENSSH}" "$DRIVE_C/windows/system32/"
|
||||
|
||||
try_remove_dir "$ADDONS_PATH"
|
||||
try_remove_file "$ADDONS_PACK"
|
||||
fi
|
||||
|
||||
# Определение всех программ, значков и исполняемых файлов
|
||||
declare -a PROG_NAME_All=("Арбат" "Вест" "Глобальные настройки" "Декор" "Дискретная арматура" "Запрос" "Камин" "КоКон" "Комета" "Конструктор сечений" "Консул" "Конфигуратор лицензий" "Кристалл" "Кросс" "Куст" "Магнум" "Монолит" "Откос" "Пастернак" "Преобразование ед. измерений" "Cортамент металлопроката" "Расчет по формуле" "Редактор акселерограмм" "Редактор динамичности" "Редактор материалов" "Тонус" "Эквивалентное сечение" "SCAD++")
|
||||
if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then
|
||||
create_new_dir "$DRIVE_C/SDATA"
|
||||
create_new_dir "$DRIVE_C/SWORK"
|
||||
# временно запрещаем запуск hasplms.exe, hasplmv.exe для успешного завершения установки
|
||||
tmp_winedlloverride_update "hasplms.exe,hasplmv.exe=d"
|
||||
wine_run_install "$AUTOINSTALL_EXE"
|
||||
try_remove_file "$AUTOINSTALL_EXE"
|
||||
|
||||
declare -a PROG_ICON_ALL=("arbat" "west" "globalsettings" "decor" "rebar" "underground" "comein" "cocon" "comet" "section" "consul" "configprotection" "kristall" "cross" "kust" "magnum" "monolit" "slope" "pasternak" "ucalc" "viewprof" "scalc" "acceledit" "betaedit" "materialsedit" "tonus" "sezam" "scadx")
|
||||
# Определение всех программ, значков и исполняемых файлов
|
||||
declare -a PROG_NAME_All=("Арбат" "Вест" "Глобальные настройки" "Декор" "Дискретная арматура" "Запрос" "Камин" "КоКон" "Комета" "Конструктор сечений" "Консул" "Конфигуратор лицензий" "Кристалл" "Кросс" "Куст" "Магнум" "Монолит" "Откос" "Пастернак" "Преобразование ед. измерений" "Cортамент металлопроката" "Расчет по формуле" "Редактор акселерограмм" "Редактор динамичности" "Редактор материалов" "Тонус" "Эквивалентное сечение" "SCAD++")
|
||||
|
||||
declare -a WIN_FILE_EXEC=("${DRIVE_C_SCADOFFICE}/Arbat.exe" "${DRIVE_C_SCADOFFICE}/West.exe" "${DRIVE_C_SCADOFFICE}/GlobalSettings.exe" "${DRIVE_C_SCADOFFICE}/Decor.exe" "${DRIVE_C_SCADOFFICE}/ReBar.exe" "${DRIVE_C_SCADOFFICE}/UnderGround.exe" "${DRIVE_C_SCADOFFICE}/ComeIn.exe" "${DRIVE_C_SCADOFFICE}/CoCon.exe" "${DRIVE_C_SCADOFFICE}/Comet2.exe" "${DRIVE_C_SCADOFFICE}/Section.exe" "${DRIVE_C_SCADOFFICE}/Consul.exe" "${DRIVE_C_SCADOFFICE}/ConfigProtection.exe" "${DRIVE_C_SCADOFFICE}/Kristall.exe" "${DRIVE_C_SCADOFFICE}/Cross.exe" "${DRIVE_C_SCADOFFICE}/Kust2.exe" "${DRIVE_C_SCADOFFICE}/Magnum.exe" "${DRIVE_C_SCADOFFICE}/Monolit.exe" "${DRIVE_C_SCADOFFICE}/Slope.exe" "${DRIVE_C_SCADOFFICE}/Pasternak.exe" "${DRIVE_C_SCADOFFICE}/UCalc.exe" "${DRIVE_C_SCADOFFICE}/ViewProf.exe" "${DRIVE_C_SCADOFFICE}/SCalc.exe" "${DRIVE_C_SCADOFFICE}/AccelEdit.exe" "${DRIVE_C_SCADOFFICE}/BetaEdit.exe" "${DRIVE_C_SCADOFFICE}/MaterialsEdit.exe" "${DRIVE_C_SCADOFFICE}/Tonus.exe" "${DRIVE_C_SCADOFFICE}/Sezam.exe" "${DRIVE_C_SCADOFFICE}/SCADX.exe")
|
||||
declare -a PROG_ICON_ALL=("arbat" "west" "globalsettings" "decor" "rebar" "underground" "comein" "cocon" "comet" "section" "consul" "configprotection" "kristall" "cross" "kust" "magnum" "monolit" "slope" "pasternak" "ucalc" "viewprof" "scalc" "acceledit" "betaedit" "materialsedit" "tonus" "sezam" "scadx")
|
||||
|
||||
# Цикл создания десктоп файлов для scad office
|
||||
for i in "${!PROG_NAME_All[@]}"; do
|
||||
create_desktop "${PROG_NAME_All[i]}" "${WIN_FILE_EXEC[i]}" "${PROG_ICON_ALL[i]}" "nocopy"
|
||||
done
|
||||
declare -a WIN_FILE_EXEC=("${DRIVE_C_SCADOFFICE}/Arbat.exe" "${DRIVE_C_SCADOFFICE}/West.exe" "${DRIVE_C_SCADOFFICE}/GlobalSettings.exe" "${DRIVE_C_SCADOFFICE}/Decor.exe" "${DRIVE_C_SCADOFFICE}/ReBar.exe" "${DRIVE_C_SCADOFFICE}/UnderGround.exe" "${DRIVE_C_SCADOFFICE}/ComeIn.exe" "${DRIVE_C_SCADOFFICE}/CoCon.exe" "${DRIVE_C_SCADOFFICE}/Comet2.exe" "${DRIVE_C_SCADOFFICE}/Section.exe" "${DRIVE_C_SCADOFFICE}/Consul.exe" "${DRIVE_C_SCADOFFICE}/ConfigProtection.exe" "${DRIVE_C_SCADOFFICE}/Kristall.exe" "${DRIVE_C_SCADOFFICE}/Cross.exe" "${DRIVE_C_SCADOFFICE}/Kust2.exe" "${DRIVE_C_SCADOFFICE}/Magnum.exe" "${DRIVE_C_SCADOFFICE}/Monolit.exe" "${DRIVE_C_SCADOFFICE}/Slope.exe" "${DRIVE_C_SCADOFFICE}/Pasternak.exe" "${DRIVE_C_SCADOFFICE}/UCalc.exe" "${DRIVE_C_SCADOFFICE}/ViewProf.exe" "${DRIVE_C_SCADOFFICE}/SCalc.exe" "${DRIVE_C_SCADOFFICE}/AccelEdit.exe" "${DRIVE_C_SCADOFFICE}/BetaEdit.exe" "${DRIVE_C_SCADOFFICE}/MaterialsEdit.exe" "${DRIVE_C_SCADOFFICE}/Tonus.exe" "${DRIVE_C_SCADOFFICE}/Sezam.exe" "${DRIVE_C_SCADOFFICE}/SCADX.exe")
|
||||
|
||||
# Цикл создания десктоп файлов для scad office
|
||||
for i in "${!PROG_NAME_All[@]}"; do
|
||||
create_desktop "${PROG_NAME_All[i]}" "${WIN_FILE_EXEC[i]}" "${PROG_ICON_ALL[i]}" "nocopy"
|
||||
done
|
||||
fi
|
||||
|
||||
27
winehelper
27
winehelper
@@ -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 THIRD_PARTY_FILE WH_ICON_TRAY GENERAL
|
||||
export SCRIPT_NAME USER_WORK_PATH RUN_SCRIPT DATA_PATH CHANGELOG_FILE WH_ICON_PATH LICENSE_FILE AGREEMENT THIRD_PARTY_FILE WH_ICON_TRAY ACCORDANCE
|
||||
|
||||
SCRIPT_NAME="$(basename "$0")"
|
||||
if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
|
||||
@@ -22,7 +22,7 @@ if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
|
||||
LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE"
|
||||
AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT"
|
||||
THIRD_PARTY_FILE="/usr/share/doc/winehelper-$WH_VERSION/THIRD-PARTY"
|
||||
GENERAL="/usr/share/doc/winehelper-$WH_VERSION/GENERAL"
|
||||
ACCORDANCE="/usr/share/doc/winehelper-$WH_VERSION/ACCORDANCE"
|
||||
else
|
||||
# переменные для тестового запуска WineHelper из репозитория
|
||||
USER_WORK_PATH="$HOME/test-$SCRIPT_NAME"
|
||||
@@ -34,7 +34,7 @@ else
|
||||
LICENSE_FILE="$DATA_PATH/LICENSE"
|
||||
AGREEMENT="$DATA_PATH/LICENSE_AGREEMENT"
|
||||
THIRD_PARTY_FILE="$DATA_PATH/THIRD-PARTY"
|
||||
GENERAL="$DATA_PATH/GENERAL"
|
||||
ACCORDANCE="$DATA_PATH/ACCORDANCE"
|
||||
WH_DEVEL="1"
|
||||
|
||||
# минимальная проверка синтаксиса скриптов
|
||||
@@ -54,21 +54,21 @@ fi
|
||||
|
||||
##### MESSAGES FUNCTIONS #####
|
||||
if [[ $WH_USE_GUI != "1" ]] ; then
|
||||
print_error () { printf "\E[31m%s Ошибка: $* %s\e[0m\n" ;}
|
||||
print_warning () { printf "\E[33m%s Предупреждение: $* %s\e[0m\n" ;}
|
||||
print_info () { printf "\E[36m%s Информация: \"$*\" %s\e[0m\n" ;}
|
||||
print_ok () { printf "\E[35m%s Успех: $* %s\e[0m\n" ;}
|
||||
print_error () { printf "\E[31m%s Ошибка: $@ %s\e[0m\n" ;}
|
||||
print_warning () { printf "\E[33m%s Предупреждение: $@ %s\e[0m\n" ;}
|
||||
print_info () { printf "\E[36m%s Информация: \"$@\" %s\e[0m\n" ;}
|
||||
print_ok () { printf "\E[35m%s Успех: $@ %s\e[0m\n" ;}
|
||||
else
|
||||
print_error () { echo -e "Ошибка: $*" ;}
|
||||
print_warning () { echo -e "Предупреждение: $*" ;}
|
||||
print_info () { echo -e "Информация: \"$*\"" ;}
|
||||
print_ok () { echo -e "Успех: $*" ;}
|
||||
print_error () { echo -e "Ошибка: $@" ;}
|
||||
print_warning () { echo -e "Предупреждение: $@" ;}
|
||||
print_info () { echo -e "Информация: \"$@\"" ;}
|
||||
print_ok () { echo -e "Успех: $@" ;}
|
||||
fi
|
||||
|
||||
print_var () { for vp in $@ ; do echo "${vp}=${!vp}" ; done ;}
|
||||
|
||||
fatal () {
|
||||
print_error "$@ Аварийное завершение работы WineHelper!"
|
||||
print_error "$@"
|
||||
[[ -n "$WINESERVER" ]] && "$WINESERVER" -w
|
||||
exit 1
|
||||
}
|
||||
@@ -328,7 +328,6 @@ unpack () {
|
||||
try_get_page () {
|
||||
local url_page="$1"
|
||||
export OUT_PAGE_TMP="${WH_TMP_DIR}/url_page.tmp"
|
||||
try_remove_file "$OUT_PAGE_TMP"
|
||||
print_info "Чтение страницы: $url_page"
|
||||
if ! curl -o "$OUT_PAGE_TMP" -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "$url_page" \
|
||||
|| grep -q "Forbidden" "$OUT_PAGE_TMP"
|
||||
@@ -345,6 +344,7 @@ read_page () {
|
||||
&& [[ -f "$OUT_PAGE_TMP" ]]
|
||||
then
|
||||
cat "$OUT_PAGE_TMP"
|
||||
try_remove_file "$OUT_PAGE_TMP"
|
||||
unset OUT_PAGE_TMP
|
||||
else
|
||||
echo "Используй try_get_page перед read_page"
|
||||
@@ -1541,7 +1541,6 @@ run_autoinstall () {
|
||||
else print_license_agreement
|
||||
fi
|
||||
source "$INSTALL_SCRIPT" "$@"
|
||||
[[ -n $OUT_PAGE_TMP ]] && try_remove_file "$OUT_PAGE_TMP"
|
||||
print_info "Завершена установка $INSTALL_SCRIPT_NAME"
|
||||
else
|
||||
fatal "Скрипт автоматической установки для $INSTALL_SCRIPT_NAME не найден!"
|
||||
|
||||
@@ -13,8 +13,8 @@ from functools import partial
|
||||
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QTabBar,
|
||||
QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox,
|
||||
QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser, QInputDialog, QDialogButtonBox, QSystemTrayIcon, QMenu)
|
||||
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve, pyqtSignal, QRect
|
||||
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor, QTextCharFormat, QColor, QPalette
|
||||
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve, pyqtSignal
|
||||
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor, QTextCharFormat
|
||||
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ class Var:
|
||||
LICENSE_FILE = os.environ.get("LICENSE_FILE")
|
||||
LICENSE_AGREEMENT_FILE = os.environ.get("AGREEMENT")
|
||||
THIRD_PARTY_FILE = os.environ.get("THIRD_PARTY_FILE")
|
||||
GENERAL = os.environ.get("GENERAL")
|
||||
ACCORDANCE = os.environ.get("ACCORDANCE")
|
||||
|
||||
class DependencyManager:
|
||||
"""Класс для управления проверкой и установкой системных зависимостей."""
|
||||
@@ -1739,18 +1739,6 @@ class WineHelperGUI(QMainWindow):
|
||||
self.raise_()
|
||||
self.activateWindow()
|
||||
|
||||
def create_colorized_icon(self, icon_path, color):
|
||||
"""Загружает иконку (SVG) и применяет к ней указанный цвет."""
|
||||
target_pixmap = QPixmap(icon_path)
|
||||
if target_pixmap.isNull():
|
||||
return QIcon()
|
||||
|
||||
painter = QPainter(target_pixmap)
|
||||
painter.setCompositionMode(QPainter.CompositionMode_SourceIn)
|
||||
painter.fillRect(target_pixmap.rect(), QColor(color))
|
||||
painter.end()
|
||||
return QIcon(target_pixmap)
|
||||
|
||||
def create_tray_icon(self):
|
||||
"""Создает и настраивает иконку в системном трее."""
|
||||
if not QSystemTrayIcon.isSystemTrayAvailable():
|
||||
@@ -1759,23 +1747,11 @@ class WineHelperGUI(QMainWindow):
|
||||
|
||||
self.tray_icon = QSystemTrayIcon(self)
|
||||
|
||||
# --- Определение цвета иконки в зависимости от темы ---
|
||||
if Var.WH_ICON_TRAY and os.path.exists(Var.WH_ICON_TRAY):
|
||||
# Получаем цвет текста окна из палитры приложения.
|
||||
# Это хороший индикатор для определения контрастного цвета.
|
||||
window_text_color = self.palette().color(QPalette.WindowText)
|
||||
|
||||
# Если цвет текста светлый (высокая яркость), значит, тема темная.
|
||||
# И наоборот: если цвет текста темный, тема светлая.
|
||||
# Яркость > 127 обычно указывает на светлый цвет.
|
||||
is_dark_theme = window_text_color.lightness() > 127
|
||||
|
||||
if is_dark_theme:
|
||||
# Для темных тем используем белую иконку
|
||||
self.tray_icon.setIcon(self.create_colorized_icon(Var.WH_ICON_TRAY, Qt.white))
|
||||
else:
|
||||
# Для светлых тем используем черную иконку
|
||||
self.tray_icon.setIcon(self.create_colorized_icon(Var.WH_ICON_TRAY, Qt.black))
|
||||
icon_path = Var.WH_ICON_TRAY
|
||||
if icon_path and os.path.exists(icon_path):
|
||||
pixmap = QPixmap(icon_path)
|
||||
if not pixmap.isNull():
|
||||
self.tray_icon.setIcon(QIcon(pixmap))
|
||||
|
||||
# Создаем и сохраняем меню как атрибут класса, чтобы оно не удалялось
|
||||
self.tray_menu = QMenu(self)
|
||||
@@ -3278,44 +3254,43 @@ class WineHelperGUI(QMainWindow):
|
||||
help_subtabs = QTabWidget()
|
||||
help_layout.addWidget(help_subtabs)
|
||||
|
||||
# Подвкладка "Общее"
|
||||
general_tab = QWidget()
|
||||
general_layout = QVBoxLayout(general_tab)
|
||||
general_text = QTextBrowser()
|
||||
general_text.setOpenExternalLinks(True)
|
||||
# Подвкладка "Руководство"
|
||||
guide_tab = QWidget()
|
||||
guide_layout = QVBoxLayout(guide_tab)
|
||||
guide_text = QTextBrowser()
|
||||
guide_text.setOpenExternalLinks(True)
|
||||
|
||||
# --- Блок Совместимость ---
|
||||
accordance_html = ""
|
||||
try:
|
||||
if not Var.GENERAL or not os.path.exists(Var.GENERAL):
|
||||
accordance_file_path = Var.ACCORDANCE
|
||||
if not accordance_file_path or not os.path.exists(accordance_file_path):
|
||||
raise FileNotFoundError
|
||||
|
||||
with open(Var.GENERAL, 'r', encoding='utf-8') as f:
|
||||
general_content = f.read()
|
||||
with open(accordance_file_path, 'r', encoding='utf-8') as f_acc:
|
||||
accordance_lines = f_acc.read().strip().splitlines()
|
||||
|
||||
html_content = ""
|
||||
url_re = re.compile(r'(https?://[^\s]+)')
|
||||
if accordance_lines:
|
||||
accordance_html += '<hr><h2>Совместимость ПО и сертификаты</h2>'
|
||||
accordance_html += '<p>С полным списком совместимого ПО и сертификатами можно ознакомиться по следующим ссылкам:</p><ul>'
|
||||
for line in accordance_lines:
|
||||
url_match = re.search(r'(https?://[^\s]+)', line)
|
||||
if url_match:
|
||||
url = url_match.group(1)
|
||||
description = line[:url_match.start()].strip()
|
||||
accordance_html += f'<li>{html.escape(description)} <a href="{url}">{url}</a></li>'
|
||||
else:
|
||||
accordance_html += f'<li>{html.escape(line)}</li>'
|
||||
accordance_html += '</ul>'
|
||||
except Exception as e:
|
||||
print(f"Не удалось обработать файл ACCORDANCE: {e}")
|
||||
|
||||
for line in general_content.splitlines():
|
||||
line = line.strip()
|
||||
if not line:
|
||||
html_content += "<br>"
|
||||
continue
|
||||
|
||||
line = html.escape(line)
|
||||
line = url_re.sub(r'<a href="\1">\1</a>', line)
|
||||
|
||||
if line.startswith('# '):
|
||||
html_content += f'<h2>{line[2:]}</h2>'
|
||||
elif line.startswith('Для '):
|
||||
html_content += f'<p style="margin-left: 10px;">• {line}</p>'
|
||||
else:
|
||||
html_content += f'<p>{line}</p>'
|
||||
|
||||
general_text.setHtml(html_content)
|
||||
except (FileNotFoundError, TypeError):
|
||||
general_text.setHtml(f'<h2>Ошибка</h2><p>Не удалось загрузить файл с общей информацией по пути:<br>{Var.GENERAL}</p>')
|
||||
|
||||
general_layout.addWidget(general_text)
|
||||
help_subtabs.addTab(general_tab, "Общее")
|
||||
guide_text.setHtml(f"""
|
||||
<h2>Руководство пользователя</h2>
|
||||
<p>Подробное и актуальное руководство по использованию WineHelper смотрите на сайте: <a href="https://www.altlinux.org/Winehelper">https://www.altlinux.org/Winehelper</a></p>
|
||||
""" + accordance_html)
|
||||
guide_layout.addWidget(guide_text)
|
||||
help_subtabs.addTab(guide_tab, "Руководство")
|
||||
|
||||
# Подвкладка "Авторы"
|
||||
authors_tab = QWidget()
|
||||
@@ -4974,7 +4949,7 @@ def main():
|
||||
window.server = server
|
||||
window.show()
|
||||
# Создаем иконку в системном трее после создания окна
|
||||
# window.create_tray_icon() # Временно отключено
|
||||
window.create_tray_icon()
|
||||
return app.exec_()
|
||||
|
||||
return 1
|
||||
|
||||
Reference in New Issue
Block a user