diff options
Diffstat (limited to 'src/frontEnd')
-rwxr-xr-x | src/frontEnd/Application.py | 502 | ||||
-rw-r--r-- | src/frontEnd/DockArea.py | 308 | ||||
-rw-r--r-- | src/frontEnd/DockArea.pyc | bin | 0 -> 9821 bytes | |||
-rw-r--r-- | src/frontEnd/ProjectExplorer.py | 147 | ||||
-rw-r--r-- | src/frontEnd/ProjectExplorer.pyc | bin | 0 -> 7183 bytes | |||
-rw-r--r-- | src/frontEnd/Workspace.py | 121 | ||||
-rw-r--r-- | src/frontEnd/Workspace.pyc | bin | 0 -> 4314 bytes | |||
-rw-r--r-- | src/frontEnd/__init__.py | 0 | ||||
-rw-r--r-- | src/frontEnd/__init__.pyc | bin | 0 -> 145 bytes |
9 files changed, 1078 insertions, 0 deletions
diff --git a/src/frontEnd/Application.py b/src/frontEnd/Application.py new file mode 100755 index 00000000..a6c5feb5 --- /dev/null +++ b/src/frontEnd/Application.py @@ -0,0 +1,502 @@ + +#=============================================================================== +# +# FILE: Application.py +# +# USAGE: --- +# +# DESCRIPTION: This main file use to start the Application +# +# OPTIONS: --- +# REQUIREMENTS: --- +# BUGS: --- +# NOTES: --- +# AUTHOR: Fahim Khan, Rahul Paknikar +# ORGANIZATION: eSim team at FOSSEE, IIT Bombay. +# CREATED: Friday 23 August 2019 +# REVISION: --- +#=============================================================================== +import os +import sys +#Setting PYTHONPATH +cwd = os.getcwd() +(setPath,fronEnd) = os.path.split(cwd) +sys.path.append(setPath) + +from PyQt4 import QtGui, QtCore +from configuration.Appconfig import Appconfig +from projManagement.openProject import OpenProjectInfo +from projManagement.newProject import NewProjectInfo +from projManagement.Kicad import Kicad +from projManagement.Validation import Validation +from projManagement import Worker +from frontEnd import ProjectExplorer +from frontEnd import Workspace +from frontEnd import DockArea +import time +from PyQt4.Qt import QSize + + +class Application(QtGui.QMainWindow): + global project_name + """ + Its our main window of application + """ + def __init__(self,*args): + """ + Initialize main Application window + """ + #Calling __init__ of super class + QtGui.QMainWindow.__init__(self,*args) + + + #Flag for online-offline mode. Default is set offline mode. + #Mode gets updated dynamically from the previous eSim session. + self.online_flag = False + + + #Creating require Object + self.obj_workspace = Workspace.Workspace() + self.obj_Mainview = MainView() + self.obj_kicad = Kicad(self.obj_Mainview.obj_dockarea) + self.obj_appconfig = Appconfig() + self.obj_validation = Validation() + #Initialize all widget + self.setCentralWidget(self.obj_Mainview) + self.initToolBar() + + self.setGeometry(self.obj_appconfig._app_xpos, + self.obj_appconfig._app_ypos, + self.obj_appconfig._app_width, + self.obj_appconfig._app_heigth) + self.setWindowTitle(self.obj_appconfig._APPLICATION) + self.showMaximized() + self.setWindowIcon(QtGui.QIcon('../../images/logo.png')) + #self.show() + self.systemTrayIcon = QtGui.QSystemTrayIcon(self) + self.systemTrayIcon.setIcon(QtGui.QIcon('../../images/logo.png')) + self.systemTrayIcon.setVisible(True) + + + def initToolBar(self): + """ + This function initialize Tool Bar + """ + #Top Tool bar + self.newproj = QtGui.QAction(QtGui.QIcon('../../images/newProject.png'),'<b>New Project</b>',self) + self.newproj.setShortcut('Ctrl+N') + self.newproj.triggered.connect(self.new_project) + #self.newproj.connect(self.newproj,QtCore.SIGNAL('triggered()'),self,QtCore.SLOT(self.new_project())) + + self.openproj = QtGui.QAction(QtGui.QIcon('../../images/openProject.png'),'<b>Open Project</b>',self) + self.openproj.setShortcut('Ctrl+O') + self.openproj.triggered.connect(self.open_project) + + self.closeproj = QtGui.QAction(QtGui.QIcon('../../images/closeProject.png'),'<b>Close Project</b>',self) + self.closeproj.setShortcut('Ctrl+X') + self.closeproj.triggered.connect(self.close_project) + + + + for file in os.listdir("../../../../.config/kicad"): + if file.startswith("fp-lib-table"): + if file.endswith("offline"): + self.webConnect = QtGui.QAction(QtGui.QIcon('../../images/online.png'),'<b>Go Offline</b>',self) + self.online_flag = True + break + elif file.endswith("online"): + self.webConnect = QtGui.QAction(QtGui.QIcon('../../images/offline.png'),'<b>Go Online</b>',self) + self.online_flag = False + break + + self.webConnect.setShortcut('Ctrl+G') + self.webConnect.triggered.connect(self.go_online_offline) + + # try: + # self.webConnect.setShortcut('Ctrl+G') + # self.webConnect.triggered.connect(self.go_online_offline) + # except AttributeError as e: + # self.webConnect = QtGui.QAction(QtGui.QIcon('../../images/offline.png'),'<b>Go Online</b>',self) + # self.webConnect.setShortcut('Ctrl+G') + # self.webConnect.triggered.connect(self.go_online_offline) + # self.online_flag = False + + + + self.helpfile = QtGui.QAction(QtGui.QIcon('../../images/helpProject.png'),'<b>Help</b>',self) + self.helpfile.setShortcut('Ctrl+H') + self.helpfile.triggered.connect(self.help_project) + + self.topToolbar = self.addToolBar('Top Tool Bar') + self.topToolbar.addAction(self.newproj) + self.topToolbar.addAction(self.openproj) + + self.topToolbar.addAction(self.closeproj) + self.topToolbar.addAction(self.webConnect) + self.topToolbar.addAction(self.helpfile) + + self.spacer = QtGui.QWidget() + self.spacer.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding) + self.topToolbar.addWidget(self.spacer) + self.logo = QtGui.QLabel() + self.logopic = QtGui.QPixmap(os.path.join(os.path.abspath('../..'),'images','fosseeLogo.png')) + self.logopic = self.logopic.scaled(QSize(150,150),QtCore.Qt.KeepAspectRatio) + self.logo.setPixmap(self.logopic) + self.logo.setStyleSheet("padding:0 15px 0 0;") + self.topToolbar.addWidget(self.logo) + + #Left Tool bar Action Widget + self.kicad = QtGui.QAction(QtGui.QIcon('../../images/kicad.png'),'<b>Open Schematic</b>',self) + self.kicad.triggered.connect(self.obj_kicad.openSchematic) + + self.conversion = QtGui.QAction(QtGui.QIcon('../../images/ki-ng.png'),'<b>Convert Kicad to Ngspice</b>',self) + self.conversion.triggered.connect(self.obj_kicad.openKicadToNgspice) + + self.ngspice = QtGui.QAction(QtGui.QIcon('../../images/ngspice.png'), '<b>Simulation</b>', self) + self.ngspice.triggered.connect(self.open_ngspice) + + self.model = QtGui.QAction(QtGui.QIcon('../../images/model.png'),'<b>Model Editor</b>',self) + self.model.triggered.connect(self.open_modelEditor) + + self.subcircuit=QtGui.QAction(QtGui.QIcon('../../images/subckt.png'),'<b>Subcircuit</b>',self) + self.subcircuit.triggered.connect(self.open_subcircuit) + + self.nghdl = QtGui.QAction(QtGui.QIcon('../../images/nghdl.png'), '<b>Nghdl</b>', self) + self.nghdl.triggered.connect(self.open_nghdl) + + self.omedit = QtGui.QAction(QtGui.QIcon('../../images/omedit.png'),'<b>Modelica Converter</b>',self) + self.omedit.triggered.connect(self.open_OMedit) + + self.omoptim=QtGui.QAction(QtGui.QIcon('../../images/omoptim.png'),'<b>OM Optimisation</b>',self) + self.omoptim.triggered.connect(self.open_OMoptim) + + #Adding Action Widget to tool bar + self.lefttoolbar = QtGui.QToolBar('Left ToolBar') + self.addToolBar(QtCore.Qt.LeftToolBarArea, self.lefttoolbar) + self.lefttoolbar.addAction(self.kicad) + self.lefttoolbar.addAction(self.conversion) + self.lefttoolbar.addAction(self.ngspice) + self.lefttoolbar.addAction(self.model) + self.lefttoolbar.addAction(self.subcircuit) + self.lefttoolbar.addAction(self.nghdl) + self.lefttoolbar.addAction(self.omedit) + self.lefttoolbar.addAction(self.omoptim) + self.lefttoolbar.setOrientation(QtCore.Qt.Vertical) + self.lefttoolbar.setIconSize(QSize(40,40)) + + def closeEvent(self, event): + exit_msg = "Are you sure you want to exit the program ? All unsaved data will be lost." + reply = QtGui.QMessageBox.question(self, 'Message', + exit_msg, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) + + if reply == QtGui.QMessageBox.Yes: + for proc in self.obj_appconfig.procThread_list: + try: + proc.terminate() + except: + pass + try: + for process_object in self.obj_appconfig.process_obj: + try: + process_object.close() + except: + pass + except: + pass + ##Just checking if open project and New project window is open. If yes just close it when application is closed + try: + self.project.close() + except: + pass + event.accept() + self.systemTrayIcon.showMessage('Exit', 'eSim is Closed.') + + elif reply == QtGui.QMessageBox.No: + event.ignore() + + + def close_project(self): + print "Function : Close Project" + current_project = self.obj_appconfig.current_project['ProjectName'] + if current_project==None: + pass + else: + for pid in self.obj_appconfig.proc_dict[self.obj_appconfig.current_project['ProjectName']]: + try: + os.kill(pid, 9) + except: + pass + self.obj_Mainview.obj_dockarea.closeDock() + self.obj_appconfig.current_project['ProjectName'] = None + self.systemTrayIcon.showMessage('Close', 'Current project '+os.path.basename(current_project)+' is Closed.') + + def new_project(self): + """ + This function call New Project Info class. + """ + text, ok = QtGui.QInputDialog.getText(self, 'New Project Info','Enter Project Name:') + if ok: + self.projname = (str(text)) + self.project = NewProjectInfo() + directory, filelist =self.project.createProject(self.projname) + + self.obj_Mainview.obj_projectExplorer.addTreeNode(directory, filelist) + + else: + print "No new project created" + self.obj_appconfig.print_info('No new project created') + try: + self.obj_appconfig.print_info('Current project is : ' + self.obj_appconfig.current_project["ProjectName"]) + except: + pass + + def open_project(self): + """ + This project call Open Project Info class + """ + print "Function : Open Project" + self.project = OpenProjectInfo() + + try: + directory, filelist = self.project.body() + self.obj_Mainview.obj_projectExplorer.addTreeNode(directory, filelist) + except: + pass + + def help_project(self): + print "Function : Help" + self.obj_appconfig.print_info('Help is called') + print "Current Project is : ",self.obj_appconfig.current_project + self.obj_Mainview.obj_dockarea.usermanual() + + + + def go_online_offline(self): + if self.online_flag: + os.rename("../../../../.config/kicad/fp-lib-table", "../../../../.config/kicad/fp-lib-table-online") + os.rename("../../../../.config/kicad/fp-lib-table-offline", "../../../../.config/kicad/fp-lib-table") + self.webConnect.setIcon(QtGui.QIcon('../../images/offline.png')) + self.webConnect.setText('<b>Go Online</b>') + self.online_flag = False + else: + os.rename("../../../../.config/kicad/fp-lib-table", "../../../../.config/kicad/fp-lib-table-offline") + os.rename("../../../../.config/kicad/fp-lib-table-online", "../../../../.config/kicad/fp-lib-table") + self.webConnect.setIcon(QtGui.QIcon('../../images/online.png')) + self.webConnect.setText('<b>Go Offline</b>') + self.online_flag = True + + + + def open_ngspice(self): + """ + This Function execute ngspice on current project + """ + + self.projDir = self.obj_appconfig.current_project["ProjectName"] + + if self.projDir != None: + self.obj_Mainview.obj_dockarea.ngspiceEditor(self.projDir) + time.sleep(2) #Need permanent solution + #Calling Python Plotting + + try: + self.obj_Mainview.obj_dockarea.plottingEditor() + except Exception as e: + self.msg = QtGui.QErrorMessage(None) + self.msg.showMessage('Error while opening python plotting Editor. Please look at console for more details ') + print "Exception Message:",str(e) + self.obj_appconfig.print_error('Exception Message : ' + str(e)) + self.msg.setWindowTitle("Error Message") + + else: + self.msg = QtGui.QErrorMessage() + self.msg.showMessage('Please select the project first. You can either create new project or open existing project') + self.msg.setWindowTitle("Error Message") + + def open_subcircuit(self): + print "Function : Subcircuit editor" + self.obj_appconfig.print_info('Subcircuit editor is called') + self.obj_Mainview.obj_dockarea.subcircuiteditor() + + def open_nghdl(self): + print "Function : Nghdl" + self.obj_appconfig.print_info('Nghdl is called') + + if self.obj_validation.validateTool('nghdl'): + self.cmd = 'nghdl -e' + self.obj_workThread = Worker.WorkerThread(self.cmd) + self.obj_workThread.start() + + else: + self.msg = QtGui.QErrorMessage(None) + self.msg.showMessage('Error while opening nghdl. Please make sure nghdl is installed') + self.obj_appconfig.print_error('Error while opening nghdl. Please make sure nghdl is installed') + self.msg.setWindowTitle('nghdl Error Message') + + + def open_modelEditor(self): + print "Function : Model editor" + self.obj_appconfig.print_info('Model editor is called') + self.obj_Mainview.obj_dockarea.modelEditor() + + + def open_OMedit(self): + """ + This function call ngspice to OM edit converter and then launch OM edit. + """ + self.obj_appconfig.print_info('OM edit is called') + self.projDir = self.obj_appconfig.current_project["ProjectName"] + + if self.projDir != None: + if self.obj_validation.validateCirOut(self.projDir): + self.projName = os.path.basename(self.projDir) + self.ngspiceNetlist = os.path.join(self.projDir,self.projName+".cir.out") + self.modelicaNetlist = os.path.join(self.projDir,self.projName+".mo") + + """ + try: + #Creating a command for Ngspice to Modelica converter + self.cmd1 = "python ../ngspicetoModelica/NgspicetoModelica.py "+self.ngspiceNetlist + self.obj_workThread1 = Worker.WorkerThread(self.cmd1) + self.obj_workThread1.start() + + + if self.obj_validation.validateTool("OMEdit"): + #Creating command to run OMEdit + self.cmd2 = "OMEdit "+self.modelicaNetlist + self.obj_workThread2 = Worker.WorkerThread(self.cmd2) + self.obj_workThread2.start() + else: + self.msg = QtGui.QMessageBox() + self.msgContent = "There was an error while opening OMEdit.<br/>\ + Please make sure OpenModelica is installed in your system. <br/>\ + To install it on Linux : Go to <a href=https://www.openmodelica.org/download/download-linux>OpenModelica Linux</a> and install nigthly build release.<br/>\ + To install it on Windows : Go to <a href=https://www.openmodelica.org/download/download-windows>OpenModelica Windows</a> and install latest version.<br/>" + self.msg.setTextFormat(QtCore.Qt.RichText) + self.msg.setText(self.msgContent) + self.msg.setWindowTitle("Missing OpenModelica") + self.obj_appconfig.print_info(self.msgContent) + self.msg.exec_() + + except Exception as e: + self.msg = QtGui.QErrorMessage() + self.msg.showMessage('Unable to convert NgSpice netlist to Modelica netlist :'+str(e)) + self.msg.setWindowTitle("Ngspice to Modelica conversion error") + self.obj_appconfig.print_error(str(e)) + """ + + self.obj_Mainview.obj_dockarea.modelicaEditor(self.projDir) + + else: + self.msg = QtGui.QErrorMessage() + self.msg.showMessage('Current project does not contain any ngspice file. Please create ngspice file with extension .cir.out') + self.msg.setWindowTitle("Missing Ngspice netlist") + else: + self.msg = QtGui.QErrorMessage() + self.msg.showMessage('Please select the project first. You can either create new project or open existing project') + self.msg.setWindowTitle("Error Message") + + + def open_OMoptim(self): + print "Function : OM Optim" + self.obj_appconfig.print_info('OM Optim is called') + #Check if OMOptim is installed + if self.obj_validation.validateTool("OMOptim"): + #Creating a command to run + self.cmd = "OMOptim" + self.obj_workThread = Worker.WorkerThread(self.cmd) + self.obj_workThread.start() + else: + self.msg = QtGui.QMessageBox() + self.msgContent = "There was an error while opening OMOptim.<br/>\ + Please make sure OpenModelica is installed in your system. <br/>\ + To install it on Linux : Go to <a href=https://www.openmodelica.org/download/download-linux>OpenModelica Linux</a> and install nigthly build release.<br/>\ + To install it on Windows : Go to <a href=https://www.openmodelica.org/download/download-windows>OpenModelica Windows</a> and install latest version.<br/>" + self.msg.setTextFormat(QtCore.Qt.RichText) + self.msg.setText(self.msgContent) + self.msg.setWindowTitle("Error Message") + self.obj_appconfig.print_info(self.msgContent) + self.msg.exec_() + +class MainView(QtGui.QWidget): + """ + This class initialize the Main View of Application + """ + def __init__(self, *args): + # call init method of superclass + QtGui.QWidget.__init__(self, *args) + + self.obj_appconfig = Appconfig() + + self.leftSplit = QtGui.QSplitter() + self.middleSplit = QtGui.QSplitter() + + self.mainLayout = QtGui.QVBoxLayout() + #Intermediate Widget + self.middleContainer = QtGui.QWidget() + self.middleContainerLayout = QtGui.QVBoxLayout() + + #Area to be included in MainView + self.noteArea = QtGui.QTextEdit() + self.noteArea.setReadOnly(True) + self.obj_appconfig.noteArea['Note'] = self.noteArea + self.obj_appconfig.noteArea['Note'].append(' eSim Started......') + self.obj_appconfig.noteArea['Note'].append('Project Selected : None') + self.obj_appconfig.noteArea['Note'].append('\n') + + #CSS + self.noteArea.setStyleSheet(" \ + QWidget { border-radius: 15px; border: 1px solid gray; padding: 5px; } \ + ") + + self.obj_dockarea = DockArea.DockArea() + self.obj_projectExplorer = ProjectExplorer.ProjectExplorer() + + #Adding content to vertical middle Split. + self.middleSplit.setOrientation(QtCore.Qt.Vertical) + self.middleSplit.addWidget(self.obj_dockarea) + self.middleSplit.addWidget(self.noteArea) + + #Adding middle split to Middle Container Widget + self.middleContainerLayout.addWidget(self.middleSplit) + self.middleContainer.setLayout(self.middleContainerLayout) + + #Adding content of left split + self.leftSplit.addWidget(self.obj_projectExplorer) + self.leftSplit.addWidget(self.middleContainer) + + + #Adding to main Layout + self.mainLayout.addWidget(self.leftSplit) + self.leftSplit.setSizes([self.width()/4.5,self.height()]) + self.middleSplit.setSizes([self.width(),self.height()/2]) + self.setLayout(self.mainLayout) + + +def main(args): + """ + It is main function of the module.It starts the application + """ + print "Starting eSim......" + app = QtGui.QApplication(args) + + splash_pix = QtGui.QPixmap('../../images/splash_screen_esim.png') + splash = QtGui.QSplashScreen(splash_pix,QtCore.Qt.WindowStaysOnTopHint) + splash.setMask(splash_pix.mask()) + splash.show() + appView = Application() + appView.splash=splash + appView.obj_workspace.returnWhetherClickedOrNot(appView) + appView.hide() + appView.obj_workspace.show() + sys.exit(app.exec_()) + + + +# Call main function +if __name__ == '__main__': + # Create and display the splash screen + main(sys.argv) + + + diff --git a/src/frontEnd/DockArea.py b/src/frontEnd/DockArea.py new file mode 100644 index 00000000..073072bf --- /dev/null +++ b/src/frontEnd/DockArea.py @@ -0,0 +1,308 @@ +from PyQt4 import QtGui,QtCore +from ngspiceSimulation.pythonPlotting import plotWindow +from ngspiceSimulation.NgspiceWidget import NgspiceWidget +from configuration.Appconfig import Appconfig +from modelEditor.ModelEditor import ModelEditorclass +from subcircuit.Subcircuit import Subcircuit +from kicadtoNgspice.KicadtoNgspice import MainWindow +from browser.Welcome import Welcome +from browser.UserManual import UserManual +from ngspicetoModelica.ModelicaUI import OpenModelicaEditor +import os + +dockList = ['Welcome'] +count = 1 +dock = {} + +class DockArea(QtGui.QMainWindow): + + def __init__(self): + QtGui.QMainWindow.__init__(self) + self.obj_appconfig = Appconfig() + + for dockName in dockList: + dock[dockName] = QtGui.QDockWidget(dockName) + self.welcomeWidget = QtGui.QWidget() + self.welcomeLayout = QtGui.QVBoxLayout() + self.welcomeLayout.addWidget(Welcome()) ##Call browser + + #Adding to main Layout + self.welcomeWidget.setLayout(self.welcomeLayout) + dock[dockName].setWidget(self.welcomeWidget) + #CSS + dock[dockName].setStyleSheet(" \ + QWidget { border-radius: 15px; border: 1px solid gray; padding: 5px; width: 200px; height: 150px; } \ + ") + self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock[dockName]) + + #self.tabifyDockWidget(dock['Notes'],dock['Blank']) + self.show() + + ''' + def __init__(self): + QtGui.QMainWindow.__init__(self) + self.obj_appconfig = Appconfig() + + for dockName in dockList: + dock[dockName] = QtGui.QDockWidget(dockName) + self.welcome = QtGui.QTextEdit() + self.welcome.setReadOnly(True) + dock[dockName].setWidget(self.welcome) + #CSS + dock[dockName].setStyleSheet(" \ + QWidget { border-radius: 15px; border: 1px solid gray; padding: 5px; width: 200px; height: 150px; } \ + ") + self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock[dockName]) + + #self.tabifyDockWidget(dock['Notes'],dock['Blank']) + self.show() + ''' + + def createTestEditor(self): + """ + This function create widget for Library Editor + """ + global count + + self.testWidget = QtGui.QWidget() + self.testArea = QtGui.QTextEdit() + self.testLayout = QtGui.QVBoxLayout() + self.testLayout.addWidget(self.testArea) + + #Adding to main Layout + self.testWidget.setLayout(self.testLayout) + dock['Tips-'+str(count)] = QtGui.QDockWidget('Tips-'+str(count)) + dock['Tips-'+str(count)].setWidget(self.testWidget) + self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock['Tips-'+str(count)]) + self.tabifyDockWidget(dock['Welcome'],dock['Tips-'+str(count)]) + + """ + #CSS + dock['Tips-'+str(count)].setStyleSheet(" \ + .QWidget { border-radius: 15px; border: 1px solid gray; padding: 5px; width: 200px; height: 150px; } \ + ") + """ + + dock['Tips-'+str(count)].setVisible(True) + dock['Tips-'+str(count)].setFocus() + """ + dock['Tips-'+str(count)].setStyleSheet(" \ + :hover { background-color: yellow; } \ + ") + """ + dock['Tips-'+str(count)].raise_() + + self.obj_appconfig.dock_dict[self.obj_appconfig.current_project['ProjectName']].append(dock['Tips-'+str(count)]) + count = count + 1 + + def plottingEditor(self): + """ + This function create widget for interactive PythonPlotting + """ + self.projDir = self.obj_appconfig.current_project["ProjectName"] + self.projName = os.path.basename(self.projDir) + #self.project = os.path.join(self.projDir,self.projName) + + + global count + self.plottingWidget = QtGui.QWidget() + + self.plottingLayout = QtGui.QVBoxLayout() + self.plottingLayout.addWidget(plotWindow(self.projDir,self.projName)) + + #Adding to main Layout + self.plottingWidget.setLayout(self.plottingLayout) + dock['Plotting-'+str(count)] = QtGui.QDockWidget('Plotting-'+str(count)) + dock['Plotting-'+str(count)].setWidget(self.plottingWidget) + self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock['Plotting-'+str(count)]) + self.tabifyDockWidget(dock['Welcome'],dock['Plotting-'+str(count)]) + + """ + #CSS + dock['Plotting-'+str(count)].setStyleSheet(" \ + .QWidget { border-radius: 15px; border: 1px solid gray; padding: 5px; width: 200px; height: 150px; } \ + ") + """ + dock['Plotting-'+str(count)].setVisible(True) + dock['Plotting-'+str(count)].setFocus() + dock['Plotting-'+str(count)].raise_() + + self.obj_appconfig.dock_dict[self.obj_appconfig.current_project['ProjectName']].append(dock['Plotting-'+str(count)]) + count = count + 1 + + def ngspiceEditor(self,projDir): + """ + This function creates widget for NgSpice window + """ + + + self.projDir = projDir + self.projName = os.path.basename(self.projDir) + self.ngspiceNetlist = os.path.join(self.projDir,self.projName+".cir.out") + + + + global count + self.ngspiceWidget = QtGui.QWidget() + + self.ngspiceLayout = QtGui.QVBoxLayout() + self.ngspiceLayout.addWidget(NgspiceWidget(self.ngspiceNetlist,self.projDir)) + + #Adding to main Layout + self.ngspiceWidget.setLayout(self.ngspiceLayout) + dock['NgSpice-'+str(count)] = QtGui.QDockWidget('NgSpice-'+str(count)) + dock['NgSpice-'+str(count)].setWidget(self.ngspiceWidget) + self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock['NgSpice-'+str(count)]) + self.tabifyDockWidget(dock['Welcome'],dock['NgSpice-'+str(count)]) + + #CSS + dock['NgSpice-'+str(count)].setStyleSheet(" \ + .QWidget { border-radius: 15px; border: 1px solid gray; padding: 0px; width: 200px; height: 150px; } \ + ") + + dock['NgSpice-'+str(count)].setVisible(True) + dock['NgSpice-'+str(count)].setFocus() + dock['NgSpice-'+str(count)].raise_() + self.obj_appconfig.dock_dict[self.obj_appconfig.current_project['ProjectName']].append(dock['NgSpice-'+str(count)]) + count = count + 1 + + def modelEditor(self): + print"in model editor" + global count + self.modelwidget = QtGui.QWidget() + + self.modellayout = QtGui.QVBoxLayout() + self.modellayout.addWidget(ModelEditorclass()) + + #Adding to main Layout + self.modelwidget.setLayout(self.modellayout) + + dock['Model Editor-'+str(count)] = QtGui.QDockWidget('Model Editor-'+str(count)) + dock['Model Editor-'+str(count)].setWidget(self.modelwidget) + self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock['Model Editor-'+str(count)]) + self.tabifyDockWidget(dock['Welcome'],dock['Model Editor-'+str(count)]) + + #CSS + dock['Model Editor-'+str(count)].setStyleSheet(" \ + .QWidget { border-radius: 15px; border: 1px solid gray; padding: 5px; width: 200px; height: 150px; } \ + ") + + dock['Model Editor-'+str(count)].setVisible(True) + dock['Model Editor-'+str(count)].setFocus() + dock['Model Editor-'+str(count)].raise_() + + self.obj_appconfig.dock_dict[self.obj_appconfig.current_project['ProjectName']].append(dock['Model Editor-'+str(count)]) + count = count + 1 + + def kicadToNgspiceEditor(self,clarg1,clarg2=None): + global count + self.kicadToNgspiceWidget=QtGui.QWidget() + self.kicadToNgspiceLayout=QtGui.QVBoxLayout() + self.kicadToNgspiceLayout.addWidget(MainWindow(clarg1,clarg2)) + + self.kicadToNgspiceWidget.setLayout(self.kicadToNgspiceLayout) + dock['kicadToNgspice-'+str(count)] = QtGui.QDockWidget('kicadToNgspice-'+str(count)) + dock['kicadToNgspice-'+str(count)].setWidget(self.kicadToNgspiceWidget) + self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock['kicadToNgspice-'+str(count)]) + self.tabifyDockWidget(dock['Welcome'],dock['kicadToNgspice-'+str(count)]) + + #CSS + dock['kicadToNgspice-'+str(count)].setStyleSheet(" \ + .QWidget { border-radius: 15px; border: 1px solid gray; padding: 5px; width: 200px; height: 150px; } \ + ") + + dock['kicadToNgspice-'+str(count)].setVisible(True) + dock['kicadToNgspice-'+str(count)].setFocus() + dock['kicadToNgspice-'+str(count)].raise_() + + self.obj_appconfig.dock_dict[self.obj_appconfig.current_project['ProjectName']].append(dock['kicadToNgspice-'+str(count)]) + count = count + 1 + + + def subcircuiteditor(self): + """ + This function creates a widget for different subcircuit options + """ + + global count + self.subcktWidget=QtGui.QWidget() + self.subcktLayout=QtGui.QVBoxLayout() + self.subcktLayout.addWidget(Subcircuit(self)) + + self.subcktWidget.setLayout(self.subcktLayout) + dock['Subcircuit-'+str(count)] = QtGui.QDockWidget('Subcircuit-'+str(count)) + dock['Subcircuit-'+str(count)].setWidget(self.subcktWidget) + self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock['Subcircuit-'+str(count)]) + self.tabifyDockWidget(dock['Welcome'],dock['Subcircuit-'+str(count)]) + + #CSS + dock['Subcircuit-'+str(count)].setStyleSheet(" \ + .QWidget { border-radius: 15px; border: 1px solid gray; padding: 5px; width: 200px; height: 150px; } \ + ") + + dock['Subcircuit-'+str(count)].setVisible(True) + dock['Subcircuit-'+str(count)].setFocus() + dock['Subcircuit-'+str(count)].raise_() + + self.obj_appconfig.dock_dict[self.obj_appconfig.current_project['ProjectName']].append(dock['Subcircuit-'+str(count)]) + count = count + 1 + + def usermanual(self): + """ + This function creates a widget for different subcircuit options + """ + + global count + self.usermanualWidget=QtGui.QWidget() + self.usermanualLayout=QtGui.QVBoxLayout() + self.usermanualLayout.addWidget(UserManual()) + + self.usermanualWidget.setLayout(self.usermanualLayout) + dock['User Manual-'+str(count)] = QtGui.QDockWidget('User Manual-'+str(count)) + dock['User Manual-'+str(count)].setWidget(self.usermanualWidget) + self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock['User Manual-'+str(count)]) + self.tabifyDockWidget(dock['Welcome'],dock['User Manual-'+str(count)]) + + #CSS + dock['User Manual-'+str(count)].setStyleSheet(" \ + .QWidget { border-radius: 15px; border: 1px solid gray; padding: 5px; width: 200px; height: 150px; } \ + ") + + dock['User Manual-'+str(count)].setVisible(True) + dock['User Manual-'+str(count)].setFocus() + dock['User Manual-'+str(count)].raise_() + + count = count + 1 + + def modelicaEditor(self, projDir): + """ + This function sets up the UI for ngspice to modelica conversion + """ + + global count + self.modelicaWidget = QtGui.QWidget() + self.modelicaLayout = QtGui.QVBoxLayout() + self.modelicaLayout.addWidget(OpenModelicaEditor(projDir)) + + self.modelicaWidget.setLayout(self.modelicaLayout) + dock['Modelica-'+str(count)] = QtGui.QDockWidget('Modelica-'+str(count)) + dock['Modelica-'+str(count)].setWidget(self.modelicaWidget) + self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock['Modelica-'+str(count)]) + self.tabifyDockWidget(dock['Welcome'],dock['Modelica-'+str(count)]) + + dock['Modelica-'+str(count)].setVisible(True) + dock['Modelica-'+str(count)].setFocus() + dock['Modelica-'+str(count)].raise_() + + #CSS + dock['Modelica-'+str(count)].setStyleSheet(" \ + .QWidget { border-radius: 15px; border: 1px solid gray; padding: 5px; width: 200px; height: 150px; } \ + ") + + self.obj_appconfig.dock_dict[self.obj_appconfig.current_project['ProjectName']].append(dock['Modelica-'+str(count)]) + + count = count + 1 + + def closeDock (self): + for dockwidget in self.obj_appconfig.dock_dict[self.obj_appconfig.current_project['ProjectName']]: + dockwidget.close() diff --git a/src/frontEnd/DockArea.pyc b/src/frontEnd/DockArea.pyc Binary files differnew file mode 100644 index 00000000..d699a73a --- /dev/null +++ b/src/frontEnd/DockArea.pyc diff --git a/src/frontEnd/ProjectExplorer.py b/src/frontEnd/ProjectExplorer.py new file mode 100644 index 00000000..146b6d0f --- /dev/null +++ b/src/frontEnd/ProjectExplorer.py @@ -0,0 +1,147 @@ +from PyQt4 import QtGui,QtCore +import os +import json +from configuration.Appconfig import Appconfig + + +class ProjectExplorer(QtGui.QWidget): + def __init__(self): + QtGui.QWidget.__init__(self) + self.obj_appconfig = Appconfig() + self.treewidget = QtGui.QTreeWidget() + self.window= QtGui.QVBoxLayout() + header = QtGui.QTreeWidgetItem(["Projects","path"]) + self.treewidget.setHeaderItem(header) + self.treewidget.setColumnHidden(1,True) + + #CSS + 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(../../images/vline.png) 0; } \ + QTreeView::branch:has-siblings:adjoins-item { border-image: url(../../images/branch-more.png) 0; } \ + QTreeView::branch:!has-children:!has-siblings:adjoins-item { border-image: url(../../images/branch-end.png) 0; } \ + QTreeView::branch:has-children:!has-siblings:closed, \ + QTreeView::branch:closed:has-children:has-siblings { border-image: none; image: url(../../images/branch-closed.png); } \ + QTreeView::branch:open:has-children:!has-siblings, \ + QTreeView::branch:open:has-children:has-siblings { border-image: none; image: url(../../images/branch-open.png); } \ + ") + + for parents, children in self.obj_appconfig.project_explorer.items(): + os.path.join(parents) + if os.path.exists(parents): + pathlist= parents.split(os.sep) + parentnode = QtGui.QTreeWidgetItem(self.treewidget, [pathlist[-1],parents]) + for files in children: + childnode = QtGui.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 = QtGui.QTreeWidgetItem(self.treewidget, [pathlist[-1], parents]) + for files in children: + childnode = QtGui.QTreeWidgetItem(parentnode, [files, os.path.join(parents,files)]) + self.obj_appconfig.proc_dict[self.obj_appconfig.current_project['ProjectName']] = [] + self.oj_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 = QtGui.QMenu() + if level == 0: + 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= self.indexItem.data().toString() + self.filePath= self.indexItem.sibling(self.indexItem.row(), 1).data().toString() + self.obj_appconfig.print_info('The current project is ' + self.filePath) + + self.textwindow = QtGui.QWidget() + self.textwindow.setMinimumSize(600, 500) + self.textwindow.setGeometry(QtCore.QRect(400,150,400,400)) + self.textwindow.setWindowTitle(filename) + + self.text = QtGui.QTextEdit() + self.save = QtGui.QPushButton('Save and Exit') + self.save.setDisabled(True) + self.windowgrid = QtGui.QGridLayout() + if (os.path.isfile(str(self.filePath)))== True: + self.fopen = open(str(self.filePath), 'r') + lines = self.fopen.read() + self.text.setText(lines) + + QtCore.QObject.connect(self.text,QtCore.SIGNAL("textChanged()"), self.enable_save) + + vbox_main = QtGui.QVBoxLayout(self.textwindow) + vbox_main.addWidget(self.text) + vbox_main.addWidget(self.save) + self.save.clicked.connect(self.save_data) + #self.connect(exit,QtCore.SIGNAL('close()'), self.onQuit) + + 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): + self.save.setEnabled(True) + + def save_data(self): + self.fopen=open(self.filePath, 'w') + self.fopen.write(self.text.toPlainText()) + self.fopen.close() + self.textwindow.close() + + def removeProject(self): + self.indexItem =self.treewidget.currentIndex() + filename= self.indexItem.data().toString() + self.filePath= self.indexItem.sibling(self.indexItem.row(), 1).data().toString() + self.int = self.indexItem.row() + self.treewidget.takeTopLevelItem(self.int) + + if self.obj_appconfig.current_project["ProjectName"] == self.filePath: + self.obj_appconfig.current_project["ProjectName"] = None + + del self.obj_appconfig.project_explorer[str(self.filePath)] + json.dump(self.obj_appconfig.project_explorer, open(self.obj_appconfig.dictPath,'w')) + + def refreshProject(self): + self.indexItem =self.treewidget.currentIndex() + filename= self.indexItem.data().toString() + self.filePath= str(self.indexItem.sibling(self.indexItem.row(), 1).data().toString()) + filelistnew= os.listdir(os.path.join(self.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: + childnode= QtGui.QTreeWidgetItem(parentnode, [files, os.path.join(self.filePath,files)]) + + self.obj_appconfig.project_explorer[self.filePath]= filelistnew + json.dump(self.obj_appconfig.project_explorer, open(self.obj_appconfig.dictPath,'w')) diff --git a/src/frontEnd/ProjectExplorer.pyc b/src/frontEnd/ProjectExplorer.pyc Binary files differnew file mode 100644 index 00000000..1fb43ac0 --- /dev/null +++ b/src/frontEnd/ProjectExplorer.pyc diff --git a/src/frontEnd/Workspace.py b/src/frontEnd/Workspace.py new file mode 100644 index 00000000..7cefa6c6 --- /dev/null +++ b/src/frontEnd/Workspace.py @@ -0,0 +1,121 @@ +#=============================================================================== +# +# FILE: Workspace.py +# +# USAGE: --- +# +# DESCRIPTION: This define all configuration used in Application. +# +# OPTIONS: --- +# REQUIREMENTS: --- +# BUGS: --- +# NOTES: --- +# AUTHOR: Fahim Khan, fahim.elex@gmail.com +# ORGANIZATION: eSim team at FOSSEE, IIT Bombay. +# CREATED: Wednesday 05 February 2015 +# REVISION: --- +#=============================================================================== +from PyQt4 import QtCore, QtGui +from configuration.Appconfig import Appconfig +import time +import os + + +class Workspace(QtGui.QWidget): + """ + This class creates Workspace GUI. + """ + def __init__(self,parent=None): + super(Workspace, self).__init__() + self.obj_appconfig = Appconfig() + + #Initializing Workspace directory for project + self.initWorkspace() + + + def initWorkspace(self): + #print "Calling workspace" + + self.mainwindow = QtGui.QVBoxLayout() + self.split = QtGui.QSplitter() + self.split.setOrientation(QtCore.Qt.Vertical) + + self.grid = QtGui.QGridLayout() + self.note = QtGui.QTextEdit(self) + self.workspace_label = QtGui.QLabel(self) + self.workspace_loc = QtGui.QLineEdit(self) + + self.note.append(self.obj_appconfig.workspace_text) + self.workspace_label.setText("Workspace:") + self.workspace_loc.setText(self.obj_appconfig.home) + + #Buttons + self.browsebtn = QtGui.QPushButton('Browse') + self.browsebtn.clicked.connect(self.browseLocation) + self.okbtn = QtGui.QPushButton('OK') + self.okbtn.clicked.connect(self.createWorkspace) + self.cancelbtn = QtGui.QPushButton('Cancel') + self.cancelbtn.clicked.connect(self.defaultWorkspace) + #Layout + self.grid.addWidget(self.note, 0,0,1,15) + self.grid.addWidget(self.workspace_label, 2,1) + self.grid.addWidget(self.workspace_loc,2,2,2,12) + self.grid.addWidget(self.browsebtn, 2,14) + self.grid.addWidget(self.okbtn, 4,13) + self.grid.addWidget(self.cancelbtn, 4,14) + + self.setGeometry(QtCore.QRect(500,250,400,400)) + self.setMaximumSize(4000, 200) + self.setWindowTitle("eSim") + self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) + self.note.setReadOnly(True) + self.setWindowIcon(QtGui.QIcon('../../images/logo.png')) + self.setLayout(self.grid) + self.show() + + + def defaultWorkspace(self): + print "Default workspace selected : "+self.obj_appconfig.default_workspace["workspace"] + self.imp_var=1 + self.obj_appconfig.print_info('Default workspace selected : ' + self.obj_appconfig.default_workspace["workspace"]) + self.close() + var_appView.show() + time.sleep(1) + var_appView.splash.close() + + + + + def close(self, *args, **kwargs): + self.window_open_close=1 + self.close_var=1 + return QtGui.QWidget.close(self, *args, **kwargs) + + + def returnWhetherClickedOrNot(self,appView): + global var_appView + var_appView=appView + + + def createWorkspace(self): + print "Function : Create workspace" + self.create_workspace = str(self.workspace_loc.text()) + self.obj_appconfig.print_info('Workspace : ' + self.create_workspace) + #Checking if Workspace already exist or not + if os.path.isdir(self.create_workspace): + self.obj_appconfig.default_workspace["workspace"] = self.create_workspace + else: + os.mkdir(self.create_workspace) + self.obj_appconfig.default_workspace["workspace"] = self.create_workspace + self.imp_var=1 + self.close() + var_appView.show() + time.sleep(1) + var_appView.splash.close() + + + def browseLocation(self): + print "Function : Browse Location" + self.workspace_directory = QtGui.QFileDialog.getExistingDirectory(self, "Browse Location",os.path.expanduser("~")) + self.workspace_loc.setText(self.workspace_directory) +
\ No newline at end of file diff --git a/src/frontEnd/Workspace.pyc b/src/frontEnd/Workspace.pyc Binary files differnew file mode 100644 index 00000000..eb6e473c --- /dev/null +++ b/src/frontEnd/Workspace.pyc diff --git a/src/frontEnd/__init__.py b/src/frontEnd/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/frontEnd/__init__.py diff --git a/src/frontEnd/__init__.pyc b/src/frontEnd/__init__.pyc Binary files differnew file mode 100644 index 00000000..708ce1aa --- /dev/null +++ b/src/frontEnd/__init__.pyc |