예제 #1
0
 def __init__(self,
              text="Enter object label",
              parent=None,
              labels=None,
              sort_labels=True,
              show_text_field=True,
              completion='startswith'):
     super(LabelDialog, self).__init__(parent)
     self.edit = LabelQLineEdit()
     self.edit.setPlaceholderText(text)
     self.edit.setValidator(labelme.utils.labelValidator())
     self.edit.editingFinished.connect(self.postProcess)
     layout = QtWidgets.QVBoxLayout()
     if show_text_field:
         layout.addWidget(self.edit)
     # buttons
     self.buttonBox = bb = QtWidgets.QDialogButtonBox(
         QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel,
         QtCore.Qt.Horizontal,
         self,
     )
     bb.button(bb.Ok).setIcon(labelme.utils.newIcon('done'))
     bb.button(bb.Cancel).setIcon(labelme.utils.newIcon('undo'))
     bb.accepted.connect(self.validate)
     bb.rejected.connect(self.reject)
     layout.addWidget(bb)
     # label_list
     self.labelList = QtWidgets.QListWidget()
     self._sort_labels = sort_labels
     if labels:
         self.labelList.addItems(labels)
     if self._sort_labels:
         self.labelList.sortItems()
     else:
         self.labelList.setDragDropMode(
             QtGui.QAbstractItemView.InternalMove)
     self.labelList.currentItemChanged.connect(self.labelSelected)
     self.edit.setListWidget(self.labelList)
     layout.addWidget(self.labelList)
     self.setLayout(layout)
     # completion
     completer = QtWidgets.QCompleter()
     if not QT5 and completion != 'startswith':
         logger.warn("completion other than 'startswith' is only "
                     "supported with Qt5. Using 'startswith'")
         completion = 'startswith'
     if completion == 'startswith':
         completer.setCompletionMode(QtWidgets.QCompleter.InlineCompletion)
         # Default settings.
         # completer.setFilterMode(QtCore.Qt.MatchStartsWith)
     elif completion == 'contains':
         completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
         completer.setFilterMode(QtCore.Qt.MatchContains)
     else:
         raise ValueError('Unsupported completion: {}'.format(completion))
     completer.setModel(self.labelList.model())
     self.edit.setCompleter(completer)
 def init_completer(edit_widget, model):
     "Init QCompleter to work with filesystem"
     completer = QtWidgets.QCompleter(edit_widget)
     completer.setCaseSensitivity(Qt.CaseInsensitive)
     completer.setModel(model)
     # Optimize performance https://stackoverflow.com/a/33454284/1119602
     popup = completer.popup()
     popup.setUniformItemSizes(True)
     popup.setLayoutMode(QtWidgets.QListView.Batched)
     edit_widget.setCompleter(completer)
     edit_widget.textEdited.connect(model.setPathPrefix)
     return completer
예제 #3
0
    def __init__(self, parent=None):
        super(CompleterDelegate, self).__init__(parent)

        items = []
        for plugin, obj in PLUGINS.iteritems():
            for chan_name in obj.channels:
                items.append('{}:{}'.format(plugin, chan_name))

        self.completer = QtWidgets.QCompleter(sorted(items))
        self.completer.setCompletionColumn(0)
        self.completer.setCompletionRole(QtCore.Qt.EditRole)
        self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
예제 #4
0
 def make_completer(parent):
     completion = Config.get('label_completion')
     completer = QtWidgets.QCompleter(parent)
     if completion == 'startswith':
         completer.setCompletionMode(QtWidgets.QCompleter.InlineCompletion)
         # Default settings.
         # completer.setFilterMode(QtCore.Qt.MatchStartsWith)
     elif completion == 'contains':
         completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
         completer.setFilterMode(QtCore.Qt.MatchContains)
     else:
         raise ValueError('Unsupported completion: {}'.format(completion))
     return completer
