Ejemplo n.º 1
0
class NewSub(QtGui.QWidget):
    """
    This class is called when User create new Project.
    """
    
    def __init__(self):
        super(NewSub, self).__init__()
        self.obj_validation = Validation()
        self.obj_appconfig = Appconfig()

        
    def createSubcircuit(self,subName):
        """
        This function create Subcircuit related directories and files
        """
        self.create_schematic = subName
        #Checking if Workspace already exist or not       
        self.schematic_path = (os.path.join(os.path.abspath('..'),'SubcircuitLibrary',self.create_schematic))
        
        #Validation for new subcircuit
        if self.schematic_path == "":
            self.reply = "NONE"
        else:
            self.reply = self.obj_validation.validateNewproj(str(self.schematic_path))
        
        #Checking Validations Response
        if self.reply == "VALID":
            print "Validated : Creating subcircuit directory"
            try:
                os.mkdir(self.schematic_path)
                self.schematic = os.path.join(self.schematic_path,self.create_schematic)
                self.cmd = "eeschema "+self.schematic+".sch"
                self.obj_workThread = Worker.WorkerThread(self.cmd)
                self.obj_workThread.start()
                self.close()
            except:
                #print "Some Thing Went Wrong"
                self.msg = QtGui.QErrorMessage(self)
                self.msg.showMessage('Unable to create subcircuit. Please make sure you have write permission on '+self.schematic_path)
                self.msg.setWindowTitle("Error Message")
            
            self.obj_appconfig.current_subcircuit['SubcircuitName'] = self.schematic_path 
            
        elif self.reply == "CHECKEXIST":
            #print "Project already exist"
            self.msg = QtGui.QErrorMessage(self)
            self.msg.showMessage('The subcircuit "'+self.create_schematic+'" already exist.Please select the different name or delete existing subcircuit')
            self.msg.setWindowTitle("Error Message")
            
        elif self.reply == "CHECKNAME":
            #print "Name is not proper"
            self.msg = QtGui.QErrorMessage(self)
            self.msg.showMessage('The subcircuit name should not contain space between them')
            self.msg.setWindowTitle("Error Message")
        
        elif self.reply == "NONE":
            self.msg = QtGui.QErrorMessage(self)
            self.msg.showMessage('The subcircuit name cannot be empty')
            self.msg.setWindowTitle("Error Message")
Ejemplo n.º 2
0
class UploadSub(QtWidgets.QWidget):
    """
    This class contain function for uploading subcircuits
    in SubcircuitLibrary present in src folder.
    A folder is created in library/SubcircuitLibrary
    and desired file is moved to that folder.
    """
    def __init__(self):
        super(UploadSub, self).__init__()
        self.obj_validation = Validation()
        self.obj_appconfig = Appconfig()

    def upload(self):
        """
        This method opens a dialogue box when Upload subcircuit button is
        clicked and after entering folder name, it opens directory system
        to chose file for folder, it only shows file with extension .sub
        and with the name of project entered earlier as folder name.

            It then validates file if it is in proper format or not, for it
            the file is passed to the function **validateSub** and it returns
            true if file has valid format or else it shows an error message.
        """

        editfile = QtWidgets.QFileDialog.getOpenFileName(
            None, "Upload Subcircuit File", os.path.expanduser("~"),
            "*.sub")[0]

        if editfile == '':
            return

        upload = os.path.basename(editfile)
        create_subcircuit, ext = os.path.splitext(upload)

        if ext != '.sub':
            self.msg = QtWidgets.QErrorMessage(self)
            self.msg.setModal(True)
            self.msg.setWindowTitle("Error Message")
            self.msg.showMessage("Please ensure that filename ends with .sub")
            self.msg.exec_()
            print("Invalid filename")
            return

        valid = self.obj_validation.validateSubcir(editfile, create_subcircuit)
        if not valid:
            self.msg = QtWidgets.QErrorMessage(self)
            self.msg.setModal(True)
            self.msg.setWindowTitle("Error Message")
            self.msg.showMessage(
                "Content of file does not meet the required format. " +
                "Please ensure that file starts with **.subckt " +
                create_subcircuit + " ** and ends with **.ends " +
                create_subcircuit + " **")
            self.msg.exec_()
            print("Invalid file format")
            return

        init_path = '../../'
        if os.name == 'nt':
            init_path = ''

        subcircuit_path = os.path.join(os.path.abspath(init_path + 'library'),
                                       'SubcircuitLibrary', create_subcircuit)

        reply = self.obj_validation.validateNewproj(subcircuit_path)

        if reply == "VALID":
            print("Validated: Creating subcircuit directory")
            os.makedirs(subcircuit_path)
            subcircuit = os.path.join(subcircuit_path, upload)

            print("===================")
            print("Current path of subcircuit file is " + editfile)
            print("Selected file is " + upload)
            print("Final path of file is " + subcircuit)
            print("===================")
            shutil.copy(editfile, subcircuit)

        elif reply == "CHECKEXIST":
            print("Project name already exists.")
            print("==========================")
            msg = QtWidgets.QErrorMessage(self)
            msg.setModal(True)
            msg.setWindowTitle("Error Message")
            msg.showMessage("The project already exist. Please select "
                            "a different name or delete existing project")
            msg.exec_()

        elif reply == "CHECKNAME":
            print("Name can not contain space between them")
            print("===========================")
            msg = QtWidgets.QErrorMessage(self)
            msg.setModal(True)
            msg.setWindowTitle("Error Message")
            msg.showMessage(
                'The project name should not contain space between them')
            msg.exec_()
