Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Searchboxes #303

Merged
merged 7 commits into from
Oct 19, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions qucs/qucs-lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ INCLUDE( ${QT_USE_FILE} )
ADD_DEFINITIONS(${QT_DEFINITIONS})

SET(QUCSLIB_SRCS
main.cpp qucslib.cpp displaydialog.cpp symbolwidget.cpp searchdialog.cpp librarydialog.cpp
main.cpp qucslib.cpp displaydialog.cpp symbolwidget.cpp librarydialog.cpp
)

SET(QUCSLIB_MOC_HDRS
qucslib.h displaydialog.h symbolwidget.h searchdialog.h librarydialog.h
qucslib.h displaydialog.h symbolwidget.h librarydialog.h
)

QT4_WRAP_CPP( QUCSLIB_MOC_SRCS ${QUCSLIB_MOC_HDRS} )
Expand Down
6 changes: 3 additions & 3 deletions qucs/qucs-lib/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,13 @@ bin_PROGRAMS = qucslib

dist_man_MANS = qucslib.1

MOCHEADERS = qucslib.h displaydialog.h symbolwidget.h searchdialog.h \
librarydialog.h qucslib_common.h
MOCHEADERS = qucslib.h displaydialog.h symbolwidget.h librarydialog.h \
qucslib_common.h

MOCFILES = $(MOCHEADERS:.h=.moc.cpp)

qucslib_SOURCES = main.cpp qucslib.cpp displaydialog.cpp symbolwidget.cpp \
searchdialog.cpp librarydialog.cpp qrc_qucslib.cpp
librarydialog.cpp qrc_qucslib.cpp

qrc_qucslib.cpp: qucslib.qrc
$(RCC) -o $@ $<
Expand Down
20 changes: 13 additions & 7 deletions qucs/qucs-lib/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,17 @@ QDir UserLibDir;
bool loadSettings()
{
QSettings settings("qucs","qucs");
// Qucs Library Tool specific settings
settings.beginGroup("QucsLib");
if(settings.contains("x"))QucsSettings.x=settings.value("x").toInt();
if(settings.contains("y"))QucsSettings.y=settings.value("y").toInt();
if(settings.contains("dx"))QucsSettings.dx=settings.value("dx").toInt();
if(settings.contains("dy"))QucsSettings.dy=settings.value("dy").toInt();
settings.endGroup();
// Qucs general settings
if(settings.contains("QucsHomeDir"))
if(settings.value("QucsHomeDir").toString() != "")
QucsSettings.QucsHomeDir.setPath(settings.value("QucsHomeDir").toString());
if(settings.contains("font"))QucsSettings.font.fromString(settings.value("font").toString());
if(settings.contains("Language"))QucsSettings.Language=settings.value("Language").toString();

Expand Down Expand Up @@ -85,23 +90,24 @@ int main(int argc, char *argv[])
QucsSettings.dx = 600;
QucsSettings.dy = 350;
QucsSettings.font = QFont("Helvetica", 12);
QucsSettings.QucsHomeDir.setPath(QDir::homePath() + "/.qucs");

// is application relocated?
char * var = getenv ("QUCSDIR");
QDir QucsDir;
if (var != NULL) {
QDir QucsDir = QDir (var);
QString QucsDirStr = QucsDir.canonicalPath ();
QucsSettings.LangDir =
QDir::convertSeparators (QucsDirStr + "/share/qucs/lang/");
QucsSettings.LibDir =
QDir::convertSeparators (QucsDirStr + "/share/qucs/library/");
QucsDir = QDir(QString(var));
QucsSettings.LangDir = QucsDir.canonicalPath() + "/share/qucs/lang/";
QucsSettings.LibDir = QucsDir.canonicalPath() + "/share/qucs/library/";
} else {
QucsSettings.LangDir = LANGUAGEDIR;
QucsSettings.LibDir = LIBRARYDIR;
}
UserLibDir.setPath (QDir::homePath()+QDir::convertSeparators ("/.qucs/user_lib"));

loadSettings();

UserLibDir.setPath(QucsSettings.QucsHomeDir.canonicalPath() + "/user_lib/");

QApplication a(argc, argv);
a.setFont(QucsSettings.font);

Expand Down
170 changes: 137 additions & 33 deletions qucs/qucs-lib/qucslib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@
#include <QPixmap>
#include <QWidget>
#include <QBrush>
#include <QLineEdit>

#include "qucslib.h"
#include "qucslib_common.h"
#include "librarydialog.h"
#include "displaydialog.h"
#include "symbolwidget.h"
#include "searchdialog.h"


/* Constructor setups the GUI. */
Expand Down Expand Up @@ -84,6 +84,12 @@ QucsLib::QucsLib()
helpMenu->addAction(helpAbout);
connect(helpAbout, SIGNAL(activated()), SLOT(slotAbout()));

// use Escape key to clear search
QAction *escape = new QAction(this);
escape->setShortcut(Qt::Key_Escape);
connect(escape, SIGNAL(triggered()), SLOT(slotSearchClear()));
this->addAction(escape);

// setup menu bar
menuBar()->addMenu(fileMenu);
menuBar()->addSeparator();
Expand All @@ -106,12 +112,19 @@ QucsLib::QucsLib()
CompList = new QListWidget();
connect(CompList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(slotShowComponent(QListWidgetItem*)));
connect(CompList,SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),SLOT(slotShowComponent(QListWidgetItem*)));
QPushButton *SearchButton = new QPushButton (tr("Search..."));
connect(SearchButton, SIGNAL(clicked()), SLOT(slotSearchComponent()));

