2022-07-12 07:02:57 +12:00
|
|
|
import platform
|
2022-09-09 00:32:54 +12:00
|
|
|
from typing import Union
|
2022-07-12 07:02:57 +12:00
|
|
|
|
2022-09-09 00:32:54 +12:00
|
|
|
from PyQt5.QtCore import QProcessEnvironment, pyqtSignal, QSize, Qt
|
|
|
|
from PyQt5.QtGui import QTextCursor, QFont, QCursor, QCloseEvent
|
2021-12-24 22:09:50 +13:00
|
|
|
from PyQt5.QtWidgets import (
|
|
|
|
QPlainTextEdit,
|
2022-05-05 08:11:41 +12:00
|
|
|
QDialog,
|
2021-12-24 22:09:50 +13:00
|
|
|
QPushButton,
|
|
|
|
QFileDialog,
|
|
|
|
QVBoxLayout,
|
2022-05-05 08:11:41 +12:00
|
|
|
QHBoxLayout,
|
|
|
|
QSpacerItem,
|
2022-09-08 22:33:46 +12:00
|
|
|
QSizePolicy, QTableWidgetItem, QHeaderView, QApplication,
|
2021-12-24 22:09:50 +13:00
|
|
|
)
|
2021-08-14 08:51:36 +12:00
|
|
|
|
2022-05-05 08:44:53 +12:00
|
|
|
from rare.ui.components.extra.console_env import Ui_ConsoleEnv
|
2021-08-14 08:51:36 +12:00
|
|
|
|
2022-05-05 08:44:53 +12:00
|
|
|
|
|
|
|
class Console(QDialog):
|
2022-07-12 07:02:57 +12:00
|
|
|
term = pyqtSignal()
|
|
|
|
kill = pyqtSignal()
|
2022-05-05 08:11:41 +12:00
|
|
|
env: QProcessEnvironment
|
|
|
|
|
|
|
|
def __init__(self, parent=None):
|
2022-05-05 08:44:53 +12:00
|
|
|
super(Console, self).__init__(parent=parent)
|
2022-09-09 00:32:54 +12:00
|
|
|
self.setAttribute(Qt.WA_DeleteOnClose, True)
|
2022-05-05 08:44:53 +12:00
|
|
|
self.setWindowTitle("Rare - Console")
|
2022-09-08 22:33:46 +12:00
|
|
|
self.setGeometry(0, 0, 640, 480)
|
2022-05-05 08:11:41 +12:00
|
|
|
layout = QVBoxLayout()
|
|
|
|
|
2022-05-05 08:44:53 +12:00
|
|
|
self.console = ConsoleEdit(self)
|
2022-05-05 08:11:41 +12:00
|
|
|
layout.addWidget(self.console)
|
|
|
|
|
|
|
|
button_layout = QHBoxLayout()
|
2021-08-14 08:51:36 +12:00
|
|
|
|
2022-05-05 08:11:41 +12:00
|
|
|
self.env_button = QPushButton(self.tr("Show environment"))
|
|
|
|
button_layout.addWidget(self.env_button)
|
|
|
|
self.env_button.clicked.connect(self.show_env)
|
2021-08-14 08:51:36 +12:00
|
|
|
|
|
|
|
self.save_button = QPushButton(self.tr("Save output to file"))
|
2022-05-05 08:11:41 +12:00
|
|
|
button_layout.addWidget(self.save_button)
|
2021-08-14 08:51:36 +12:00
|
|
|
self.save_button.clicked.connect(self.save)
|
|
|
|
|
2022-05-05 08:11:41 +12:00
|
|
|
self.clear_button = QPushButton(self.tr("Clear console"))
|
|
|
|
button_layout.addWidget(self.clear_button)
|
2021-11-02 09:49:17 +13:00
|
|
|
self.clear_button.clicked.connect(self.console.clear)
|
|
|
|
|
2022-07-12 07:02:57 +12:00
|
|
|
button_layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Fixed))
|
|
|
|
|
2022-09-09 00:32:54 +12:00
|
|
|
# self.terminate_button = QPushButton(self.tr("Terminate"))
|
|
|
|
# self.terminate_button.setVisible(platform.system() == "Windows")
|
|
|
|
# button_layout.addWidget(self.terminate_button)
|
|
|
|
# self.terminate_button.clicked.connect(lambda: self.term.emit())
|
|
|
|
#
|
|
|
|
# self.kill_button = QPushButton(self.tr("Kill"))
|
|
|
|
# self.kill_button.setVisible(platform.system() == "Windows")
|
|
|
|
# button_layout.addWidget(self.kill_button)
|
|
|
|
# self.kill_button.clicked.connect(lambda: self.kill.emit())
|
2022-07-12 07:02:57 +12:00
|
|
|
|
2022-05-05 08:11:41 +12:00
|
|
|
layout.addLayout(button_layout)
|
|
|
|
|
|
|
|
self.setLayout(layout)
|
|
|
|
|
2022-05-05 08:44:53 +12:00
|
|
|
self.env_variables = ConsoleEnv(self)
|
2022-05-05 08:11:41 +12:00
|
|
|
self.env_variables.hide()
|
2021-08-14 08:51:36 +12:00
|
|
|
|
2022-09-09 00:32:54 +12:00
|
|
|
self.accept_close = False
|
|
|
|
|
2022-09-08 22:33:46 +12:00
|
|
|
def show(self) -> None:
|
|
|
|
super(Console, self).show()
|
|
|
|
self.center_window()
|
|
|
|
|
|
|
|
def center_window(self):
|
|
|
|
# get the margins of the decorated window
|
|
|
|
margins = self.windowHandle().frameMargins()
|
|
|
|
# get the screen the cursor is on
|
|
|
|
current_screen = QApplication.screenAt(QCursor.pos())
|
|
|
|
if not current_screen:
|
|
|
|
current_screen = QApplication.primaryScreen()
|
|
|
|
# get the available screen geometry (excludes panels/docks)
|
|
|
|
screen_rect = current_screen.availableGeometry()
|
|
|
|
decor_width = margins.left() + margins.right()
|
|
|
|
decor_height = margins.top() + margins.bottom()
|
|
|
|
window_size = QSize(self.width(), self.height()).boundedTo(
|
|
|
|
screen_rect.size() - QSize(decor_width, decor_height)
|
|
|
|
)
|
|
|
|
|
|
|
|
self.resize(window_size)
|
|
|
|
self.move(
|
|
|
|
screen_rect.center()
|
|
|
|
- self.rect().adjusted(0, 0, decor_width, decor_height).center()
|
|
|
|
)
|
|
|
|
|
2021-08-14 08:51:36 +12:00
|
|
|
def save(self):
|
2021-12-24 22:09:50 +13:00
|
|
|
file, ok = QFileDialog.getSaveFileName(
|
|
|
|
self, "Save output", "", "Log Files (*.log);;All Files (*)"
|
|
|
|
)
|
2021-08-14 08:51:36 +12:00
|
|
|
if ok:
|
|
|
|
if "." not in file:
|
|
|
|
file += ".log"
|
|
|
|
with open(file, "w") as f:
|
|
|
|
f.write(self.console.toPlainText())
|
|
|
|
f.close()
|
|
|
|
self.save_button.setText(self.tr("Saved"))
|
|
|
|
|
2022-05-05 08:11:41 +12:00
|
|
|
def set_env(self, env: QProcessEnvironment):
|
|
|
|
self.env = env
|
|
|
|
|
|
|
|
def show_env(self):
|
|
|
|
self.env_variables.setTable(self.env)
|
|
|
|
self.env_variables.show()
|
|
|
|
|
2022-01-09 05:08:22 +13:00
|
|
|
def log(self, text: str, end: str = "\n"):
|
|
|
|
self.console.log(text + end)
|
2021-08-14 08:51:36 +12:00
|
|
|
|
2022-03-28 10:03:48 +13:00
|
|
|
def error(self, text, end: str = "\n"):
|
|
|
|
self.console.error(text + end)
|
2021-08-14 08:51:36 +12:00
|
|
|
|
2022-09-09 00:32:54 +12:00
|
|
|
def on_process_exit(self, app_title: str, status: Union[int, str]):
|
|
|
|
self.error(
|
|
|
|
self.tr("Application \"{}\" finished with \"{}\"").format(app_title, status)
|
|
|
|
)
|
|
|
|
self.accept_close = True
|
|
|
|
|
|
|
|
def closeEvent(self, a0: QCloseEvent) -> None:
|
|
|
|
if self.accept_close:
|
|
|
|
super(Console, self).closeEvent(a0)
|
|
|
|
a0.accept()
|
|
|
|
else:
|
2022-09-09 01:57:43 +12:00
|
|
|
self.showMinimized()
|
2022-09-09 00:32:54 +12:00
|
|
|
a0.ignore()
|
|
|
|
|
2021-08-14 08:51:36 +12:00
|
|
|
|
2022-05-05 08:44:53 +12:00
|
|
|
class ConsoleEnv(QDialog):
|
2022-05-05 08:11:41 +12:00
|
|
|
|
|
|
|
def __init__(self, parent=None):
|
2022-05-05 08:44:53 +12:00
|
|
|
super(ConsoleEnv, self).__init__(parent=parent)
|
2022-09-09 00:32:54 +12:00
|
|
|
self.setAttribute(Qt.WA_DeleteOnClose, False)
|
2022-05-05 08:44:53 +12:00
|
|
|
self.ui = Ui_ConsoleEnv()
|
|
|
|
self.ui.setupUi(self)
|
2022-05-05 08:11:41 +12:00
|
|
|
|
|
|
|
def setTable(self, env: QProcessEnvironment):
|
|
|
|
self.ui.table.clearContents()
|
|
|
|
self.ui.table.setRowCount(len(env.keys()))
|
|
|
|
|
|
|
|
for idx, key in enumerate(env.keys()):
|
|
|
|
self.ui.table.setItem(idx, 0, QTableWidgetItem(env.keys()[idx]))
|
|
|
|
self.ui.table.setItem(idx, 1, QTableWidgetItem(env.value(env.keys()[idx])))
|
|
|
|
|
|
|
|
self.ui.table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
|
|
|
|
|
|
|
|
|
2022-05-05 08:44:53 +12:00
|
|
|
class ConsoleEdit(QPlainTextEdit):
|
2022-09-09 00:32:54 +12:00
|
|
|
|
2022-05-05 08:11:41 +12:00
|
|
|
def __init__(self, parent=None):
|
2022-05-05 08:44:53 +12:00
|
|
|
super(ConsoleEdit, self).__init__(parent=parent)
|
2021-08-14 08:51:36 +12:00
|
|
|
self.setReadOnly(True)
|
2022-09-09 00:32:54 +12:00
|
|
|
font = QFont("Monospace")
|
|
|
|
font.setStyleHint(QFont.Monospace)
|
|
|
|
self.setFont(font)
|
2021-08-14 08:51:36 +12:00
|
|
|
self._cursor_output = self.textCursor()
|
|
|
|
|
|
|
|
def log(self, text):
|
2022-03-28 10:03:48 +13:00
|
|
|
html = f"<p style=\"color:#999;white-space:pre\">{text}</p>"
|
|
|
|
self._cursor_output.insertHtml(html)
|
2021-08-14 08:51:36 +12:00
|
|
|
self.scroll_to_last_line()
|
|
|
|
|
|
|
|
def error(self, text):
|
2022-03-28 10:03:48 +13:00
|
|
|
html = f"<p style=\"color:#eee;white-space:pre\">{text}</p>"
|
|
|
|
self._cursor_output.insertHtml(html)
|
2021-08-14 08:51:36 +12:00
|
|
|
self.scroll_to_last_line()
|
|
|
|
|
|
|
|
def scroll_to_last_line(self):
|
|
|
|
cursor = self.textCursor()
|
|
|
|
cursor.movePosition(QTextCursor.End)
|
2021-12-24 22:09:50 +13:00
|
|
|
cursor.movePosition(
|
|
|
|
QTextCursor.Up if cursor.atBlockStart() else QTextCursor.StartOfLine
|
|
|
|
)
|
2021-08-14 08:51:36 +12:00
|
|
|
self.setTextCursor(cursor)
|