Source code for mzx.gui

import os
import sys
from PySide6.QtCore import QByteArray, QSettings, QThread
from PySide6.QtGui import QDropEvent, QDragLeaveEvent
from PySide6.QtWidgets import (
    QApplication,
    QCheckBox,
    QMainWindow,
    QMessageBox,
    QSizePolicy,
    QTextEdit,
    QVBoxLayout,
    QWidget,
)
from . import convert_raw_file, docker, get_vendor, __version__


[docs] class ConverterThread(QThread): def __init__(self, path, peakpicking, removezeros, emit_fn, parent=None): super().__init__(parent) self.emit_fn = emit_fn self.path = path self.peakpicking = peakpicking self.removezeros = removezeros
[docs] def options(self) -> str: options = ' --filter "peakPicking true 1-"' if self.peakpicking else "" options += ' --filter "zeroSamples removeExtra"' if self.removezeros else "" return options
[docs] def run(self): vendor = get_vendor(self.path) _outfile = convert_raw_file(self.path, vendor) self.emit_fn.emit(f"Conversion completed: {_outfile}")
[docs] class MainWindow(QMainWindow): def __init__(self): super().__init__() self.initUI()
[docs] def initUI(self): settings = QSettings("mzx", "app") self.central_widget = QWidget() layout = QVBoxLayout(self.central_widget) self.setWindowTitle(f"mzx Version {__version__}") self.setCentralWidget(self.central_widget) # Restore window geometry (position and size) geometry = settings.value("window_geometry") if geometry and isinstance(geometry, QByteArray): self.restoreGeometry(geometry) else: self.setGeometry(100, 100, 600, 400) # Peak Picking Option self.peakpicking_checkbox = QCheckBox("Enable Peakpicking", self) peak_picking = bool(settings.value("peakpicking", False, bool)) self.peakpicking_checkbox.setChecked(peak_picking) layout.addWidget(self.peakpicking_checkbox) # Remove Zeros Option self.removezeros_checkbox = QCheckBox("Remove Zeros", self) remove_zeros = bool(settings.value("removezeros", False, bool)) self.removezeros_checkbox.setChecked(remove_zeros) layout.addWidget(self.removezeros_checkbox) # Create a blank panel at the bottom blank_panel = QWidget(self) blank_panel.setSizePolicy( QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding ) blank_panel.setMinimumHeight(self.height() // 2) layout.addWidget(blank_panel) # Log output self.log_text_edit = QTextEdit(self) self.log_text_edit.setReadOnly(True) layout.addWidget(self.log_text_edit) self._layout = layout
[docs] def closeEvent(self, event): settings = QSettings("mzx", "app") settings.setValue("window_geometry", self.saveGeometry()) settings.setValue("peakpicking", self.peakpicking_checkbox.isChecked()) settings.setValue("removezeros", self.removezeros_checkbox.isChecked()) super().closeEvent(event)
[docs] def dragEnterEvent(self, event: QDropEvent) -> None: if event.mimeData().hasUrls(): event.accept() self.setStyleSheet("background-color: lightgreen;") else: event.ignore()
[docs] def dragLeaveEvent(self, _event: QDragLeaveEvent) -> None: self.setStyleSheet("") # Reset background color on leave
[docs] def dropEvent(self, event: QDropEvent) -> None: self.setStyleSheet("") # Reset background color after drop for url in event.mimeData().urls(): path = url.toLocalFile() if os.path.isfile(path): self.convert(path)
[docs] def convert(self, path: str) -> None: if not docker.check_running(): self.show_popup("Docker is not running. Please start Docker and try again.") self.log_text_edit.append("Docker is not running. Conversion cancelled.") return peakpicking = self.peakpicking_checkbox.isChecked() removezeros = self.removezeros_checkbox.isChecked() self.log_text_edit.append(f"Launching thread to convert {path}...") self.convert_thread = ConverterThread( path, peakpicking, removezeros, self.log_text_edit.append ) self.convert_thread.start()
[docs] def show_popup(self, message: str) -> QMessageBox: dialog = QMessageBox() dialog.setIcon(QMessageBox.Icon.Warning) dialog.setText(message) dialog.setWindowTitle("Warning") dialog.setStandardButtons(QMessageBox.StandardButton.Ok) dialog.show() return dialog
[docs] def main(): app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
if __name__ == "__main__": main()