CompSearch = new QLineEdit(this);
CompSearch->setPlaceholderText(tr("Search Lib Components"));
QPushButton *CompSearchClear = new QPushButton(tr("Clear"));
connect(CompSearch, SIGNAL(textEdited(const QString &)), SLOT(slotSearchComponent(const QString &)));
connect(CompSearchClear, SIGNAL(clicked()), SLOT(slotSearchClear()));

LibGroupLayout->addWidget(Library);
LibGroupLayout->addWidget(CompList);
LibGroupLayout->addWidget(SearchButton);
QHBoxLayout *CompSearchLayout = new QHBoxLayout();
LibGroupLayout->addLayout(CompSearchLayout);
CompSearchLayout->addWidget(CompSearch);
CompSearchLayout->addWidget(CompSearchClear);

LibGroup->setLayout(LibGroupLayout);

Expand Down Expand Up @@ -171,21 +184,24 @@ void QucsLib::putLibrariesIntoCombobox()
UserLibCount = 0;
QStringList LibFiles;
QStringList::iterator it;

if(UserLibDir.cd(".")) // user library directory exists ?
{
//LibFiles = UserLibDir.entryList("*.lib", QDir::Files, QDir::Name);
LibFiles = UserLibDir.entryList(QStringList("*.lib"), QDir::Files, QDir::Name);

UserLibCount = LibFiles.count();

for(it = LibFiles.begin(); it != LibFiles.end(); it++)
{
Library->addItem(QPixmap(":/bitmaps/home.png"), (*it).left((*it).length()-4));
}
}


// add a separator to distinguish between user libraries and system libs
Library->insertSeparator(LibFiles.size());
if (UserLibCount > 0) {
// add a separator to distinguish between user libraries and system libs
Library->insertSeparator(LibFiles.size());
}
}