예제 #5
0
 def __init__(self,
              text="Enter object label",
              parent=None,
              labels=None,
              sort_labels=True,
              show_text_field=True):
     super(LabelDialog, self).__init__(parent)
     self.edit = LabelQLineEdit()
     self.edit.setPlaceholderText(text)
     self.edit.setValidator(labelValidator())
     self.edit.editingFinished.connect(self.postProcess)
     layout = QtWidgets.QVBoxLayout()
     if show_text_field:
         layout.addWidget(self.edit)
     # buttons
     self.buttonBox = bb = QtWidgets.QDialogButtonBox(
         QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel,
         QtCore.Qt.Horizontal,
         self,
     )
     bb.button(bb.Ok).setIcon(newIcon('done'))
     bb.button(bb.Cancel).setIcon(newIcon('undo'))
     bb.accepted.connect(self.validate)
     bb.rejected.connect(self.reject)
     layout.addWidget(bb)
     # label_list
     self.labelList = QtWidgets.QListWidget()
     self._sort_labels = sort_labels
     if labels:
         self.labelList.addItems(labels)
     if self._sort_labels:
         self.labelList.sortItems()
     else:
         self.labelList.setDragDropMode(
             QtGui.QAbstractItemView.InternalMove)
     self.labelList.currentItemChanged.connect(self.labelSelected)
     self.edit.setListWidget(self.labelList)
     layout.addWidget(self.labelList)
     self.setLayout(layout)
     # completion
     completer = QtWidgets.QCompleter()
     completer.setCompletionMode(QtWidgets.QCompleter.InlineCompletion)
     completer.setModel(self.labelList.model())
     self.edit.setCompleter(completer)
예제 #6
0
    def __init__(self, parent=None):
        QtWidgets.QLineEdit.__init__(self, parent)
        self.textChanged.connect(self.mark_changed)
        self.editingFinished.connect(self.emitUpdatedValue)
        self.dtype = str
        self.text_changed_flag = False
        self.context_menu = self.createStandardContextMenu
        self.error_check = True

        self._separators = ['*', '**', '/', '-', '+', ' ']
        self._completer_model = QStringListModel(
            sorted(list(PARAMETER_DICT.keys())))
        self._completer = QtWidgets.QCompleter()
        self._completer.setModel(self._completer_model)
        self._completer.setWidget(self)
        self._completer.setCaseSensitivity(Qt.CaseInsensitive)
        self._completer.activated.connect(self._insertCompletion)
        self._keysToIgnore = [
            Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab
        ]  # shouldn't TAB take us to next field?
예제 #7
0
 def _create_completer(self):
     if self.filter_mode != self.FILTER_FUZZY:
         self._completer = QtWidgets.QCompleter([''], self.editor)
         if self.filter_mode == self.FILTER_CONTAINS:
             try:
                 self._completer.setFilterMode(QtCore.Qt.MatchContains)
             except AttributeError:
                 # only available with PyQt5
                 pass
     else:
         self._completer = SubsequenceCompleter(self.editor)
     self._completer.setCompletionMode(self._completer.PopupCompletion)
     if self.case_sensitive:
         self._completer.setCaseSensitivity(QtCore.Qt.CaseSensitive)
     else:
         self._completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
     self._completer.activated.connect(self._insert_completion)
     self._completer.highlighted.connect(
         self._on_selected_completion_changed)
     self._completer.highlighted.connect(self._display_completion_tooltip)
예제 #8
0
    def __init__(self,
                 contents='',
                 mode=QtWidgets.QFileDialog.AnyFile,
                 dialog=None,
                 parent=None,
                 flags=QtCore.Qt.WindowFlags(0),
                 **kwargs):
        QtWidgets.QWidget.__init__(self, parent, flags, **kwargs)

        self.__completer = QtWidgets.QCompleter(self)
        # @TODO: use QFileSystemModel instraed
        # model = QtWidgets.QFileSystemModel(self.__completer)
        model = QtWidgets.QDirModel(self.__completer)
        # model.setFilter(QtCore.QDir.AllEntries)
        # self.completer.setCompletionMode(
        #     QtWidgets.QCompleter.InlineCompletion)
        self.__completer.setModel(model)

        self.lineEdit = QtWidgets.QLineEdit()
        self.lineEdit.setCompleter(self.__completer)
        if contents:
            self.lineEdit.setText(contents)

        icon = qtsupport.geticon('open.svg', __name__)
        self.button = QtWidgets.QPushButton(
            icon, '', toolTip=self.tr('select from file dialog'))

        layout = QtWidgets.QHBoxLayout()
        layout.addWidget(self.lineEdit)
        layout.addWidget(self.button)
        layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(layout)

        self._mode = None
        self.mode = mode
        self.dialog = dialog

        # if not self.dialog:
        #     self.dialog = get_filedialog(self)

        self.button.clicked.connect(self.choose)
