def image_import(self):
     """
     Take the path(s) of one or more images and import them to the application.
     :return: Nothing
     """
     file_dialog = QFileDialog()  # Create QFileDialog
     # Open the file dialog as Open File Names dialog (for image choice)
     f_path = file_dialog.getOpenFileNames(parent=None,
                                           caption="Open Image(s)",
                                           directory=QDir.homePath(),
                                           filter=self.IMG_FILTER,
                                           options=self.DIALOG_FLAG)[0]
     if f_path:  # If user chose at least one image
         img_id_counter = 0  # Set a counter for id
         for file in f_path:  # For all paths in f_paths
             image_tmp = Image()  # Create an Image object
             success = image_tmp.img_open(file)  # Set image parameters
             if success:  # If image exists
                 image_tmp.img_set_image_id(img_id_counter)  # Set image counter
                 img_id_counter += 1  # increase the counter by 1
                 # image_tmp.img_print_info()  # print image info for debugging
                 self.image_list.append(image_tmp)  # Append image to list
                 item_name = "../" + image_tmp.info.dir_name + "/" + image_tmp.info.name  # Set name for view
                 item_widget = QListWidgetItem(item_name)  # Append item to window image list
                 item_widget.setFlags(item_widget.flags() | QtCore.Qt.ItemIsUserCheckable)  # Set it checkable
                 item_widget.setCheckState(QtCore.Qt.Checked)  # Set it checked
                 self.ui_main_win.listImage.addItem(item_widget)  # Add item to list
                 self.ui_main_win.menuCamera_Settings.setEnabled(self.UP)  # Enable Camera menu
                 self.ui_main_win.actionCrabSFM.setEnabled(self.UP)  # Enable SFM action
Example #2
0
    def getOpenFileNames(self, name, parent=None, caption='', dir_='',
            filter_='', selectedFilter='', options=QFileDialog.Options()):
        '''
        @param: name QString
        @param: parent QWidget
        @param: caption QString
        @param: dir_ QString
        @param: filter_ QString
        @param: selectedFilter QString TODO: this is an output parameter
        @param: options QFileDialog::Options
        @return: QStringList
        '''
        settings = Settings()
        settings.beginGroup('FileDialogPaths')

        lastDir = settings.value(name, '')
        fileName = self.getFileName(dir_)

        if not lastDir:
            lastDir = dir_
        else:
            lastDir = pathjoin(lastDir, fileName)

        paths, selectedFilter = QFileDialog.getOpenFileNames(parent, caption,
            lastDir, filter_, selectedFilter, options)

        if paths:
            settings.setValue(name, QFileInfo(paths[0]).absolutePath())

        settings.endGroup()
        return paths
Example #3
0
 def select_batch_files(self):
     """
     Selection of .xml pyIMD project files for batch calculation.
     """
     filter_ext = "XML (*.xml);;, All files (*.*) "
     file_name = QFileDialog()
     file_name.setFileMode(QFileDialog.ExistingFiles)
     ret = file_name.getOpenFileNames(
         self, "Select the pyIMD project files for batch processing",
         self.last_selected_path, filter_ext)
     files = ret[0]
     for i in range(0, len(files)):
         self.batchFileListWidget.addItem(str(files[i]))
Example #4
0
 def buttonExportClicked(self):
     (filePaths, filter) = QFileDialog.getOpenFileNames(
         parent=self,
         caption="转换数据库文件为文本格式",
         directory=QApplication.applicationDirPath() + "/../data",
         filter="Database file (*.db * mdb)",
     )
     if not filePaths:
         return
     #
     if DatabaseMgr().convertToText(filePaths):
         QMessageBox.information(self, "格式转换", "转换成功!")
     else:
         QMessageBox.warning(self, "格式转换", "转换失败!")
def load_file_dialog(parent, filters, multiple_files=False):
    dlg = QFileDialog()
    options = dlg.Options()
    options |= QFileDialog.DontUseNativeDialog
    if multiple_files:
        file_name, _ = dlg.getOpenFileNames(parent,
                                            "Load a model",
                                            "",
                                            filters,
                                            "File WRML (*.wrl)",
                                            options=options)
    else:
        file_name, _ = dlg.getOpenFileName(parent,
                                           "Load a model",
                                           "",
                                           filters,
                                           "File WRML (*.wrl)",
                                           options=options)
    if file_name == "":
        return None
    return file_name
