diff --git a/blipblop/ui/resultsscreen.py b/blipblop/ui/resultsscreen.py index 047568c..10c92df 100644 --- a/blipblop/ui/resultsscreen.py +++ b/blipblop/ui/resultsscreen.py @@ -1,3 +1,6 @@ +import io +import csv +from PyQt5 import QtWidgets from PyQt5.QtGui import QFont, QKeySequence from PyQt5.QtWidgets import QAction, QComboBox, QFrame, QGroupBox, QHBoxLayout, QLabel, QSplitter, QStackedLayout, QTableWidget, QTableWidgetItem, QTextEdit, QVBoxLayout, QWidget from PyQt5.QtCore import QItemSelectionModel, Qt, reset, pyqtSignal @@ -21,14 +24,20 @@ class ResultsScreen(QWidget): font.setPointSize(25) label.setStyleSheet("color: #2D4B9A") label.setFont(font) - self._stack.addWidget(label) # 0 + self._stack.addWidget(label) # 0 self._stack.addWidget(self.table) # 1 self.setLayout(self._stack) self._back_action = QAction("back") self._back_action.setShortcut(QKeySequence("escape")) self._back_action.triggered.connect(self.on_back) + + self._copy_action = QAction("copy") + self._copy_action.setShortcut(QKeySequence("ctrl+c")) + self._copy_action.triggered.connect(self.copy_selection) + self.addAction(self._back_action) + self.addAction(self._copy_action) def set_results(self, measurement_results): if len(measurement_results) == 0: @@ -54,6 +63,26 @@ class ResultsScreen(QWidget): self._stack.setCurrentIndex(1) + def copy_selection(self): + """ + solution stolen from StackOverflow https://stackoverflow.com/a/55204654 + """ + selection = self.table.selectedIndexes() + if selection: + rows = sorted(index.row() for index in selection) + columns = sorted(index.column() for index in selection) + rowcount = rows[-1] - rows[0] + 1 + colcount = columns[-1] - columns[0] + 1 + table = [[''] * colcount for _ in range(rowcount)] + for index in selection: + row = index.row() - rows[0] + column = index.column() - columns[0] + table[row][column] = index.data() + stream = io.StringIO() + csv.writer(stream, delimiter='\t').writerows(table) + QtWidgets.qApp.clipboard().setText(stream.getvalue()) + return + def on_back(self): self.back_signal.emit()