Skip to content

Commit

Permalink
Merge pull request #303 from in3otd/searchboxes
Browse files Browse the repository at this point in the history
Searchboxes
  • Loading branch information
guitorri committed Oct 19, 2015
2 parents 989c772 + c8f6ae6 commit 6c8badc
Show file tree
Hide file tree
Showing 9 changed files with 198 additions and 258 deletions.
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

0 comments on commit 6c8badc

Please sign in to comment.