Files
aegnux/src/mainwindow.py
2025-11-08 03:50:34 +03:00

318 lines
10 KiB
Python

import os
import subprocess
import sys
from ui.mainwindow import MainWindowUI
from translations import gls
from PySide6.QtCore import Slot
from PySide6.QtGui import QAction, QKeySequence
from PySide6.QtWidgets import QFileDialog, QMessageBox
from src.installationthread import InstallationThread
from src.runaethread import RunAEThread
from src.runexethread import RunExeThread
from src.killaethread import KillAEThread
from src.pluginthread import PluginThread
from src.removeaethread import RemoveAEThread
from src.utils import (
check_aegnux_tip_marked, get_default_terminal, get_wine_bin_path_env,
get_cep_dir, get_ae_plugins_dir, get_wineprefix_dir,
check_aegnux_installed, mark_aegnux_tip_as_shown, get_ae_install_dir, get_aegnux_installation_dir
)
from src.types import DownloadMethod
class MainWindow(MainWindowUI):
def __init__(self):
super().__init__()
self.ran_from_aep_file = False
self.setWindowTitle(gls('welcome_win_title'))
self.install_button.clicked.connect(self.install_button_clicked)
self.run_button.clicked.connect(self.run_ae_button_clicked)
self.remove_aegnux_button.clicked.connect(self.remove_aegnux_button_clicked)
self.install_thread = InstallationThread()
self.install_thread.log_signal.connect(self._log)
self.install_thread.progress_signal.connect(self.progress_bar.setValue)
self.install_thread.finished_signal.connect(self._finished)
self.run_ae_thread = RunAEThread()
self.run_ae_thread.log_signal.connect(self._log)
self.run_ae_thread.finished_signal.connect(self._finished)
self.kill_ae_thread = KillAEThread()
self.remove_ae_thread = RemoveAEThread()
self.remove_ae_thread.finished_signal.connect(self._finished)
self.plugin_thread = PluginThread()
self.plugin_thread.log_signal.connect(self._log)
self.plugin_thread.progress_signal.connect(self.progress_bar.setValue)
self.plugin_thread.finished_signal.connect(self._finished)
self.alt_t_action = QAction(self)
self.alt_t_action.setShortcut(QKeySequence("Alt+T"))
self.alt_t_action.triggered.connect(self.run_command_alt_t)
self.addAction(self.alt_t_action)
self.ctrl_q_action = QAction(self)
self.ctrl_q_action.setShortcut(QKeySequence("Ctrl+Q"))
self.ctrl_q_action.triggered.connect(self.run_command_ctrl_q)
self.addAction(self.ctrl_q_action)
self._construct_menubar()
self.init_installation()
self.ae_action.triggered.connect(self.run_ae_button_clicked)
self.exe_action.triggered.connect(self.run_exe_button_clicked)
self.reg_action.triggered.connect(self.reg_button_clicked)
self.plugininst_action.triggered.connect(self.install_plugins_button_clicked)
self.kill_action.triggered.connect(self.kill_ae_button_clicked)
self.log_action.triggered.connect(self.toggle_logs)
self.term_action.triggered.connect(self.run_command_alt_t)
self.wpd_action.triggered.connect(self.wineprefix_folder_clicked)
self.plugind_action.triggered.connect(self.plugins_folder_clicked)
self.aed_action.triggered.connect(self.ae_folder_clicked)
self.aeg_action.triggered.connect(self.aegnux_folder_clicked)
self.cep_action.triggered.connect(self.cep_folder_clicked)
def try_autoopen_aep(self):
self.run_ae_thread.clear_aep_file_arg()
if self.ran_from_aep_file:
return
self.ran_from_aep_file = True
aep_file = ''
for arg in sys.argv:
if '.aep' in arg:
aep_file = arg
break
if aep_file == '':
return
self.run_ae_thread.add_aep_file_arg(aep_file)
self.run_ae_button_clicked()
def init_installation(self):
if check_aegnux_installed():
self.install_button.hide()
self.run_button.show()
self.remove_aegnux_button.show()
self.runMenu.setEnabled(True)
self.browseMenu.setEnabled(True)
self.kill_action.setEnabled(True)
self.plugininst_action.setEnabled(True)
self.term_action.setEnabled(True)
self.try_autoopen_aep()
else:
self.install_button.show()
self.run_button.hide()
self.remove_aegnux_button.hide()
self.runMenu.setEnabled(False)
self.browseMenu.setEnabled(False)
self.kill_action.setEnabled(False)
self.term_action.setEnabled(False)
self.plugininst_action.setEnabled(False)
def _construct_menubar(self):
self.runMenu = self.menuBar().addMenu(gls('run_menu'))
self.ae_action = self.runMenu.addAction(gls('ae_action'))
self.exe_action = self.runMenu.addAction(gls('exe_action'))
self.plugininst_action = self.runMenu.addAction(gls('plugininst_action'))
self.reg_action = self.runMenu.addAction(gls('reg_action'))
self.browseMenu = self.menuBar().addMenu(gls('browse_menu'))
self.wpd_action = self.browseMenu.addAction(gls('wpd_action'))
self.plugind_action = self.browseMenu.addAction(gls('plugind_action'))
self.aed_action = self.browseMenu.addAction(gls('aed_action'))
self.aeg_action = self.browseMenu.addAction(gls('aeg_action'))
self.cep_action = self.browseMenu.addAction(gls('cep_action'))
self.debugMenu = self.menuBar().addMenu(gls('debug_menu'))
self.kill_action = self.debugMenu.addAction(gls('kill_action'))
self.log_action = self.debugMenu.addAction(gls('log_action'))
self.term_action = self.debugMenu.addAction(gls('term_action'))
def lock_ui(self, lock: bool = True):
self.install_button.setEnabled(not lock)
self.run_button.setEnabled(not lock)
self.remove_aegnux_button.setEnabled(not lock)
self.runMenu.setEnabled(not lock)
@Slot()
def toggle_logs(self):
if self.logs_edit.isHidden():
self.logs_edit.show()
return
self.logs_edit.hide()
@Slot(bool)
def _finished(self, success: bool):
self.lock_ui(False)
self.progress_bar.hide()
self.init_installation()
if not success:
QMessageBox.critical(
self,
gls('error'),
self.logs_edit.toPlainText().split('\n')[-2]
)
return
if check_aegnux_installed() and not check_aegnux_tip_marked():
QMessageBox.information(self, '', gls('tip_alt_t'))
mark_aegnux_tip_as_shown()
@Slot(str)
def _log(self, message: str):
self.logs_edit.append(message + '\n')
@Slot()
def install_button_clicked(self):
# method = show_download_method_dialog(gls('installation_method_title'), gls('installation_method_text'))
method = DownloadMethod.OFFLINE
if method == DownloadMethod.CANCEL:
return
self.install_thread.set_download_method(method)
if method == DownloadMethod.OFFLINE:
QMessageBox.warning(
self,
gls('offline_note'),
gls('offline_note_text')
)
filename, _ = QFileDialog.getOpenFileName(
self,
gls('offline_ae_zip_title'),
"",
"Zip Files (*.zip);;All Files (*)"
)
if filename == '':
return
self.install_thread.set_offline_filename(filename)
self.lock_ui()
self.progress_bar.show()
self.install_thread.start()
@Slot()
def install_plugins_button_clicked(self):
QMessageBox.information(
self,
gls('plugin_note'),
gls('plugin_note_text')
)
filename, _ = QFileDialog.getOpenFileName(
self,
gls('offline_ae_zip_title'),
"",
"Zip Files (*.zip);;All Files (*)"
)
if filename == '':
return
self.plugin_thread.set_plugin_zip_filename(filename)
self.lock_ui()
self.progress_bar.show()
self.plugin_thread.start()
@Slot()
def run_ae_button_clicked(self):
self.lock_ui()
self.run_ae_thread.start()
@Slot()
def run_exe_button_clicked(self):
filename, _ = QFileDialog.getOpenFileName(
self,
gls('Open .exe'),
"",
"Exe Files (*.exe);;All Files (*)"
)
if filename == '':
return
self.run_exe_thread = RunExeThread([filename])
self.run_exe_thread.log_signal.connect(self._log)
self.run_exe_thread.finished_signal.connect(self._finished)
self.lock_ui()
self.run_exe_thread.start()
@Slot()
def reg_button_clicked(self):
filename, _ = QFileDialog.getOpenFileName(
self,
gls('Open .reg'),
"",
"Reg Files (*.reg);;All Files (*)"
)
if filename == '':
return
self.reg_thread = RunExeThread(['regedit', filename])
self.reg_thread.log_signal.connect(self._log)
self.reg_thread.finished_signal.connect(self._finished)
self.lock_ui()
self.reg_thread.start()
@Slot()
def kill_ae_button_clicked(self):
self.kill_ae_thread.start()
@Slot()
def remove_aegnux_button_clicked(self):
self.lock_ui()
self.remove_ae_thread.start()
@Slot()
def plugins_folder_clicked(self):
os.system(f'xdg-open "{get_ae_plugins_dir()}"')
@Slot()
def wineprefix_folder_clicked(self):
os.system(f'xdg-open "{get_wineprefix_dir()}"')
@Slot()
def ae_folder_clicked(self):
os.system(f'xdg-open "{get_ae_install_dir()}"')
@Slot()
def aegnux_folder_clicked(self):
os.system(f'xdg-open "{get_aegnux_installation_dir()}"')
@Slot()
def cep_folder_clicked(self):
os.system(f'xdg-open "{get_cep_dir()}"')
@Slot()
def run_command_alt_t(self):
env = os.environ.copy()
env['WINEPREFIX'] = get_wineprefix_dir()
env['PATH'] = get_wine_bin_path_env('/usr/bin')
try:
terminal = get_default_terminal()
subprocess.Popen([terminal, "bash"], env=env)
except RuntimeError as e:
print("[CRITICAL ERROR]:", e)
@Slot()
def run_command_ctrl_q(self):
exit()