예제 #9
0
 def set_word_list(self, word_list):
     self.word_list = word_list
     self.set_completer(QtWidgets.QCompleter(word_list))
예제 #10
0
    def __init__(
        self,
        text="Enter object label",
        parent=None,
        labels=None,
        sort_labels=True,
        show_text_field=True,
        completion="startswith",
        fit_to_content=None,
        flags=None,
    ):
        if fit_to_content is None:
            fit_to_content = {"row": False, "column": True}
        self._fit_to_content = fit_to_content

        super(LabelDialog, self).__init__(parent)
        self.edit = LabelQLineEdit()
        self.edit.setPlaceholderText(text)
        self.edit.setValidator(labelpoints.utils.labelValidator())
        self.edit.editingFinished.connect(self.postProcess)
        if flags:
            self.edit.textChanged.connect(self.updateFlags)
        self.edit_group_id = QtWidgets.QLineEdit()
        self.edit_group_id.setPlaceholderText("Group ID")
        self.edit_group_id.setValidator(
            QtGui.QRegExpValidator(QtCore.QRegExp(r"\d*"), None)
        )
        layout = QtWidgets.QVBoxLayout()
        if show_text_field:
            layout_edit = QtWidgets.QHBoxLayout()
            layout_edit.addWidget(self.edit, 6)
            layout_edit.addWidget(self.edit_group_id, 2)
            layout.addLayout(layout_edit)
        # buttons
        self.buttonBox = bb = QtWidgets.QDialogButtonBox(
            QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal,
            self,
        )
        bb.button(bb.Ok).setIcon(labelpoints.utils.newIcon("done"))
        bb.button(bb.Cancel).setIcon(labelpoints.utils.newIcon("undo"))
        bb.accepted.connect(self.validate)
        bb.rejected.connect(self.reject)
        layout.addWidget(bb)
        # label_list
        self.labelList = QtWidgets.QListWidget()
        if self._fit_to_content["row"]:
            self.labelList.setHorizontalScrollBarPolicy(
                QtCore.Qt.ScrollBarAlwaysOff
            )
        if self._fit_to_content["column"]:
            self.labelList.setVerticalScrollBarPolicy(
                QtCore.Qt.ScrollBarAlwaysOff
            )
        self._sort_labels = sort_labels
        if labels:
            self.labelList.addItems(labels)
        if self._sort_labels:
            self.labelList.sortItems()
        else:
            self.labelList.setDragDropMode(
                QtWidgets.QAbstractItemView.InternalMove
            )
        self.labelList.currentItemChanged.connect(self.labelSelected)
        self.labelList.itemDoubleClicked.connect(self.labelDoubleClicked)
        self.edit.setListWidget(self.labelList)
        layout.addWidget(self.labelList)
        # label_flags
        if flags is None:
            flags = {}
        self._flags = flags
        self.flagsLayout = QtWidgets.QVBoxLayout()
        self.resetFlags()
        layout.addItem(self.flagsLayout)
        self.edit.textChanged.connect(self.updateFlags)
        self.setLayout(layout)
        # completion
        completer = QtWidgets.QCompleter()
        if not QT5 and completion != "startswith":
            logger.warn(
                "completion other than 'startswith' is only "
                "supported with Qt5. Using 'startswith'"
            )
            completion = "startswith"
        if completion == "startswith":
            completer.setCompletionMode(QtWidgets.QCompleter.InlineCompletion)
            # Default settings.
            # completer.setFilterMode(QtCore.Qt.MatchStartsWith)
        elif completion == "contains":
            completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
            completer.setFilterMode(QtCore.Qt.MatchContains)
        else:
            raise ValueError("Unsupported completion: {}".format(completion))
        completer.setModel(self.labelList.model())
        self.edit.setCompleter(completer)