Example #6
0
    def select_data_files(self):
        """
        Select data files to create a new pyIMD project
        """
        try:
            filter_ext = "All files (*.*);; Txt (*.txt);; TDMS (*.tdms);; All files " \
                         "without file endings (*)"
            file_name = QFileDialog()
            file_name.setFileMode(QFileDialog.ExistingFiles)
            ret = file_name.getOpenFileNames(self, "Pick relevant data files",
                                             self.last_selected_path,
                                             filter_ext)
            names = ret[0]
            if len(names) > 0:
                # Clear previous file list
                self.file_list = []
                # Setting the file list
                self.file_list = names
                sorted_file_list = self.file_list
                self.last_selected_path = os.path.dirname(sorted_file_list[0])
                self.show_data()
                self.print_to_console("Selected %d files." %
                                      (len(sorted_file_list)))

                # Populate drop down list with selected items.
                self.noCellDataBox.clear()
                self.withCellDataBox.clear()
                self.measuredDataBox.clear()
                self.noCellDataBox.addItems(self.file_list)
                self.withCellDataBox.addItems(self.file_list)
                self.measuredDataBox.addItems(self.file_list)
                # Create new pyimd project
                self.imd.create_pyimd_project(self.file_list[0],
                                              self.file_list[0],
                                              self.file_list[0], '\t', 23,
                                              'PLL')
        except Exception as e:
            self.print_to_console("Error could not select files." + str(e))
 def video_import(self):
     """
     Take the path(s) of one or more videos and import them to the application.
     :return:
     """
     file_dialog = QFileDialog()
     f_path = file_dialog.getOpenFileNames(parent=None,
                                           caption="Open Video(s)",
                                           directory=QDir.homePath(),
                                           filter=self.VID_FILTER,
                                           options=self.DIALOG_FLAG)[0]
     if f_path:
         for file in f_path:
             video_tmp = Video()
             success = video_tmp.vid_open(file)
             if success:
                 self.video_list.append(video_tmp)
                 item_name = "../" + video_tmp.info.dir_name + "/" + video_tmp.info.name
                 item_widget = QListWidgetItem(item_name)
                 item_widget.setFlags(item_widget.flags() | QtCore.Qt.ItemIsUserCheckable)
                 item_widget.setCheckState(QtCore.Qt.Checked)
                 self.ui_main_win.listVideo.addItem(item_widget)
         self.video_list_info()
