// ----------------------------------------------------------------------- void QucsApp::slotInsertEntity () { TextDoc * Doc = (TextDoc *) DocumentTab->currentPage (); Doc->viewport()->setFocus (); //TODO Doc->clearParagraphBackground (Doc->tmpPosX); Doc->insertSkeleton (); //int x, y; //Doc->getCursorPosition (&x, &y); //x = Doc->textCursor().blockNumber(); //y = Doc->textCursor().columnNumber(); Doc->slotCursorPosChanged(); }
// ----------------------------------------------------------------------- // Is called, when "Zoom in" action is activated. void QucsApp::slotZoomIn(bool on) { TextDoc *Doc = (TextDoc*)DocumentTab->currentPage(); if(Doc->inherits("QTextEdit")) { Doc->zoomBy(2.0f); magPlus->blockSignals(true); magPlus->setOn(false); magPlus->blockSignals(false); } else performToggleAction(on, magPlus, 0, &MouseActions::MMoveZoomIn, &MouseActions::MPressZoomIn); }
// ----------------------------------------------------------------------- // Is called, when "Zoom in" action is triggered. void QucsApp::slotZoomIn(bool on) { TextDoc *Doc = (TextDoc*)DocumentTab->currentWidget(); if(isTextDocument(Doc)) { Doc->zoomBy(1.5f); magPlus->blockSignals(true); magPlus->setChecked(false); magPlus->blockSignals(false); } else performToggleAction(on, magPlus, 0, &MouseActions::MMoveZoomIn, &MouseActions::MPressZoomIn); }
// --------------------------------------------------------------------- void SearchDialog::searchText(bool fromCursor, int Offset) { TextDoc *Doc = (TextDoc*)App->DocumentTab->currentPage(); int Line=0, Column=0, count=0, i; if(fromCursor) Doc->getCursorPosition(&Line, &Column); else if(BackwardBox->isChecked()) Line = Doc->paragraphs(); if(!BackwardBox->isChecked()) Column += Offset; if(SearchEdit->text().isEmpty()) return; while(Doc->find(SearchEdit->text(), CaseBox->isChecked(), WordBox->isChecked(), !BackwardBox->isChecked(), &Line, &Column)) { count++; if(AskBox->isHidden()) // search only ? return; i = QMessageBox::Yes; if(AskBox->isChecked()) { i = QMessageBox::information(this, tr("Replace..."), tr("Replace occurrence ?"), QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); } switch(i) { case QMessageBox::Yes: Doc->insert(ReplaceEdit->text()); Column += ReplaceEdit->text().length(); break; case QMessageBox::No: Column += SearchEdit->text().length(); break; default: return; } } if(count == 0) QMessageBox::information(this, tr("Search..."), tr("Search string not found!")); else if(!AskBox->isHidden()) // replace ? if(!AskBox->isChecked()) // only with that, "count" has correct number !!! QMessageBox::information(this, tr("Replace..."), tr("Replaced %1 occurrences!").arg(count)); }
// ------------------------------------------------------------------------ // Is called if "Delete"-Button is pressed. void QucsApp::slotEditDelete(bool on) { TextDoc *Doc = (TextDoc*)DocumentTab->currentPage(); if(Doc->inherits("QTextEdit")) { Doc->viewport()->setFocus(); Doc->del(); editDelete->blockSignals(true); editDelete->setOn(false); // release toolbar button editDelete->blockSignals(false); } else performToggleAction(on, editDelete, &Schematic::deleteElements, &MouseActions::MMoveDelete, &MouseActions::MPressDelete); }
// ----------------------------------------------------------------------- // Is called when the activate/deactivate toolbar button is pressed. void QucsApp::slotEditActivate (bool on) { TextDoc * Doc = (TextDoc *) DocumentTab->currentPage (); if (isTextDocument (Doc)) { Doc->clearParagraphBackground (Doc->tmpPosX); Doc->commentSelected (); editActivate->blockSignals (true); editActivate->setOn (false); // release toolbar button editActivate->blockSignals (false); } else performToggleAction (on, editActivate, &Schematic::activateSelectedComponents, &MouseActions::MMoveActivate, &MouseActions::MPressActivate); }
// ------------------------------------------------------------------------ // Is called if "Delete"-Button is pressed. void QucsApp::slotEditDelete(bool on) { TextDoc *Doc = (TextDoc*)DocumentTab->currentWidget(); if(isTextDocument(Doc)) { Doc->viewport()->setFocus(); //Doc->del(); Doc->textCursor().deleteChar(); editDelete->blockSignals(true); editDelete->setChecked(false); // release toolbar button editDelete->blockSignals(false); } else performToggleAction(on, editDelete, &Schematic::deleteElements, &MouseActions::MMoveDelete, &MouseActions::MPressDelete); }
// --------------------------------------------------------------------- void SearchDialog::initSearch(bool replace) { if(replace) { setCaption(tr("Replace Text")); AskBox->setHidden(false); ReplaceGroup->setHidden(false); } else { setCaption(tr("Search Text")); AskBox->hide(); ReplaceGroup->hide(); } TextDoc *Doc = (TextDoc*)App->DocumentTab->currentPage(); ReplaceEdit->clear(); SearchEdit->setText(Doc->selectedText()); SearchEdit->selectAll(); SearchEdit->setFocus(); exec(); }
// ----------------------------------------------------------------------- void QucsApp::slotInsertEntity () { TextDoc * Doc = (TextDoc *) DocumentTab->currentPage (); Doc->viewport()->setFocus (); Doc->clearParagraphBackground (Doc->tmpPosX); Doc->insertSkeleton (); int x, y; Doc->getCursorPosition (&x, &y); Doc->slotCursorPosChanged (x, y); }
/*! * \brief SimMessage::startSimulator simulates the document in view. */ void SimMessage::startSimulator() { // Using the Doc pointer here is risky as the user may have closed // the schematic, but converting the SPICE netlists is (hopefully) // faster than the user (I have no other idea). QString SimTime; QStringList Arguments; QString SimPath = QDir::convertSeparators (QucsSettings.QucsHomeDir.absolutePath()); #ifdef __MINGW32__ QString QucsDigiLib = "qucsdigilib.bat"; QString QucsDigi = "qucsdigi.bat"; QString QucsVeri = "qucsveri.bat"; #else QString QucsDigiLib = "qucsdigilib"; QString QucsDigi = "qucsdigi"; QString QucsVeri = "qucsveri"; #endif SimOpt = NULL; bool isVerilog = false; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); // Simulate text window. if(DocWidget->inherits("QTextEdit")) { TextDoc * Doc = (TextDoc*)DocWidget; // Take VHDL file in memory as it could contain unsaved changes. Stream << Doc->toPlainText(); NetlistFile.close(); ProgText->insertPlainText(tr("done.\n")); // of "creating netlist... // Simulation. if (Doc->simulation) { SimTime = Doc->SimTime; QString libs = Doc->Libraries.toLower(); /// \todo \bug error: unrecognized command line option '-Wl' #ifdef __MINGW32__ if(libs.isEmpty()) { libs = ""; } else { libs.replace(" ",",-l"); libs = "-Wl,-l" + libs; } #else if(libs.isEmpty()) { libs = "-c"; } else { libs.replace(" ",",-l"); libs = "-c,-l" + libs; } #endif Program = pathName(QucsSettings.BinDir + QucsDigi); Arguments << QucsSettings.QucsHomeDir.filePath("netlist.txt") << DataSet << SimTime << pathName(SimPath) << pathName(QucsSettings.BinDir) << libs; } // Module. else { QString text = Doc->toPlainText(); VHDL_File_Info VInfo (text); QString entity = VInfo.EntityName.toLower(); QString lib = Doc->Library.toLower(); if (lib.isEmpty()) lib = "work"; QString dir = QDir::convertSeparators (QucsSettings.QucsHomeDir.path()); QDir vhdlDir(dir); if(!vhdlDir.exists("vhdl")) if(!vhdlDir.mkdir("vhdl")) { ErrText->appendPlainText(tr("ERROR: Cannot create VHDL directory \"%1\"!") .arg(vhdlDir.path()+"/vhdl")); return; } vhdlDir.setPath(vhdlDir.path()+"/vhdl"); if(!vhdlDir.exists(lib)) if(!vhdlDir.mkdir(lib)) { ErrText->appendPlainText(tr("ERROR: Cannot create VHDL directory \"%1\"!") .arg(vhdlDir.path()+"/"+lib)); return; } vhdlDir.setPath(vhdlDir.path()+"/"+lib); QFile destFile; destFile.setFileName(vhdlDir.filePath(entity+".vhdl")); if(!destFile.open(QIODevice::WriteOnly)) { ErrText->appendPlainText(tr("ERROR: Cannot create \"%1\"!") .arg(destFile.fileName())); return; } destFile.write(text.toAscii(), text.length()); destFile.close(); Program = pathName(QucsSettings.BinDir + QucsDigiLib); Arguments << QucsSettings.QucsHomeDir.filePath("netlist.txt") << pathName(SimPath) << entity << lib; } } // Simulate schematic window. else { // output NodeSets, SPICE simulations etc. for(QStringList::Iterator it = Collect.begin(); it != Collect.end(); ++it) { // don't put library includes into netlist... if ((*it).right(4) != ".lst" && (*it).right(5) != ".vhdl" && (*it).right(4) != ".vhd" && (*it).right(2) != ".v") { Stream << *it << '\n'; } } Stream << '\n'; isVerilog = ((Schematic*)DocWidget)->isVerilog; SimTime = ((Schematic*)DocWidget)->createNetlist(Stream, SimPorts); if(SimTime.length()>0&&SimTime.at(0) == '\xA7') { NetlistFile.close(); ErrText->insertPlainText(SimTime.mid(1)); FinishSimulation(-1); return; } if (isVerilog) { Stream << "\n" << " initial begin\n" << " $dumpfile(\"digi.vcd\");\n" << " $dumpvars();\n" << " #" << SimTime << " $finish;\n" << " end\n\n" << "endmodule // TestBench\n"; } NetlistFile.close(); ProgText->insertPlainText(tr("done.\n")); // of "creating netlist... if(SimPorts < 0) { // append command arguments // append netlist with same arguments if (! Module::vaComponents.isEmpty()) { /*! Only pass modules to Qucsator that are indeed used on * the schematic,it might be the case that the user loaded the icons, * but did not compiled the module. Qucsator will not find the library. * * Check if used symbols have corresponing lib before running * Qucsator? Need to search on the netlis.txt? Is there other data * structure containig the netlist? * */ QStringList usedComponents; if (!NetlistFile.open(QIODevice::ReadOnly)) QMessageBox::critical(this, tr("Error"), tr("Cannot read netlist!")); else { QString net = QString(NetlistFile.readAll()); QMapIterator<QString, QString> i(Module::vaComponents); while (i.hasNext()) { i.next(); if (net.contains(i.key())) usedComponents << i.key(); } NetlistFile.close(); } if (! usedComponents.isEmpty()) { /// \todo remvoe the command line arguments? use only netlist annotation? //Arguments << "-p" << QucsSettings.QucsWorkDir.absolutePath() // << "-m" << usedComponents; //qDebug() << "Command :" << Program << Arguments.join(" "); /// Anotate netlist with Verilog-A dynamic path and module names /// if (!NetlistFile.open(QFile::Append | QFile::Text)) QMessageBox::critical(this, tr("Error"), tr("Cannot read netlist!")); else { QTextStream out(&NetlistFile); out << "\n"; out << "# --path=" << QucsSettings.QucsWorkDir.absolutePath() << "\n"; out << "# --module=" << usedComponents.join(" ") << "\n"; NetlistFile.close(); } } } // vaComponents not empty if((SimOpt = findOptimization((Schematic*)DocWidget))) { ((Optimize_Sim*)SimOpt)->createASCOnetlist(); Program = QucsSettings.AscoBinDir.canonicalPath(); Program = QDir::toNativeSeparators(Program+"/"+"asco"+QString(executableSuffix)); Arguments << "-qucs" << QucsSettings.QucsHomeDir.filePath("asco_netlist.txt") << "-o" << "asco_out"; } else { Program = QucsSettings.Qucsator; Arguments << "-b" << "-g" << "-i" << QucsSettings.QucsHomeDir.filePath("netlist.txt") << "-o" << DataSet; } } else { if (isVerilog) { Program = QDir::toNativeSeparators(QucsSettings.BinDir + QucsVeri); Arguments << QDir::toNativeSeparators(QucsSettings.QucsHomeDir.filePath("netlist.txt")) << DataSet << SimTime << QDir::toNativeSeparators(SimPath) << QDir::toNativeSeparators(QucsSettings.BinDir) << "-c"; } else { /// \todo \bug error: unrecognized command line option '-Wl' #ifdef __MINGW32__ Program = QDir::toNativeSeparators(pathName(QucsSettings.BinDir + QucsDigi)); Arguments << QDir::toNativeSeparators(QucsSettings.QucsHomeDir.filePath("netlist.txt")) << DataSet << SimTime << QDir::toNativeSeparators(SimPath) << QDir::toNativeSeparators(QucsSettings.BinDir) << "-Wall" << "-c"; #else Program = QDir::toNativeSeparators(pathName(QucsSettings.BinDir + QucsDigi)); Arguments << QucsSettings.QucsHomeDir.filePath("netlist.txt") << DataSet << SimTime << pathName(SimPath) << pathName(QucsSettings.BinDir) << "-Wall" << "-c"; #endif } } } disconnect(&SimProcess, 0, 0, 0); connect(&SimProcess, SIGNAL(readyReadStandardError()), SLOT(slotDisplayErr())); connect(&SimProcess, SIGNAL(readyReadStandardOutput()), SLOT(slotDisplayMsg())); connect(&SimProcess, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(slotSimEnded(int, QProcess::ExitStatus))); connect(&SimProcess, SIGNAL(stateChanged(QProcess::ProcessState)), SLOT(slotStateChanged(QProcess::ProcessState))); #ifdef SPEEDUP_PROGRESSBAR waitForUpdate = false; #endif wasLF = false; ProgressText = ""; #ifdef __MINGW32__ QString sep(";"); // path separator #else QString sep(":"); #endif // append process PATH // insert Qucs bin dir, so ASCO can find qucsator env.insert("PATH", env.value("PATH") + sep + QucsSettings.BinDir ); SimProcess.setProcessEnvironment(env); qDebug() << "Command :" << Program << Arguments.join(" "); SimProcess.start(Program, Arguments); // launch the program }
// ------------------------------------------------------------------------ void SimMessage::startSimulator() { // Using the Doc pointer here is risky as the user may have closed // the schematic, but converting the SPICE netlists is (hopefully) // faster than the user (I have no other idea). QString SimTime; QString Program; QStringList Arguments; QString SimPath = QDir::convertSeparators (QucsHomeDir.absPath()); #ifdef __MINGW32__ QString QucsDigiLib = "qucsdigilib.bat"; QString QucsDigi = "qucsdigi.bat"; QString QucsVeri = "qucsveri.bat"; #else QString QucsDigiLib = "qucsdigilib"; QString QucsDigi = "qucsdigi"; QString QucsVeri = "qucsveri"; #endif SimOpt = NULL; bool isVerilog = false; // Simulate text window. if(DocWidget->inherits("QTextEdit")) { TextDoc * Doc = (TextDoc*)DocWidget; // Take VHDL file in memory as it could contain unsaved changes. Stream << Doc->text(); NetlistFile.close(); ProgText->insert(tr("done.")+"\n"); // of "creating netlist... // Simulation. if (Doc->simulation) { SimTime = Doc->SimTime; QString libs = Doc->Libraries.lower(); #ifdef __MINGW32__ if(libs.isEmpty()) { libs = "-Wl"; } else { libs.replace(" ",",-l"); libs = "-Wl,-l" + libs; } #else if(libs.isEmpty()) { libs = "-c"; } else { libs.replace(" ",",-l"); libs = "-c,-l" + libs; } #endif Program = pathName(QucsSettings.BinDir + QucsDigi); Arguments << "netlist.txt" << DataSet << SimTime << pathName(SimPath) << pathName(QucsSettings.BinDir) << libs; } // Module. else { QString text = Doc->text(); VHDL_File_Info VInfo (text); QString entity = VInfo.EntityName.lower(); QString lib = Doc->Library.lower(); if (lib.isEmpty()) lib = "work"; QString dir = QDir::convertSeparators (QucsHomeDir.path()); QDir vhdlDir(dir); if(!vhdlDir.exists("vhdl")) if(!vhdlDir.mkdir("vhdl")) { ErrText->insert(tr("ERROR: Cannot create VHDL directory \"%1\"!") .arg(vhdlDir.path()+"/vhdl")); return; } vhdlDir.setPath(vhdlDir.path()+"/vhdl"); if(!vhdlDir.exists(lib)) if(!vhdlDir.mkdir(lib)) { ErrText->insert(tr("ERROR: Cannot create VHDL directory \"%1\"!") .arg(vhdlDir.path()+"/"+lib)); return; } vhdlDir.setPath(vhdlDir.path()+"/"+lib); QFile destFile; destFile.setName(vhdlDir.filePath(entity+".vhdl")); if(!destFile.open(QIODevice::WriteOnly)) { ErrText->insert(tr("ERROR: Cannot create \"%1\"!") .arg(destFile.name())); return; } destFile.writeBlock(text.ascii(), text.length()); destFile.close(); Program = pathName(QucsSettings.BinDir + QucsDigiLib); Arguments << "netlist.txt" << pathName(SimPath) << entity << lib; } } // Simulate schematic window. else { // output NodeSets, SPICE simulations etc. for(QStringList::Iterator it = Collect.begin(); it != Collect.end(); ++it) { // don't put library includes into netlist... if ((*it).right(4) != ".lst" && (*it).right(5) != ".vhdl" && (*it).right(4) != ".vhd" && (*it).right(2) != ".v") { Stream << *it << '\n'; } } Stream << '\n'; isVerilog = ((Schematic*)DocWidget)->isVerilog; SimTime = ((Schematic*)DocWidget)->createNetlist(Stream, SimPorts); if(SimTime.length()>0&&SimTime.at(0) == '\xA7') { NetlistFile.close(); ErrText->insert(SimTime.mid(1)); FinishSimulation(-1); return; } if (isVerilog) { Stream << "\n" << " initial begin\n" << " $dumpfile(\"digi.vcd\");\n" << " $dumpvars();\n" << " #" << SimTime << " $finish;\n" << " end\n\n" << "endmodule // TestBench\n"; } NetlistFile.close(); ProgText->insert(tr("done.")+"\n"); // of "creating netlist... if(SimPorts < 0) { if((SimOpt = findOptimization((Schematic*)DocWidget))) { ((Optimize_Sim*)SimOpt)->createASCOnetlist(); Program = QucsSettings.AscoDir + "asco"+ executablePostfix; Arguments << "-qucs" << QucsHomeDir.filePath("asco_netlist.txt") << "-o" << "asco_out"; } else { Program = QucsSettings.BinDir + "qucsator" + executablePostfix; Arguments << "-b" << "-g" << "-i" << QucsHomeDir.filePath("netlist.txt") << "-o" << DataSet; } } else { if (isVerilog) { Program = pathName(QucsSettings.BinDir + QucsVeri); Arguments << "netlist.txt" << DataSet << SimTime << pathName(SimPath) << pathName(QucsSettings.BinDir) << "-c"; } else { #ifdef __MINGW32__ Program = pathName(QucsSettings.BinDir + QucsDigi); Arguments << "netlist.txt" << DataSet << SimTime << pathName(SimPath) << pathName(QucsSettings.BinDir) << "-Wl" << "-c"; #else Program = pathName(QucsSettings.BinDir + QucsDigi); Arguments << "netlist.txt" << DataSet << SimTime << pathName(SimPath) << pathName(QucsSettings.BinDir) << "-Wall" << "-c"; #endif } } } disconnect(&SimProcess, 0, 0, 0); connect(&SimProcess, SIGNAL(readyReadStandardError()), SLOT(slotDisplayErr())); connect(&SimProcess, SIGNAL(readyReadStandardOutput()), SLOT(slotDisplayMsg())); connect(&SimProcess, SIGNAL(finished(int)), SLOT(slotSimEnded(int))); #ifdef SPEEDUP_PROGRESSBAR waitForUpdate = false; #endif wasLF = false; ProgressText = ""; #ifdef __MINGW32__ QString sep(";"); // path separator #else QString sep(":"); #endif // append process PATH QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("PATH", env.value("PATH") + sep + QucsSettings.BinDir ); SimProcess.setProcessEnvironment(env); QFile file(Program); if ( !file.exists() ){ ErrText->insert(tr("ERROR: Program not found: %1").arg(Program)); FinishSimulation(-1); return; } else file.close(); SimProcess.start(Program, Arguments); // launch the program if(!SimProcess.Running) { ErrText->insert(tr("ERROR: Cannot start simulator!")); FinishSimulation(-1); return; } }
/*! * \brief MessageDock::slotCursor */ void MessageDock::slotCursor() { qWarning() << admsOutput->textCursor().blockNumber(); int gotoLine = -1; QString line = admsOutput->textCursor().block().text(); if (line.contains("[fatal..]",Qt::CaseSensitive)) { // \todo improve the parsing of line // try to find line number: ":34:" if (line.contains(":",Qt::CaseSensitive)) { int a,b; a = line.indexOf(":")+1; b = line.indexOf(":",a); gotoLine = line.mid(a,b-a).stripWhiteSpace().toInt(); qWarning() << "goto line " << gotoLine; } // try to find line number: "syntax error at line 33 --" if (line.contains("syntax error ",Qt::CaseSensitive)) { int a,b; a = line.indexOf("at line"); b = line.indexOf("--",a); gotoLine = line.mid(a+7,b-a-7).stripWhiteSpace().toInt(); qWarning() << "goto line " << gotoLine; } } // \todo set hightlight in QucsDoc Verilog-A file? // move cursor? addt line number? highliht line number? set in focus /* * add slot to TextDoc * it takes the gotoLine * hightlings the line * QucsApp::getDoc() //current should be a TextDoc */ // QucsDoc *foo = QucsMain->getDoc(); // qWarning() << foo->DocName; if (gotoLine >= 0) { // \todo it will mark whatever document is open. parse the model file // name from the fatal message and ->findDoc instead of ->getDoc? // grab active text document TextDoc * d = (TextDoc*)QucsMain->getDoc(); QTextCursor cursor = d->textCursor(); int pos = d->document()->findBlockByLineNumber(gotoLine-1).position(); cursor.setPosition(pos); // Highligt a give line QList<QTextEdit::ExtraSelection> extraSelections; QTextEdit::ExtraSelection selection; QColor lineColor = QColor(Qt::yellow).lighter(160); selection.format.setBackground(lineColor); selection.format.setProperty(QTextFormat::FullWidthSelection, true); selection.cursor = cursor; // get existing extraSelections.append(d->extraSelections()); // append new extraSelections.append(selection); // color the selections on the active document d->setExtraSelections(extraSelections); //move focus to VA code d->setFocus(); //move cursor to highlighted line // d->setCursor(d->document()->); d->setTextCursor(cursor); } /// \todo add line numbers to TextDoc, highlight as the cursor moves /// problem that now the cursor paints over the failed line. /// can we have multiple selections? }