From 7f082760bbb568481a8fae0d0b270e4661d5c0fb Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 10 Jun 2020 10:25:48 +0300 Subject: [PATCH] - working on the tool reordering in the Geometry UI --- CHANGELOG.md | 1 + appGUI/GUIElements.py | 23 ++++++++++++---- appGUI/ObjectUI.py | 2 +- appObjects/FlatCAMGeometry.py | 49 ++++++++++++++++++++++++++++++++--- 4 files changed, 66 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 871d3f30..70afe7e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ CHANGELOG for FlatCAM beta 10.06.2020 - fixed bug in the Isolation Tool that in certain cases an empty geometry was present in the solid_geometry which mae the CNCJob object generation to fail. It happen for Gerber objects created in the Gerber Editor +- working on the tool reordering in the Geometry UI 9.06.2020 diff --git a/appGUI/GUIElements.py b/appGUI/GUIElements.py index 012f8bad..64d146ca 100644 --- a/appGUI/GUIElements.py +++ b/appGUI/GUIElements.py @@ -2396,7 +2396,7 @@ class OptionalHideInputSection: class FCTable(QtWidgets.QTableWidget): - drag_drop_sig = QtCore.pyqtSignal() + drag_drop_sig = QtCore.pyqtSignal(int, int) lost_focus = QtCore.pyqtSignal() def __init__(self, drag_drop=False, protected_rows=None, parent=None): @@ -2431,6 +2431,7 @@ class FCTable(QtWidgets.QTableWidget): self.rows_not_for_drag_and_drop = [protected_rows] self.rows_to_move = [] + self.row_dragged = None def sizeHint(self): default_hint_size = super(FCTable, self).sizeHint() @@ -2455,10 +2456,12 @@ class FCTable(QtWidgets.QTableWidget): # if user is clicking an blank area inside the QTableWidget it will deselect currently selected rows def mousePressEvent(self, event): - if not self.itemAt(event.pos()): + clicked_item = self.itemAt(event.pos()) + if not clicked_item: self.clearSelection() self.clearFocus() else: + self.row_dragged = clicked_item.row() QtWidgets.QTableWidget.mousePressEvent(self, event) def focusOutEvent(self, event): @@ -2545,6 +2548,13 @@ class FCTable(QtWidgets.QTableWidget): # return rect.contains(pos, True) and not ( # int(self.model().flags(index)) & Qt.ItemIsDropEnabled) and pos.y() >= rect.center().y() + def dragEnterEvent(self, e: QtGui.QDragEnterEvent) -> None: + if e.source() == self: + self.blockSignals(True) + e.accept() + else: + e.ignore() + def dropEvent(self, event): """ From here: https://stackoverflow.com/questions/26227885/drag-and-drop-rows-within-qtablewidget @@ -2552,6 +2562,7 @@ class FCTable(QtWidgets.QTableWidget): :return: """ if event.source() == self: + event.acceptProposedAction() rows = set([mi.row() for mi in self.selectedIndexes()]) # if one of the selected rows for drag and drop is within the protected list, return @@ -2592,10 +2603,12 @@ class FCTable(QtWidgets.QTableWidget): for row in reversed(sorted(rowMapping.keys())): self.removeRow(row) - event.accept() - self.drag_drop_sig.emit() - return + self.target_row = targetRow + self.blockSignals(False) + self.drag_drop_sig.emit(int(self.row_dragged), int(targetRow)) + else: + event.ignore() class SpinBoxDelegate(QtWidgets.QItemDelegate): diff --git a/appGUI/ObjectUI.py b/appGUI/ObjectUI.py index c753f266..3cad638a 100644 --- a/appGUI/ObjectUI.py +++ b/appGUI/ObjectUI.py @@ -1385,7 +1385,7 @@ class GeometryObjectUI(ObjectUI): self.plot_cb.setLayoutDirection(QtCore.Qt.RightToLeft) grid0.addWidget(self.plot_cb, 0, 1) - self.geo_tools_table = FCTable() + self.geo_tools_table = FCTable(drag_drop=True) grid0.addWidget(self.geo_tools_table, 1, 0, 1, 2) self.geo_tools_table.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents) diff --git a/appObjects/FlatCAMGeometry.py b/appObjects/FlatCAMGeometry.py index 6f572905..766cad01 100644 --- a/appObjects/FlatCAMGeometry.py +++ b/appObjects/FlatCAMGeometry.py @@ -376,7 +376,9 @@ class GeometryObject(FlatCAMObj, Geometry): sel_rows = [] sel_items = self.ui.geo_tools_table.selectedItems() for it in sel_items: - sel_rows.append(it.row()) + new_row = it.row() + if new_row not in sel_rows: + sel_rows.append(new_row) if len(sel_rows) > 1: self.ui.tool_data_label.setText( "%s: %s" % (_('Parameters for'), _("Multiple Tools")) @@ -618,6 +620,37 @@ class GeometryObject(FlatCAMObj, Geometry): self.ui.delete_sel_area_button.clicked.connect(self.on_delete_sel_areas) self.ui.strategy_radio.activated_custom.connect(self.on_strategy) + self.ui.geo_tools_table.drag_drop_sig.connect(self.rebuild_ui) + + def rebuild_ui(self, old_row, new_row): + for td in self.tools: + print(td, type(td), self.tools[td]) + + item = self.ui.geo_tools_table.item(new_row, 5) + old_tooluid = int(item.text()) + old_dict = self.tools.pop(old_tooluid) + + item = self.ui.geo_tools_table.item(old_row, 5) + new_tooluid = int(item.text()) + + print(old_tooluid, new_tooluid) + + new_tools = {} + new_tid = 1 + + for k, v in list(self.tools.items()): + if k != new_tooluid: + new_tools[new_tid] = deepcopy(v) + else: + new_tools[new_tid] = deepcopy(old_dict) + new_tools[new_tid + 1] = deepcopy(v) + new_tid += 1 + + self.tools = new_tools + for td in self.tools: + print(td, self.tools[td]) + self.build_ui() + def on_cut_z_changed(self): self.old_cutz = self.ui.cutz_entry.get_value() @@ -798,12 +831,22 @@ class GeometryObject(FlatCAMObj, Geometry): sel_rows = [] sel_items = self.ui.geo_tools_table.selectedItems() for it in sel_items: - sel_rows.append(it.row()) + new_row = it.row() + if new_row not in sel_rows: + sel_rows.append(new_row) else: sel_rows = row if type(row) == list else [row] if not sel_rows: - sel_rows = [0] + # sel_rows = [0] + self.ui.generate_cnc_button.setDisabled(True) + self.ui.tool_data_label.setText( + "%s: %s" % (_('Parameters for'), _("No Tool Selected")) + ) + self.ui_connect() + return + else: + self.ui.generate_cnc_button.setDisabled(False) for current_row in sel_rows: self.set_tool_offset_visibility(current_row)