Преглед изворни кода

- finished the new database based on a QTreeWidget

Marius Stanciu пре 5 година
родитељ
комит
5554cf0afa
3 измењених фајлова са 229 додато и 401 уклоњено
  1. 224 400
      FlatCAMCommon.py
  2. 4 0
      README.md
  3. 1 1
      requirements.txt

+ 224 - 400
FlatCAMCommon.py

@@ -1425,6 +1425,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.tree_widget = FCTree(columns=2, header_hidden=False, protected_column=[0])
         self.tree_widget.setHeaderLabels(["ID", "Tool Name"])
         self.tree_widget.setIndentation(0)
+        self.tree_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
+        self.tree_widget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
 
         # set alternating colors
         # self.tree_widget.setAlternatingRowColors(True)
@@ -1436,7 +1438,14 @@ class ToolsDB2(QtWidgets.QWidget):
         tree_layout.addWidget(self.tree_widget)
 
         param_hlay = QtWidgets.QHBoxLayout()
-        grid_layout.addLayout(param_hlay, 0, 1)
+        param_area = QtWidgets.QScrollArea()
+        param_widget = QtWidgets.QWidget()
+        param_widget.setLayout(param_hlay)
+
+        param_area.setWidget(param_widget)
+        param_area.setWidgetResizable(True)
+
+        grid_layout.addWidget(param_area, 0, 1)
 
         # ###########################################################################
         # ############## The UI form ################################################
@@ -1450,7 +1459,6 @@ class ToolsDB2(QtWidgets.QWidget):
         }
         """)
         self.basic_vlay = QtWidgets.QVBoxLayout()
-        self.basic_box.setLayout(self.basic_vlay)
         self.basic_box.setTitle(_("Basic Parameters"))
         self.basic_box.setMinimumWidth(250)
 
@@ -1463,21 +1471,25 @@ class ToolsDB2(QtWidgets.QWidget):
                 }
                 """)
         self.advanced_vlay = QtWidgets.QVBoxLayout()
-        self.advanced_box.setLayout(self.advanced_vlay)
         self.advanced_box.setTitle(_("Advanced Parameters"))
         self.advanced_box.setMinimumWidth(250)
 
-        param_hlay.addLayout(self.basic_vlay)
-        param_hlay.addLayout(self.advanced_vlay)
+        self.basic_box.setLayout(self.basic_vlay)
+        self.advanced_box.setLayout(self.advanced_vlay)
+
+        param_hlay.addWidget(self.basic_box)
+        param_hlay.addWidget(self.advanced_box)
+        param_hlay.addStretch()
 
         # ###########################################################################
         # ############### BASIC UI form #############################################
         # ###########################################################################
 
-        grid0 = QtWidgets.QGridLayout()
-        self.advanced_vlay.addLayout(grid0)
-        grid0.setColumnStretch(0, 0)
-        grid0.setColumnStretch(1, 1)
+        self.grid0 = QtWidgets.QGridLayout()
+        self.basic_vlay.addLayout(self.grid0)
+        self.grid0.setColumnStretch(0, 0)
+        self.grid0.setColumnStretch(1, 1)
+        self.basic_vlay.addStretch()
 
         # Tool Name
         self.name_label = QtWidgets.QLabel('%s:' % _('Tool Name'))
@@ -1489,8 +1501,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.name_entry = FCEntry()
         self.name_entry.setObjectName('gdb_name')
 
-        grid0.addWidget(self.name_label, 0, 0)
-        grid0.addWidget(self.name_entry, 0, 1)
+        self.grid0.addWidget(self.name_label, 0, 0)
+        self.grid0.addWidget(self.name_entry, 0, 1)
 
         # Tool Dia
         self.dia_label = QtWidgets.QLabel('%s:' % _('Tool Dia'))
@@ -1502,8 +1514,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.dia_entry.set_precision(self.decimals)
         self.dia_entry.setObjectName('gdb_dia')
 
-        grid0.addWidget(self.dia_label, 1, 0)
-        grid0.addWidget(self.dia_entry, 1, 1)
+        self.grid0.addWidget(self.dia_label, 1, 0)
+        self.grid0.addWidget(self.dia_entry, 1, 1)
 
         # Tool Shape
         self.shape_label = QtWidgets.QLabel('%s:' % _('Tool Shape'))
@@ -1518,8 +1530,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.shape_combo.addItems(["C1", "C2", "C3", "C4", "B", "V"])
         self.shape_combo.setObjectName('gdb_shape')
 
-        grid0.addWidget(self.shape_label, 2, 0)
-        grid0.addWidget(self.shape_combo, 2, 1)
+        self.grid0.addWidget(self.shape_label, 2, 0)
+        self.grid0.addWidget(self.shape_combo, 2, 1)
 
         # Cut Z
         self.cutz_label = QtWidgets.QLabel('%s:' % _("Cut Z"))
@@ -1532,8 +1544,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.cutz_entry.set_precision(self.decimals)
         self.cutz_entry.setObjectName('gdb_cutz')
 
-        grid0.addWidget(self.cutz_label, 4, 0)
-        grid0.addWidget(self.cutz_entry, 4, 1)
+        self.grid0.addWidget(self.cutz_label, 4, 0)
+        self.grid0.addWidget(self.cutz_entry, 4, 1)
 
         # Multi Depth
         self.multidepth_label = QtWidgets.QLabel('%s:' % _("MultiDepth"))
@@ -1545,8 +1557,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.multidepth_cb = FCCheckBox()
         self.multidepth_cb.setObjectName('gdb_multidepth')
 