Ejemplo n.º 3
0
class ProjectExplorer(QtWidgets.QWidget):
    """
    This class contains function:

        - One work as a constructor(__init__).
        - For saving data.
        - for renaming project.
        - for refreshing project.
        - for removing project.
    """
    def __init__(self):
        """
        This method is doing following tasks:
            - Working as a constructor for class ProjectExplorer.
            - view of project explorer area.
        """
        QtWidgets.QWidget.__init__(self)
        self.obj_appconfig = Appconfig()
        self.obj_validation = Validation()
        self.treewidget = QtWidgets.QTreeWidget()
        self.window = QtWidgets.QVBoxLayout()
        header = QtWidgets.QTreeWidgetItem(["Projects", "path"])
        self.treewidget.setHeaderItem(header)
        self.treewidget.setColumnHidden(1, True)

        # CSS
        init_path = '../../'
        if os.name == 'nt':
            init_path = ''

        self.treewidget.setStyleSheet(" \
            QTreeView { border-radius: 15px; border: 1px \
            solid gray; padding: 5px; width: 200px; height: 150px;  }\
            QTreeView::branch:has-siblings:!adjoins-item { \
            border-image: url(" + init_path + "images/vline.png) 0;} \
            QTreeView::branch:has-siblings:adjoins-item { \
            border-image: url(" + init_path + "images/branch-more.png) 0; } \
            QTreeView::branch:!has-children:!has-siblings:adjoins-item { \
            border-image: url(" + init_path + "images/branch-end.png) 0; } \
            QTreeView::branch:has-children:!has-siblings:closed, \
            QTreeView::branch:closed:has-children:has-siblings { \
            border-image: none; \
            image: url(" + init_path + "images/branch-closed.png); } \
            QTreeView::branch:open:has-children:!has-siblings, \
            QTreeView::branch:open:has-children:has-siblings  { \
            border-image: none; \
            image: url(" + init_path + "images/branch-open.png); } \
        ")

        for parents, children in list(
                self.obj_appconfig.project_explorer.items()):
            os.path.join(parents)
            if os.path.exists(parents):
                pathlist = parents.split(os.sep)
                parentnode = QtWidgets.QTreeWidgetItem(self.treewidget,
                                                       [pathlist[-1], parents])
                for files in children:
                    QtWidgets.QTreeWidgetItem(
                        parentnode,
                        [files, os.path.join(parents, files)])
        self.window.addWidget(self.treewidget)

        self.treewidget.doubleClicked.connect(self.openProject)
        self.treewidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.treewidget.customContextMenuRequested.connect(self.openMenu)
        self.setLayout(self.window)
        self.show()

    def addTreeNode(self, parents, children):
        os.path.join(parents)
        pathlist = parents.split(os.sep)
        parentnode = QtWidgets.QTreeWidgetItem(self.treewidget,
                                               [pathlist[-1], parents])
        for files in children:
            QtWidgets.QTreeWidgetItem(
                parentnode, [files, os.path.join(parents, files)])

        (self.obj_appconfig.proc_dict[
            self.obj_appconfig.current_project['ProjectName']]) = []
        (self.obj_appconfig.dock_dict[
            self.obj_appconfig.current_project['ProjectName']]) = []

    def openMenu(self, position):
        indexes = self.treewidget.selectedIndexes()
        if len(indexes) > 0:
            level = 0
            index = indexes[0]
            while index.parent().isValid():
                index = index.parent()
                level += 1

        menu = QtWidgets.QMenu()
        if level == 0:
            renameProject = menu.addAction(self.tr("Rename Project"))
            renameProject.triggered.connect(self.renameProject)
            deleteproject = menu.addAction(self.tr("Remove Project"))
            deleteproject.triggered.connect(self.removeProject)
            refreshproject = menu.addAction(self.tr("Refresh"))
            refreshproject.triggered.connect(self.refreshProject)
        elif level == 1:
            openfile = menu.addAction(self.tr("Open"))
            openfile.triggered.connect(self.openProject)

        menu.exec_(self.treewidget.viewport().mapToGlobal(position))

    def openProject(self):
        self.indexItem = self.treewidget.currentIndex()
        filename = str(self.indexItem.data())
        self.filePath = str(
            self.indexItem.sibling(self.indexItem.row(), 1).data())
        self.obj_appconfig.print_info('The current project is ' +
                                      self.filePath)

        self.textwindow = QtWidgets.QWidget()
        self.textwindow.setMinimumSize(600, 500)
        self.textwindow.setGeometry(QtCore.QRect(400, 150, 400, 400))
        self.textwindow.setWindowTitle(filename)

        self.text = QtWidgets.QTextEdit()
        self.save = QtWidgets.QPushButton('Save and Exit')
        self.save.setDisabled(True)
        self.windowgrid = QtWidgets.QGridLayout()

        if (os.path.isfile(str(self.filePath))):
            self.fopen = open(str(self.filePath), 'r')
            lines = self.fopen.read()
            self.text.setText(lines)

            self.text.textChanged.connect(self.enable_save)

            vbox_main = QtWidgets.QVBoxLayout(self.textwindow)
            vbox_main.addWidget(self.text)
            vbox_main.addWidget(self.save)
            self.save.clicked.connect(self.save_data)

            self.textwindow.show()
        else:
            self.obj_appconfig.current_project["ProjectName"] = str(
                self.filePath)
            (self.obj_appconfig.proc_dict[
                self.obj_appconfig.current_project['ProjectName']]) = []
            if (self.obj_appconfig.current_project['ProjectName']
                    not in self.obj_appconfig.dock_dict):
                (self.obj_appconfig.dock_dict[
                    self.obj_appconfig.current_project['ProjectName']]) = []

    def enable_save(self):
        """This function enables save button option."""
        self.save.setEnabled(True)

    def save_data(self):
        """
        This function saves data before it closes the given file.
        It first opens file in write-mode, write operation is performed, \
        closes that file and then it closes window.
        """
        self.fopen = open(self.filePath, 'w')
        self.fopen.write(self.text.toPlainText())
        self.fopen.close()
        self.textwindow.close()

    def removeProject(self):
        """
        This function removes the project in explorer area by right \
        clicking on project and selecting remove option.
        """
        self.indexItem = self.treewidget.currentIndex()
        filePath = str(self.indexItem.sibling(self.indexItem.row(), 1).data())
        self.int = self.indexItem.row()
        self.treewidget.takeTopLevelItem(self.int)

        if self.obj_appconfig.current_project["ProjectName"] == filePath:
            self.obj_appconfig.current_project["ProjectName"] = None

        del self.obj_appconfig.project_explorer[filePath]
        json.dump(self.obj_appconfig.project_explorer,
                  open(self.obj_appconfig.dictPath["path"], 'w'))

    def refreshProject(self, filePath=None):
        """
        This function refresh the project in explorer area by right \
        clicking on project and selecting refresh option.
        """

        if not filePath or filePath is None:
            self.indexItem = self.treewidget.currentIndex()
            filePath = str(
                self.indexItem.sibling(self.indexItem.row(), 1).data())

        if os.path.exists(filePath):
            filelistnew = os.listdir(os.path.join(filePath))
            parentnode = self.treewidget.currentItem()
            count = parentnode.childCount()
            for i in range(count):
                for items in self.treewidget.selectedItems():
                    items.removeChild(items.child(0))
            for files in filelistnew:
                QtWidgets.QTreeWidgetItem(
                    parentnode, [files, os.path.join(filePath, files)])

            self.obj_appconfig.project_explorer[filePath] = filelistnew
            json.dump(self.obj_appconfig.project_explorer,
                      open(self.obj_appconfig.dictPath["path"], 'w'))
            return True

        else:
            print("Selected project not found")
            print("==================")
            msg = QtWidgets.QErrorMessage(self)
            msg.setModal(True)
            msg.setWindowTitle("Error Message")
            msg.showMessage('Selected project does not exist.')
            msg.exec_()
            return False

    def renameProject(self):
        """
        This function renames the project present in project explorer area.
        It validates first:

            - If project names is not empty.
            - Project name does not contain spaces between them.
            - Project name is different between what it was earlier.
            - Project name should not exist.

        After project name is changed, it recreates the project explorer tree.
        """
        self.indexItem = self.treewidget.currentIndex()
        self.baseFileName = str(self.indexItem.data())
        filePath = str(self.indexItem.sibling(self.indexItem.row(), 1).data())

        newBaseFileName, ok = QtWidgets.QInputDialog.getText(
            self, 'Rename Project', 'Project Name:',
            QtWidgets.QLineEdit.Normal, self.baseFileName)

        if ok and newBaseFileName:
            newBaseFileName = str(newBaseFileName)

            if not newBaseFileName.strip():
                print("Project name cannot be empty")
                print("==================")
                msg = QtWidgets.QErrorMessage(self)
                msg.setModal(True)
                msg.setWindowTitle("Error Message")
                msg.showMessage('The project name cannot be empty')
                msg.exec_()

            elif self.baseFileName == newBaseFileName:
                print("Project name has to be different")
                print("==================")
                msg = QtWidgets.QErrorMessage(self)
                msg.setModal(True)
                msg.setWindowTitle("Error Message")
                msg.showMessage('The project name has to be different')
                msg.exec_()

            elif self.refreshProject(filePath):

                projectPath = None
                projectFiles = None

                for parents, children in list(
                        self.obj_appconfig.project_explorer.items()):
                    if filePath == parents:
                        if os.path.exists(parents):
                            projectPath, projectFiles = parents, children
                        break

                self.workspace = \
                    self.obj_appconfig.default_workspace['workspace']
                newBaseFileName = str(newBaseFileName).rstrip().lstrip()
                projDir = os.path.join(self.workspace, str(newBaseFileName))

                reply = self.obj_validation.validateNewproj(str(projDir))

                if not (projectPath and projectFiles):
                    print("Selected project not found")
                    print("Project Path :", projectPath)
                    print("Project Files :", projectFiles)
                    print("==================")
                    msg = QtWidgets.QErrorMessage(self)
                    msg.setModal(True)
                    msg.setWindowTitle("Error Message")
                    msg.showMessage('Selected project does not exist.')
                    msg.exec_()

                elif reply == "VALID":
                    # rename project folder
                    updatedProjectFiles = []

                    updatedProjectPath = newBaseFileName.join(
                        projectPath.rsplit(self.baseFileName, 1))
                    print("Renaming " + projectPath + " to " +
                          updatedProjectPath)

                    # rename project folder
                    try:
                        os.rename(projectPath, updatedProjectPath)
                    except BaseException as e:
                        msg = QtWidgets.QErrorMessage(self)
                        msg.setModal(True)
                        msg.setWindowTitle("Error Message")
                        msg.showMessage(str(e))
                        msg.exec_()
                        return

                    # rename files matching project name
                    try:
                        for projectFile in projectFiles:
                            if self.baseFileName in projectFile:
                                oldFilePath = os.path.join(
                                    updatedProjectPath, projectFile)
                                projectFile = projectFile.replace(
                                    self.baseFileName, newBaseFileName, 1)
                                newFilePath = os.path.join(
                                    updatedProjectPath, projectFile)
                                print("Renaming " + oldFilePath + " to " +
                                      newFilePath)
                                os.rename(oldFilePath, newFilePath)
                                updatedProjectFiles.append(projectFile)

                    except BaseException as e:
                        print("==================")
                        print("Error! Revert renaming project")

                        # Revert updatedProjectFiles
                        for projectFile in updatedProjectFiles:
                            newFilePath = os.path.join(updatedProjectPath,
                                                       projectFile)
                            projectFile = projectFile.replace(
                                newBaseFileName, self.baseFileName, 1)
                            oldFilePath = os.path.join(updatedProjectPath,
                                                       projectFile)
                            os.rename(newFilePath, oldFilePath)

                        # Revert project folder name
                        os.rename(updatedProjectPath, projectPath)
                        print("==================")
                        msg = QtWidgets.QErrorMessage(self)
                        msg.setModal(True)
                        msg.setWindowTitle("Error Message")
                        msg.showMessage(str(e))
                        msg.exec_()
                        return

                    # update project_explorer dictionary
                    del self.obj_appconfig.project_explorer[projectPath]
                    self.obj_appconfig.project_explorer[updatedProjectPath] = \
                        updatedProjectFiles

                    # save project_explorer dictionary on disk
                    json.dump(self.obj_appconfig.project_explorer,
                              open(self.obj_appconfig.dictPath["path"], 'w'))

                    # recreate project explorer tree
                    self.treewidget.clear()
                    for parent, children in \
                            self.obj_appconfig.project_explorer.items():
                        if os.path.exists(parent):
                            self.addTreeNode(parent, children)

                elif reply == "CHECKEXIST":
                    print("Project name already exists.")
                    print("==========================")
                    msg = QtWidgets.QErrorMessage(self)
                    msg.setModal(True)
                    msg.setWindowTitle("Error Message")
                    msg.showMessage(
                        'The project "' + newBaseFileName +
                        '" already exist. Please select a different name or' +
                        ' delete existing project')
                    msg.exec_()

                elif reply == "CHECKNAME":
                    print("Name can not contain space between them")
                    print("===========================")
                    msg = QtWidgets.QErrorMessage(self)
                    msg.setModal(True)
                    msg.setWindowTitle("Error Message")
                    msg.showMessage('The project name should not ' +
                                    'contain space between them')
                    msg.exec_()
