src/eric7/Project/AddFileDialog.py

Wed, 20 Jul 2022 17:26:23 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 20 Jul 2022 17:26:23 +0200
branch
eric7
changeset 9256
67603066f0a6
parent 9221
bf71ee032bb4
child 9362
9daa438fb4de
permissions
-rw-r--r--

Fixed issues caused by using EricPathPicker.paths() method.

# -*- coding: utf-8 -*-

# Copyright (c) 2002 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing a dialog to add a file to the project.
"""

import os

from PyQt6.QtCore import pyqtSlot
from PyQt6.QtWidgets import QDialog

from EricWidgets.EricPathPicker import EricPathPickerModes

from .Ui_AddFileDialog import Ui_AddFileDialog


class AddFileDialog(QDialog, Ui_AddFileDialog):
    """
    Class implementing a dialog to add a file to the project.
    """

    def __init__(self, pro, parent=None, fileTypeFilter=None, name=None, startdir=None):
        """
        Constructor

        @param pro reference to the project object
        @param parent parent widget of this dialog (QWidget)
        @param fileTypeFilter filter specification for the file to add (string)
        @param name name of this dialog (string)
        @param startdir start directory for the selection dialog
        """
        super().__init__(parent)
        if name:
            self.setObjectName(name)
        self.setupUi(self)

        self.sourceFilesPicker.setMode(EricPathPickerModes.OPEN_FILES_MODE)
        self.targetDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
        self.targetDirPicker.setDefaultDirectory(startdir)

        self.targetDirPicker.setText(pro.ppath)
        self.fileTypeFilter = fileTypeFilter
        self.ppath = pro.ppath
        self.startdir = startdir
        self.filetypes = pro.pdata["FILETYPES"]
        # save a reference to the filetypes dict

        if self.fileTypeFilter is not None:
            self.sourcecodeCheckBox.hide()

        msh = self.minimumSizeHint()
        self.resize(max(self.width(), msh.width()), msh.height())

    @pyqtSlot()
    def on_sourceFilesPicker_aboutToShowPathPickerDialog(self):
        """
        Private slot to perform actions before the source files selection
        dialog is shown.
        """
        path = self.targetDirPicker.text()
        if not path:
            path = self.startdir
        self.sourceFilesPicker.setDefaultDirectory(path)

        if self.fileTypeFilter is None:
            patterns = {
                "SOURCES": [],
                "FORMS": [],
                "RESOURCES": [],
                "INTERFACES": [],
                "PROTOCOLS": [],
                "TRANSLATIONS": [],
            }
            for pattern, filetype in list(self.filetypes.items()):
                if filetype in patterns:
                    patterns[filetype].append(pattern)
            dfilter = self.tr(
                "Source Files ({0});;"
                "Forms Files ({1});;"
                "Resource Files ({2});;"
                "Interface Files ({3});;"
                "Protocol Files ({4});;"
                "Translation Files ({5});;"
                "All Files (*)"
            ).format(
                " ".join(patterns["SOURCES"]),
                " ".join(patterns["FORMS"]),
                " ".join(patterns["RESOURCES"]),
                " ".join(patterns["INTERFACES"]),
                " ".join(patterns["PROTOCOLS"]),
                " ".join(patterns["TRANSLATIONS"]),
            )
            caption = self.tr("Select Files")
        elif self.fileTypeFilter == "form":
            patterns = []
            for pattern, filetype in list(self.filetypes.items()):
                if filetype == "FORMS":
                    patterns.append(pattern)
            dfilter = self.tr("Forms Files ({0})").format(" ".join(patterns))
            caption = self.tr("Select user-interface files")
        elif self.fileTypeFilter == "resource":
            patterns = []
            for pattern, filetype in list(self.filetypes.items()):
                if filetype == "RESOURCES":
                    patterns.append(pattern)
            dfilter = self.tr("Resource Files ({0})").format(" ".join(patterns))
            caption = self.tr("Select resource files")
        elif self.fileTypeFilter == "source":
            patterns = []
            for pattern, filetype in list(self.filetypes.items()):
                if filetype == "SOURCES":
                    patterns.append(pattern)
            dfilter = self.tr("Source Files ({0});;All Files (*)").format(
                " ".join(patterns)
            )
            caption = self.tr("Select source files")
        elif self.fileTypeFilter == "interface":
            patterns = []
            for pattern, filetype in list(self.filetypes.items()):
                if filetype == "INTERFACES":
                    patterns.append(pattern)
            dfilter = self.tr("Interface Files ({0})").format(" ".join(patterns))
            caption = self.tr("Select interface files")
        elif self.fileTypeFilter == "protocol":
            patterns = []
            for pattern, filetype in list(self.filetypes.items()):
                if filetype == "PROTOCOLS":
                    patterns.append(pattern)
            dfilter = self.tr("Protocol Files ({0})").format(" ".join(patterns))
            caption = self.tr("Select protocol files")
        elif self.fileTypeFilter == "translation":
            patterns = []
            for pattern, filetype in list(self.filetypes.items()):
                if filetype == "TRANSLATIONS":
                    patterns.append(pattern)
            dfilter = self.tr("Translation Files ({0})").format(" ".join(patterns))
            caption = self.tr("Select translation files")
        elif self.fileTypeFilter == "others":
            dfilter = self.tr("All Files (*)")
            caption = self.tr("Select files")
        else:
            dfilter = ""
            caption = ""

        self.sourceFilesPicker.setWindowTitle(caption)
        self.sourceFilesPicker.setFilters(dfilter)

    @pyqtSlot(str)
    def on_sourceFilesPicker_textChanged(self, sfile):
        """
        Private slot to handle the source file text changed.

        If the entered source directory is a subdirectory of the current
        projects main directory, the target directory path is synchronized.
        It is assumed, that the user wants to add a bunch of files to
        the project in place.

        @param sfile the text of the source file picker (string)
        """
        sfile = str(self.sourceFilesPicker.firstPath())
        if sfile.startswith(self.ppath):
            if os.path.isdir(sfile):
                directory = sfile
            else:
                directory = os.path.dirname(sfile)
            self.targetDirPicker.setText(directory)

    def getData(self):
        """
        Public slot to retrieve the dialogs data.

        @return tuple of three values (list of string, string, boolean)
            giving the source files, the target directory and a flag
            telling, whether the files shall be added as source code
        """
        return (
            [str(p) for p in self.sourceFilesPicker.paths()],
            self.targetDirPicker.text(),
            self.sourcecodeCheckBox.isChecked(),
        )

eric ide

mercurial