X-Git-Url: https://vaikene.ee/gitweb/highlight.css?a=blobdiff_plain;f=src%2Fapps%2FFileFinder%2FGUI%2Fgui.cpp;h=b0531af0ca42db36b7c36d97df721371ebe9dae3;hb=4c0329c5c2690bde28212c89029015a5da4c7e34;hp=a849da970d2e2cf4da6da630ee2d39dfbc0848b6;hpb=e73fe47c7bba8066feeb68b0f1568f3ac493f50c;p=evaf diff --git a/src/apps/FileFinder/GUI/gui.cpp b/src/apps/FileFinder/GUI/gui.cpp index a849da9..b0531af 100644 --- a/src/apps/FileFinder/GUI/gui.cpp +++ b/src/apps/FileFinder/GUI/gui.cpp @@ -3,7 +3,7 @@ * @brief GUI for the FileFinder application * @author Enar Vaikene * - * Copyright (c) 2011 Enar Vaikene + * Copyright (c) 2011-2019 Enar Vaikene * * This file is part of the eVaf C++ cross-platform application development framework. * @@ -18,7 +18,6 @@ */ #include "gui.h" -#include "version.h" #include "Engine/iFileFinder" @@ -28,10 +27,9 @@ #include #include -#include +#include VER_EXPORT_VERSION_INFO() -Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, eVaf::FileFinder::GUI::Module) using namespace eVaf; @@ -44,7 +42,7 @@ void FileFinder::GUI::Internal::MainWidget::keyPressEvent(QKeyEvent * e) switch (e->key()) { case Qt::Key_Enter: case Qt::Key_Return: { - QList buttons = qFindChildren(this); + QList buttons = findChildren(); foreach (QPushButton * btn, buttons) { if (btn->isDefault() && btn->isVisible()) { if (btn->isEnabled()) @@ -75,20 +73,24 @@ void FileFinder::GUI::Internal::MainWidget::keyPressEvent(QKeyEvent * e) //------------------------------------------------------------------- +int const FileFinder::GUI::Module::MaxHistoryItems = 20; + FileFinder::GUI::Module::Module() : Plugins::iPlugin() , mReady(false) - , mFinder(0) - , mOpenFileAction(0) - , mOpenDirectoryAction(0) - , wMain(0) - , wDirectory(0) - , wRecursive(0) - , wIncludeNames(0) - , wExcludeNames(0) - , wIncludeContent(0) - , wExcludeContent(0) - , wFind(0) + , mFinder(nullptr) + , mOpenFileAction(nullptr) + , mOpenDirectoryAction(nullptr) + , mCopyNameAction(nullptr) + , mCopyAllNamesAction(nullptr) + , wMain(nullptr) + , wDirectory(nullptr) + , wRecursive(nullptr) + , wIncludeNames(nullptr) + , wExcludeNames(nullptr) + , wIncludeContent(nullptr) + , wExcludeContent(nullptr) + , wFind(nullptr) { setObjectName(QString("%1.Module").arg(VER_MODULE_NAME_STR)); @@ -105,18 +107,18 @@ bool FileFinder::GUI::Module::init(QString const & args) Q_UNUSED(args) // Get the iFileFinder interface - EVAF_TEST_X((mFinder = evafQueryInterface("iFileFinder")), "No iFileFinder interface"); + EVAF_TEST_X((mFinder = evafQueryInterface("iFileFinder")), "No iFileFinder interface") connect(mFinder, SIGNAL(found(QString,QString)), this, SLOT(found(QString,QString))); connect(mFinder, SIGNAL(finished(bool)), this, SLOT(finished(bool))); // Get the main window interface and fill it with widgets SdiWindow::iSdiWindow * win = evafQueryInterface("iSdiWindow"); - EVAF_TEST_X(win, "No iSdiWindow interface"); + EVAF_TEST_X(win, "No iSdiWindow interface") // Create the main widget for this window wMain = new Internal::MainWidget; connect(wMain, SIGNAL(quit()), qApp, SLOT(quit())); - win->addWidget(wMain); + win->addPanel("FileFinder", wMain); // Create actions for the window and widgets on it createActions(); @@ -138,12 +140,14 @@ void FileFinder::GUI::Module::done() { mReady = false; + mFinder = nullptr; + /* * Widgets are deleted by the SdiWindow module. We use wMain to track calls to done() without * proper init(). */ if (wMain) { - wMain = 0; + wMain = nullptr; saveHistory(); } @@ -155,27 +159,27 @@ void FileFinder::GUI::Module::saveHistory() QSettings settings(VER_COMPANY_NAME_STR, Common::iApp::instance()->name()); QStringList t; - for (int i = 0; i < wDirectory->count(); ++i) + for (int i = 0; i < wDirectory->count() && i < MaxHistoryItems; ++i) t.append(wDirectory->itemText(i)); settings.setValue("FileFinder/Directories", t); t.clear(); - for (int i = 0; i < wIncludeNames->count(); ++i) + for (int i = 0; i < wIncludeNames->count() && i < MaxHistoryItems; ++i) t.append(wIncludeNames->itemText(i)); settings.setValue("FileFinder/IncludeNames", t); t.clear(); - for (int i = 0; i < wExcludeNames->count(); ++i) + for (int i = 0; i < wExcludeNames->count() && i < MaxHistoryItems; ++i) t.append(wExcludeNames->itemText(i)); settings.setValue("FileFinder/ExcludeNames", t); t.clear(); - for (int i = 0; i < wIncludeContent->count(); ++i) + for (int i = 0; i < wIncludeContent->count() && i < MaxHistoryItems; ++i) t.append(wIncludeContent->itemText(i)); settings.setValue("FileFinder/IncludeContent", t); t.clear(); - for (int i = 0; i < wExcludeContent->count(); ++i) + for (int i = 0; i < wExcludeContent->count() && i < MaxHistoryItems; ++i) t.append(wExcludeContent->itemText(i)); settings.setValue("FileFinder/ExcludeContent", t); @@ -187,6 +191,7 @@ void FileFinder::GUI::Module::loadHistory() wDirectory->addItems(settings.value("FileFinder/Directories").toStringList()); wDirectory->setEditText(QDir::currentPath()); + mDirModel->setRootPath(QDir::currentPath()); wIncludeNames->addItems(settings.value("FileFinder/IncludeNames").toStringList()); wIncludeNames->setEditText(""); @@ -216,12 +221,17 @@ void FileFinder::GUI::Module::createWidgets() wDirectory->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); wDirectory->setEditable(true); wDirectory->setInsertPolicy(QComboBox::InsertAtTop); + QCompleter * completer = new QCompleter(wMain); + mDirModel = new QFileSystemModel(wMain); + mDirModel->setFilter(QDir::AllDirs | QDir::Dirs | QDir::NoDotAndDotDot); + completer->setModel(mDirModel); + wDirectory->setCompleter(completer); l->setBuddy(wDirectory); hbox->addWidget(wDirectory); - QPushButton * btn = new QPushButton(tr("&Browse")); - connect(btn, SIGNAL(clicked()), this, SLOT(browseDirectory())); - hbox->addWidget(btn); + wBrowse = new QPushButton(tr("&Browse")); + connect(wBrowse, SIGNAL(clicked()), this, SLOT(browseDirectory())); + hbox->addWidget(wBrowse); wRecursive = new QCheckBox(tr("&Recursive")); wRecursive->setChecked(true); @@ -271,8 +281,7 @@ void FileFinder::GUI::Module::createWidgets() wResults = new QListWidget; wResults->setContextMenuPolicy(Qt::ActionsContextMenu); - wResults->addAction(mOpenFileAction); - wResults->addAction(mOpenDirectoryAction); + wResults->addActions(QList() << mOpenFileAction << mOpenDirectoryAction << mCopyNameAction << mCopyAllNamesAction); connect(wResults, SIGNAL(currentRowChanged(int)), this, SLOT(currentRowChanged(int))); connect(wResults, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(openFile(QModelIndex))); vbox->addWidget(wResults); @@ -286,7 +295,7 @@ void FileFinder::GUI::Module::createWidgets() connect(wFind, SIGNAL(clicked()), this, SLOT(find())); hbox->addWidget(wFind); - btn = new QPushButton(tr("&Close")); + QPushButton * btn = new QPushButton(tr("&Close")); connect(btn, SIGNAL(clicked()), qApp, SLOT(quit())); hbox->addWidget(btn); } @@ -305,6 +314,14 @@ void FileFinder::GUI::Module::createActions() mOpenDirectoryAction = new QAction(tr("Open &location"), wMain); mOpenDirectoryAction->setEnabled(false); connect(mOpenDirectoryAction, SIGNAL(triggered()), this, SLOT(openDirectory())); + + mCopyNameAction = new QAction(tr("&Copy name"), wMain); + mCopyNameAction->setEnabled(false); + connect(mCopyNameAction, SIGNAL(triggered()), this, SLOT(copyName())); + + mCopyAllNamesAction = new QAction(tr("Copy &all names"), wMain); + connect(mCopyAllNamesAction, SIGNAL(triggered()), this, SLOT(copyAllNames())); + } void FileFinder::GUI::Module::browseDirectory() @@ -323,7 +340,27 @@ void FileFinder::GUI::Module::find() } else { wResults->clear(); - + + if (wDirectory->findText(wDirectory->currentText()) == -1) + wDirectory->insertItem(0, wDirectory->currentText()); + if (wIncludeNames->findText(wIncludeNames->currentText()) == -1) + wIncludeNames->insertItem(0, wIncludeNames->currentText()); + if (wExcludeNames->findText(wExcludeNames->currentText()) == -1) + wExcludeNames->insertItem(0, wExcludeNames->currentText()); + if (wIncludeContent->findText(wIncludeContent->currentText()) == -1) + wIncludeContent->insertItem(0, wIncludeContent->currentText()); + if (wExcludeContent->findText(wExcludeContent->currentText()) == -1) + wExcludeContent->insertItem(0, wExcludeContent->currentText()); + + // Disable input fields + wDirectory->setEnabled(false); + wBrowse->setEnabled(false); + wRecursive->setEnabled(false); + wIncludeNames->setEnabled(false); + wExcludeNames->setEnabled(false); + wIncludeContent->setEnabled(false); + wExcludeContent->setEnabled(false); + mFinder->search(wDirectory->currentText(), wRecursive->isChecked(), FileFinder::Filter( @@ -351,6 +388,15 @@ void FileFinder::GUI::Module::finished(bool canceled) { Q_UNUSED(canceled) + // Enable input fields + wDirectory->setEnabled(true); + wBrowse->setEnabled(true); + wRecursive->setEnabled(true); + wIncludeNames->setEnabled(true); + wExcludeNames->setEnabled(true); + wIncludeContent->setEnabled(true); + wExcludeContent->setEnabled(true); + wFind->setText(tr("&Search")); } @@ -358,19 +404,52 @@ void FileFinder::GUI::Module::currentRowChanged(int currentRow) { mOpenFileAction->setEnabled(currentRow >= 0); mOpenDirectoryAction->setEnabled(currentRow >= 0); + mCopyNameAction->setEnabled(currentRow >= 0); } void FileFinder::GUI::Module::openFile(QModelIndex const & index) { Q_UNUSED(index) - if (wResults->currentItem()) - QDesktopServices::openUrl(QUrl(QString("file:///%1").arg(wResults->currentItem()->text()))); + if (wResults->currentItem()) { + QString t = wResults->currentItem()->text(); + t.replace("?", "\0453f"); + QDesktopServices::openUrl(QUrl::fromEncoded(QString("file:///%1").arg(t).toUtf8())); + } } void FileFinder::GUI::Module::openDirectory() { if (wResults->currentItem()) { - QFileInfo fi(wResults->currentItem()->text()); - QDesktopServices::openUrl(QUrl(QString("file:///%1").arg(fi.path()))); + QString t = wResults->currentItem()->text(); + t.replace("?", "\0453f"); + QFileInfo fi(t); + QDesktopServices::openUrl(QUrl::fromEncoded(QString("file:///%1").arg(fi.path()).toUtf8())); + } +} + +void FileFinder::GUI::Module::copyName() +{ + if (wResults->currentItem()) { + QClipboard * cb = QApplication::clipboard(); + if (cb) + cb->setText(wResults->currentItem()->text()); + } +} + +void FileFinder::GUI::Module::copyAllNames() +{ +#ifdef Q_OS_WIN32 + static char const * const EOLN = "\r\n"; +#else + static char const * const EOLN = "\n"; +#endif + + QString t; + for (int i = 0; i < wResults->count(); ++i) + t.append(wResults->item(i)->text() + EOLN); + if (!t.isEmpty()) { + QClipboard * cb = QApplication::clipboard(); + if (cb) + cb->setText(t); } }