-        grid0.addWidget(self.multidepth_label, 5, 0)
-        grid0.addWidget(self.multidepth_cb, 5, 1)
+        self.grid0.addWidget(self.multidepth_label, 5, 0)
+        self.grid0.addWidget(self.multidepth_cb, 5, 1)
 
         # Depth Per Pass
         self.dpp_label = QtWidgets.QLabel('%s:' % _("DPP"))
@@ -1559,8 +1571,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.multidepth_entry.set_precision(self.decimals)
         self.multidepth_entry.setObjectName('gdb_multidepth_entry')
 
-        grid0.addWidget(self.dpp_label, 7, 0)
-        grid0.addWidget(self.multidepth_entry, 7, 1)
+        self.grid0.addWidget(self.dpp_label, 7, 0)
+        self.grid0.addWidget(self.multidepth_entry, 7, 1)
 
         # Travel Z
         self.travelz_label = QtWidgets.QLabel('%s:' % _("Travel Z"))
@@ -1574,8 +1586,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.travelz_entry.set_precision(self.decimals)
         self.travelz_entry.setObjectName('gdb_travel')
 
-        grid0.addWidget(self.travelz_label, 9, 0)
-        grid0.addWidget(self.travelz_entry, 9, 1)
+        self.grid0.addWidget(self.travelz_label, 9, 0)
+        self.grid0.addWidget(self.travelz_entry, 9, 1)
 
         # Feedrate X-Y
         self.frxy_label = QtWidgets.QLabel('%s:' % _("Feedrate X-Y"))
@@ -1583,11 +1595,13 @@ class ToolsDB2(QtWidgets.QWidget):
             _("Feedrate X-Y. Feedrate\n"
               "The speed on XY plane used while cutting into material."))
 
-        self.frxy_entry = FCEntry()
+        self.frxy_entry = FCDoubleSpinner()
+        self.frxy_entry.set_range(-9999.9999, 9999.9999)
+        self.frxy_entry.set_precision(self.decimals)
         self.frxy_entry.setObjectName('gdb_frxy')
 
-        grid0.addWidget(self.frxy_label, 12, 0)
-        grid0.addWidget(self.frxy_entry, 12, 1)
+        self.grid0.addWidget(self.frxy_label, 12, 0)
+        self.grid0.addWidget(self.frxy_entry, 12, 1)
 
         # Feedrate Z
         self.frz_label = QtWidgets.QLabel('%s:' % _("Feedrate Z"))
@@ -1600,8 +1614,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.frz_entry.set_precision(self.decimals)
         self.frz_entry.setObjectName('gdb_frz')
 
-        grid0.addWidget(self.frz_label, 14, 0)
-        grid0.addWidget(self.frz_entry, 14, 1)
+        self.grid0.addWidget(self.frz_label, 14, 0)
+        self.grid0.addWidget(self.frz_entry, 14, 1)
 
         # Spindle Spped
         self.spindle_label = QtWidgets.QLabel('%s:' % _("Spindle Speed"))
@@ -1615,8 +1629,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.spindle_entry.set_precision(self.decimals)
         self.frz_entry.setObjectName('gdb_spindle')
 
-        grid0.addWidget(self.spindle_label, 15, 0)
-        grid0.addWidget(self.spindle_entry, 15, 1)
+        self.grid0.addWidget(self.spindle_label, 15, 0)
+        self.grid0.addWidget(self.spindle_entry, 15, 1)
 
         # Dwell
         self.dwell_label = QtWidgets.QLabel('%s:' % _("Dwell"))
@@ -1628,8 +1642,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.dwell_cb = FCCheckBox()
         self.dwell_cb.setObjectName('gdb_dwell')
 
-        grid0.addWidget(self.dwell_label, 16, 0)
-        grid0.addWidget(self.dwell_cb, 16, 1)
+        self.grid0.addWidget(self.dwell_label, 16, 0)
+        self.grid0.addWidget(self.dwell_cb, 16, 1)
 
         # Dwell Time
         self.dwelltime_label = QtWidgets.QLabel('%s:' % _("Dwelltime"))
@@ -1642,17 +1656,18 @@ class ToolsDB2(QtWidgets.QWidget):
         self.dwelltime_entry.set_precision(self.decimals)
         self.dwelltime_entry.setObjectName('gdb_dwelltime')
 
-        grid0.addWidget(self.dwelltime_label, 17, 0)
-        grid0.addWidget(self.dwelltime_entry, 17, 1)
+        self.grid0.addWidget(self.dwelltime_label, 17, 0)
+        self.grid0.addWidget(self.dwelltime_entry, 17, 1)
 
         # ###########################################################################
         # ############### ADVANCED UI form ##########################################
         # ###########################################################################
 
-        grid1 = QtWidgets.QGridLayout()
-        self.advanced_vlay.addLayout(grid1)
-        grid1.setColumnStretch(0, 0)
-        grid1.setColumnStretch(1, 1)
+        self.grid1 = QtWidgets.QGridLayout()
+        self.advanced_vlay.addLayout(self.grid1)
+        self.grid1.setColumnStretch(0, 0)
+        self.grid1.setColumnStretch(1, 1)
+        self.advanced_vlay.addStretch()
 
         # Tool Type
         self.type_label = QtWidgets.QLabel('%s:' % _("Tool Type"))
@@ -1667,8 +1682,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.type_combo.addItems(["Iso", "Rough", "Finish"])
         self.type_combo.setObjectName('gdb_type')
 
-        grid1.addWidget(self.type_label, 0, 0)
-        grid1.addWidget(self.type_combo, 0, 1)
+        self.grid1.addWidget(self.type_label, 0, 0)
+        self.grid1.addWidget(self.type_combo, 0, 1)
 
         # Tool Offset
         self.tooloffset_label = QtWidgets.QLabel('%s:' % _('Tool Offset'))