예제 #11
0
def add_completer(widget, items):
    """Add simple completion to a widget"""
    completer = QtWidgets.QCompleter(items, widget)
    completer.setCaseSensitivity(Qt.CaseInsensitive)
    completer.setCompletionMode(QtWidgets.QCompleter.InlineCompletion)
    widget.setCompleter(completer)
예제 #12
0
    def __init__(self, **kwargs):
        parent = kwargs['parent'] if 'parent' in kwargs else None
        labels = kwargs['labels'] if 'labels' in kwargs else None
        sort_labels = kwargs['sort_labels'] if 'sort_labels' in kwargs else None
        show_text_field = kwargs[
            'show_text_field'] if 'show_text_field' in kwargs else None
        fit_to_content = kwargs[
            'fit_to_content'] if 'fit_to_content' in kwargs else None
        flags = kwargs['flags'] if 'flags' in kwargs else None
        completion = 'startswith'
        text = "Enter object label"

        if fit_to_content is None:
            fit_to_content = {'row': False, 'column': True}
        self._fit_to_content = fit_to_content

        super(LabelDialog, self).__init__(parent)
        self.edit = LabelQLineEdit()
        self.edit.setPlaceholderText(text)
        self.edit.setValidator(utils.labelValidator())
        self.edit.editingFinished.connect(self.postProcess)
        if flags:
            self.edit.textChanged.connect(self.updateFlags)
        layout = QtWidgets.QVBoxLayout()
        if show_text_field:
            layout.addWidget(self.edit)

        # buttons
        self.buttonBox = bb = QtWidgets.QDialogButtonBox(
            QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal, self)
        bb.button(bb.Ok).setIcon(utils.newIcon('done'))
        bb.button(bb.Cancel).setIcon(utils.newIcon('undo'))
        bb.accepted.connect(self.validate)
        bb.rejected.connect(self.reject)
        layout.addWidget(bb)

        # label_list
        self.labelList = QtWidgets.QListWidget()
        if self._fit_to_content['row']:
            self.labelList.setHorizontalScrollBarPolicy(
                QtCore.Qt.ScrollBarAlwaysOff)
        if self._fit_to_content['column']:
            self.labelList.setVerticalScrollBarPolicy(
                QtCore.Qt.ScrollBarAlwaysOff)
        self._sort_labels = sort_labels
        if labels:
            self.labelList.addItems(labels)
        if self._sort_labels:
            self.labelList.sortItems()
        else:
            self.labelList.setDragDropMode(
                QtWidgets.QAbstractItemView.InternalMove)
        self.labelList.currentItemChanged.connect(self.labelSelected)
        self.edit.setListWidget(self.labelList)
        layout.addWidget(self.labelList)

        # label_flags
        if flags is None:
            flags = {}
        self._flags = flags
        self.flagsLayout = QtWidgets.QVBoxLayout()
        self.resetFlags()
        layout.addItem(self.flagsLayout)
        self.edit.textChanged.connect(self.updateFlags)
        self.setLayout(layout)

        # completion
        completer = QtWidgets.QCompleter()
        if not QT5 and completion != 'startswith':
            logger.warn(
                "completion other than 'startswith' is only supported with Qt5. Using 'startswith'"
            )
            completion = 'startswith'
        if completion == 'startswith':
            completer.setCompletionMode(QtWidgets.QCompleter.InlineCompletion)
            # Default settings.
            # completer.setFilterMode(QtCore.Qt.MatchStartsWith)
        elif completion == 'contains':
            completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
            completer.setFilterMode(QtCore.Qt.MatchContains)
        else:
            raise ValueError('Unsupported completion: {}'.format(completion))
        completer.setModel(self.labelList.model())
        self.edit.setCompleter(completer)
