Improvements to Launch and Delete buttons

This commit is contained in:
Brett Williams
2025-03-01 01:19:58 -06:00
parent e97e3d74c8
commit d5f1224c33

View File

@@ -6,7 +6,7 @@ import socket
from datetime import datetime from datetime import datetime
from PyQt6 import QtCore from PyQt6 import QtCore
from PyQt6.QtCore import Qt, QSettings from PyQt6.QtCore import Qt, QSettings, pyqtSignal as Signal
from PyQt6.QtGui import QIcon from PyQt6.QtGui import QIcon
from PyQt6.QtWidgets import QApplication, QMainWindow, QListWidget, QListWidgetItem, QStackedWidget, QVBoxLayout, \ from PyQt6.QtWidgets import QApplication, QMainWindow, QListWidget, QListWidgetItem, QStackedWidget, QVBoxLayout, \
QWidget, QLabel, QCheckBox, QLineEdit, \ QWidget, QLabel, QCheckBox, QLineEdit, \
@@ -26,8 +26,12 @@ class SettingsWindow(QMainWindow):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
if not EngineManager.engines_path: # fix issue where sometimes path was not set
EngineManager.engines_path = system_safe_path(
os.path.join(os.path.join(os.path.expanduser(Config.upload_folder),
'engines')))
# declare objects we need to store settings # declare objects we need to store settings
self.check_for_engine_updates_checkbox = None
# todo: add all here # todo: add all here
self.installed_engines_table = None self.installed_engines_table = None
@@ -182,22 +186,29 @@ class SettingsWindow(QMainWindow):
# Installed Engines Group # Installed Engines Group
installed_group = QGroupBox("Installed Engines") installed_group = QGroupBox("Installed Engines")
installed_layout = QVBoxLayout() installed_layout = QVBoxLayout()
# Setup table
self.installed_engines_table = EngineTableWidget() self.installed_engines_table = EngineTableWidget()
self.installed_engines_table.row_selected.connect(self.engine_table_selected)
installed_layout.addWidget(self.installed_engines_table) installed_layout.addWidget(self.installed_engines_table)
# Ignore system installs
engine_ignore_system_installs_checkbox = QCheckBox("Ignore system installs") engine_ignore_system_installs_checkbox = QCheckBox("Ignore system installs")
engine_ignore_system_installs_checkbox.setChecked(settings.value("engines_ignore_system_installs", False)) engine_ignore_system_installs_checkbox.setChecked(settings.value("engines_ignore_system_installs", False))
engine_ignore_system_installs_checkbox.stateChanged.connect(self.change_ignore_system_installs) engine_ignore_system_installs_checkbox.stateChanged.connect(self.change_ignore_system_installs)
installed_layout.addWidget(engine_ignore_system_installs_checkbox) installed_layout.addWidget(engine_ignore_system_installs_checkbox)
# Engine Launch / Delete buttons
installed_buttons_layout = QHBoxLayout() installed_buttons_layout = QHBoxLayout()
launch_engine_button = QPushButton("Launch") self.launch_engine_button = QPushButton("Launch")
launch_engine_button.clicked.connect(self.launch_selected_engine) self.launch_engine_button.setEnabled(False)
delete_engine_button = QPushButton("Delete") self.launch_engine_button.clicked.connect(self.launch_selected_engine)
delete_engine_button.clicked.connect(self.delete_selected_engine) self.delete_engine_button = QPushButton("Delete")
self.delete_engine_button.setEnabled(False)
self.delete_engine_button.clicked.connect(self.delete_selected_engine)
installed_buttons_layout.addWidget(launch_engine_button) installed_buttons_layout.addWidget(self.launch_engine_button)
installed_buttons_layout.addWidget(delete_engine_button) installed_buttons_layout.addWidget(self.delete_engine_button)
installed_layout.addLayout(installed_buttons_layout) installed_layout.addLayout(installed_buttons_layout)
installed_group.setLayout(installed_layout) installed_group.setLayout(installed_layout)
@@ -222,12 +233,12 @@ class SettingsWindow(QMainWindow):
engine_updates_layout.addLayout(engine_download_layout) engine_updates_layout.addLayout(engine_download_layout)
self.check_for_engine_updates_checkbox = QCheckBox("Check for new versions on launch") check_for_engine_updates_checkbox = QCheckBox("Check for new versions on launch")
self.check_for_engine_updates_checkbox.setChecked(settings.value('check_for_engine_updates_on_launch', True)) check_for_engine_updates_checkbox.setChecked(settings.value('check_for_engine_updates_on_launch', True))
self.check_for_engine_updates_checkbox.setEnabled(at_least_one_downloadable) check_for_engine_updates_checkbox.setEnabled(at_least_one_downloadable)
self.check_for_engine_updates_checkbox.stateChanged.connect( check_for_engine_updates_checkbox.stateChanged.connect(
lambda state: settings.setValue("check_for_engine_updates_on_launch", bool(state))) lambda state: settings.setValue("check_for_engine_updates_on_launch", bool(state)))
engine_updates_layout.addWidget(self.check_for_engine_updates_checkbox) engine_updates_layout.addWidget(check_for_engine_updates_checkbox)
self.engines_last_update_label = QLabel() self.engines_last_update_label = QLabel()
self.update_last_checked_label() self.update_last_checked_label()
self.engines_last_update_label.setEnabled(at_least_one_downloadable) self.engines_last_update_label.setEnabled(at_least_one_downloadable)
@@ -272,19 +283,47 @@ class SettingsWindow(QMainWindow):
self.engines_last_update_label.setEnabled(at_least_one_downloadable) self.engines_last_update_label.setEnabled(at_least_one_downloadable)
def delete_selected_engine(self): def delete_selected_engine(self):
pass engine_info = self.installed_engines_table.selected_engine_data()
reply = QMessageBox.question(self, f"Delete {engine_info['engine']} {engine_info['version']}?",
f"Do you want to delete {engine_info['engine']} {engine_info['version']}?",
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
if reply is not QMessageBox.StandardButton.Yes:
return
delete_result = EngineManager.delete_engine_download(engine_info.get('engine'),
engine_info.get('version'),
engine_info.get('system_os'),
engine_info.get('cpu'))
if delete_result:
QMessageBox.information(self, f"{engine_info['engine']} {engine_info['version']} Deleted",
f"{engine_info['engine']} {engine_info['version']} deleted successfully",
QMessageBox.StandardButton.Ok)
else:
QMessageBox.warning(self, f"Unknown Error",
f"Unknown error while deleting {engine_info['engine']} {engine_info['version']}.",
QMessageBox.StandardButton.Ok)
self.installed_engines_table.update_table(use_cached=False)
def launch_selected_engine(self): def launch_selected_engine(self):
engine_info = self.installed_engines_table.selected_engine_data() engine_info = self.installed_engines_table.selected_engine_data()
if engine_info: if engine_info:
launch_url(engine_info['path']) launch_url(engine_info['path'])
def check_for_new_engines(self): def engine_table_selected(self):
engine_data = self.installed_engines_table.selected_engine_data()
if engine_data:
self.launch_engine_button.setEnabled(bool(engine_data.get('path') or True))
self.delete_engine_button.setEnabled(engine_data.get('type') == 'managed')
else:
self.launch_engine_button.setEnabled(False)
self.delete_engine_button.setEnabled(False)
if not EngineManager.engines_path: # fix issue where sometimes path was not set
EngineManager.engines_path = system_safe_path(
os.path.join(os.path.join(os.path.expanduser(Config.upload_folder), def check_for_new_engines(self):
'engines')))
ignore_system = settings.value("engines_ignore_system_installs", False) ignore_system = settings.value("engines_ignore_system_installs", False)
messagebox_shown = False messagebox_shown = False
@@ -297,7 +336,7 @@ class SettingsWindow(QMainWindow):
msg_box.setWindowTitle(f"{result['name']} ({result['version']}) Available") msg_box.setWindowTitle(f"{result['name']} ({result['version']}) Available")
msg_box.setText(f"A new version of {result['name']} is available ({result['version']}).\n\n" msg_box.setText(f"A new version of {result['name']} is available ({result['version']}).\n\n"
f"Would you like to download it now?") f"Would you like to download it now?")
msg_box.setIcon(QMessageBox.Icon.Information) msg_box.setIcon(QMessageBox.Icon.Question)
msg_box.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No) msg_box.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
msg_result = msg_box.exec() msg_result = msg_box.exec()
messagebox_shown = True messagebox_shown = True
@@ -327,6 +366,8 @@ class SettingsWindow(QMainWindow):
class EngineTableWidget(QWidget): class EngineTableWidget(QWidget):
row_selected = Signal()
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@@ -336,6 +377,7 @@ class EngineTableWidget(QWidget):
self.table.verticalHeader().setVisible(False) self.table.verticalHeader().setVisible(False)
# self.table_widget.itemSelectionChanged.connect(self.engine_picked) # self.table_widget.itemSelectionChanged.connect(self.engine_picked)
self.table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) self.table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
self.table.selectionModel().selectionChanged.connect(self.on_selection_changed)
layout = QVBoxLayout(self) layout = QVBoxLayout(self)
layout.addWidget(self.table) layout.addWidget(self.table)
@@ -382,7 +424,7 @@ class EngineTableWidget(QWidget):
"""Returns the data from the selected row as a dictionary.""" """Returns the data from the selected row as a dictionary."""
row = self.table.currentRow() # Get the selected row index row = self.table.currentRow() # Get the selected row index
if row < 0: # No row selected if row < 0 or not len(self.table.selectedItems()): # No row selected
return None return None
data = { data = {
@@ -394,6 +436,9 @@ class EngineTableWidget(QWidget):
return data return data
def on_selection_changed(self):
self.row_selected.emit()
if __name__ == "__main__": if __name__ == "__main__":