forked from CastroFidel/winehelper
Compare commits
11 Commits
95b189f5a2
...
dfc6c1c836
Author | SHA1 | Date | |
---|---|---|---|
|
dfc6c1c836 | ||
|
04187e9463 | ||
|
5f915ab58d | ||
|
0e8ee7788a | ||
|
49c1ac6846 | ||
|
971bcd0f5a | ||
|
5b21015aee | ||
|
7dee08bcfb | ||
|
633deaf1c1 | ||
|
4df9508547 | ||
|
989f04cdd8 |
11
CHANGELOG
11
CHANGELOG
@@ -1,5 +1,16 @@
|
|||||||
История изменений:
|
История изменений:
|
||||||
|
|
||||||
|
0.7.0
|
||||||
|
* обновлен графический режим Qt5
|
||||||
|
- добавлена кнопка открытия каталога с резервными копиями и логами
|
||||||
|
- добавлена кнопка открытия каталога с префиксом
|
||||||
|
- добавлена блокировка кнопок для установленного приложения, если оно уже запущено
|
||||||
|
- добавлено отображения процесса установки сторонних компонентов с помощью winetricks
|
||||||
|
- добавлена возможность отображения и установки тестовых скриптов (выключено по умолчанию)
|
||||||
|
* добавлены скрипты установки для t-flex версии 18
|
||||||
|
* добавлен список тестовых скриптов установки ПО
|
||||||
|
* добавлена возможность ассоциации файлов для передачи в приложения запускаемых в WineHelper
|
||||||
|
|
||||||
0.6.0
|
0.6.0
|
||||||
* обновлен графический режим Qt5
|
* обновлен графический режим Qt5
|
||||||
* добавлен иконка в трее для графического режима Qt5
|
* добавлен иконка в трее для графического режима Qt5
|
||||||
|
20
winehelper
20
winehelper
@@ -17,6 +17,7 @@ if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
|
|||||||
RUN_SCRIPT="/usr/bin/$SCRIPT_NAME"
|
RUN_SCRIPT="/usr/bin/$SCRIPT_NAME"
|
||||||
DATA_PATH="/usr/share/$SCRIPT_NAME"
|
DATA_PATH="/usr/share/$SCRIPT_NAME"
|
||||||
WH_ICON_PATH="/usr/share/icons/hicolor/scalable/apps/winehelper.svg"
|
WH_ICON_PATH="/usr/share/icons/hicolor/scalable/apps/winehelper.svg"
|
||||||
|
WH_ICON_TRAY=" /usr/share/icons/hicolor/symbolic/apps/winehelper-symbolic.svg"
|
||||||
CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG"
|
CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG"
|
||||||
LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE"
|
LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE"
|
||||||
AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT"
|
AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT"
|
||||||
@@ -28,6 +29,7 @@ else
|
|||||||
DATA_PATH="$(dirname "$RUN_SCRIPT")"
|
DATA_PATH="$(dirname "$RUN_SCRIPT")"
|
||||||
CHANGELOG_FILE="$DATA_PATH/CHANGELOG"
|
CHANGELOG_FILE="$DATA_PATH/CHANGELOG"
|
||||||
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper-devel.svg"
|
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper-devel.svg"
|
||||||
|
WH_ICON_TRAY="$DATA_PATH/image/gui/winehelper-symbolic.svg"
|
||||||
LICENSE_FILE="$DATA_PATH/LICENSE"
|
LICENSE_FILE="$DATA_PATH/LICENSE"
|
||||||
AGREEMENT="$DATA_PATH/LICENSE_AGREEMENT"
|
AGREEMENT="$DATA_PATH/LICENSE_AGREEMENT"
|
||||||
THIRD_PARTY_FILE="$DATA_PATH/THIRD-PARTY"
|
THIRD_PARTY_FILE="$DATA_PATH/THIRD-PARTY"
|
||||||
@@ -1387,6 +1389,20 @@ prepair_wine () {
|
|||||||
[[ "$MANGOHUD" == 1 ]] && MANGOHUD_RUN="mangohud"
|
[[ "$MANGOHUD" == 1 ]] && MANGOHUD_RUN="mangohud"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wine_regfile () {
|
||||||
|
print_info "Запускаем команду: $WINELOADER $@"
|
||||||
|
"$WINELOADER" "$@" && print_ok "Выполнено." || fatal "Не выполнено: $WINELOADER $@"
|
||||||
|
wait_wineserver
|
||||||
|
|
||||||
|
if [[ "$WINEARCH" == "win64" ]] \
|
||||||
|
&& [[ -f "${WINELOADER}64" ]]
|
||||||
|
then
|
||||||
|
print_info "Запускаем команду: ${WINELOADER}64 $@"
|
||||||
|
"${WINELOADER}64" "$@" && print_ok "Выполнено." || fatal "Не выполнено: ${WINELOADER}64 $@"
|
||||||
|
wait_wineserver
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
wine_run () {
|
wine_run () {
|
||||||
local wh_add_args win_file_exec win_file_path win_file_name
|
local wh_add_args win_file_exec win_file_path win_file_name
|
||||||
|
|
||||||
@@ -1395,6 +1411,9 @@ wine_run () {
|
|||||||
win_file_name="$win_file_exec"
|
win_file_name="$win_file_exec"
|
||||||
win_file_path="$DRIVE_C"
|
win_file_path="$DRIVE_C"
|
||||||
wh_add_args=""
|
wh_add_args=""
|
||||||
|
elif [[ $1 =~ \.dll$ ]] ; then
|
||||||
|
wine_regfile regsvr32 /s "$@"
|
||||||
|
return 0
|
||||||
elif [[ -f "$1" ]] ; then
|
elif [[ -f "$1" ]] ; then
|
||||||
win_file_exec="$(readlink -f "$1")"
|
win_file_exec="$(readlink -f "$1")"
|
||||||
win_file_path="$(dirname "$win_file_exec")"
|
win_file_path="$(dirname "$win_file_exec")"
|
||||||
@@ -1404,6 +1423,7 @@ wine_run () {
|
|||||||
*.exe) wh_add_args="$WINE_WIN_START" ;;
|
*.exe) wh_add_args="$WINE_WIN_START" ;;
|
||||||
*.msi) wh_add_args="msiexec /i" ;;
|
*.msi) wh_add_args="msiexec /i" ;;
|
||||||
*.bat|*.cmd) wh_add_args="" ;;
|
*.bat|*.cmd) wh_add_args="" ;;
|
||||||
|
*.reg) wine_regfile regedit "$@" ; return 0 ;;
|
||||||
*) fatal "Не удалось запустить файл $1. Проверьте расширение файла." ;;
|
*) fatal "Не удалось запустить файл $1. Проверьте расширение файла." ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
@@ -14,7 +14,7 @@ from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QH
|
|||||||
QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox,
|
QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox,
|
||||||
QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser, QInputDialog, QDialogButtonBox, QSystemTrayIcon, QMenu)
|
QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser, QInputDialog, QDialogButtonBox, QSystemTrayIcon, QMenu)
|
||||||
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve, pyqtSignal
|
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve, pyqtSignal
|
||||||
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor
|
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor, QTextCharFormat
|
||||||
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
|
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
|
||||||
|
|
||||||
|
|
||||||
@@ -870,6 +870,9 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
"Подробности смотрите в логе.",
|
"Подробности смотрите в логе.",
|
||||||
QMessageBox.Warning,
|
QMessageBox.Warning,
|
||||||
{"buttons": {"OK": QMessageBox.AcceptRole}})
|
{"buttons": {"OK": QMessageBox.AcceptRole}})
|
||||||
|
# Сбрасываем формат символов к значению по умолчанию.
|
||||||
|
# Это гарантирует, что следующий вызов append() не унаследует красный цвет.
|
||||||
|
self.log_output.setCurrentCharFormat(QTextCharFormat())
|
||||||
self.apply_button.setEnabled(True)
|
self.apply_button.setEnabled(True)
|
||||||
self.close_button.setEnabled(True)
|
self.close_button.setEnabled(True)
|
||||||
return
|
return
|
||||||
@@ -1622,6 +1625,19 @@ class WineHelperGUI(QMainWindow):
|
|||||||
"padding-left: 10px;", "padding-left: 15px;"
|
"padding-left: 10px;", "padding-left: 15px;"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Стиль для кнопок тестовых программ
|
||||||
|
self.TEST_BUTTON_LIST_STYLE = """
|
||||||
|
QPushButton {
|
||||||
|
background-color: #ffdc64; /* Более темный желтый фон */
|
||||||
|
color: black; /* Черный цвет текста для контраста */
|
||||||
|
text-align: left;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
height: 42px; min-height: 42px; max-height: 42px;
|
||||||
|
}
|
||||||
|
QPushButton::icon { padding-left: 10px; }
|
||||||
|
"""
|
||||||
|
|
||||||
# Стили для оберток кнопок (для рамки выделения)
|
# Стили для оберток кнопок (для рамки выделения)
|
||||||
self.FRAME_STYLE_DEFAULT = "QFrame { border: 2px solid transparent; border-radius: 8px; padding: 0px; }"
|
self.FRAME_STYLE_DEFAULT = "QFrame { border: 2px solid transparent; border-radius: 8px; padding: 0px; }"
|
||||||
self.FRAME_STYLE_SELECTED = "QFrame { border: 2px solid #0078d7; border-radius: 8px; padding: 0px; }"
|
self.FRAME_STYLE_SELECTED = "QFrame { border: 2px solid #0078d7; border-radius: 8px; padding: 0px; }"
|
||||||
@@ -1775,8 +1791,11 @@ class WineHelperGUI(QMainWindow):
|
|||||||
if tab_name == "Автоматическая установка":
|
if tab_name == "Автоматическая установка":
|
||||||
title = "Автоматическая установка"
|
title = "Автоматическая установка"
|
||||||
html_content = ("<h3>Автоматическая установка</h3>"
|
html_content = ("<h3>Автоматическая установка</h3>"
|
||||||
"<p>Скрипты из этого списка скачают, установят и настроят приложение за вас.</p>"
|
"<p>Скрипты из этого списка скачают, установят и настроят приложение за вас. Просто выберите программу и нажмите «Установить».</p>"
|
||||||
"<p>Просто выберите программу и нажмите «Установить».</p>")
|
"<p>Для доступа к экспериментальным скриптам установки отметьте опцию <b>«Показать тестовые версии»</b> внизу списка.</p>"
|
||||||
|
"<br><h3>Совместимость с дистрибутивами Альт</h3>"
|
||||||
|
"<p>С полным списком совместимого ПО и сертификатами (не только для WineHelper) можно ознакомиться по следующим ссылкам:<br>"
|
||||||
|
"<a href='https://www.basealt.ru/fileadmin/user_upload/compatibility/P10-view2.html'>Для 10 платформы</a> | <a href='https://www.basealt.ru/fileadmin/user_upload/compatibility/P11-view2.html'>Для 11 платформы</a></p>")
|
||||||
show_global = False
|
show_global = False
|
||||||
elif tab_name == "Ручная установка":
|
elif tab_name == "Ручная установка":
|
||||||
title = "Ручная установка"
|
title = "Ручная установка"
|
||||||
@@ -2064,14 +2083,14 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
return btn
|
return btn
|
||||||
|
|
||||||
def _populate_install_grid(self, grid_layout, scripts_list, script_folder, button_list):
|
def _populate_install_grid(self, grid_layout, scripts_list, script_folder, button_list, start_index=None):
|
||||||
"""
|
"""
|
||||||
Заполняет QGridLayout кнопками установщиков.
|
Заполняет QGridLayout кнопками установщиков.
|
||||||
Кнопки создаются только для скриптов, в которых найдена переменная PROG_NAME.
|
Кнопки создаются только для скриптов, в которых найдена переменная PROG_NAME.
|
||||||
|
|
||||||
:param grid_layout: QGridLayout для заполнения.
|
:param grid_layout: QGridLayout для заполнения.
|
||||||
:param scripts_list: Список имен скриптов.
|
:param scripts_list: Список имен скриптов.
|
||||||
:param script_folder: Имя папки со скриптами ('autoinstall' или 'manualinstall').
|
:param script_folder: Имя папки со скриптами ('autoinstall', 'manualinstall' или 'testinstall').
|
||||||
:param button_list: Список для хранения созданных кнопок.
|
:param button_list: Список для хранения созданных кнопок.
|
||||||
"""
|
"""
|
||||||
button_index = 0
|
button_index = 0
|
||||||
@@ -2085,7 +2104,13 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
icon_names = ScriptParser.extract_icons_from_script(script_path)
|
icon_names = ScriptParser.extract_icons_from_script(script_path)
|
||||||
icon_paths = [os.path.join(Var.DATA_PATH, "image", f"{name}.png") for name in icon_names]
|
icon_paths = [os.path.join(Var.DATA_PATH, "image", f"{name}.png") for name in icon_names]
|
||||||
btn = self._create_app_button(prog_name, icon_paths, self.BUTTON_LIST_STYLE)
|
|
||||||
|
# Выбираем стиль в зависимости от папки
|
||||||
|
if script_folder == 'testinstall':
|
||||||
|
style_sheet = self.TEST_BUTTON_LIST_STYLE
|
||||||
|
else:
|
||||||
|
style_sheet = self.BUTTON_LIST_STYLE
|
||||||
|
btn = self._create_app_button(prog_name, icon_paths, style_sheet)
|
||||||
|
|
||||||
# Обертка для рамки выделения
|
# Обертка для рамки выделения
|
||||||
frame = QFrame()
|
frame = QFrame()
|
||||||
@@ -2095,12 +2120,12 @@ class WineHelperGUI(QMainWindow):
|
|||||||
layout.addWidget(btn)
|
layout.addWidget(btn)
|
||||||
|
|
||||||
btn.clicked.connect(lambda _, s=script, b=btn: self.show_script_info(s, b))
|
btn.clicked.connect(lambda _, s=script, b=btn: self.show_script_info(s, b))
|
||||||
row, column = divmod(button_index, 2)
|
row, column = divmod(len(button_list), 2)
|
||||||
grid_layout.addWidget(frame, row, column)
|
grid_layout.addWidget(frame, row, column)
|
||||||
button_list.append(btn)
|
button_list.append(btn)
|
||||||
button_index += 1
|
button_index += 1
|
||||||
|
|
||||||
def _create_searchable_grid_tab(self, placeholder_text, filter_slot):
|
def _create_searchable_grid_tab(self, placeholder_text, filter_slot, add_stretch=True):
|
||||||
"""
|
"""
|
||||||
Создает стандартную вкладку с полем поиска и сеточным макетом с прокруткой.
|
Создает стандартную вкладку с полем поиска и сеточным макетом с прокруткой.
|
||||||
Возвращает кортеж (главный виджет вкладки, сеточный макет, поле поиска, область прокрутки).
|
Возвращает кортеж (главный виджет вкладки, сеточный макет, поле поиска, область прокрутки).
|
||||||
@@ -2134,11 +2159,12 @@ class WineHelperGUI(QMainWindow):
|
|||||||
grid_layout.setColumnStretch(1, 1)
|
grid_layout.setColumnStretch(1, 1)
|
||||||
|
|
||||||
v_scroll_layout.addLayout(grid_layout)
|
v_scroll_layout.addLayout(grid_layout)
|
||||||
|
if add_stretch:
|
||||||
v_scroll_layout.addStretch(1)
|
v_scroll_layout.addStretch(1)
|
||||||
|
|
||||||
return tab_widget, grid_layout, search_edit, scroll_area
|
return tab_widget, grid_layout, search_edit, scroll_area
|
||||||
|
|
||||||
def _create_and_populate_install_tab(self, tab_title, script_folder, search_placeholder, filter_slot):
|
def _create_and_populate_install_tab(self, tab_title, script_folders, search_placeholder, filter_slot):
|
||||||
"""
|
"""
|
||||||
Создает и заполняет вкладку для установки (автоматической или ручной).
|
Создает и заполняет вкладку для установки (автоматической или ручной).
|
||||||
Возвращает кортеж со скриптами, кнопками и виджетами.
|
Возвращает кортеж со скриптами, кнопками и виджетами.
|
||||||
@@ -2148,16 +2174,17 @@ class WineHelperGUI(QMainWindow):
|
|||||||
)
|
)
|
||||||
|
|
||||||
scripts = []
|
scripts = []
|
||||||
script_path = os.path.join(Var.DATA_PATH, script_folder)
|
buttons_list = []
|
||||||
|
for folder in script_folders:
|
||||||
|
script_path = os.path.join(Var.DATA_PATH, folder)
|
||||||
if os.path.isdir(script_path):
|
if os.path.isdir(script_path):
|
||||||
try:
|
try:
|
||||||
scripts = sorted(os.listdir(script_path))
|
folder_scripts = sorted(os.listdir(script_path))
|
||||||
|
scripts.extend(folder_scripts)
|
||||||
|
self._populate_install_grid(grid_layout, folder_scripts, folder, buttons_list)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
print(f"Не удалось прочитать директорию {script_path}: {e}")
|
print(f"Не удалось прочитать директорию {script_path}: {e}")
|
||||||
|
|
||||||
buttons_list = []
|
|
||||||
self._populate_install_grid(grid_layout, scripts, script_folder, buttons_list)
|
|
||||||
|
|
||||||
self.add_tab(tab_widget, tab_title)
|
self.add_tab(tab_widget, tab_title)
|
||||||
|
|
||||||
return scripts, buttons_list, grid_layout, search_edit, scroll_area
|
return scripts, buttons_list, grid_layout, search_edit, scroll_area
|
||||||
@@ -2168,30 +2195,89 @@ class WineHelperGUI(QMainWindow):
|
|||||||
scripts, buttons, layout,
|
scripts, buttons, layout,
|
||||||
search_edit, scroll_area
|
search_edit, scroll_area
|
||||||
) = self._create_and_populate_install_tab(
|
) = self._create_and_populate_install_tab(
|
||||||
"Автоматическая установка", "autoinstall", "Поиск скрипта автоматической установки...", partial(self.filter_buttons, 'auto')
|
"Автоматическая установка", ["autoinstall"], "Поиск скрипта автоматической установки...", partial(self.filter_buttons, 'auto')
|
||||||
)
|
)
|
||||||
self.autoinstall_scripts = scripts
|
self.autoinstall_scripts = scripts
|
||||||
self.install_tabs_data['auto'] = {
|
self.install_tabs_data['auto'] = {
|
||||||
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Добавляем чекбокс для тестовых версий
|
||||||
|
test_checkbox = QCheckBox("Показать тестовые версии")
|
||||||
|
test_checkbox.setToolTip("Показать/скрыть экспериментальные скрипты установки")
|
||||||
|
|
||||||
|
# Находим layout вкладки, чтобы добавить чекбокс
|
||||||
|
tab_widget = self.stacked_widget.widget(self.stacked_widget.count() - 1)
|
||||||
|
if tab_widget and tab_widget.layout():
|
||||||
|
tab_widget.layout().addWidget(test_checkbox)
|
||||||
|
|
||||||
|
# Подключаем сигнал к слоту обновления
|
||||||
|
test_checkbox.stateChanged.connect(self.update_auto_install_list)
|
||||||
|
|
||||||
|
# Сохраняем чекбокс для доступа в будущем
|
||||||
|
self.install_tabs_data['auto']['test_checkbox'] = test_checkbox
|
||||||
|
|
||||||
def create_manual_install_tab(self):
|
def create_manual_install_tab(self):
|
||||||
"""Создает вкладку для ручной установки программ"""
|
"""Создает вкладку для ручной установки программ"""
|
||||||
(
|
(
|
||||||
scripts, buttons, layout,
|
scripts, buttons, layout,
|
||||||
search_edit, scroll_area
|
search_edit, scroll_area
|
||||||
) = self._create_and_populate_install_tab(
|
) = self._create_and_populate_install_tab(
|
||||||
"Ручная установка", "manualinstall", "Поиск скрипта ручной установки...", partial(self.filter_buttons, 'manual')
|
"Ручная установка", ["manualinstall"], "Поиск скрипта ручной установки...", partial(self.filter_buttons, 'manual')
|
||||||
)
|
)
|
||||||
self.manualinstall_scripts = scripts
|
self.manualinstall_scripts = scripts
|
||||||
self.install_tabs_data['manual'] = {
|
self.install_tabs_data['manual'] = {
|
||||||
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def update_auto_install_list(self):
|
||||||
|
"""Обновляет список на вкладке 'Автоматическая установка' при изменении чекбокса."""
|
||||||
|
data = self.install_tabs_data.get('auto')
|
||||||
|
if not data:
|
||||||
|
return
|
||||||
|
|
||||||
|
script_folders = ["autoinstall"]
|
||||||
|
if data['test_checkbox'].isChecked():
|
||||||
|
script_folders.append("testinstall")
|
||||||
|
|
||||||
|
# Перед удалением кнопок останавливаем все связанные с ними таймеры анимации
|
||||||
|
for btn in data['buttons']:
|
||||||
|
if btn in self.icon_animators:
|
||||||
|
anim_data = self.icon_animators.pop(btn)
|
||||||
|
if 'main_timer' in anim_data:
|
||||||
|
anim_data['main_timer'].stop()
|
||||||
|
if 'animation' in anim_data and anim_data['animation']:
|
||||||
|
anim_data['animation'].stop()
|
||||||
|
|
||||||
|
# Сбрасываем ссылку на активную кнопку, если она была удалена
|
||||||
|
if self.current_active_button in data['buttons']:
|
||||||
|
self.current_active_button = None
|
||||||
|
|
||||||
|
# Очищаем старые кнопки и layout
|
||||||
|
for btn in data['buttons']:
|
||||||
|
btn.parent().deleteLater()
|
||||||
|
data['buttons'].clear()
|
||||||
|
|
||||||
|
# Заполняем layout новыми кнопками
|
||||||
|
scripts = []
|
||||||
|
for folder in script_folders:
|
||||||
|
script_path = os.path.join(Var.DATA_PATH, folder)
|
||||||
|
if os.path.isdir(script_path):
|
||||||
|
try:
|
||||||
|
folder_scripts = sorted(os.listdir(script_path))
|
||||||
|
self._populate_install_grid(data['layout'], folder_scripts, folder, data['buttons'])
|
||||||
|
scripts.extend(folder_scripts)
|
||||||
|
except OSError as e:
|
||||||
|
print(f"Не удалось прочитать директорию {script_path}: {e}")
|
||||||
|
|
||||||
|
self.autoinstall_scripts = scripts
|
||||||
|
# Применяем текущий фильтр поиска к обновленному списку
|
||||||
|
self.filter_buttons('auto')
|
||||||
|
|
||||||
def create_installed_tab(self):
|
def create_installed_tab(self):
|
||||||
"""Создает вкладку для отображения установленных программ в виде кнопок"""
|
"""Создает вкладку для отображения установленных программ в виде кнопок"""
|
||||||
installed_tab, self.installed_scroll_layout, self.installed_search_edit, self.installed_scroll_area = self._create_searchable_grid_tab(
|
installed_tab, self.installed_scroll_layout, self.installed_search_edit, self.installed_scroll_area = self._create_searchable_grid_tab(
|
||||||
"Поиск установленной программы...", self.filter_installed_buttons
|
"Поиск установленной программы...", self.filter_installed_buttons, add_stretch=True
|
||||||
)
|
)
|
||||||
self.add_tab(installed_tab, "Установленные")
|
self.add_tab(installed_tab, "Установленные")
|
||||||
|
|
||||||
@@ -2433,7 +2519,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
prefix_names = []
|
prefix_names = []
|
||||||
|
|
||||||
self.created_prefix_selector.blockSignals(True)
|
self.created_prefix_selector.blockSignals(True)
|
||||||
self.remove_all_button.setEnabled(bool(prefix_names))
|
self.remove_all_button.setEnabled(True)
|
||||||
self.created_prefix_selector.clear()
|
self.created_prefix_selector.clear()
|
||||||
if prefix_names:
|
if prefix_names:
|
||||||
self.created_prefix_selector.addItems(prefix_names)
|
self.created_prefix_selector.addItems(prefix_names)
|
||||||
@@ -2449,7 +2535,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.current_managed_prefix_name = None
|
self.current_managed_prefix_name = None
|
||||||
self._setup_prefix_management_panel(None)
|
self._setup_prefix_management_panel(None)
|
||||||
self.delete_prefix_button.setEnabled(False)
|
self.delete_prefix_button.setEnabled(False)
|
||||||
self.remove_all_button.setEnabled(False)
|
self.remove_all_button.setEnabled(True)
|
||||||
self.create_base_pfx_button.setEnabled(False)
|
self.create_base_pfx_button.setEnabled(False)
|
||||||
self.open_prefix_folder_button.setEnabled(False)
|
self.open_prefix_folder_button.setEnabled(False)
|
||||||
else:
|
else:
|
||||||
@@ -4239,6 +4325,8 @@ class WineHelperGUI(QMainWindow):
|
|||||||
if script_name in self.autoinstall_scripts:
|
if script_name in self.autoinstall_scripts:
|
||||||
script_path = os.path.join(Var.DATA_PATH, "autoinstall", script_name)
|
script_path = os.path.join(Var.DATA_PATH, "autoinstall", script_name)
|
||||||
tab_type = 'auto'
|
tab_type = 'auto'
|
||||||
|
if not os.path.exists(script_path): # Проверяем в testinstall, если не нашли в autoinstall
|
||||||
|
script_path = os.path.join(Var.DATA_PATH, "testinstall", script_name)
|
||||||
self.manual_install_path_widget.setVisible(False)
|
self.manual_install_path_widget.setVisible(False)
|
||||||
else:
|
else:
|
||||||
script_path = os.path.join(Var.DATA_PATH, "manualinstall", script_name)
|
script_path = os.path.join(Var.DATA_PATH, "manualinstall", script_name)
|
||||||
@@ -4404,7 +4492,9 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
winehelper_path = self.winehelper_path
|
winehelper_path = self.winehelper_path
|
||||||
script_path = os.path.join(Var.DATA_PATH,
|
script_path = os.path.join(Var.DATA_PATH,
|
||||||
"autoinstall" if self.current_script in self.autoinstall_scripts else "manualinstall",
|
"autoinstall" if os.path.exists(os.path.join(Var.DATA_PATH, "autoinstall", self.current_script))
|
||||||
|
else "testinstall" if os.path.exists(os.path.join(Var.DATA_PATH, "testinstall", self.current_script))
|
||||||
|
else "manualinstall",
|
||||||
self.current_script)
|
self.current_script)
|
||||||
|
|
||||||
if not os.path.exists(winehelper_path):
|
if not os.path.exists(winehelper_path):
|
||||||
|
Reference in New Issue
Block a user