예제 #13
0
    def __init__(self, parent=None):
        super().__init__(parent)
        layout = QtWidgets.QHBoxLayout(self)

        pal = self.palette()
        pal.setColor(QtGui.QPalette.Background, pal.color(QtGui.QPalette.Base))
        self.setPalette(pal)
        self.setAutoFillBackground(True)
        self.setFrameShape(self.StyledPanel)
        self.layout().setContentsMargins(4, 0, 0, 0)
        self.layout().setSpacing(0)

        # Edit presented path textually
        self.line_address = QtWidgets.QLineEdit(self)
        self.line_address.setFrame(False)
        self.line_address.hide()
        self.line_address.keyPressEvent_super = self.line_address.keyPressEvent
        self.line_address.keyPressEvent = self.line_address_keyPressEvent
        self.line_address.focusOutEvent = lambda e: self._cancel_edit()
        self.completer = QtWidgets.QCompleter(self)  # FIXME:
        # self.completer.setModel(QtCore.QStringListModel())
        fs_model = QtWidgets.QFileSystemModel(self.completer)
        fs_model.setRootPath("")
        fs_model.setFilter(QtCore.QDir.Dirs | QtCore.QDir.Drives
                           | QtCore.QDir.NoDotAndDotDot | QtCore.QDir.AllDirs)
        self.completer.setModel(fs_model)
        self.completer.setCaseSensitivity(Qt.CaseInsensitive)
        self.completer.activated.connect(self.set_path)
        self.line_address.setCompleter(self.completer)
        layout.addWidget(self.line_address)

        # Container for `btn_crumbs_hidden`, `crumbs_panel`, `switch_space`
        self.crumbs_container = QtWidgets.QWidget(self)
        crumbs_cont_layout = QtWidgets.QHBoxLayout(self.crumbs_container)
        crumbs_cont_layout.setContentsMargins(0, 0, 0, 0)
        crumbs_cont_layout.setSpacing(0)
        layout.addWidget(self.crumbs_container)

        # Hidden breadcrumbs menu button
        self.btn_crumbs_hidden = QtWidgets.QToolButton(self)
        self.btn_crumbs_hidden.setAutoRaise(True)
        self.btn_crumbs_hidden.setPopupMode(QtWidgets.QToolButton.InstantPopup)
        self.btn_crumbs_hidden.setArrowType(Qt.LeftArrow)
        self.btn_crumbs_hidden.setStyleSheet("QToolButton::menu-indicator {"
                                             "image: none;}")
        self.btn_crumbs_hidden.setMinimumSize(
            self.btn_crumbs_hidden.minimumSizeHint())
        self.btn_crumbs_hidden.hide()
        crumbs_cont_layout.addWidget(self.btn_crumbs_hidden)
        menu = QtWidgets.QMenu(self.btn_crumbs_hidden)  # FIXME:
        menu.aboutToShow.connect(self._hidden_crumbs_menu_show)
        self.btn_crumbs_hidden.setMenu(menu)

        # Container for breadcrumbs
        self.crumbs_panel = QtWidgets.QWidget(self)
        crumbs_layout = QtWidgets.QHBoxLayout(self.crumbs_panel)
        crumbs_layout.setContentsMargins(0, 0, 0, 0)
        crumbs_layout.setSpacing(0)
        crumbs_cont_layout.addWidget(self.crumbs_panel)

        # Clicking on empty space to the right puts the bar into edit mode
        self.switch_space = QtWidgets.QWidget(self)
        s_policy = self.switch_space.sizePolicy()
        s_policy.setHorizontalStretch(1)
        self.switch_space.setSizePolicy(s_policy)
        self.switch_space.mouseReleaseEvent = self.switch_space_mouse_up
        crumbs_cont_layout.addWidget(self.switch_space)

        self.btn_browse = QtWidgets.QToolButton(self)
        self.btn_browse.setAutoRaise(True)
        self.btn_browse.setText("...")
        self.btn_browse.setToolTip("Browse for folder")
        self.btn_browse.clicked.connect(self._browse_for_folder)
        layout.addWidget(self.btn_browse)

        self.setMaximumHeight(self.line_address.height())  # FIXME:

        self.first_visible, self.l_breadcrumbs = 0, None
        self.path_ = None
        self.set_path(Path())