Ejemplo n.º 4
0
class NewSub(QtGui.QWidget):
    """
    Contains functions to check :
    - Name of project should not be blank.
    - Name should not contain space between them.
    - Name does not match with existing project.
    """
    def __init__(self):
        super(NewSub, self).__init__()
        self.obj_validation = Validation()
        self.obj_appconfig = Appconfig()

    def createSubcircuit(self, subName):
        """
        - This function create workspace for subcircuit.
        - It also validate file names for Subcircuits:
            - File name should not contain space.
            - Name can not be empty.
            - File name already exists.
        """
        self.create_schematic = subName
        # Checking if Workspace already exist or not
        self.schematic_path = (os.path.join(os.path.abspath('library'),
                                            'SubcircuitLibrary',
                                            self.create_schematic))

        # Validation for new subcircuit
        if self.schematic_path == "":
            self.reply = "NONE"
        else:
            self.reply = self.obj_validation.validateNewproj(
                str(self.schematic_path))

        # Checking Validations Response
        if self.reply == "VALID":
            print("Validated : Creating subcircuit directory")
            try:
                os.mkdir(self.schematic_path)
                self.schematic = os.path.join(self.schematic_path,
                                              self.create_schematic)
                self.cmd = "eeschema " + self.schematic + ".sch"
                self.obj_workThread = Worker.WorkerThread(self.cmd)
                self.obj_workThread.start()
                self.close()
            except BaseException:
                self.msg = QtGui.QErrorMessage(self)
                self.msg.setModal(True)
                self.msg.setWindowTitle("Error Message")
                self.msg.showMessage(
                    'Unable to create subcircuit. Please make sure ' +
                    'you have write permission on ' + self.schematic_path)
                self.msg.exec_()

            self.obj_appconfig.current_subcircuit['SubcircuitName'] \
                = self.schematic_path

        elif self.reply == "CHECKEXIST":
            self.msg = QtGui.QErrorMessage(self)
            self.msg.setModal(True)
            self.msg.setWindowTitle("Error Message")
            self.msg.showMessage(
                'The subcircuit "' + self.create_schematic +
                '" already exist.Please select the different name or delete' +
                'existing subcircuit')
            self.msg.exec_()

        elif self.reply == "CHECKNAME":
            self.msg = QtGui.QErrorMessage(self)
            self.msg.setModal(True)
            self.msg.setWindowTitle("Error Message")
            self.msg.showMessage(
                'The subcircuit name should not contain space between them')
            self.msg.exec_()

        elif self.reply == "NONE":
            self.msg = QtGui.QErrorMessage(self)
            self.msg.setModal(True)
            self.msg.setWindowTitle("Error Message")
            self.msg.showMessage('The subcircuit name cannot be empty')
            self.msg.exec_()
