FileBrowserDialog::FileBrowserDialog(const ServerRepo& repo, QWidget *parent) : QDialog(parent), repo_(repo) { current_path_ = "/"; // since root is special, the next step is unnecessary // current_lpath_.push_back(""); const Account& account = seafApplet->accountManager()->currentAccount(); data_mgr_ = new DataManager(account); setWindowTitle(tr("File Browser")); setWindowIcon(QIcon(":/images/seafile.png")); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); createToolBar(); createStatusBar(); createLoadingFailedView(); createFileTable(); QVBoxLayout *vlayout = new QVBoxLayout; vlayout->setContentsMargins(0, 6, 0, 0); vlayout->setSpacing(0); setLayout(vlayout); stack_ = new QStackedWidget; stack_->insertWidget(INDEX_LOADING_VIEW, loading_view_); stack_->insertWidget(INDEX_TABLE_VIEW, table_view_); stack_->insertWidget(INDEX_LOADING_FAILED_VIEW, loading_failed_view_); vlayout->addWidget(toolbar_); vlayout->addWidget(stack_); vlayout->addWidget(status_bar_); connect(table_view_, SIGNAL(direntClicked(const SeafDirent&)), this, SLOT(onDirentClicked(const SeafDirent&))); connect(data_mgr_, SIGNAL(getDirentsSuccess(const QList<SeafDirent>&)), this, SLOT(onGetDirentsSuccess(const QList<SeafDirent>&))); connect(data_mgr_, SIGNAL(getDirentsFailed(const ApiError&)), this, SLOT(onGetDirentsFailed(const ApiError&))); QTimer::singleShot(0, this, SLOT(fetchDirents())); }
QString SearchWorker::searchRecursively(QString directory, QString searchTerm) { // skip some system folders - they don't really have any interesting stuff if (directory.startsWith("/proc") || directory.startsWith("/sys/block")) return QString(); QDir dir(directory); if (!dir.exists()) // skip "non-existent" directories (found in /dev) return QString(); // update progress m_currentDirectory = directory; emit progressChanged(m_currentDirectory); //profile settings; bool enableRegEx = m_profile.getBoolOption(Profile::EnableRegEx); bool hiddenSetting = m_profile.getBoolOption(Profile::SearchHiddenFiles); bool enableSymlinks = m_profile.getBoolOption(Profile::EnableSymlinks); bool singleMatchSetting = m_profile.getBoolOption(Profile::SingleMatchSetting); bool enableNotes = m_profile.getBoolOption(Profile::EnableNotes); bool enableFileDir = m_profile.getBoolOption(Profile::EnableFileDir); QHash<SearchWorker::WorkSet, bool> enabler; enabler[SearchWorker::EnableMimeType] = m_profile.getBoolOption(Profile::EnableMimeType); enabler[SearchWorker::EnableTxt] = m_profile.getBoolOption(Profile::EnableTxt); enabler[SearchWorker::EnableHtml] = m_profile.getBoolOption(Profile::EnableHtml); enabler[SearchWorker::EnableSrc] = m_profile.getBoolOption(Profile::EnableSrc); enabler[SearchWorker::EnableApps] = m_profile.getBoolOption(Profile::EnableApps); enabler[SearchWorker::EnableSqlite] = m_profile.getBoolOption(Profile::EnableSqlite); //prepare for regEx const QRegularExpression searchExpr(searchTerm, QRegularExpression::UseUnicodePropertiesOption); if(!searchExpr.isValid()) enableRegEx=false; QDir::Filter hidden = hiddenSetting ? QDir::Hidden : (QDir::Filter)0; // search dirs QString searchtype = "DIR"; QString matchline = ""; QStringList names = dir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::System | hidden); for (int i = 0 ; i < names.count() ; ++i) { // stop if cancelled if (m_cancelled.loadAcquire() == Cancelled) return QString(); QString filename = names.at(i); QString fullpath = dir.absoluteFilePath(filename); if (enableFileDir) if ( enableRegEx ? filename.contains(searchExpr) : filename.contains(searchTerm, Qt::CaseInsensitive) ) emit matchFound(fullpath, searchtype, "", matchline, 0); if (enableSymlinks) { //skip deep subdirs when symlinks enabled if (fullpath.count("/") > MAXDIRDEPTH) continue; } else { QFileInfo info(fullpath); // skip symlinks to prevent infinite loops if (info.isSymLink()) continue; } if ( !m_profile.isInBlackList(fullpath) ) { QString errmsg = searchRecursively(fullpath, searchTerm); if (!errmsg.isEmpty()) return errmsg; } } // search files if (enableFileDir) { searchtype = "FILE"; matchline = ""; names = dir.entryList(QDir::Files | hidden); for (int i = 0 ; i < names.count() ; ++i) { // stop if cancelled if (m_cancelled.loadAcquire() == Cancelled) return QString(); QString filename = names.at(i); QString fullpath = dir.absoluteFilePath(filename); if ( enableRegEx ? filename.contains(searchExpr) : filename.contains(searchTerm, Qt::CaseInsensitive) ) emit matchFound(fullpath, searchtype, "", matchline, 0); } } // create table of file lists qualified for search QHash<SearchWorker::WorkSet, QStringList> filesTab = createFileTable(dir,hidden,enabler); // search inside filtered files (*.txt) if (enabler[SearchWorker::EnableTxt]) if ( addSearchTXT("TXT", searchTerm, dir, filesTab, singleMatchSetting) == QString() ) return QString(); // search inside filtered files (*.html) if (enabler[SearchWorker::EnableHtml]) if ( addSearchTXT("HTML", searchTerm, dir, filesTab, singleMatchSetting) == QString() ) return QString(); // search inside filtered files (*.cpp, *.c, *.h, *.py, *.sh, *.qml, *.js) if (enabler[SearchWorker::EnableSrc]) if ( addSearchTXT("SRC", searchTerm, dir, filesTab, singleMatchSetting) == QString() ) return QString(); // search inside filtered files (*.desktop) if (enabler[SearchWorker::EnableApps]) if ( addSearchTXT("APPS", searchTerm, dir, filesTab, singleMatchSetting) == QString() ) return QString(); // search inside raw sqlite files (*.sqlite, *.sqlite3, *db) if (enabler[SearchWorker::EnableSqlite]) if ( addSearchSqlite("SQLITE", searchTerm, dir, filesTab, singleMatchSetting) == QString() ) return QString(); // search inside Notes sqlite db if ( !m_alreadySearchedNotes ) { if (enableNotes) if ( addSearchNotes("NOTES", searchTerm, singleMatchSetting) == QString() ) return QString(); m_alreadySearchedNotes = true; } return QString(); }
FileBrowserDialog::FileBrowserDialog(const ServerRepo& repo, QWidget *parent) : QDialog(parent), repo_(repo) { current_path_ = "/"; // since root is special, the next step is unnecessary // current_lpath_.push_back(""); const Account& account = seafApplet->accountManager()->currentAccount(); data_mgr_ = new DataManager(account); setWindowTitle(tr("Cloud File Browser")); setWindowIcon(QIcon(":/images/seafile.png")); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint & ~Qt::Dialog | Qt::WindowMinimizeButtonHint | Qt::Window); createToolBar(); createStatusBar(); createLoadingFailedView(); createFileTable(); QVBoxLayout *vlayout = new QVBoxLayout; vlayout->setContentsMargins(0, 6, 0, 0); vlayout->setSpacing(0); setLayout(vlayout); stack_ = new QStackedWidget; stack_->insertWidget(INDEX_LOADING_VIEW, loading_view_); stack_->insertWidget(INDEX_TABLE_VIEW, table_view_); stack_->insertWidget(INDEX_LOADING_FAILED_VIEW, loading_failed_view_); vlayout->addWidget(toolbar_); vlayout->addWidget(stack_); vlayout->addWidget(status_bar_); // this <--> table_view_ connect(table_view_, SIGNAL(direntClicked(const SeafDirent&)), this, SLOT(onDirentClicked(const SeafDirent&))); connect(table_view_, SIGNAL(direntRename(const SeafDirent&)), this, SLOT(onGetDirentRename(const SeafDirent&))); connect(table_view_, SIGNAL(direntRemove(const SeafDirent&)), this, SLOT(onGetDirentRemove(const SeafDirent&))); connect(table_view_, SIGNAL(direntShare(const SeafDirent&)), this, SLOT(onGetDirentShare(const SeafDirent&))); connect(table_view_, SIGNAL(direntUpdate(const SeafDirent&)), this, SLOT(onGetDirentUpdate(const SeafDirent&))); connect(table_view_, SIGNAL(cancelDownload(const SeafDirent&)), this, SLOT(onCancelDownload(const SeafDirent&))); //dirents <--> data_mgr_ connect(data_mgr_, SIGNAL(getDirentsSuccess(const QList<SeafDirent>&)), this, SLOT(onGetDirentsSuccess(const QList<SeafDirent>&))); connect(data_mgr_, SIGNAL(getDirentsFailed(const ApiError&)), this, SLOT(onGetDirentsFailed(const ApiError&))); //create <--> data_mgr_ connect(data_mgr_, SIGNAL(createDirectorySuccess(const QString&)), this, SLOT(onDirectoryCreateSuccess(const QString&))); connect(data_mgr_, SIGNAL(createDirectoryFailed(const ApiError&)), this, SLOT(onDirectoryCreateFailed(const ApiError&))); //rename <--> data_mgr_ connect(data_mgr_, SIGNAL(renameDirentSuccess(const QString&, const QString&)), this, SLOT(onDirentRenameSuccess(const QString&, const QString&))); connect(data_mgr_, SIGNAL(renameDirentFailed(const ApiError&)), this, SLOT(onDirentRenameFailed(const ApiError&))); //remove <--> data_mgr_ connect(data_mgr_, SIGNAL(removeDirentSuccess(const QString&)), this, SLOT(onDirentRemoveSuccess(const QString&))); connect(data_mgr_, SIGNAL(removeDirentFailed(const ApiError&)), this, SLOT(onDirentRemoveFailed(const ApiError&))); //share <--> data_mgr_ connect(data_mgr_, SIGNAL(shareDirentSuccess(const QString&)), this, SLOT(onDirentShareSuccess(const QString&))); connect(data_mgr_, SIGNAL(shareDirentFailed(const ApiError&)), this, SLOT(onDirentShareFailed(const ApiError&))); connect(AutoUpdateManager::instance(), SIGNAL(fileUpdated(const QString&, const QString&)), this, SLOT(onFileAutoUpdated(const QString&, const QString&))); QTimer::singleShot(0, this, SLOT(fetchDirents())); }
FileBrowserDialog::FileBrowserDialog(const Account &account, const ServerRepo& repo, const QString &path, QWidget *parent) : QDialog(parent), account_(account), repo_(repo), current_path_(path) { current_lpath_ = current_path_.split('/'); data_mgr_ = new DataManager(account_); setWindowTitle(tr("Cloud File Browser")); setWindowIcon(QIcon(":/images/seafile.png")); setWindowFlags((windowFlags() & ~Qt::WindowContextHelpButtonHint & ~Qt::Dialog) #if !defined(Q_OS_MAC) | Qt::FramelessWindowHint #endif #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) | Qt::WindowMinimizeButtonHint #endif | Qt::Window); resizer_ = new QSizeGrip(this); resizer_->resize(resizer_->sizeHint()); setAttribute(Qt::WA_TranslucentBackground, true); createTitleBar(); createToolBar(); createStatusBar(); createLoadingFailedView(); createFileTable(); QWidget* widget = new QWidget; widget->setObjectName("mainWidget"); QVBoxLayout* layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); setLayout(layout); layout->addWidget(widget); QVBoxLayout *vlayout = new QVBoxLayout; vlayout->setContentsMargins(1, 0, 1, 0); vlayout->setSpacing(0); widget->setLayout(vlayout); stack_ = new QStackedWidget; stack_->insertWidget(INDEX_LOADING_VIEW, loading_view_); stack_->insertWidget(INDEX_TABLE_VIEW, table_view_); stack_->insertWidget(INDEX_LOADING_FAILED_VIEW, loading_failed_view_); stack_->setContentsMargins(0, 0, 0, 0); vlayout->addWidget(header_); vlayout->addWidget(toolbar_); vlayout->addWidget(stack_); vlayout->addWidget(status_bar_); #ifdef Q_OS_MAC header_->setVisible(false); #endif // this <--> table_view_ connect(table_view_, SIGNAL(direntClicked(const SeafDirent&)), this, SLOT(onDirentClicked(const SeafDirent&))); connect(table_view_, SIGNAL(direntSaveAs(const SeafDirent&)), this, SLOT(onDirentSaveAs(const SeafDirent&))); connect(table_view_, SIGNAL(direntRename(const SeafDirent&)), this, SLOT(onGetDirentRename(const SeafDirent&))); connect(table_view_, SIGNAL(direntRemove(const SeafDirent&)), this, SLOT(onGetDirentRemove(const SeafDirent&))); connect(table_view_, SIGNAL(direntRemove(const QList<const SeafDirent*> &)), this, SLOT(onGetDirentRemove(const QList<const SeafDirent*> &))); connect(table_view_, SIGNAL(direntShare(const SeafDirent&)), this, SLOT(onGetDirentShare(const SeafDirent&))); connect(table_view_, SIGNAL(direntUpdate(const SeafDirent&)), this, SLOT(onGetDirentUpdate(const SeafDirent&))); connect(table_view_, SIGNAL(direntPaste()), this, SLOT(onGetDirentsPaste())); connect(table_view_, SIGNAL(cancelDownload(const SeafDirent&)), this, SLOT(onCancelDownload(const SeafDirent&))); connect(table_view_, SIGNAL(syncSubdirectory(const QString&)), this, SLOT(onGetSyncSubdirectory(const QString &))); //dirents <--> data_mgr_ connect(data_mgr_, SIGNAL(getDirentsSuccess(const QList<SeafDirent>&)), this, SLOT(onGetDirentsSuccess(const QList<SeafDirent>&))); connect(data_mgr_, SIGNAL(getDirentsFailed(const ApiError&)), this, SLOT(onGetDirentsFailed(const ApiError&))); //create <--> data_mgr_ connect(data_mgr_, SIGNAL(createDirectorySuccess(const QString&)), this, SLOT(onDirectoryCreateSuccess(const QString&))); connect(data_mgr_, SIGNAL(createDirectoryFailed(const ApiError&)), this, SLOT(onDirectoryCreateFailed(const ApiError&))); //rename <--> data_mgr_ connect(data_mgr_, SIGNAL(renameDirentSuccess(const QString&, const QString&)), this, SLOT(onDirentRenameSuccess(const QString&, const QString&))); connect(data_mgr_, SIGNAL(renameDirentFailed(const ApiError&)), this, SLOT(onDirentRenameFailed(const ApiError&))); //remove <--> data_mgr_ connect(data_mgr_, SIGNAL(removeDirentSuccess(const QString&)), this, SLOT(onDirentRemoveSuccess(const QString&))); connect(data_mgr_, SIGNAL(removeDirentFailed(const ApiError&)), this, SLOT(onDirentRemoveFailed(const ApiError&))); //share <--> data_mgr_ connect(data_mgr_, SIGNAL(shareDirentSuccess(const QString&)), this, SLOT(onDirentShareSuccess(const QString&))); connect(data_mgr_, SIGNAL(shareDirentFailed(const ApiError&)), this, SLOT(onDirentShareFailed(const ApiError&))); //copy <--> data_mgr_ connect(data_mgr_, SIGNAL(copyDirentsSuccess()), this, SLOT(onDirentsCopySuccess())); connect(data_mgr_, SIGNAL(copyDirentsFailed(const ApiError&)), this, SLOT(onDirentsCopyFailed(const ApiError&))); //move <--> data_mgr_ connect(data_mgr_, SIGNAL(moveDirentsSuccess()), this, SLOT(onDirentsMoveSuccess())); connect(data_mgr_, SIGNAL(moveDirentsFailed(const ApiError&)), this, SLOT(onDirentsMoveFailed(const ApiError&))); //subrepo <-->data_mgr_ connect(data_mgr_, SIGNAL(createSubrepoSuccess(const ServerRepo &)), this, SLOT(onCreateSubrepoSuccess(const ServerRepo &))); connect(data_mgr_, SIGNAL(createSubrepoFailed(const ApiError&)), this, SLOT(onCreateSubrepoFailed(const ApiError&))); connect(AutoUpdateManager::instance(), SIGNAL(fileUpdated(const QString&, const QString&)), this, SLOT(onFileAutoUpdated(const QString&, const QString&))); QTimer::singleShot(0, this, SLOT(fetchDirents())); }