예제 #14
0
    def __init__(self, text="Enter object label", parent=None, labels=None,
                 sort_labels=True, show_text_field=True,
                 completion='startswith', fit_to_content=None):
        if fit_to_content is None:
            fit_to_content = {'row': False, 'column': True}
        self._fit_to_content = fit_to_content

        super(LabelDialog, self).__init__(parent)
        self.edit = LabelQLineEdit()



        self.edit.setPlaceholderText(text)
        self.edit.setValidator(labelme.utils.labelValidator())
        self.edit.editingFinished.connect(self.postProcess)
        layout = QtWidgets.QVBoxLayout()
        if show_text_field:
            layout.addWidget(self.edit)

        #tags
        # lihaodong edit
        self.first_lable = QtWidgets.QLabel()
        self.first_lable.setText('first')
        self.first_combox=QtWidgets.QComboBox()
        self.first_combox.addItem('front')
        self.first_combox.addItem('left')
        self.first_combox.addItem('right')
        self.first_combox.addItem('rear')
        self.second_lable = QtWidgets.QLabel()
        self.second_lable.setText('second')
        self.second_combox = QtWidgets.QComboBox()
        self.second_combox.addItem('front')
        self.second_combox.addItem('left')
        self.second_combox.addItem('right')
        self.second_combox.addItem('rear')
        layout.addWidget(self.first_lable)
        layout.addWidget(self.first_combox)
        layout.addWidget(self.second_lable)
        layout.addWidget(self.second_combox)

        ##

        # buttons
        self.buttonBox = bb = QtWidgets.QDialogButtonBox(
            QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal,
            self,
        )
        bb.button(bb.Ok).setIcon(labelme.utils.newIcon('done'))
        bb.button(bb.Cancel).setIcon(labelme.utils.newIcon('undo'))
        bb.accepted.connect(self.validate)
        bb.rejected.connect(self.reject)
        layout.addWidget(bb)
        # label_list
        self.labelList = QtWidgets.QListWidget()
        if self._fit_to_content['row']:
            self.labelList.setHorizontalScrollBarPolicy(
                QtCore.Qt.ScrollBarAlwaysOff
            )
        if self._fit_to_content['column']:
            self.labelList.setVerticalScrollBarPolicy(
                QtCore.Qt.ScrollBarAlwaysOff
            )
        self._sort_labels = sort_labels
        if labels:
            self.labelList.addItems(labels)
        if self._sort_labels:
            self.labelList.sortItems()
        else:
            self.labelList.setDragDropMode(
                QtGui.QAbstractItemView.InternalMove)
        self.labelList.currentItemChanged.connect(self.labelSelected)
        self.edit.setListWidget(self.labelList)
        layout.addWidget(self.labelList)
        self.setLayout(layout)
        # completion
        completer = QtWidgets.QCompleter()
        if not QT5 and completion != 'startswith':
            logger.warn(
                "completion other than 'startswith' is only "
                "supported with Qt5. Using 'startswith'"
            )
            completion = 'startswith'
        if completion == 'startswith':
            completer.setCompletionMode(QtWidgets.QCompleter.InlineCompletion)
            # Default settings.
            # completer.setFilterMode(QtCore.Qt.MatchStartsWith)
        elif completion == 'contains':
            completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
            completer.setFilterMode(QtCore.Qt.MatchContains)
        else:
            raise ValueError('Unsupported completion: {}'.format(completion))
        completer.setModel(self.labelList.model())
        self.edit.setCompleter(completer)
