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()