From c9e963ee5d08caea9b167fd15a4dae3b4524f7dd Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Thu, 15 Dec 2022 09:13:24 +0100 Subject: [PATCH] first try --- dictlist.py | 36 ++++++++++++++++++++++++++++++++++++ grum.py | 14 ++++++++++++++ mainwin.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ mdi.py | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 132 insertions(+) create mode 100644 dictlist.py create mode 100755 grum.py create mode 100644 mainwin.py create mode 100644 mdi.py diff --git a/dictlist.py b/dictlist.py new file mode 100644 index 0000000..7fc144a --- /dev/null +++ b/dictlist.py @@ -0,0 +1,36 @@ +from PyQt5.QtWidgets import QListWidget, QListWidgetItem + + +class DictList(QListWidget): + + def __init__(self, data, *args, **kwargs): + super().__init__(*args, **kwargs) + self.data = {} + self.update(data) + + def update(self, data): + for k, v in data.items(): + self.add(k, v) + + def add(self, key, value): + if key not in self.data: + itm = QListWidgetItem(key) + self.addItem(itm) + self.data[key] = value + + def get(self, index): + key = self.get_key(index) + value = self.data[key] + return key, value + + def get_value(self, index): + _key, value = self.get(index) + return value + + def get_key(self, index): # this relies on dict being ordered + lst = list(self.data) + row = index.row() + return lst[row] + + + diff --git a/grum.py b/grum.py new file mode 100755 index 0000000..48de8de --- /dev/null +++ b/grum.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python + +import sys +from PyQt5.QtWidgets import QApplication +from mainwin import MainWindow + + +app = QApplication(sys.argv) +mw = MainWindow() +mw.show() +sys.exit(app.exec()) + + + diff --git a/mainwin.py b/mainwin.py new file mode 100644 index 0000000..2da0af1 --- /dev/null +++ b/mainwin.py @@ -0,0 +1,47 @@ +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import QMainWindow, QSplitter + +from dictlist import DictList +from mdi import MDIArea, MDISubWindow + + +class MainWindow(QMainWindow): + + def __init__(self, title="grum.py", *args, **kwargs): + super().__init__(*args, **kwargs) + self.setWindowTitle(title) + + data = {"a": 10, "b": 20, "c": 30, "d": 40} + self.lst = lst = DictList(data) + lst.setAlternatingRowColors(True) + lst.doubleClicked.connect(self.on_select_list_item) + self.setCentralWidget(lst) + + bar = self.menuBar() + self.mdi = mdi = MDIArea(bar) + + splitter = QSplitter(Qt.Horizontal) + splitter.addWidget(lst) + splitter.addWidget(mdi) + splitter.setSizes([100, 1000]) + + self.setCentralWidget(splitter) + + + def on_select_list_item(self, index): + key, value = self.lst.get(index) + + #TODO: just a test for dynamic adding + self.lst.add("x", 100) + + for sub in self.mdi.subWindowList(): + if sub.windowTitle() == key: + self.mdi.setActiveSubWindow(sub) + return + + sub = MDISubWindow(key, value) + self.mdi.addSubWindow(sub) + sub.show() + + + diff --git a/mdi.py b/mdi.py new file mode 100644 index 0000000..c6547eb --- /dev/null +++ b/mdi.py @@ -0,0 +1,35 @@ +from PyQt5.QtWidgets import QMdiArea, QMdiSubWindow, QAction +from PyQt5.QtWidgets import QTextEdit + + +class MDIArea(QMdiArea): + + def __init__(self, bar, *args, **kwargs): + super().__init__(*args, **kwargs) + + menu = bar.addMenu("View") + menu.addAction("Cascade") + menu.addAction("Tiled") + menu.triggered[QAction].connect(self.on_menu_select) + + + def on_menu_select(self, p): + txt = p.text() + if txt == "Cascade": + self.cascadeSubWindows() + elif txt == "Tiled": + self.tileSubWindows() + + + +class MDISubWindow(QMdiSubWindow): + + def __init__(self, title, data, *args, **kwargs): + super().__init__(*args, **kwargs) + self.setWindowTitle(title) + + txt = QTextEdit(str(data)) + self.setWidget(txt) + + +