예제 #15
0
    def __init__(self,
                 text="Enter object label",
                 parent=None,
                 labels=None,
                 sub_labels=None,
                 sort_labels=True,
                 show_text_field=True,
                 completion="startswith",
                 fit_to_content=None,
                 flags=None,
                 app=None):
        if fit_to_content is None:
            fit_to_content = {"row": False, "column": True}
        self._fit_to_content = fit_to_content
        super(LabelDialog, self).__init__(parent)

        # disable default button. Use default close button will have bug
        # that sub window setting will be reset and can not modify again.
        # QtCore.Qt.Dialog setting will be reseted.
        self.setWindowFlag(QtCore.Qt.WindowCloseButtonHint, False)
        self.setWindowFlag(QtCore.Qt.WindowContextHelpButtonHint, False)

        self.edit = LabelQLineEdit()
        self.edit.setPlaceholderText(text)
        self.edit.setValidator(labelme.utils.labelValidator())
        self.edit.editingFinished.connect(self.postProcess)
        if flags:
            self.edit.textChanged.connect(self.updateFlags)

        self.edit_group_id = QtWidgets.QLineEdit()
        self.edit_group_id.setPlaceholderText("Group ID")
        self.edit_group_id.setValidator(
            QtGui.QRegExpValidator(QtCore.QRegExp(r"\d*"), None))

        layout = QtWidgets.QVBoxLayout()
        if show_text_field:
            layout_edit = QtWidgets.QHBoxLayout()
            layout_edit.addWidget(self.edit, 6)
            layout_edit.addWidget(self.edit_group_id, 2)
            layout.addLayout(layout_edit)

        ### cc region threshold
        self.cc_threshold_ui = []
        ## slider
        defaultValue = 6
        self.sl = QSlider(Qt.Horizontal)
        self.sl.setMinimum(0)
        self.sl.setMaximum(100)
        self.sl.setValue(defaultValue)
        self.sl.valueChanged.connect(self.sl_valuechange)
        ## label show slider value
        self.slLabel = QLabel("")
        self.slLabel.setText(str(defaultValue))
        self.slLabel.setAlignment(Qt.AlignCenter)
        ## tie slider and label together
        slider_set = QtWidgets.QHBoxLayout()
        slider_set.addWidget(self.sl, 6)
        slider_set.addWidget(self.slLabel, 2)
        ## add to total layout
        self.cc_threshold_ui.append(self.sl)
        self.cc_threshold_ui.append(self.slLabel)
        layout.addLayout(slider_set)

        ### text box attribute
        self.text_box_ui = []
        text_box_set = QtWidgets.QVBoxLayout()
        ## column of text
        tmpHor = QtWidgets.QHBoxLayout()
        self.text_cols = QtWidgets.QLineEdit("4")
        self.text_cols.setPlaceholderText("")
        self.text_cols.setValidator(
            QtGui.QRegExpValidator(QtCore.QRegExp(r"\d*"), None))
        # label
        self.text_cols_label = QLabel("Columns of Text")
        self.text_cols_label.setAlignment(Qt.AlignLeft)
        tmpHor.addWidget(self.text_cols_label, 5)
        tmpHor.addWidget(self.text_cols, 5)
        # add to ui group
        self.text_box_ui.append(self.text_cols_label)
        self.text_box_ui.append(self.text_cols)
        text_box_set.addLayout(tmpHor)

        ## rows of text
        tmpHor = QtWidgets.QHBoxLayout()
        self.text_rows = QtWidgets.QLineEdit("4")
        self.text_rows.setPlaceholderText("")
        self.text_rows.setValidator(
            QtGui.QRegExpValidator(QtCore.QRegExp(r"\d*"), None))
        # label
        self.text_rows_label = QLabel("Rows of Text")
        self.text_rows_label.setAlignment(Qt.AlignLeft)
        tmpHor.addWidget(self.text_rows_label, 5)
        tmpHor.addWidget(self.text_rows, 5)
        # add to ui group
        self.text_box_ui.append(self.text_rows_label)
        self.text_box_ui.append(self.text_rows)
        text_box_set.addLayout(tmpHor)

        ## generate button
        self.generateBoxbb = QtWidgets.QDialogButtonBox(
            QtWidgets.QDialogButtonBox.Apply
            | QtWidgets.QDialogButtonBox.Reset, QtCore.Qt.Horizontal, self)
        self.generateBoxbb.button(self.generateBoxbb.Apply).clicked.connect(
            self.setTextBoxAttribute)
        self.generateBoxbb.button(self.generateBoxbb.Reset).clicked.connect(
            self.resetTextBoxAttribute)
        # add to ui group
        self.text_box_ui.append(self.generateBoxbb)
        text_box_set.addWidget(self.generateBoxbb,
                               alignment=QtCore.Qt.AlignRight)
        ## add to total layout
        layout.addLayout(text_box_set)

        # buttons
        self.buttonBox = bb = QtWidgets.QDialogButtonBox(
            QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal,
            self,
        )
        bb.button(bb.Ok).setIcon(labelme.utils.newIcon("done"))
        bb.button(bb.Cancel).setIcon(labelme.utils.newIcon("undo"))
        bb.accepted.connect(self.validate)
        bb.rejected.connect(self.reject)
        layout.addWidget(bb)
        # label_list
        self.labelList = QtWidgets.QListWidget()
        if self._fit_to_content["row"]:
            self.labelList.setHorizontalScrollBarPolicy(
                QtCore.Qt.ScrollBarAlwaysOff)
        if self._fit_to_content["column"]:
            self.labelList.setVerticalScrollBarPolicy(
                QtCore.Qt.ScrollBarAlwaysOff)
        self._sort_labels = sort_labels
        if labels:
            self.labelList.addItems(labels)
        if self._sort_labels:
            self.labelList.sortItems()
        else:
            self.labelList.setDragDropMode(
                QtWidgets.QAbstractItemView.InternalMove)
        self.labelList.currentItemChanged.connect(self.labelSelected)
        self.labelList.itemDoubleClicked.connect(self.labelDoubleClicked)
        self.edit.setListWidget(self.labelList)
        layout.addWidget(self.labelList)
        # sub label list
        self.sub_labelList = QtWidgets.QListWidget()
        if self._fit_to_content["row"]:
            self.sub_labelList.setHorizontalScrollBarPolicy(
                QtCore.Qt.ScrollBarAlwaysOff)
        if self._fit_to_content["column"]:
            self.sub_labelList.setVerticalScrollBarPolicy(
                QtCore.Qt.ScrollBarAlwaysOff)
        if labels:
            self.sub_labelList.addItems(sub_labels)
        self.sub_labelList.setDragDropMode(
            QtWidgets.QAbstractItemView.InternalMove)
        self.sub_labelList.currentItemChanged.connect(self.labelSelected)
        # make sure main label has content
        self.sub_labelList.itemDoubleClicked.connect(self.labelDoubleClicked)
        self.edit.setListWidget(self.sub_labelList)
        layout.addWidget(self.sub_labelList)
        # label_flags
        if flags is None:
            flags = {}
        self._flags = flags
        self.flagsLayout = QtWidgets.QVBoxLayout()
        self.resetFlags()
        layout.addItem(self.flagsLayout)
        self.edit.textChanged.connect(self.updateFlags)
        self.setLayout(layout)
        # completion
        completer = QtWidgets.QCompleter()
        if not QT5 and completion != "startswith":
            logger.warn("completion other than 'startswith' is only "
                        "supported with Qt5. Using 'startswith'")
            completion = "startswith"
        if completion == "startswith":
            completer.setCompletionMode(QtWidgets.QCompleter.InlineCompletion)
            # Default settings.
            # completer.setFilterMode(QtCore.Qt.MatchStartsWith)
        elif completion == "contains":
            completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
            completer.setFilterMode(QtCore.Qt.MatchContains)
        else:
            raise ValueError("Unsupported completion: {}".format(completion))
        completer.setModel(self.labelList.model())
        self.completer = completer
        self.edit.setCompleter(completer)

        # sub completion
        completer = QtWidgets.QCompleter()
        if not QT5 and completion != "startswith":
            logger.warn("completion other than 'startswith' is only "
                        "supported with Qt5. Using 'startswith'")
            completion = "startswith"
        if completion == "startswith":
            completer.setCompletionMode(QtWidgets.QCompleter.InlineCompletion)
            # Default settings.
            # completer.setFilterMode(QtCore.Qt.MatchStartsWith)
        elif completion == "contains":
            completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
            completer.setFilterMode(QtCore.Qt.MatchContains)
        else:
            raise ValueError("Unsupported completion: {}".format(completion))
        completer.setModel(self.sub_labelList.model())
        self.sub_completer = completer

        # mine
        # self.inEdit = False
        self.app = app
        self.sub_window = SubWindow(self)