Ejemplo n.º 5
0
class NewSub(QtGui.QWidget):
    """
    This class is called when User create new Project.
    """
    def __init__(self):
        super(NewSub, self).__init__()
        self.obj_validation = Validation()
        self.obj_appconfig = Appconfig()

    def createSubcircuit(self, subName):
        """
        This function create Subcircuit related directories and files
        """
        self.create_schematic = subName
        #Checking if Workspace already exist or not
        self.schematic_path = (os.path.join(os.path.abspath('..'),
                                            'SubcircuitLibrary',
                                            self.create_schematic))

        #Validation for new subcircuit
        if self.schematic_path == "":
            self.reply = "NONE"
        else:
            self.reply = self.obj_validation.validateNewproj(
                str(self.schematic_path))

        #Checking Validations Response
        if self.reply == "VALID":
            print "Validated : Creating subcircuit directory"
            try:
                os.mkdir(self.schematic_path)
                self.schematic = os.path.join(self.schematic_path,
                                              self.create_schematic)
                self.cmd = "eeschema " + self.schematic + ".sch"
                self.obj_workThread = Worker.WorkerThread(self.cmd)
                self.obj_workThread.start()
                self.close()
            except:
                #print "Some Thing Went Wrong"
                self.msg = QtGui.QErrorMessage(self)
                self.msg.showMessage(
                    'Unable to create subcircuit. Please make sure you have write permission on '
                    + self.schematic_path)
                self.msg.setWindowTitle("Error Message")

            self.obj_appconfig.current_subcircuit[
                'SubcircuitName'] = self.schematic_path

        elif self.reply == "CHECKEXIST":
            #print "Project already exist"
            self.msg = QtGui.QErrorMessage(self)
            self.msg.showMessage(
                'The subcircuit "' + self.create_schematic +
                '" already exist.Please select the different name or delete existing subcircuit'
            )
            self.msg.setWindowTitle("Error Message")

        elif self.reply == "CHECKNAME":
            #print "Name is not proper"
            self.msg = QtGui.QErrorMessage(self)
            self.msg.showMessage(
                'The subcircuit name should not contain space between them')
            self.msg.setWindowTitle("Error Message")

        elif self.reply == "NONE":
            self.msg = QtGui.QErrorMessage(self)
            self.msg.showMessage('The subcircuit name cannot be empty')
            self.msg.setWindowTitle("Error Message")