Sfoglia il codice sorgente

- working on the tool reordering in the Geometry UI

Marius Stanciu 5 anni fa
parent
commit
7f082760bb
4 ha cambiato i file con 66 aggiunte e 9 eliminazioni
  1. 1 0
      CHANGELOG.md
  2. 18 5
      appGUI/GUIElements.py
  3. 1 1
      appGUI/ObjectUI.py
  4. 46 3
      appObjects/FlatCAMGeometry.py

+ 1 - 0
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
 

+ 18 - 5
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):

+ 1 - 1
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)
 

+ 46 - 3
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(
                 "<b>%s: <font color='#0000FF'>%s</font></b>" % (_('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(
+                "<b>%s: <font color='#0000FF'>%s</font></b>" % (_('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)