@@ -1684,8 +1699,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.tooloffset_combo.addItems(["Path", "In", "Out", "Custom"])
         self.tooloffset_combo.setObjectName('gdb_tool_offset')
 
-        grid1.addWidget(self.tooloffset_label, 2, 0)
-        grid1.addWidget(self.tooloffset_combo, 2, 1)
+        self.grid1.addWidget(self.tooloffset_label, 2, 0)
+        self.grid1.addWidget(self.tooloffset_combo, 2, 1)
 
         # Custom Offset
         self.custom_offset_label = QtWidgets.QLabel('%s:' % _("Custom Offset"))
@@ -1698,8 +1713,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.custom_offset_entry.set_precision(self.decimals)
         self.custom_offset_entry.setObjectName('gdb_custom_offset')
 
-        grid1.addWidget(self.custom_offset_label, 5, 0)
-        grid1.addWidget(self.custom_offset_entry, 5, 1)
+        self.grid1.addWidget(self.custom_offset_label, 5, 0)
+        self.grid1.addWidget(self.custom_offset_entry, 5, 1)
 
         # V-Dia
         self.vdia_label = QtWidgets.QLabel('%s:' % _("V-Dia"))
@@ -1712,8 +1727,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.vdia_entry.set_precision(self.decimals)
         self.vdia_entry.setObjectName('gdb_vdia')
 
-        grid1.addWidget(self.vdia_label, 7, 0)
-        grid1.addWidget(self.vdia_entry, 7, 1)
+        self.grid1.addWidget(self.vdia_label, 7, 0)
+        self.grid1.addWidget(self.vdia_entry, 7, 1)
 
         # V-Angle
         self.vangle_label = QtWidgets.QLabel('%s:' %  _("V-Angle"))
@@ -1726,8 +1741,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.vangle_entry.set_precision(self.decimals)
         self.vangle_entry.setObjectName('gdb_vangle')
 
-        grid1.addWidget(self.vangle_label, 8, 0)
-        grid1.addWidget(self.vangle_entry, 8, 1)
+        self.grid1.addWidget(self.vangle_label, 8, 0)
+        self.grid1.addWidget(self.vangle_entry, 8, 1)
 
         # Feedrate Rapids
         self.frapids_label = QtWidgets.QLabel('%s:' %  _("FR Rapids"))
@@ -1742,8 +1757,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.frapids_entry.set_precision(self.decimals)
         self.frapids_entry.setObjectName('gdb_frapids')
 
-        grid1.addWidget(self.frapids_label, 10, 0)
-        grid1.addWidget(self.frapids_entry, 10, 1)
+        self.grid1.addWidget(self.frapids_label, 10, 0)
+        self.grid1.addWidget(self.frapids_entry, 10, 1)
 
         # Extra Cut
         self.ecut_label = QtWidgets.QLabel('%s:' % _("ExtraCut"))
@@ -1757,8 +1772,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.ecut_cb = FCCheckBox()
         self.ecut_cb.setObjectName('gdb_ecut')
 
-        grid1.addWidget(self.ecut_label, 12, 0)
-        grid1.addWidget(self.ecut_cb, 12, 1)
+        self.grid1.addWidget(self.ecut_label, 12, 0)
+        self.grid1.addWidget(self.ecut_cb, 12, 1)
 
         # Extra Cut Length
         self.ecut_length_label = QtWidgets.QLabel('%s:' % _("E-Cut Length"))
@@ -1775,8 +1790,8 @@ class ToolsDB2(QtWidgets.QWidget):
         self.ecut_length_entry.set_precision(self.decimals)
         self.ecut_length_entry.setObjectName('gdb_ecut_length')
 
-        grid1.addWidget(self.ecut_length_label, 13, 0)
-        grid1.addWidget(self.ecut_length_entry, 13, 1)
+        self.grid1.addWidget(self.ecut_length_label, 13, 0)
+        self.grid1.addWidget(self.ecut_length_entry, 13, 1)
 
         # ####################################################################
         # ####################################################################
@@ -1862,7 +1877,7 @@ class ToolsDB2(QtWidgets.QWidget):
             "depthperpass":     self.multidepth_entry,
             "travelz":          self.travelz_entry,
             "feedrate":         self.frxy_entry,
-            "feedrate_z":       self.frxy_entry,
+            "feedrate_z":       self.frz_entry,
             "spindlespeed":     self.spindle_entry,
             "dwell":            self.dwell_cb,
             "dwelltime":        self.dwelltime_entry,
@@ -1904,6 +1919,8 @@ class ToolsDB2(QtWidgets.QWidget):
             "gdb_ecut_length":      "extracut_length"
         }
 
+        self.current_toolid = None
+
         # ##############################################################################
         # ######################## SIGNALS #############################################
         # ##############################################################################
@@ -1920,20 +1937,38 @@ class ToolsDB2(QtWidgets.QWidget):
         # self.tree_widget.selectionModel().selectionChanged.connect(self.on_list_selection_change)
         self.tree_widget.currentItemChanged.connect(self.on_list_selection_change)
         self.tree_widget.itemChanged.connect(self.on_list_item_edited)
+        self.tree_widget.customContextMenuRequested.connect(self.on_menu_request)
 
         self.setup_db_ui()
 
