📄 q3filedialog.cpp
字号:
if (fi.isDir() && itemRect(item).contains(pnt)) return true; return false;}void QFileListBox::setCurrentDropItem(const QPoint &pnt){ changeDirTimer->stop(); Q3ListBoxItem *item = 0; if (pnt != QPoint(-1, -1)) item = itemAt(pnt); if (item && !QUrlInfo(filedialog->d->url.info(item->text().isEmpty() ? QString::fromLatin1(".") : item->text())).isDir()) item = 0; if (item && !itemRect(item).contains(pnt)) item = 0; currDropItem = item; if (currDropItem) setCurrentItem(currDropItem); changeDirTimer->start(750);}#endif // QT_NO_DRAGANDDROPvoid QFileListBox::changeDirDuringDrag(){#ifndef QT_NO_DRAGANDDROP if (!currDropItem) return; changeDirTimer->stop(); Q3Url u(filedialog->d->url, Q3FileDialogPrivate::encodeFileName(currDropItem->text())); filedialog->setDir(u); currDropItem = 0;#endif}void QFileListBox::doubleClickTimeout(){ startRename(); renameTimer->stop();}void QFileListBox::startRename(bool check){ if (check && (!renameItem || renameItem != item(currentItem()))) return; int i = currentItem(); setSelected(i, true); QRect r = itemRect(item(i)); int bdr = item(i)->pixmap() ? item(i)->pixmap()->width() : 16; int x = r.x() + bdr; int y = r.y(); int w = item(i)->width(this) - bdr; int h = qMax(lined->height() + 2, r.height()); y = y + r.height() / 2 - h / 2; lined->parentWidget()->setGeometry(x, y, w + 6, h); lined->setFocus(); lined->setText(item(i)->text()); lined->selectAll(); lined->setFrame(false); lined->parentWidget()->show(); viewport()->setFocusProxy(lined); renaming = true;}void QFileListBox::clear(){ cancelRename(); Q3ListBox::clear();}void QFileListBox::rename(){ if (!lined->text().isEmpty()) { QString file = currentText(); if (lined->text() != file) filedialog->d->url.rename(file, lined->text()); } cancelRename();}void QFileListBox::cancelRename(){ renameItem = 0; lined->parentWidget()->hide(); viewport()->setFocusProxy(this); renaming = false; updateItem(currentItem()); if (lined->hasFocus()) viewport()->setFocus();}void QFileListBox::contentsMoved(int, int){ changeDirTimer->stop();#ifndef QT_NO_DRAGANDDROP setCurrentDropItem(QPoint(-1, -1));#endif}/************************************************************************ * * Internal class QFileListView * ************************************************************************/Q3FileDialogQFileListView::Q3FileDialogQFileListView(QWidget *parent, Q3FileDialog *dlg) : Q3ListView(parent, "qt_filedlg_listview"), renaming(false), renameItem(0), filedialog(dlg), mousePressed(false), firstMousePressEvent(true){ changeDirTimer = new QTimer(this); Q3VBox *box = new Q3VBox(viewport(), "qt_vbox"); box->setFrameStyle(QFrame::Box | QFrame::Plain); lined = new QRenameEdit(box); lined->setFixedHeight(lined->sizeHint().height()); box->hide(); box->setBackgroundRole(QPalette::Base); renameTimer = new QTimer(this); connect(lined, SIGNAL(doRename()), this, SLOT (rename())); connect(lined, SIGNAL(cancelRename()), this, SLOT(cancelRename())); header()->setMovingEnabled(false); connect(renameTimer, SIGNAL(timeout()), this, SLOT(doubleClickTimeout())); connect(changeDirTimer, SIGNAL(timeout()), this, SLOT(changeDirDuringDrag())); disconnect(header(), SIGNAL(sectionClicked(int)), this, SLOT(changeSortColumn(int))); connect(header(), SIGNAL(sectionClicked(int)), this, SLOT(changeSortColumn2(int))); connect(this, SIGNAL(contentsMoving(int,int)), this, SLOT(contentsMoved(int,int))); viewport()->setAcceptDrops(true); sortcolumn = 0; ascending = true; dragItem = 0;}void Q3FileDialogQFileListView::setSorting(int column, bool increasing){ if (column == -1) { Q3ListView::setSorting(column, increasing); return; } sortAscending = ascending = increasing; sortcolumn = column; switch (column) { case 0: sortFilesBy = QDir::Name; break; case 1: sortFilesBy = QDir::Size; break; case 3: sortFilesBy = QDir::Time; break; default: sortFilesBy = QDir::Name; // #### ??? break; } filedialog->resortDir();}void Q3FileDialogQFileListView::changeSortColumn2(int column){ int lcol = header()->mapToLogical(column); setSorting(lcol, sortcolumn == lcol ? !ascending : true);}void Q3FileDialogQFileListView::keyPressEvent(QKeyEvent *e){ if ((e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) && renaming) return; QString keyPressed = e->text().toLower(); QChar keyChar = keyPressed[0]; if (keyChar.isLetterOrNumber()) { Q3ListViewItem * i = 0; if (currentItem()) i = currentItem(); else i = firstChild(); if (i->nextSibling()) i = i->nextSibling(); else i = firstChild(); while (i != currentItem()) { QString it = i->text(0); if (it[0].toLower() == keyChar) { clearSelection(); ensureItemVisible(i); setCurrentItem(i); } else { if (i->nextSibling()) i = i->nextSibling(); else i = firstChild(); } } return; } cancelRename(); Q3ListView::keyPressEvent(e);}void Q3FileDialogQFileListView::viewportMousePressEvent(QMouseEvent *e){ pressPos = e->pos(); mousePressed = false; bool didRename = renaming; cancelRename(); if (!hasFocus() && !viewport()->hasFocus()) setFocus(); if (e->button() != Qt::LeftButton) { Q3ListView::viewportMousePressEvent(e); firstMousePressEvent = false; return; } Q3ListViewItem *i = currentItem(); Q3ListView::viewportMousePressEvent(e); Q3FileDialogPrivate::File *i1 = (Q3FileDialogPrivate::File*)currentItem(); if (i1) mousePressed = !i1->info.isDir() || (filedialog->mode() == Q3FileDialog::Directory) || (filedialog->mode() == Q3FileDialog::DirectoryOnly); if (itemAt(e->pos()) != i || e->x() + contentsX() > columnWidth(0)) { firstMousePressEvent = false; return; } if (!firstMousePressEvent && !didRename && i == currentItem() && currentItem() && QUrlInfo(filedialog->d->url.info(QString(QLatin1Char('.')))).isWritable() && currentItem()->text(0) != QLatin1String("..")) { renameTimer->start(QApplication::doubleClickInterval(), true); renameItem = currentItem(); } firstMousePressEvent = false;}void Q3FileDialogQFileListView::viewportMouseDoubleClickEvent(QMouseEvent *e){ renameTimer->stop(); Q3ListView::viewportMouseDoubleClickEvent(e);}void Q3FileDialogQFileListView::viewportMouseReleaseEvent(QMouseEvent *e){ Q3ListView::viewportMouseReleaseEvent(e); mousePressed = false; dragItem = 0;}void Q3FileDialogQFileListView::viewportMouseMoveEvent(QMouseEvent *e){ renameTimer->stop(); if (!dragItem) dragItem = itemAt(e->pos());#ifndef QT_NO_DRAGANDDROP if ( (pressPos - e->pos()).manhattanLength() > QApplication::startDragDistance() && mousePressed) { Q3ListViewItem *item = dragItem; dragItem = 0; if (item) { Q3UriDrag* drag = new Q3UriDrag(viewport()); QStringList files; if (filedialog->mode() == Q3FileDialog::ExistingFiles) files = filedialog->selectedFiles(); else files = QStringList(filedialog->selectedFile()); drag->setFileNames(files); if (lined->isVisible()) cancelRename(); connect(drag, SIGNAL(destroyed()), this, SLOT(dragObjDestroyed())); drag->drag(); mousePressed = false; } }#endif}void Q3FileDialogQFileListView::dragObjDestroyed(){#ifndef QT_NO_DRAGANDDROP //###### //filedialog->rereadDir();#endif}#ifndef QT_NO_DRAGANDDROPvoid Q3FileDialogQFileListView::viewportDragEnterEvent(QDragEnterEvent *e){ startDragUrl = filedialog->d->url; startDragDir = filedialog->dirPath(); currDropItem = 0; if (!Q3UriDrag::canDecode(e)) { e->ignore(); return; } QStringList l; Q3UriDrag::decodeLocalFiles(e, l); urls = (int)l.count(); if (acceptDrop(e->pos(), e->source())) { e->accept(); setCurrentDropItem(e->pos()); } else { e->ignore(); setCurrentDropItem(QPoint(-1, -1)); } oldDragPos = e->pos();}void Q3FileDialogQFileListView::viewportDragMoveEvent(QDragMoveEvent *e){ if (acceptDrop(e->pos(), e->source())) { if (oldDragPos != e->pos()) setCurrentDropItem(e->pos()); switch (e->action()) { case QDropEvent::Copy: e->acceptAction(); break; case QDropEvent::Move: e->acceptAction(); break; case QDropEvent::Link: break; default: break; } } else { changeDirTimer->stop(); e->ignore(); setCurrentDropItem(QPoint(-1, -1)); } oldDragPos = e->pos();}void Q3FileDialogQFileListView::viewportDragLeaveEvent(QDragLeaveEvent *){ changeDirTimer->stop(); setCurrentDropItem(QPoint(-1, -1));//########// if (startDragDir != filedialog->d->url)// filedialog->setUrl(startDragUrl);}void Q3FileDialogQFileListView::viewportDropEvent(QDropEvent *e){ changeDirTimer->stop(); if (!Q3UriDrag::canDecode(e)) { e->ignore(); return; } QStringList l; Q3UriDrag::decodeToUnicodeUris(e, l); bool move = e->action() == QDropEvent::Move;// bool supportAction = move || e->action() == QDropEvent::Copy; Q3UrlOperator dest; if (currDropItem) dest = Q3UrlOperator(filedialog->d->url, Q3FileDialogPrivate::encodeFileName(currDropItem->text(0))); else dest = filedialog->d->url; filedialog->d->url.copy(l, dest, move); // ##### what is supportAction for? e->acceptAction(); currDropItem = 0;}bool Q3FileDialogQFileListView::acceptDrop(const QPoint &pnt, QWidget *source){ Q3ListViewItem *item = itemAt(pnt); if (!item || item && !itemRect(item).contains(pnt)) { if (source == viewport() && startDragDir == filedialog->dirPath()) return false; return true; } QUrlInfo fi(filedialog->d->url.info(item->text(0).isEmpty() ? QString::fromLatin1(".") : item->text(0))); if (fi.isDir() && itemRect(item).contains(pnt)) return true; return false;}void Q3FileDialogQFileListView::setCurrentDropItem(const QPoint &pnt){ changeDirTimer->stop(); Q3ListViewItem *item = itemAt(pnt); if (pnt == QPoint(-1, -1)) item = 0; if (item && !QUrlInfo(filedialog->d->url.info(item->text(0).isEmpty() ? QString::fromLatin1(".") : item->text(0))).isDir()) item = 0; if (item && !itemRect(item).contains(pnt)) item = 0; currDropItem = item; if (currDropItem) setCurrentItem(currDropItem); changeDirTimer->start(750);}#endif // QT_NO_DRAGANDDROPvoid Q3FileDialogQFileListView::changeDirDuringDrag(){#ifndef QT_NO_DRAGANDDROP if (!currDropItem) return; changeDirTimer->stop(); Q3Url u(filedialog->d->url, Q3FileDialogPrivate::encodeFileName(currDropItem->text(0))); filedialog->setDir(u); currDropItem = 0;#endif // QT_NO_DRAGANDDROP}void Q3FileDialogQFileListView::doubleClickTimeout(){ startRename(); renameTimer->stop();}void Q3FileDialogQFileListView::startRename(bool check){ if (check && (!renameItem || renameItem != currentItem())) return; Q3ListViewItem *i = currentItem(); setSelected(i, true); QRect r = itemRect(i); int bdr = i->pixmap(0) ? i->pixmap(0)->width() : 16; int x = r.x() + bdr; int y = r.y(); int w = columnWidth(0) - bdr; int h = qMax(lined->height() + 2, r.height()); y = y + r.height() / 2 - h / 2; lined->parentWidget()->setGeometry(x, y, w + 6, h); lined->setFocus(); lined->setText(i->text(0)); lined->selectAll(); lined->setFrame(false); lined->parentWidget()->show();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -