docs: def showMenu(self, pos):
          """
          Creates a new menu for this widget and displays it.
          
          :param      pos | <QPoint>
          """
          glbl_pos = self.viewport().mapToGlobal(pos)
          
          # lookup the specific item at the given position
          item = self.itemAt(pos)
          selected = self.selectedRecords()
          
          if not self._recordEditors:
              return
          
          if item and not isinstance(item, XOrbRecordItem):
              return
          
          menu = QMenu(self)
          acts = {}
          
          # modify a particular item
          if item:
              if self.editorFlags() & XOrbTreeWidget.EditorFlags.Edit:
                  record = item.record()
                  editor = self.recordEditor(type(record))
                  
                  if editor:
                      name = record.schema().displayName()
                      act = menu.addAction('Edit {}...'.format(name))
                      act.setIcon(QIcon(resources.find('img/edit.png')))
                      acts[act] = (editor, 'edit', record)
          
          # add items
          if self.editorFlags() & XOrbTreeWidget.EditorFlags.Create:
              menu.addSeparator()
              
              typs = self._recordEditors.keys()
              typs.sort(key=lambda x: x.schema().displayName())
              
              for typ in typs:
                  name = typ.schema().displayName()
                  act  = menu.addAction('Add {}...'.format(name))
                  act.setIcon(QIcon(resources.find('img/add.png')))
                  acts[act] = (self._recordEditors[typ], 'create', None)
          
          # remove selected items
          if selected and self.editorFlags() & XOrbTreeWidget.EditorFlags.Remove:
              menu.addSeparator()
              
              act = menu.addAction('Remove Selected Records')
              act.setIcon(QIcon(resources.find('img/remove.png')))
              acts[act] =(None, 'remove', selected)
          
          if not acts:
              return
          
          act = menu.exec_(glbl_pos)
          
          editor, action, record = acts.get(act, (None, None, None))
          
          # create a new record
          if action == 'create':
              record = editor.create(autoCommit=False)
              if record:
                  self.recordCreated.emit(record)
                  record.commit()
                  self.refresh()
          
          # edit an existing record
          elif action == 'edit':
              self.editRecord(record, glbl_pos)
          
          # remove selected records
          elif action == 'remove':
              title = 'Remove Records'
              msg = 'Are you sure you want to remove these records?'
              btns = QMessageBox.Yes | QMessageBox.No
              ans = QMessageBox.information(self.window(), title, msg, btns)
              if ans == QMessageBox.Yes:
                  self.recordsRemoved.emit(selected)
                  if RecordSet(selected).remove():
                      self.refresh()