+    def on_menu_request(self, pos):
+
+        menu = QtWidgets.QMenu()
+        add_tool = menu.addAction(QtGui.QIcon(self.app.resource_location + '/plus16.png'), _("Add to DB"))
+        add_tool.triggered.connect(self.on_tool_add)
+
+        copy_tool = menu.addAction(QtGui.QIcon(self.app.resource_location + '/copy16.png'), _("Copy from DB"))
+        copy_tool.triggered.connect(self.on_tool_copy)
+
+        delete_tool = menu.addAction(QtGui.QIcon(self.app.resource_location + '/delete32.png'), _("Delete from DB"))
+        delete_tool.triggered.connect(self.on_tool_delete)
+
+        # tree_item = self.tree_widget.itemAt(pos)
+        menu.exec(self.tree_widget.viewport().mapToGlobal(pos))
+
     def on_list_selection_change(self, current, previous):
         # for idx in current.indexes():
         #     print(idx.data())
-        print(current.text(0))
-        self.table_widget.selectRow(int(current.text(0))-1)
+        # print(current.text(0))
+        self.current_toolid = int(current.text(0))
+
+        self.storage_to_form(self.db_tool_dict[current.text(0)])
 
     def on_list_item_edited(self, item, column):
         if column == 0:
             return
-        row = int(item.text(0)) - 1
-        self.table_widget.item(row, 1).setText(item.text(1))
+
+        self.name_entry.set_value(item.text(1))
 
     def storage_to_form(self, dict_storage):
         for form_key in self.form_fields:
@@ -1941,8 +1976,15 @@ class ToolsDB2(QtWidgets.QWidget):
                 if form_key == storage_key:
                     try:
                         self.form_fields[form_key].set_value(dict_storage[form_key])
-                    except Exception:
-                        pass
+                    except Exception as e:
+                        print(str(e))
+                if storage_key == 'data':
+                    for data_key in dict_storage[storage_key]:
+                        if form_key == data_key:
+                            try:
+                                self.form_fields[form_key].set_value(dict_storage['data'][data_key])
+                            except Exception as e:
+                                print(str(e))
 
     def form_to_storage(self, tool):
         self.blockSignals(True)
@@ -1988,18 +2030,8 @@ class ToolsDB2(QtWidgets.QWidget):
 
         self.build_db_ui()
 
-        self.tree_widget.setupContextMenu()
-        self.tree_widget.addContextMenu(
-            _("Add to DB"), self.on_tool_add, icon=QtGui.QIcon(self.app.resource_location + "/plus16.png"))
-        self.tree_widget.addContextMenu(
-            _("Copy from DB"), self.on_tool_copy, icon=QtGui.QIcon(self.app.resource_location + "/copy16.png"))
-        self.tree_widget.addContextMenu(
-            _("Delete from DB"), self.on_tool_delete, icon=QtGui.QIcon(self.app.resource_location + "/delete32.png"))
-
     def build_db_ui(self):
         self.ui_disconnect()
-        self.table_widget.setRowCount(len(self.db_tool_dict))
-
         nr_crt = 0
 
         parent = self.tree_widget
@@ -2013,7 +2045,7 @@ class ToolsDB2(QtWidgets.QWidget):
 
             t_name = dict_val['name']
             try:
-                self.add_tool_table_line(row, name=t_name, widget=self.table_widget, tooldict=dict_val)
+                # self.add_tool_table_line(row, name=t_name, tooldict=dict_val)
                 self.tree_widget.blockSignals(True)
                 try:
                     self.tree_widget.addParentEditable(parent=parent, title=[str(row+1), t_name], editable=True)
@@ -2022,211 +2054,18 @@ class ToolsDB2(QtWidgets.QWidget):
                 self.tree_widget.blockSignals(False)
             except Exception as e:
                 self.app.log.debug("ToolDB.build_db_ui.add_tool_table_line() --> %s" % str(e))
-            vertical_header = self.table_widget.verticalHeader()
-            vertical_header.hide()
-
-            horizontal_header = self.table_widget.horizontalHeader()
-            horizontal_header.setMinimumSectionSize(10)
-            horizontal_header.setDefaultSectionSize(70)
 
-            self.table_widget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
-            for x in range(27):
-                self.table_widget.resizeColumnToContents(x)
-
-            horizontal_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Fixed)
-            # horizontal_header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch)
-            # horizontal_header.setSectionResizeMode(13, QtWidgets.QHeaderView.Fixed)
-
-            horizontal_header.resizeSection(0, 20)
-            # horizontal_header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
-            # horizontal_header.setSectionResizeMode(2, QtWidgets.QHeaderView.Stretch)
+        if self.current_toolid is None or self.current_toolid < 1:
+            if self.db_tool_dict:
+                self.storage_to_form(self.db_tool_dict['1'])
+        else:
+            self.storage_to_form(self.db_tool_dict[str(self.current_toolid)])
 
         self.ui_connect()
 
-    def add_tool_table_line(self, row, name, widget, tooldict):
+    def add_tool_table_line(self, row, name, tooldict):
         data = tooldict['data']
 
