mirror of https://gitlab.com/pamhyr/pamhyr2
geometry: Fix copy/paste command (+ with undo command).
parent
77714f710a
commit
02561be65c
|
|
@ -287,24 +287,6 @@ class Reach:
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Copy/Paste
|
|
||||||
|
|
||||||
def copy(self, index_list: List[int]):
|
|
||||||
self.__list_copied_profiles.clear()
|
|
||||||
index_list = list(set(index_list)) # delete duplicate index
|
|
||||||
|
|
||||||
for index in index_list:
|
|
||||||
try:
|
|
||||||
self.__list_copied_profiles.append(deepcopy(self.get_profile_i(index)))
|
|
||||||
except IndexError:
|
|
||||||
raise IndexError(f"Invalid profile index: {index}")
|
|
||||||
|
|
||||||
def paste(self):
|
|
||||||
if self.__list_copied_profiles:
|
|
||||||
for profile in self.__list_copied_profiles:
|
|
||||||
self._profiles.append(profile)
|
|
||||||
|
|
||||||
|
|
||||||
# Import/Export
|
# Import/Export
|
||||||
|
|
||||||
def import_geometry(self, file_path_name: str):
|
def import_geometry(self, file_path_name: str):
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import sys
|
||||||
import csv
|
import csv
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
from tools import timer
|
from tools import timer
|
||||||
|
|
||||||
from PyQt5 import QtWidgets
|
from PyQt5 import QtWidgets
|
||||||
|
|
@ -49,8 +50,10 @@ class GeometryWindow(QMainWindow, WindowToolKit):
|
||||||
|
|
||||||
self._tablemodel = None
|
self._tablemodel = None
|
||||||
|
|
||||||
|
self._clipboard = None
|
||||||
|
|
||||||
self.setup_window()
|
self.setup_window()
|
||||||
self.setup_undo()
|
self.setup_sc()
|
||||||
self.setup_model()
|
self.setup_model()
|
||||||
self.setup_plots()
|
self.setup_plots()
|
||||||
self.setup_connections()
|
self.setup_connections()
|
||||||
|
|
@ -59,11 +62,13 @@ class GeometryWindow(QMainWindow, WindowToolKit):
|
||||||
def setup_window(self):
|
def setup_window(self):
|
||||||
self.setWindowTitle(f"{self.ui.mainwindow_title} - {self._reach.name}")
|
self.setWindowTitle(f"{self.ui.mainwindow_title} - {self._reach.name}")
|
||||||
|
|
||||||
def setup_undo(self):
|
def setup_sc(self):
|
||||||
self._undo_stack = QUndoStack()
|
self._undo_stack = QUndoStack()
|
||||||
|
|
||||||
self.undo_sc = QShortcut(QKeySequence.Undo, self)
|
self.undo_sc = QShortcut(QKeySequence.Undo, self)
|
||||||
self.redo_sc = QShortcut(QKeySequence.Redo, self)
|
self.redo_sc = QShortcut(QKeySequence.Redo, self)
|
||||||
|
self.copy_sc = QShortcut(QKeySequence.Copy, self)
|
||||||
|
self.paste_sc = QShortcut(QKeySequence.Paste, self)
|
||||||
|
|
||||||
def setup_model(self):
|
def setup_model(self):
|
||||||
self._tablemodel = qtableview_reach.PandasModelEditable(
|
self._tablemodel = qtableview_reach.PandasModelEditable(
|
||||||
|
|
@ -98,6 +103,8 @@ class GeometryWindow(QMainWindow, WindowToolKit):
|
||||||
|
|
||||||
self.undo_sc.activated.connect(self.undo)
|
self.undo_sc.activated.connect(self.undo)
|
||||||
self.redo_sc.activated.connect(self.redo)
|
self.redo_sc.activated.connect(self.redo)
|
||||||
|
self.copy_sc.activated.connect(self.copy)
|
||||||
|
self.paste_sc.activated.connect(self.paste)
|
||||||
|
|
||||||
# Profile selection when line change in table
|
# Profile selection when line change in table
|
||||||
self.tableView.selectionModel()\
|
self.tableView.selectionModel()\
|
||||||
|
|
@ -408,6 +415,25 @@ class GeometryWindow(QMainWindow, WindowToolKit):
|
||||||
self._tablemodel.move_row_up(row)
|
self._tablemodel.move_row_up(row)
|
||||||
self.select_current_profile()
|
self.select_current_profile()
|
||||||
|
|
||||||
|
def copy(self):
|
||||||
|
rows = self.tableView\
|
||||||
|
.selectionModel()\
|
||||||
|
.selectedRows()
|
||||||
|
|
||||||
|
self._clipboard = []
|
||||||
|
|
||||||
|
for row in rows:
|
||||||
|
self._clipboard.append(
|
||||||
|
deepcopy(
|
||||||
|
self._reach.profile(row.row())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def paste(self):
|
||||||
|
row = self.index_selected_row()
|
||||||
|
self._tablemodel.paste(row, self._clipboard)
|
||||||
|
self.select_current_profile()
|
||||||
|
|
||||||
def undo(self):
|
def undo(self):
|
||||||
self._tablemodel.undo()
|
self._tablemodel.undo()
|
||||||
self.select_current_profile()
|
self.select_current_profile()
|
||||||
|
|
|
||||||
|
|
@ -104,3 +104,24 @@ class MoveCommand(QUndoCommand):
|
||||||
self._reach.move_up_profile(self._i)
|
self._reach.move_up_profile(self._i)
|
||||||
else:
|
else:
|
||||||
self._reach.move_down_profile(self._i)
|
self._reach.move_down_profile(self._i)
|
||||||
|
|
||||||
|
|
||||||
|
class PasteCommand(QUndoCommand):
|
||||||
|
def __init__(self, reach, row, profiles):
|
||||||
|
QUndoCommand.__init__(self)
|
||||||
|
|
||||||
|
self._reach = reach
|
||||||
|
self._row = row
|
||||||
|
self._profiles = profiles
|
||||||
|
|
||||||
|
def undo(self):
|
||||||
|
for ind in range(len(self._profiles)):
|
||||||
|
self._reach.delete(self._row)
|
||||||
|
|
||||||
|
def redo(self):
|
||||||
|
self._profiles.reverse()
|
||||||
|
|
||||||
|
for pro in self._profiles:
|
||||||
|
self._reach.insert_profile(self._row, pro)
|
||||||
|
|
||||||
|
self._profiles.reverse()
|
||||||
|
|
|
||||||
|
|
@ -211,6 +211,25 @@ class PandasModelEditable(QAbstractTableModel):
|
||||||
self.endMoveRows()
|
self.endMoveRows()
|
||||||
self.layoutChanged.emit()
|
self.layoutChanged.emit()
|
||||||
|
|
||||||
|
def paste(self, row, profiles):
|
||||||
|
if row > self._reach.number_profiles:
|
||||||
|
return
|
||||||
|
|
||||||
|
if len(profiles) == 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.layoutAboutToBeChanged.emit()
|
||||||
|
|
||||||
|
self._undo_stack.push(
|
||||||
|
PasteCommand(
|
||||||
|
self._reach, row, profiles
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.layoutAboutToBeChanged.emit()
|
||||||
|
self.layoutChanged.emit()
|
||||||
|
|
||||||
|
|
||||||
def undo(self):
|
def undo(self):
|
||||||
self._undo_stack.undo()
|
self._undo_stack.undo()
|
||||||
self.layoutChanged.emit()
|
self.layoutChanged.emit()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue