From 3b330b2fca3ca4f736225d1a74b21a6554913c71 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Tue, 26 Oct 2021 11:05:07 +0200 Subject: [PATCH] do not open same file twice --- bigtext.py | 4 ++++ logFileModel.py | 8 ++++++- main.py | 26 +++++----------------- tabs.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 22 deletions(-) create mode 100644 tabs.py diff --git a/bigtext.py b/bigtext.py index 95eb4e9..bc3dfa0 100644 --- a/bigtext.py +++ b/bigtext.py @@ -24,6 +24,7 @@ class BigText(QWidget): def __init__(self, model: LogFileModel, settings: Settings): super(BigText, self).__init__() + self.model = model self.grid = QGridLayout() self.grid.setContentsMargins(0, 0, 0, 0) self.grid.setHorizontalSpacing(0) @@ -46,6 +47,9 @@ class BigText(QWidget): self.grid.addWidget(self.h_scroll_bar, 1, 0) self.grid.addWidget(self.v_scroll_bar, 0, 1) + def get_file(self): + return self.model.get_file() + class InnerBigText(QWidget): _byte_offset = 0 diff --git a/logFileModel.py b/logFileModel.py index f811f9d..1ae2dd8 100644 --- a/logFileModel.py +++ b/logFileModel.py @@ -10,7 +10,13 @@ class LogFileModel: _lock = threading.RLock() def __init__(self, file): - self._file = file + self._file = os.path.realpath(file) + + def get_file(self): + return self._file + + def __str__(self): + return self._file def get_tab_name(self): file_name = os.path.basename(self._file) diff --git a/main.py b/main.py index 6737a21..742c840 100644 --- a/main.py +++ b/main.py @@ -11,6 +11,7 @@ import sys from bigtext import BigText from logFileModel import LogFileModel from settings import Settings +from tabs import Tabs MAX_LINE_LENGTH = 4096 @@ -23,9 +24,9 @@ class MainWindow(QMainWindow): self.setGeometry(0, 0, 640, 480) self.setDockNestingEnabled(True) - self.tabs = self.create_tabs() - self.create_tab("/home/andi/ws/performanceDb/data/production/logs_2018-09-06_2018-09-06.csv") - self.create_tab("/home/andi/ws/ravenlog/example.log") + self.tabs = Tabs(self.settings) + self.tabs.create_tab("/home/andi/ws/performanceDb/data/production/logs_2018-09-06_2018-09-06.csv") + self.tabs.create_tab("/home/andi/ws/ravenlog/example.log") self.setCentralWidget(self.tabs) @@ -54,23 +55,6 @@ class MainWindow(QMainWindow): def on_follow_file_changed(self, e): print(e) - def create_tabs(self) -> QTabWidget: - tabs = QTabWidget() - tabs.setTabsClosable(True) - tabs.tabCloseRequested.connect(lambda index: tabs.removeTab(index) ) - return tabs - - def create_tab(self, file: str): - if not os.path.isfile(file): - message = QMessageBox(QMessageBox.Icon.Warning, "File not found", "'%s' is not a file or cannot be opened" % (file)) - message.exec() - return - - model = LogFileModel(file) - big_text = BigText(model, self.settings) - self.tabs.addTab(big_text, model.get_tab_name()) - # open the new tab - self.tabs.setCurrentIndex(self.tabs.count()-1) def create_menu_bar(self) -> QMenuBar: menu_bar = QMenuBar() @@ -93,7 +77,7 @@ class MainWindow(QMainWindow): def _open_file(self) -> None: dialog = QFileDialog(self) (selected_file, _filter) = dialog.getOpenFileName(caption=self.tr("Open File")) - self.create_tab(selected_file) + self.tabs.create_tab(selected_file) diff --git a/tabs.py b/tabs.py new file mode 100644 index 0000000..5b995e1 --- /dev/null +++ b/tabs.py @@ -0,0 +1,58 @@ +import os +from typing import Mapping + +from PyQt6.QtWidgets import * +from PyQt6.QtCore import * +from PyQt6.QtGui import * + +from bigtext import BigText +from logFileModel import LogFileModel +from settings import Settings + +class Tabs(QWidget): + + tabs_by_index = {} + tabs_by_filename = {} + + def __init__(self, settings: Settings): + super(Tabs, self).__init__() + + self.settings = settings + + self.tabs = QTabWidget() + self.tabs.setTabsClosable(True) + self.tabs.setMovable(True) + self.tabs.tabCloseRequested.connect(self._close_tab) + + self.layout = QVBoxLayout(self) + self.layout.setContentsMargins(0, 0, 0, 0) + + self.layout.addWidget(self.tabs) + + def create_tab(self, file: str): + if not os.path.isfile(file): + message = QMessageBox(QMessageBox.Icon.Warning, "File not found", + "'%s' is not a file or cannot be opened" % (file)) + message.exec() + return + + model = LogFileModel(file) + big_text = BigText(model, self.settings) + + if big_text.get_file() in self.tabs_by_filename: + for tab_index in range(0, self.tabs.count()): + widget : BigText = self.tabs.widget(tab_index) + if widget.get_file() == big_text.get_file(): + self.tabs.setCurrentIndex(tab_index) + break + else: + tab_index = self.tabs.addTab(big_text, model.get_tab_name()) + self.tabs_by_filename[big_text.get_file()] = big_text + self.tabs.setCurrentIndex(tab_index) + + def _close_tab(self, tab_index: int): + big_text: BigText = self.tabs.widget(tab_index) + del self.tabs_by_filename[big_text.get_file()] + self.tabs.removeTab(tab_index) + +