/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fileview.h" #include "hoverwindow.h" #include "smglobals.h" #include "helper.h" FileView::FileView(QWidget *parent) : QTreeView(parent), mDeleteA(0) { setAttribute(Qt::WA_Hover); setRootIsDecorated(false); mHoverWin = new HoverWindow(this); QSize curSize = SmGlobals::instance()->cursorSize(); mHoverWin->setHoverOffset(QPoint(curSize.width() + 30, 0)); readConfig(); } void FileView::markFiles(){ bool ok; QString title = QString(tr("%1 - %2")).arg(qApp->applicationName()).arg(tr("Mark files")); QString glob = QInputDialog::getText(this, title, tr("Enter filename pattern"), QLineEdit::Normal, QString(), &ok); if(!ok){ return; } int rowCount = model()->rowCount(rootIndex()); if(!rowCount || glob.isEmpty()){ return; } QRegExp re(glob); for(int i = 0; i < rowCount; ++i){ QModelIndex cur = rootIndex().child(i, 0); if(cur.data(QFileSystemModel::FileNameRole).toString() == ".."){ continue; } if(re.indexIn(cur.data(QFileSystemModel::FileNameRole).toString()) != -1){ selectionModel()->select(cur, QItemSelectionModel::Select | QItemSelectionModel::Rows); } } } void FileView::unmarkFiles(){ selectionModel()->clearSelection(); } void FileView::createFolder(){ bool ok; QString title = QString(tr("%1 - %2")).arg(qApp->applicationName()).arg(tr("Mark files")); QString folderName = QInputDialog::getText(this, title, tr("Enter new folder name"), QLineEdit::Normal, QString(), &ok); if(!ok){ return; } if(!ok || folderName.isEmpty()){ return; } QSortFilterProxyModel *proxy = qobject_cast(model()); QFileSystemModel *fsModel = qobject_cast(proxy->sourceModel()); QModelIndex root = proxy->mapToSource(rootIndex()); fsModel->mkdir(root, folderName); } void FileView::readConfig(){ QSettings s; mHoverDirs = s.value("ui/hoverdirs", true).toBool(); mHoverPics = s.value("ui/hoverpics", true).toBool(); mHoverMovies = s.value("ui/hovermovies", true).toBool(); mWhen = s.value("ui/grabframe", "00:00:00").toString(); mHoverWin->setWindowOpacity(s.value("ui/hoveropacity", 10).toFloat() / 10.0); mCursorOffset = s.value("ui/cursoroffset").toInt(); } void FileView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint){ QTreeView::closeEditor(editor, hint); QSortFilterProxyModel *proxy = qobject_cast(model()); QModelIndex sourceIdx = proxy->mapToSource(currentIndex()); emit editorClosed(sourceIdx); } void FileView::contextMenuEvent(QContextMenuEvent *e){ mHoverWin->hide(); QMenu contextMenu(this); foreach(QAction *a, actions()){ contextMenu.addAction(a); } contextMenu.exec(e->globalPos()); } void FileView::keyPressEvent(QKeyEvent *e){ if(!hasFocus()){ QTreeView::keyPressEvent(e); return; } switch(e->key()){ case Qt::Key_Backspace: emit upDir(); e->accept(); break; case Qt::Key_Enter: case Qt::Key_Return: emit enterPressed(currentIndex()); e->accept(); break; case Qt::Key_Delete: emit delFiles(); e->accept(); break; default: QTreeView::keyPressEvent(e); } } void FileView::resizeEvent(QResizeEvent *e){ if(e->size().width() != e->oldSize().width()){ int width = e->size().width(); int c1width = width / 2; // * 2; setColumnWidth(0, c1width); } } bool FileView::event(QEvent *e){ QHoverEvent *hEvent = static_cast(e); if(!hEvent){ return exitHover(); } QPoint hotSpot(hEvent->pos().x(), hEvent->pos().y() + mCursorOffset); QModelIndex curIdx = indexAt(hotSpot); HoverFileType ft = None; QFileInfo curIdxInfo(curIdx.data(QFileSystemModel::FilePathRole).toString()); if((e->type() == QEvent::HoverEnter) || (e->type() == QEvent::HoverMove)){ if(!curIdx.isValid() || (!curIdx.column() == 0)){ return exitHover(); } if(curIdx.data().toString() == ".."){ return exitHover(); } if(curIdxInfo.isFile()){ QString mimeType = Helper::mimeType(curIdxInfo.absoluteFilePath()); if(mimeType.startsWith("image")){ if(!mHoverPics){ return exitHover(); } ft = Image; }else if(mimeType.startsWith("video")){ if(!mHoverMovies){ return exitHover(); } ft = Movie; }else{ return exitHover(); } }else if(curIdxInfo.isDir()){ if(!mHoverDirs){ return exitHover(); } ft = Dir; }else{ return exitHover(); } } if(e->type() == QEvent::HoverEnter){ mCurHover = curIdx; doHover(curIdxInfo, ft); return true; }else if(e->type() == QEvent::HoverMove){ if(mCurHover != curIdx){ mCurHover = curIdx; doHover(curIdxInfo, ft); }else{ mHoverWin->setPos(); } return true; }else if(e->type() == QEvent::HoverLeave){ return exitHover(); } return QTreeView::event(e); } void FileView::selectedFilesChanged(){ QModelIndexList selected = selectionModel()->selectedRows(); emit numSelected(selected.size()); qint64 selSize = 0; foreach(QModelIndex i, selected){ QString path = i.data(QFileSystemModel::FilePathRole).toString(); QFileInfo fi(path); selSize += fi.size(); } emit selectedSize(selSize); } bool FileView::exitHover(bool exitVal){ mHoverWin->setVisible(false); mCurHover = QModelIndex(); return exitVal; } void FileView::doHover(const QFileInfo &fi, int type){ QPixmap pm; if(type == Movie){ pm = SmGlobals::instance()->frameCache()->entry(fi.absoluteFilePath(), mWhen); if(pm.isNull()){ exitHover(); return; } mHoverWin->setPixmap(pm, false); mHoverWin->setCaption(fi.fileName()); }else if(type == Image){ pm.load(fi.absoluteFilePath()); mHoverWin->setPixmap(pm); mHoverWin->setCaption(fi.fileName()); }else if(type == Dir){ QList hoverList; hoverList << fi.fileName(); QDir curDir(fi.absoluteFilePath()); hoverList << curDir.entryList(QDir::AllEntries | QDir::NoDotAndDotDot, QDir::Name); mHoverWin->setData(hoverList); } mHoverWin->setPos(); mHoverWin->setVisible(true); }