QDir LibDir(QucsSettings.LibDir);
LibFiles = LibDir.entryList(QStringList("*.lib"), QDir::Files, QDir::Name);
Expand All @@ -202,6 +218,7 @@ void QucsLib::slotAbout()
QMessageBox::about(this, tr("About..."),
"QucsLib Version " PACKAGE_VERSION "\n"+
tr("Library Manager for Qucs\n")+
tr("Copyright (C) 2011-2015 Qucs Team\n")+
tr("Copyright (C) 2005 by Michael Margraf\n")+
"\nThis is free software; see the source for copying conditions."
"\nThere is NO warranty; not even for MERCHANTABILITY or "
Expand Down Expand Up @@ -237,6 +254,7 @@ void QucsLib::slotManageLib()
{
(new LibraryDialog(this))->exec();
putLibrariesIntoCombobox();
CompSearch->clear(); // in case "search mode" was previously active
}

// ----------------------------------------------------
Expand Down Expand Up @@ -283,27 +301,19 @@ void QucsLib::slotShowModel()
// ----------------------------------------------------
void QucsLib::slotSelectLibrary(int Index)
{
int End;

End = Library->count ()-1;

if(Library->itemText (End) == tr("Search result"))
{
if(Index < End)
{
// if search result still there -> remove it
Library->removeItem (End);
}
else
{
return;
}
// was in "search mode" ?
if (Library->itemText(0) == tr("Search results")) {
if (Index == 0) // user selected "Search results" item
return;
Library->removeItem(0); // remove the added "Search results" item
CompSearch->clear();
--Index; // adjust requested index since item 0 was removed
}

if(Library->itemText (0) == "")
{
Library->removeItem (0);
}
// make sure the right index is selected
// (might have been called by a cleared search and not by user action)
Library->setCurrentIndex(Index);

CompList->clear ();
LibraryComps.clear ();
DefaultSymbol = "";
Expand Down Expand Up @@ -351,15 +361,98 @@ void QucsLib::slotSelectLibrary(int Index)
}

// ----------------------------------------------------
void QucsLib::slotSearchComponent()
void QucsLib::slotSearchComponent(const QString &searchText)
{
SearchDialog *d = new SearchDialog(this);
d->setWindowTitle(tr("Search Library Component"));
if(d->exec() == QDialog::Accepted)
QMessageBox::information(this, tr("Result"),
tr("No appropriate component found."));
QStringList LibFiles;
// clear the components view
// (search restarts anew at every keypress)
CompList->clear ();

if (Library->itemText(0) != tr("Search results")) {
// not already in "search mode"
libCurIdx = Library->currentIndex(); // remember current selected item
// insert "Search results" at the beginning, so that it is visible
Library->insertItem(-1, tr("Search results"));
Library->setCurrentIndex(0);
}

if(searchText.isEmpty()) {
return;
}

bool findComponent = false;

// user libraries
QStringList UserLibFiles = UserLibDir.entryList(QStringList("*.lib"), QDir::Files, QDir::Name);
foreach(QString s, UserLibFiles) // build list with full path
LibFiles += (UserLibDir.absoluteFilePath(s));

// system libraries
QDir LibDir(QucsSettings.LibDir);
QStringList SysLibFiles = LibDir.entryList(QStringList("*.lib"), QDir::Files, QDir::Name);
foreach(QString s, SysLibFiles) // build list with full path
LibFiles += (LibDir.absoluteFilePath(s));

QFile File;
QTextStream ReadWhole;
QString LibraryString, LibName, CompName;
QStringList::iterator it;
int Start, End, NameStart, NameEnd;
for(it = LibFiles.begin(); it != LibFiles.end(); it++) { // all library files
File.setFileName((*it));
if(!File.open(QIODevice::ReadOnly)) continue;

ReadWhole.setDevice(&File);
LibraryString = ReadWhole.readAll();
File.close();

Start = LibraryString.indexOf("<Qucs Library ");
if(Start < 0) continue;
End = LibraryString.indexOf('>', Start);
if(End < 0) continue;
LibName = LibraryString.mid(Start, End-Start).section('"', 1, 1);

// check all components of the current library
while((Start=LibraryString.indexOf("\n<Component ", Start)) > 0) {
Start++;
NameStart = Start + 11;
NameEnd = LibraryString.indexOf('>', NameStart);
if(NameEnd < 0) continue;
CompName = LibraryString.mid(NameStart, NameEnd-NameStart);

End = LibraryString.indexOf("\n</Component>", NameEnd);
if(End < 0) continue;
End += 13;

// does search criterion match ?
if(CompName.indexOf(searchText, 0, Qt::CaseInsensitive) >= 0) {
if(!findComponent) {
DefaultSymbol = "";
CompList->clear();
LibraryComps.clear();
}
findComponent = true;
CompList->addItem(CompName);
LibraryComps.append(LibName+'\n'+LibraryString.mid(Start, End-Start));
}
Start = End;
}
}
}


void QucsLib::slotSearchClear()
{
// was in "search mode" ?
if (Library->itemText(0) == tr("Search results")) {
Library->removeItem(0); // remove the added "Search results" item
CompSearch->clear();
// go back to the panel selected before search started
slotSelectLibrary(libCurIdx);
}
}


// ----------------------------------------------------
void QucsLib::slotShowComponent(QListWidgetItem *Item)
{
Expand All @@ -373,6 +466,9 @@ void QucsLib::slotShowComponent(QListWidgetItem *Item)
CompDescr->append("Library: " + LibName);
CompDescr->append("----------------------------");

// FIXME: here we assume that LibName is the same as the actual filename...
int i = Library->findText(LibName);

if(Library->currentIndex() < UserLibCount)
LibName = UserLibDir.absolutePath() + QDir::separator() + LibName;

Expand Down Expand Up @@ -417,6 +513,14 @@ void QucsLib::slotShowComponent(QListWidgetItem *Item)
else if(!DefaultSymbol.isEmpty()) // has library a default symbol ?
Symbol->setSymbol(DefaultSymbol, LibName, Item->text());

// change currently selected category, so the user will
// learn where the component comes from
Library->setCurrentIndex(i);
// remove 1 to find the actual index (when in Search Mode ther is one more
// item due to the added "Search Results" item)
libCurIdx = i-1; // remember the category to select when exiting search
//!! comment out the above two lines if you would like that the search
//!! returns back to the last selected category instead
}


6 changes: 4 additions & 2 deletions qucs/qucs-lib/qucslib.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ private slots:
void slotCopyToClipBoard();
void slotShowModel();
void slotSelectLibrary(int);
void slotSearchComponent();
void slotSearchComponent(const QString &);
void slotSearchClear();
void slotShowComponent(QListWidgetItem*);
void slotManageLib();

Expand All @@ -76,10 +77,11 @@ private slots:
QMenu *fileMenu, *helpMenu;

int UserLibCount;
int libCurIdx;
SymbolWidget *Symbol;
QTextEdit *CompDescr;
QVBoxLayout *all;

QLineEdit *CompSearch;
};

#endif /* QUCSLIB_H */
Loading