-        nr_crt = row + 1
-        id_item = QtWidgets.QTableWidgetItem('%d' % int(nr_crt))
-        # id_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
-        flags = id_item.flags() & ~QtCore.Qt.ItemIsEditable
-        id_item.setFlags(flags)
-        widget.setItem(row, 0, id_item)  # Tool name/id
-
-        tool_name_item = QtWidgets.QTableWidgetItem(name)
-        widget.setItem(row, 1, tool_name_item)
-
-        dia_item = FCDoubleSpinner()
-        dia_item.set_precision(self.decimals)
-        dia_item.setSingleStep(0.1)
-        dia_item.set_range(0.0, 9999.9999)
-        dia_item.set_value(float(tooldict['tooldia']))
-        widget.setCellWidget(row, 2, dia_item)
-
-        tool_offset_item = FCComboBox()
-        for item in self.offset_item_options:
-            tool_offset_item.addItem(item)
-        tool_offset_item.set_value(tooldict['offset'])
-        widget.setCellWidget(row, 3, tool_offset_item)
-
-        c_offset_item = FCDoubleSpinner()
-        c_offset_item.set_precision(self.decimals)
-        c_offset_item.setSingleStep(0.1)
-        c_offset_item.set_range(-9999.9999, 9999.9999)
-        c_offset_item.set_value(float(tooldict['offset_value']))
-        widget.setCellWidget(row, 4, c_offset_item)
-
-        tt_item = FCComboBox()
-        for item in self.type_item_options:
-            tt_item.addItem(item)
-        tt_item.set_value(tooldict['type'])
-        widget.setCellWidget(row, 5, tt_item)
-
-        tshape_item = FCComboBox()
-        for item in self.tool_type_item_options:
-            tshape_item.addItem(item)
-        tshape_item.set_value(tooldict['tool_type'])
-        widget.setCellWidget(row, 6, tshape_item)
-
-        cutz_item = FCDoubleSpinner()
-        cutz_item.set_precision(self.decimals)
-        cutz_item.setSingleStep(0.1)
-        if self.app.defaults['global_machinist_setting']:
-            cutz_item.set_range(-9999.9999, 9999.9999)
-        else:
-            cutz_item.set_range(-9999.9999, -0.0000)
-
-        cutz_item.set_value(float(data['cutz']))
-        widget.setCellWidget(row, 7, cutz_item)
-
-        multidepth_item = FCCheckBox()
-        multidepth_item.set_value(data['multidepth'])
-        widget.setCellWidget(row, 8, multidepth_item)
-
-        # to make the checkbox centered but it can no longer have it's value accessed - needs a fix using findchild()
-        # multidepth_item = QtWidgets.QWidget()
-        # cb = FCCheckBox()
-        # cb.set_value(data['multidepth'])
-        # qhboxlayout = QtWidgets.QHBoxLayout(multidepth_item)
-        # qhboxlayout.addWidget(cb)
-        # qhboxlayout.setAlignment(QtCore.Qt.AlignCenter)
-        # qhboxlayout.setContentsMargins(0, 0, 0, 0)
-        # widget.setCellWidget(row, 8, multidepth_item)
-
-        depth_per_pass_item = FCDoubleSpinner()
-        depth_per_pass_item.set_precision(self.decimals)
-        depth_per_pass_item.setSingleStep(0.1)
-        depth_per_pass_item.set_range(0.0, 9999.9999)
-        depth_per_pass_item.set_value(float(data['depthperpass']))
-        widget.setCellWidget(row, 9, depth_per_pass_item)
-
-        vtip_dia_item = FCDoubleSpinner()
-        vtip_dia_item.set_precision(self.decimals)
-        vtip_dia_item.setSingleStep(0.1)
-        vtip_dia_item.set_range(0.0, 9999.9999)
-        vtip_dia_item.set_value(float(data['vtipdia']))
-        widget.setCellWidget(row, 10, vtip_dia_item)
-
-        vtip_angle_item = FCDoubleSpinner()
-        vtip_angle_item.set_precision(self.decimals)
-        vtip_angle_item.setSingleStep(0.1)
-        vtip_angle_item.set_range(-360.0, 360.0)
-        vtip_angle_item.set_value(float(data['vtipangle']))
-        widget.setCellWidget(row, 11, vtip_angle_item)
-
-        travelz_item = FCDoubleSpinner()
-        travelz_item.set_precision(self.decimals)
-        travelz_item.setSingleStep(0.1)
-        if self.app.defaults['global_machinist_setting']:
-            travelz_item.set_range(-9999.9999, 9999.9999)
-        else:
-            travelz_item.set_range(0.0000, 9999.9999)
-
-        travelz_item.set_value(float(data['travelz']))
-        widget.setCellWidget(row, 12, travelz_item)
-
-        fr_item = FCDoubleSpinner()
-        fr_item.set_precision(self.decimals)
-        fr_item.set_range(0.0, 9999.9999)
-        fr_item.set_value(float(data['feedrate']))
-        widget.setCellWidget(row, 13, fr_item)
-
-        frz_item = FCDoubleSpinner()
-        frz_item.set_precision(self.decimals)
-        frz_item.set_range(0.0, 9999.9999)
-        frz_item.set_value(float(data['feedrate_z']))
-        widget.setCellWidget(row, 14, frz_item)
-
-        frrapids_item = FCDoubleSpinner()
-        frrapids_item.set_precision(self.decimals)
-        frrapids_item.set_range(0.0, 9999.9999)
-        frrapids_item.set_value(float(data['feedrate_rapid']))
-        widget.setCellWidget(row, 15, frrapids_item)
-
-        spindlespeed_item = FCSpinner()
-        spindlespeed_item.set_range(0, 1000000)
-        spindlespeed_item.set_value(int(data['spindlespeed']))
-        spindlespeed_item.set_step(100)
-        widget.setCellWidget(row, 16, spindlespeed_item)
-
-        dwell_item = FCCheckBox()
-        dwell_item.set_value(data['dwell'])
-        widget.setCellWidget(row, 17, dwell_item)
-
-        dwelltime_item = FCDoubleSpinner()
-        dwelltime_item.set_precision(self.decimals)
-        dwelltime_item.set_range(0.0000, 9999.9999)
-        dwelltime_item.set_value(float(data['dwelltime']))
-        widget.setCellWidget(row, 18, dwelltime_item)
-
-        pp_item = FCComboBox()
-        for item in self.app.preprocessors:
-            pp_item.addItem(item)
-        pp_item.set_value(data['ppname_g'])
-        widget.setCellWidget(row, 19, pp_item)
-
-        ecut_item = FCCheckBox()
-        ecut_item.set_value(data['extracut'])
-        widget.setCellWidget(row, 20, ecut_item)
-
-        ecut_length_item = FCDoubleSpinner()
-        ecut_length_item.set_precision(self.decimals)
-        ecut_length_item.set_range(0.0000, 9999.9999)
-        ecut_length_item.set_value(data['extracut_length'])
-        widget.setCellWidget(row, 21, ecut_length_item)
-
-        toolchange_item = FCCheckBox()
-        toolchange_item.set_value(data['toolchange'])
-        widget.setCellWidget(row, 22, toolchange_item)
-
-        toolchangexy_item = QtWidgets.QTableWidgetItem(str(data['toolchangexy']) if data['toolchangexy'] else '')
-        widget.setItem(row, 23, toolchangexy_item)
-
-        toolchangez_item = FCDoubleSpinner()
-        toolchangez_item.set_precision(self.decimals)
-        toolchangez_item.setSingleStep(0.1)
-        if self.app.defaults['global_machinist_setting']:
-            toolchangez_item.set_range(-9999.9999, 9999.9999)
-        else:
-            toolchangez_item.set_range(0.0000, 9999.9999)
-
-        toolchangez_item.set_value(float(data['toolchangez']))
-        widget.setCellWidget(row, 24, toolchangez_item)
-
-        startz_item = QtWidgets.QTableWidgetItem(str(data['startz']) if data['startz'] else '')
-        widget.setItem(row, 25, startz_item)
-
-        endz_item = FCDoubleSpinner()
-        endz_item.set_precision(self.decimals)
-        endz_item.setSingleStep(0.1)
-        if self.app.defaults['global_machinist_setting']:
-            endz_item.set_range(-9999.9999, 9999.9999)
-        else:
-            endz_item.set_range(0.0000, 9999.9999)
-
-        endz_item.set_value(float(data['endz']))
-        widget.setCellWidget(row, 26, endz_item)
-
     def on_tool_add(self):
         """
         Add a tool in the DB Tool Table
@@ -2277,11 +2116,11 @@ class ToolsDB2(QtWidgets.QWidget):
         dict_elem['data'] = default_data
 
         new_toolid = len(self.db_tool_dict) + 1
-        self.db_tool_dict[new_toolid] = deepcopy(dict_elem)
+        self.db_tool_dict[str(new_toolid)] = deepcopy(dict_elem)
 
         # add the new entry to the Tools DB table
+        self.update_storage()
         self.build_db_ui()
-        self.callback_on_edited()
         self.app.inform.emit('[success] %s' % _("Tool added to DB."))
 
     def on_tool_copy(self):
@@ -2289,20 +2128,23 @@ class ToolsDB2(QtWidgets.QWidget):
         Copy a selection of Tools in the Tools DB table
         :return:
         """
