From 5b8124538ee1b285c4b3351275f086f1be1dab75 Mon Sep 17 00:00:00 2001 From: Roman Dvorak Date: Tue, 16 Apr 2024 22:28:33 +0200 Subject: [PATCH] add icon, update .desktop file --- dosview.desktop | 9 +++++++++ dosview/__init__.py | 33 +++++++++++++++++++++++++++++---- media/icon_ust.png | Bin 0 -> 14178 bytes setup.py | 4 ++++ 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 dosview.desktop create mode 100644 media/icon_ust.png diff --git a/dosview.desktop b/dosview.desktop new file mode 100644 index 0000000..acc8769 --- /dev/null +++ b/dosview.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=DosView +Exec=dosview %f +Icon=/usr/local/share/icons/icon_ust.png +MimeType=text/plain;text/dos +Terminal=false +Categories=Utility;TextEditor; diff --git a/dosview/__init__.py b/dosview/__init__.py index 469844b..8fc8b4d 100644 --- a/dosview/__init__.py +++ b/dosview/__init__.py @@ -3,6 +3,7 @@ from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar +from PyQt5.QtWidgets import QFileDialog import random import csv from matplotlib.figure import Figure @@ -10,11 +11,19 @@ import matplotlib.pyplot as plt import pandas as pd +from PyQt5.QtGui import QIcon def parse_file(file_path): metadata = {} - df_log = pd.read_csv(file_path, sep = ',', header = None, names=range(505)) + max_size = 0 + + with open(file_path, 'r') as file: + for line in file: + parts_size = len(line.split(",")) + if parts_size > max_size: max_size = parts_size + + df_log = pd.read_csv(file_path, sep = ',', header = None, names=range(max_size), low_memory=False) data_types = df_log[0].unique().tolist() df_spectrum = df_log [df_log[0] == '$HIST'] @@ -75,7 +84,10 @@ def plot(self): self.axes2 = self.figure.add_subplot(212) # Add second subplot self.axes2.clear() # Clear previous plot - self.axes2.plot(self.data[2], 'b.', alpha=0.3) + self.axes2.plot(self.data[2], 'b.-', alpha=0.3) + + self.axes2.set_yscale('log') + self.axes2.set_xscale('log') self.axes2.set_xlabel('Channel') self.axes2.set_ylabel('Count') @@ -100,11 +112,14 @@ def __init__(self, file_path): self.height = 400 self.file_path = file_path self.initUI() - + def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) + # Set the window icon + self.setWindowIcon(QIcon('media/icon_ust.png')) + m = PlotCanvas(self, width=5, height=4, file_path=self.file_path) self.setCentralWidget(m) m.move(0,0) @@ -117,9 +132,19 @@ def initUI(self): def main(): parser = argparse.ArgumentParser(description='Process some integers.') - parser.add_argument('file_path', type=str, help='Path to the input file') + parser.add_argument('file_path', type=str, help='Path to the input file', default=None) args = parser.parse_args() + if not args.file_path: + print("Please provide a file path") + file_dialog = QFileDialog() + file_path, _ = file_dialog.getOpenFileName() + if not file_path: + print("No file selected") + sys.exit() + else: + args.file_path = file_path + app = QApplication(sys.argv) ex = App(args.file_path) sys.exit(app.exec_()) diff --git a/media/icon_ust.png b/media/icon_ust.png new file mode 100644 index 0000000000000000000000000000000000000000..b93a01a30324746eb5a9ed0866bfe150082fb721 GIT binary patch literal 14178 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 R+~ad704l8nsgyDb{y#A)3m5