Example #8
0
    def __init__(
        self, title=_('Choose Files'),
        filters=[],
        add_all_files_filter=True,
        parent=None,
        modal=True,
        name='',
        mode=QFileDialog.ExistingFiles,
        default_dir=u'~',
        no_save_dir=False,
        combine_file_and_saved_dir=False
    ):
        from calibre.gui2 import dynamic, sanitize_env_vars
        from calibre.gui2.ui import get_gui
        gui = get_gui()
        adapt_menubar = gui.bars_manager.adapt_menu_bar_for_dialog if gui is not None else Dummy()
        QObject.__init__(self)
        ftext = ''
        if filters:
            for filter in filters:
                text, extensions = filter
                extensions = ['*'+(i if i.startswith('.') else '.'+i) for i in
                        extensions]
                ftext += '%s (%s);;'%(text, ' '.join(extensions))
        if add_all_files_filter or not ftext:
            ftext += 'All files (*)'
        if ftext.endswith(';;'):
            ftext = ftext[:-2]

        self.dialog_name = dialog_name(name, title)
        self.selected_files = None
        self.fd = None

        if combine_file_and_saved_dir:
            bn = os.path.basename(default_dir)
            prev = dynamic.get(self.dialog_name,
                    os.path.expanduser(u'~'))
            if os.path.exists(prev):
                if os.path.isfile(prev):
                    prev = os.path.dirname(prev)
            else:
                prev = os.path.expanduser(u'~')
            initial_dir = os.path.join(prev, bn)
        elif no_save_dir:
            initial_dir = os.path.expanduser(default_dir)
        else:
            initial_dir = dynamic.get(self.dialog_name,
                    os.path.expanduser(default_dir))
        if not isinstance(initial_dir, string_or_bytes):
            initial_dir = os.path.expanduser(default_dir)
        if not initial_dir or (not os.path.exists(initial_dir) and not (
                mode == QFileDialog.AnyFile and (no_save_dir or combine_file_and_saved_dir))):
            initial_dir = select_initial_dir(initial_dir)
        self.selected_files = []
        use_native_dialog = 'CALIBRE_NO_NATIVE_FILEDIALOGS' not in os.environ
        with sanitize_env_vars():
            opts = QFileDialog.Option()
            if not use_native_dialog:
                opts |= QFileDialog.DontUseNativeDialog
            if mode == QFileDialog.AnyFile:
                with adapt_menubar:
                    f = QFileDialog.getSaveFileName(parent, title,
                        initial_dir, ftext, "", opts)
                if f and f[0]:
                    self.selected_files.append(f[0])
            elif mode == QFileDialog.ExistingFile:
                with adapt_menubar:
                    f = QFileDialog.getOpenFileName(parent, title,
                        initial_dir, ftext, "", opts)
                if f and f[0] and os.path.exists(f[0]):
                    self.selected_files.append(f[0])
            elif mode == QFileDialog.ExistingFiles:
                with adapt_menubar:
                    fs = QFileDialog.getOpenFileNames(parent, title, initial_dir,
                            ftext, "", opts)
                if fs and fs[0]:
                    for f in fs[0]:
                        f = unicode_type(f)
                        if not f:
                            continue
                        if not os.path.exists(f):
                            # QFileDialog for some reason quotes spaces
                            # on linux if there is more than one space in a row
                            f = unquote(f)
                        if f and os.path.exists(f):
                            self.selected_files.append(f)
            else:
                if mode == QFileDialog.Directory:
                    opts |= QFileDialog.ShowDirsOnly
                with adapt_menubar:
                    f = unicode_type(QFileDialog.getExistingDirectory(parent, title, initial_dir, opts))
                if os.path.exists(f):
                    self.selected_files.append(f)
        if self.selected_files:
            self.selected_files = [unicode_type(q) for q in self.selected_files]
            saved_loc = self.selected_files[0]
            if os.path.isfile(saved_loc):
                saved_loc = os.path.dirname(saved_loc)
            if not no_save_dir:
                dynamic[self.dialog_name] = saved_loc
        self.accepted = bool(self.selected_files)
Example #9
0
    def __init__(self, title=_('Choose Files'),
                       filters=[],
                       add_all_files_filter=True,
                       parent=None,
                       modal=True,
                       name='',
                       mode=QFileDialog.ExistingFiles,
                       default_dir=u'~',
                       no_save_dir=False,
                       combine_file_and_saved_dir=False
                       ):
        QObject.__init__(self)
        ftext = ''
        if filters:
            for filter in filters:
                text, extensions = filter
                extensions = ['*'+(i if i.startswith('.') else '.'+i) for i in
                        extensions]
                ftext += '%s (%s);;'%(text, ' '.join(extensions))
        if add_all_files_filter or not ftext:
            ftext += 'All files (*)'
        if ftext.endswith(';;'):
            ftext = ftext[:-2]

        self.dialog_name = name if name else 'dialog_' + title
        self.selected_files = None
        self.fd = None

        if combine_file_and_saved_dir:
            bn = os.path.basename(default_dir)
            prev = dynamic.get(self.dialog_name,
                    expanduser(u'~'))
            if os.path.exists(prev):
                if os.path.isfile(prev):
                    prev = os.path.dirname(prev)
            else:
                prev = expanduser(u'~')
            initial_dir = os.path.join(prev, bn)
        elif no_save_dir:
            initial_dir = expanduser(default_dir)
        else:
            initial_dir = dynamic.get(self.dialog_name,
                    expanduser(default_dir))
        if not isinstance(initial_dir, basestring):
            initial_dir = expanduser(default_dir)
        if not initial_dir or (not os.path.exists(initial_dir) and not (
                mode == QFileDialog.AnyFile and (no_save_dir or combine_file_and_saved_dir))):
            initial_dir = select_initial_dir(initial_dir)
        self.selected_files = []
        use_native_dialog = 'CALIBRE_NO_NATIVE_FILEDIALOGS' not in os.environ
        with sanitize_env_vars():
            opts = QFileDialog.Option()
            if not use_native_dialog:
                opts |= QFileDialog.DontUseNativeDialog
            if mode == QFileDialog.AnyFile:
                f = QFileDialog.getSaveFileName(parent, title,
                    initial_dir, ftext, "", opts)
                if f and f[0]:
                    self.selected_files.append(f[0])
            elif mode == QFileDialog.ExistingFile:
                f = QFileDialog.getOpenFileName(parent, title,
                    initial_dir, ftext, "", opts)
                if f and f[0] and os.path.exists(f[0]):
                    self.selected_files.append(f[0])
            elif mode == QFileDialog.ExistingFiles:
                fs = QFileDialog.getOpenFileNames(parent, title, initial_dir,
                        ftext, "", opts)
                if fs and fs[0]:
                    for f in fs[0]:
                        f = unicode(f)
                        if not f:
                            continue
                        if not os.path.exists(f):
                            # QFileDialog for some reason quotes spaces
                            # on linux if there is more than one space in a row
                            f = unquote(f)
                        if f and os.path.exists(f):
                            self.selected_files.append(f)
            else:
                if mode == QFileDialog.Directory:
                    opts |= QFileDialog.ShowDirsOnly
                f = unicode(QFileDialog.getExistingDirectory(parent, title, initial_dir, opts))
                if os.path.exists(f):
                    self.selected_files.append(f)
        if self.selected_files:
            self.selected_files = [unicode(q) for q in self.selected_files]
            saved_loc = self.selected_files[0]
            if os.path.isfile(saved_loc):
                saved_loc = os.path.dirname(saved_loc)
            if not no_save_dir:
                dynamic[self.dialog_name] = saved_loc
        self.accepted = bool(self.selected_files)