-        new_tool_id = self.table_widget.rowCount() + 1
-        for model_index in self.table_widget.selectionModel().selectedRows():
-            # index = QtCore.QPersistentModelIndex(model_index)
-            old_tool_id = self.table_widget.item(model_index.row(), 0).text()
-            new_tool_id += 1
+        new_tool_id = len(self.db_tool_dict)
+        for item in self.tree_widget.selectedItems():
+            old_tool_id = item.data(0, QtCore.Qt.DisplayRole)
 
             for toolid, dict_val in list(self.db_tool_dict.items()):
                 if int(old_tool_id) == int(toolid):
+                    new_tool_id += 1
+                    new_key = str(new_tool_id)
+
                     self.db_tool_dict.update({
-                        new_tool_id: deepcopy(dict_val)
+                        new_key: deepcopy(dict_val)
                     })
 
+        self.current_toolid = new_tool_id
+
+        self.update_storage()
         self.build_db_ui()
-        self.callback_on_edited()
         self.app.inform.emit('[success] %s' % _("Tool copied from Tools DB."))
 
     def on_tool_delete(self):
@@ -2310,17 +2152,18 @@ class ToolsDB2(QtWidgets.QWidget):
         Delete a selection of Tools in the Tools DB table
         :return:
         """
-        for model_index in self.table_widget.selectionModel().selectedRows():
-            # index = QtCore.QPersistentModelIndex(model_index)
-            toolname_to_remove = self.table_widget.item(model_index.row(), 0).text()
+        for item in self.tree_widget.selectedItems():
+            toolname_to_remove = item.data(0, QtCore.Qt.DisplayRole)
 
             for toolid, dict_val in list(self.db_tool_dict.items()):
                 if int(toolname_to_remove) == int(toolid):
                     # remove from the storage
                     self.db_tool_dict.pop(toolid, None)
 
+        self.current_toolid -= 1
+
+        self.update_storage()
         self.build_db_ui()
-        self.callback_on_edited()
         self.app.inform.emit('[success] %s' % _("Tool removed from Tools DB."))
 
     def on_export_tools_db_file(self):
@@ -2408,7 +2251,7 @@ class ToolsDB2(QtWidgets.QWidget):
 
             self.app.inform.emit('[success] %s: %s' % (_("Loaded FlatCAM Tools DB from"), filename))
             self.build_db_ui()
-            self.callback_on_edited()
+            self.update_storage()
 
     def on_save_tools_db(self, silent=False):
         self.app.log.debug("ToolsDB.on_save_button() --> Saving Tools Database to file.")
@@ -2434,145 +2277,126 @@ class ToolsDB2(QtWidgets.QWidget):
                     self.app.inform.emit('[success] %s' % _("Saved Tools DB."))
 
     def ui_connect(self):
-        try:
-            try:
-                self.table_widget.itemChanged.disconnect(self.callback_on_edited)
-            except (TypeError, AttributeError):
-                pass
-            self.table_widget.itemChanged.connect(self.callback_on_edited)
-        except AttributeError:
-            pass
+        # make sure that we don't make multiple connections to the widgets
+        self.ui_disconnect()
 
-        for row in range(self.table_widget.rowCount()):
-            for col in range(self.table_widget.columnCount()):
-                # ComboBox
-                try:
-                    try:
-                        self.table_widget.cellWidget(row, col).currentIndexChanged.disconnect(self.callback_on_edited)
-                    except (TypeError, AttributeError):
-                        pass
-                    self.table_widget.cellWidget(row, col).currentIndexChanged.connect(self.callback_on_edited)
-                except AttributeError:
-                    pass
+        self.name_entry.editingFinished.connect(self.update_tree_name)
 
-                # CheckBox
-                try:
-                    try:
-                        self.table_widget.cellWidget(row, col).toggled.disconnect(self.callback_on_edited)
-                    except (TypeError, AttributeError):
-                        pass
-                    self.table_widget.cellWidget(row, col).toggled.connect(self.callback_on_edited)
-                except AttributeError:
-                    pass
+        for key in self.form_fields:
+            wdg = self.form_fields[key]
 
-                # SpinBox, DoubleSpinBox
-                try:
-                    try:
-                        self.table_widget.cellWidget(row, col).valueChanged.disconnect(self.callback_on_edited)
-                    except (TypeError, AttributeError):
-                        pass
-                    self.table_widget.cellWidget(row, col).valueChanged.connect(self.callback_on_edited)
-                except AttributeError:
-                    pass
+            # FCEntry
+            if isinstance(wdg, FCEntry):
+                wdg.textChanged.connect(self.update_storage)
+
+            # ComboBox
+            if isinstance(wdg, FCComboBox):
+                wdg.currentIndexChanged.connect(self.update_storage)
+
+            # CheckBox
+            if isinstance(wdg, FCCheckBox):
+                wdg.toggled.connect(self.update_storage)
+
+            # SpinBox, DoubleSpinBox
+            if isinstance(wdg, FCSpinner) or isinstance(wdg, FCDoubleSpinner):
+                wdg.valueChanged.connect(self.update_storage)
 
     def ui_disconnect(self):
         try:
-            self.table_widget.itemChanged.disconnect(self.callback_on_edited)
+            self.name_entry.editingFinished.disconnect(self.update_tree_name)
         except (TypeError, AttributeError):
             pass
 
-        for row in range(self.table_widget.rowCount()):
-            for col in range(self.table_widget.columnCount()):
-                # ComboBox
+        for key in self.form_fields:
+            wdg = self.form_fields[key]
+
+            # FCEntry
+            if isinstance(wdg, FCEntry):
                 try:
-                    self.table_widget.cellWidget(row, col).currentIndexChanged.disconnect(self.callback_on_edited)
+                    wdg.textChanged.disconnect(self.update_storage)
                 except (TypeError, AttributeError):
                     pass
 
-                # CheckBox
+            # ComboBox
+            if isinstance(wdg, FCComboBox):
                 try:
-                    self.table_widget.cellWidget(row, col).toggled.disconnect(self.callback_on_edited)
+                    wdg.currentIndexChanged.disconnect(self.update_storage)
                 except (TypeError, AttributeError):
                     pass
 
-                # SpinBox, DoubleSpinBox
+            # CheckBox
+            if isinstance(wdg, FCCheckBox):
                 try:
-                    self.table_widget.cellWidget(row, col).valueChanged.disconnect(self.callback_on_edited)
+                    wdg.toggled.disconnect(self.update_storage)
                 except (TypeError, AttributeError):
                     pass
 
-    def callback_on_edited(self):
+            # SpinBox, DoubleSpinBox
+            if isinstance(wdg, FCSpinner) or isinstance(wdg, FCDoubleSpinner):
+                try:
+                    wdg.valueChanged.disconnect(self.update_storage)
+                except (TypeError, AttributeError):
+                    pass
 
-        # update the dictionary storage self.db_tool_dict
-        self.db_tool_dict.clear()
-        dict_elem = {}
-        default_data = {}
+    def update_tree_name(self):
+        val = self.name_entry.get_value()
 
-        for row in range(self.table_widget.rowCount()):
-            new_toolid = row + 1
-            for col in range(self.table_widget.columnCount()):
-                column_header_text = self.table_widget.horizontalHeaderItem(col).text()
-                if column_header_text == _('Tool Name'):
-                    dict_elem['name'] = self.table_widget.item(row, col).text()
-                elif column_header_text == _('Tool Dia'):
-                    dict_elem['tooldia'] = self.table_widget.cellWidget(row, col).get_value()
-                elif column_header_text == _('Tool Offset'):
-                    dict_elem['offset'] = self.table_widget.cellWidget(row, col).get_value()
-                elif column_header_text == _('Custom Offset'):
-                    dict_elem['offset_value'] = self.table_widget.cellWidget(row, col).get_value()
-                elif column_header_text == _('Tool Type'):
-                    dict_elem['type'] = self.table_widget.cellWidget(row, col).get_value()
-                elif column_header_text == _('Tool Shape'):
-                    dict_elem['tool_type'] = self.table_widget.cellWidget(row, col).get_value()
-                else:
-                    if column_header_text == _('Cut Z'):
-                        default_data['cutz'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('MultiDepth'):
-                        default_data['multidepth'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('DPP'):
-                        default_data['depthperpass'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('V-Dia'):
-                        default_data['vtipdia'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('V-Angle'):
-                        default_data['vtipangle'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('Travel Z'):
-                        default_data['travelz'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('FR'):
-                        default_data['feedrate'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('FR Z'):
-                        default_data['feedrate_z'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('FR Rapids'):
-                        default_data['feedrate_rapid'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('Spindle Speed'):
-                        default_data['spindlespeed'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('Dwell'):
-                        default_data['dwell'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('Dwelltime'):
-                        default_data['dwelltime'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('Preprocessor'):
-                        default_data['ppname_g'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('ExtraCut'):
-                        default_data['extracut'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _("E-Cut Length"):
-                        default_data['extracut_length'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('Toolchange'):
-                        default_data['toolchange'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('Toolchange XY'):
-                        default_data['toolchangexy'] = self.table_widget.item(row, col).text()
-                    elif column_header_text == _('Toolchange Z'):
-                        default_data['toolchangez'] = self.table_widget.cellWidget(row, col).get_value()
-                    elif column_header_text == _('Start Z'):
-                        default_data['startz'] = float(self.table_widget.item(row, col).text()) \
-                            if self.table_widget.item(row, col).text() is not '' else None
-                    elif column_header_text == _('End Z'):
-                        default_data['endz'] = self.table_widget.cellWidget(row, col).get_value()
+        item = self.tree_widget.currentItem()
+        # I'm setting the value for the second column (designated by 1) because first column holds the ID
+        # and second column holds the Name (this behavior is set in the build_ui method)
+        item.setData(1, QtCore.Qt.DisplayRole, val)
 
-            dict_elem['data'] = default_data
-            self.db_tool_dict.update(
-                {
-                    new_toolid: deepcopy(dict_elem)
-                }
-            )
+    def update_storage(self):
+
+        tool_id = str(self.current_toolid)
+        wdg = self.sender()
+        if wdg is None:
+            return
+        wdg_name = wdg.objectName()
+
+        if wdg_name == "gdb_name":
+            self.db_tool_dict[tool_id]['name'] = wdg.get_value()
+        elif wdg_name == "gdb_dia":
+            self.db_tool_dict[tool_id]['tooldia'] = wdg.get_value()
+        elif wdg_name == "gdb_tool_offset":
+            self.db_tool_dict[tool_id]['offset'] = wdg.get_value()
+        elif wdg_name == "gdb_custom_offset":
+            self.db_tool_dict[tool_id]['offset_value'] = wdg.get_value()
+        elif wdg_name == "gdb_type":
+            self.db_tool_dict[tool_id]['type'] = wdg.get_value()
+        elif wdg_name == "gdb_shape":
+            self.db_tool_dict[tool_id]['tool_type'] = wdg.get_value()
+        else:
+            if wdg_name == "gdb_cutz":
+                self.db_tool_dict[tool_id]['data']['cutz'] = wdg.get_value()
+            elif wdg_name == "gdb_multidepth":
+                self.db_tool_dict[tool_id]['data']['multidepth'] = wdg.get_value()
+            elif wdg_name == "gdb_multidepth_entry":
+                self.db_tool_dict[tool_id]['data']['depthperpass'] = wdg.get_value()
+
+            elif wdg_name == "gdb_travel":
+                self.db_tool_dict[tool_id]['data']['travelz'] = wdg.get_value()
+            elif wdg_name == "gdb_frxy":
+                self.db_tool_dict[tool_id]['data']['feedrate'] = wdg.get_value()
+            elif wdg_name == "gdb_frz":
+                self.db_tool_dict[tool_id]['data']['feedrate_z'] = wdg.get_value()
+            elif wdg_name == "gdb_spindle":
+                self.db_tool_dict[tool_id]['data']['spindlespeed'] = wdg.get_value()
+            elif wdg_name == "gdb_dwell":
+                self.db_tool_dict[tool_id]['data']['dwell'] = wdg.get_value()
+            elif wdg_name == "gdb_dwelltime":
+                self.db_tool_dict[tool_id]['data']['dwelltime'] = wdg.get_value()
+
+            elif wdg_name == "gdb_vdia":
+                self.db_tool_dict[tool_id]['data']['vtipdia'] = wdg.get_value()
+            elif wdg_name == "gdb_vangle":
+                self.db_tool_dict[tool_id]['data']['vtipangle'] = wdg.get_value()
+            elif wdg_name == "gdb_frapids":
+                self.db_tool_dict[tool_id]['data']['feedrate_rapid'] = wdg.get_value()
+            elif wdg_name == "gdb_ecut":
+                self.db_tool_dict[tool_id]['data']['extracut'] = wdg.get_value()
+            elif wdg_name == "gdb_ecut_length":
+                self.db_tool_dict[tool_id]['data']['extracut_length'] = wdg.get_value()
 
         self.callback_app()
 

+ 4 - 0
README.md

@@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing.
 
 =================================================
 
+28.03.2020
+
+- finished the new database based on a QTreeWidget
+
 21.03.2020
 
 - fixed Cutout Tool to work with negative values for Margin parameter

+ 1 - 1
requirements.txt

@@ -1,7 +1,7 @@
 # This file contains python only requirements to be installed with pip
 # Python packages that cannot be installed with pip (e.g. PyQt5, GDAL) are not included.
 # Usage: pip3 install -r requirements.txt
-pyqt5==5.12
+pyqt5==5.12.1
 numpy>=1.16
 matplotlib>=3.1
 cycler>=0.10