Example #10
0
def load_media_subs():

    import_dir = mw.pm.profile.get("importDirectory", "")
    myfilter = "Subtitles (*.lrc *.srt);;All Files (*.*)"
    open_file_dialog = QFileDialog()
    open_file_dialog.setFileMode(QFileDialog.ExistingFiles)
    load_media_subs_paths = open_file_dialog.getOpenFileNames(mw,
                                                              "Select Sub to Import",
                                                              import_dir,
                                                              myfilter)[0]
    if not load_media_subs_paths:
        return
    mw.addon_RTMD.loading_media_subs = True

    # thread to get feed data
    class LoadSubsThreadSignals(QObject):

        error_message = pyqtSignal(str)

    class LoadSubsThread(QRunnable):

        def __init__(self, parent, sub_path):
            super(LoadSubsThread, self).__init__()
            self.parent = parent
            self.sub_path = sub_path
            self.signals = LoadSubsThreadSignals()

        def run(self):

            if self.parent.loading_media_subs_need_abort \
               or (not self.sub_path.endswith(".lrc")
                   and not self.sub_path.endswith(".srt")):
                self.signals.error_message.emit("")
                return
            media_path_no_ext = self.sub_path[:-4]
            if not os.path.split(media_path_no_ext)[1]:
                self.signals.error_message.emit("Bad file name: %s" % self.sub_path)
                return
            folder_name = os.path.split(os.path.split(media_path_no_ext)[1])[1]
            if self.sub_path.endswith(".lrc"):
                media_ext = ".mp3"
                if not os.path.isfile(media_path_no_ext + ".mp3"):
                    self.signals.error_message.emit("File not found: %s" % media_path_no_ext + ".mp3")
                    return
            else:
                video_ext = (".mp4", ".mkv", ".avi", ".flv", ".m4v", ".f4v", ".rmvb")
                media_ext = ""
                for ext in video_ext:
                    if os.path.isfile(media_path_no_ext + ext):
                        media_ext = ext
                        break
                if not media_ext:
                    self.signals.error_message.emit("Can found media file for: %s" % self.sub_path)
                    return
            # try to open the sub file
            is_ok, sub_data = get_file_data(self.sub_path)
            if not is_ok:
                self.signals.error_message.emit("Encoding should be utf-8: %s" % self.sub_path)
            # save sub_text as <<<start=23,end=43||say something>>>
            # pattern = r"<<<id=(\d+),start=(\d+),end=(\d+)\|\|(.*?)>>>"
            struct_sub = ""
            # parse lrc text
            if self.sub_path.endswith(".lrc"):
                lrc_dict = {}
                re_lrc_line = re.compile(r"(\[\d+:\d+\.\d+\])")
                re_lrc_time = re.compile(r"\[(\d+):(\d+)\.\d+\]")
                for line_text in sub_data.splitlines():
                    line_text = line_text.strip()
                    if not line_text or not re_lrc_time.match(line_text):
                        continue
                    line_time_points = []
                    line_sub_text = ""
                    for element in re_lrc_line.split(line_text):
                        if element:
                            if re_lrc_line.match(element):
                                minute, second = re_lrc_time.match(element).groups()
                                line_time_points.append(int(minute) * 60 + int(second))
                            else:
                                line_sub_text += element.strip()
                    if line_sub_text:
                        for second in line_time_points:
                            if second in lrc_dict:
                                lrc_dict[second] += line_sub_text
                            else:
                                lrc_dict[second] = line_sub_text
                if lrc_dict:
                    struct_master = "<<<start=%d,end=0||%s>>>"
                    for second in sorted(lrc_dict.keys()):
                        struct_sub += struct_master % (second, lrc_dict[second])
            # parse srt text
            else:
                sub_data = sub_data.replace("\r", "").split("\n\n")
                re_srt = re.compile(r"\d+\s*\n(\d+):(\d+):(\d+),\d+ --> (\d+):(\d+):(\d+),\d+\s*\n(.*)", re.DOTALL)
                struct_master = "<<<start=%d,end=%d||%s>>>"
                for data_block in sub_data:
                    if re_srt.match(data_block):
                        # ('00', '00', '10', '00', '00', '11', "想不出来了\nI'm out.")
                        mg = re_srt.match(data_block).groups()
                        if len(mg) < 7:
                            continue
                        struct_sub += struct_master % \
                                      (int(mg[0]) * 3600 + int(mg[1]) * 60 + int(mg[2]),
                                       int(mg[3]) * 3600 + int(mg[4]) * 60 + int(mg[5]),
                                       mg[6].strip())
            # write to db
            conn = sqlite3.connect(get_path("user_files", "doc.db"))
            conn.execute("insert or replace into subs "
                         + "(media_path_no_ext, media_ext, folder_name, sub_text, create_date) values "
                         + "(?, ?, ?, ?, current_timestamp)",
                         (media_path_no_ext, media_ext, folder_name, struct_sub))
            conn.commit()
            conn.close()
            self.signals.error_message.emit("")

    class LoadMediaDialog(QDialog):

        def __init__(self, parent, load_media_subs_paths):
            super().__init__(parent)
            self.parent = parent
            self.load_media_subs_paths = load_media_subs_paths

            self.verticalLayout =QVBoxLayout(self)

            self.progress_bar = QProgressBar(self)
            self.progress_bar.setProperty("value", 0)
            self.progress_bar.setObjectName("progress_bar")
            self.verticalLayout.addWidget(self.progress_bar)
            self.status_label = QLabel(self)
            self.status_label.setText("")
            self.status_label.setObjectName("")
            self.verticalLayout.addWidget(self.status_label)
            self.abort_button = QPushButton(self)
            self.abort_button.setText("Abort The Loading")
            self.abort_button.clicked.connect(self.abort)
            self.verticalLayout.addWidget(self.abort_button)

            # start the work
            self.load_subs_error_message = ""
            self.loading_media_subs_need_abort = False
            self.load_subs_completed_thread_count = 0
            for sub_path in self.load_media_subs_paths:
                load_thread = LoadSubsThread(self, sub_path)
                load_thread.signals.error_message.connect(self.load_error_msg_slot)
                thread_pool = QThreadPool.globalInstance()
                thread_pool.start(load_thread)

        def load_error_msg_slot(self, signal_error_msg):
            self.load_subs_completed_thread_count += 1
            if signal_error_msg:
                self.load_subs_error_message += signal_error_msg + "<p>"
            self.progress_bar.setValue(int(self.load_subs_completed_thread_count * 100
                                           / len(self.load_media_subs_paths)))
            self.status_label.setText("Completed Subs %s / %s"
                                      % (self.load_subs_completed_thread_count,
                                         len(self.load_media_subs_paths)))
            if self.load_subs_completed_thread_count == len(self.load_media_subs_paths):
                if not self.loading_media_subs_need_abort:
                    self.status_label.setText("Completed loading.")
                if self.load_subs_error_message:
                    show_text(self.load_subs_error_message)
                if mw.addon_RTMD.loading_media_subs:
                    mw.addon_RTMD.loading_media_subs = False
                self.abort_button.setEnabled(False)

        def abort(self):
            self.loading_media_subs_need_abort = True

        def closeEvent(self, event):
            if not mw.addon_RTMD.loading_media_subs:
                event.accept()
            else:
                event.ignore()

    LoadMediaDialog(mw, load_media_subs_paths).show()
Example #11
0
    def load_from_text_file(self):

        import_dir = mw.pm.profile.get("importDirectory", "")
        myfilter = "TXT/HTML (*.txt *.html);;All Files (*.*)"
        open_file_dialog = QFileDialog()
        open_file_dialog.setFileMode(QFileDialog.ExistingFiles)
        self.load_text_file_paths = open_file_dialog.getOpenFileNames(self,
                                                                      "Select Files to Import",
                                                                      import_dir,
                                                                      myfilter)[0]
        if not self.load_text_file_paths:
            return
        # disable buttons
        self.manual_input_button.setEnabled(False)
        self.load_text_button.setEnabled(False)
        self.clean_aged_button.setEnabled(False)
        self.add_feed_button.setEnabled(False)
        self.remove_feed_button.setEnabled(False)
        self.load_feed_button.setEnabled(False)
        if "load_from_text_file" not in self.hard_work:
            self.hard_work.append("load_from_text_file")
        self.existing_doc_id_list_part = []

        # thread to get feed data
        class LoadTextThreadSignals(QObject):
            exit_signal = pyqtSignal(str)

        class LoadTextThread(QRunnable):

            def __init__(self, parent, file_path):
                super(LoadTextThread, self).__init__()
                self.parent = parent
                self.file_path = file_path
                self.signals = LoadTextThreadSignals()

            def run(self):

                if self.parent.need_abort:
                    self.signals.exit_signal.emit("")
                    return

                desc = ""
                is_ok, desc = get_file_data(self.file_path)
                if not is_ok:
                    self.signals.exit_signal.emit("Need UTF-8 Encoding: %s" % self.file_path)
                    return
                if desc:
                    link_to_set = '<p><p><a href="%s">%s</a>' % (self.file_path, self.file_path)
                    if "</body>" in desc:
                        desc = desc.replace("</body>", link_to_set + "</body>")
                    else:
                        desc = desc + link_to_set
                    title = os.path.basename(self.file_path)
                    conn = sqlite3.connect(get_path("user_files", "doc.db"),
                                           detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES)
                    cur = conn.cursor()
                    cur.execute("select feed_id from doc where feed_id between ? and ?",
                                (int(time.time()*1000), int(time.time()*1000)+10000))
                    while True:
                        doc_id = int(time.time()*1000)
                        if doc_id not in self.parent.existing_doc_id_list_part:
                            break
                    self.parent.existing_doc_id_list_part.append(doc_id)
                    cur.execute("""insert into doc
                                (doc_id, link, title, descr, doc_type)
                                values (?, ?, ?, ?, 'tf')""",
                                (doc_id, self.file_path, title, desc))
                    conn.commit()
                    conn.close()
                    self.signals.exit_signal.emit("")

        def load_exit_msg_slot(signal_error_msg):
            self.load_text_completed_thread_count += 1
            if signal_error_msg:
                self.load_text_file_error_message += signal_error_msg + "<p>"
            self.status_label.setText("Completed files %s / %s"
                                      % (self.load_text_completed_thread_count,
                                         len(self.load_text_file_paths)))
            if self.load_text_completed_thread_count == len(self.load_text_file_paths):
                if self.hard_work:
                    self.hard_work.remove("load_from_text_file")
                if not self.need_abort:
                    self.status_label.setText("Completed loading.")
                if not self.hard_work and self.need_abort:
                    self.need_abort = False
                if self.load_text_file_error_message:
                    QMessageBox(QMessageBox.Warning, "Warning", self.load_text_file_error_message).exec()
                    self.load_text_file_error_message = ""
                # enable buttons
                self.manual_input_button.setEnabled(True)
                self.load_text_button.setEnabled(True)
                self.clean_aged_button.setEnabled(True)
                self.add_feed_button.setEnabled(True)
                self.remove_feed_button.setEnabled(True)
                self.load_feed_button.setEnabled(True)

        self.load_text_completed_thread_count = 0
        self.load_text_file_error_message = ""
        for file_path in self.load_text_file_paths:
            load_thread = LoadTextThread(self, file_path)
            load_thread.signals.exit_signal.connect(load_exit_msg_slot)
            thread_pool = QThreadPool.globalInstance()
            thread_pool.start(load_thread)