📄 sharewnd.cpp
字号:
/***************************************************************************
* *
* 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. *
* *
* copyright : (C) 2003 by Zhang Yong *
* email : z-yong163@163.com *
***************************************************************************/
#include "sharewnd.h"
#include "updir.xpm"
#include "refresh.xpm"
#include "download.xpm"
#include "folder.xpm"
#include "file.xpm"
#include <qsplitter.h>
#include <qiconview.h>
#include <qlistview.h>
#include <qstatusbar.h>
#include <qlabel.h>
#include <qlineedit.h>
#include <qtoolbutton.h>
#include <qcursor.h>
#include <qfiledialog.h>
#include <qmessagebox.h>
class FileIconViewItem : public QIconViewItem {
public:
FileIconViewItem(QIconView *parent, ENTRY_INFO &info);
virtual int compare(QIconViewItem *i) const;
bool isDir;
uint32 size;
};
class FileListItem : public QListViewItem {
public:
FileListItem(QListView *parent, const QString &remote,
const QString &local, uint32 size);
void setFinished();
void progress(int n);
QString remoteFile;
QString localFile;
uint32 fileSize;
uint32 bytes;
bool isFinished;
};
FileListItem::FileListItem(QListView *parent, const QString &remote,
const QString &local, uint32 size)
: QListViewItem(parent, parent->lastItem())
{
remoteFile = remote;
localFile = local;
fileSize = size;
bytes = 0;
isFinished = FALSE;
int i = remote.findRev('/');
ASSERT(i >= 0);
setText(0, remote.mid(i + 1));
size /= 1024;
if (size == 0)
size = 1;
setText(1, QString("%1K").arg(size));
setText(3, local);
progress(0);
}
void FileListItem::progress(int n)
{
bytes += n;
int percent = (bytes * 100) / fileSize;
setText(2, QString("%1%").arg(percent));
}
void FileListItem::setFinished()
{
isFinished = TRUE;
if (bytes == fileSize)
setText(2, ShareWnd::tr("Finished"));
else
setText(2, ShareWnd::tr("Error"));
}
FileIconViewItem::FileIconViewItem(QIconView *parent, ENTRY_INFO &info)
: QIconViewItem(parent)
{
isDir = info.isDir;
size = info.size;
setText(QString::fromUtf8(info.name.c_str()));
}
int FileIconViewItem::compare(QIconViewItem *i) const
{
FileIconViewItem *item = (FileIconViewItem *) i;
if (isDir != item->isDir)
return (isDir ? -1 : 1);
return QIconViewItem::compare(i);
}
ShareWnd::ShareWnd(TCPSessionBase *tcp, QWidget *parent)
: QMainWindow(parent, 0, WType_TopLevel | WDestructiveClose), ShareClient(tcp)
{
setCaption(tr("%1's share folder").arg(tcp->getContactName()));
QToolBar *toolbar = new QToolBar(this);
new QLabel(tr("Path:"), toolbar);
pathEdit = new QLineEdit(toolbar);
pathEdit->setReadOnly(TRUE);
toolbar->setStretchableWidget(pathEdit);
toolbar->addSeparator();
QPixmap pix((const char **) updir_xpm);
upButton = new QToolButton(QPixmap((const char **) updir_xpm),
tr("Up one level"), QString::null, this, SLOT(slotParentDir()), toolbar);
new QToolButton(QPixmap((const char **) refresh_xpm), tr("Refresh"),
QString::null, this, SLOT(slotRefresh()), toolbar);
new QToolButton(QPixmap((const char **) download_xpm), tr("Download"),
QString::null, this, SLOT(slotDownload()), toolbar);
QSplitter *split = new QSplitter(Qt::Vertical, this);
setCentralWidget(split);
iconView = new QIconView(split);
iconView->setGridX(75);
//iconView->setWordWrapIconText(FALSE);
iconView->setHScrollBarMode(QScrollView::AlwaysOff);
iconView->setAutoArrange(TRUE);
iconView->setSorting(TRUE);
iconView->setResizeMode(QIconView::Adjust);
iconView->setItemsMovable(FALSE);
connect(iconView, SIGNAL(doubleClicked(QIconViewItem *)),
SLOT(slotDoubleClicked(QIconViewItem *)));
connect(iconView, SIGNAL(returnPressed(QIconViewItem *)),
SLOT(slotDoubleClicked(QIconViewItem *)));
connect(iconView, SIGNAL(selectionChanged(QIconViewItem *)),
SLOT(slotSelChanged(QIconViewItem *)));
fileIcon = QPixmap((const char **) file_xpm);
folderIcon = QPixmap((const char **) folder_xpm);
listView = new QListView(split);
listView->addColumn(tr("File Name"));
listView->addColumn(tr("Size"));
listView->addColumn(tr("Percent"));
listView->addColumn(tr("Save As"));
listView->setSorting(-1);
listView->setResizeMode(QListView::LastColumn);
listView->setAllColumnsShowFocus(TRUE);
listView->setColumnAlignment(2, Qt::AlignCenter);
split->setResizeMode(listView, QSplitter::KeepSize);
resize(600, 500);
changeDirectory("");
}
void ShareWnd::changeDirectory(const QString &dir)
{
if (dir == "..") {
int i = currentDir.findRev('/');
ASSERT(i >= 0);
currentDir = currentDir.left(i);
} else {
if (!currentDir.endsWith("/"))
currentDir += '/';
currentDir += dir;
}
if (currentDir.isEmpty())
currentDir = "/";
upButton->setEnabled(currentDir != "/");
pathEdit->setText(currentDir);
slotRefresh();
}
FileListItem *ShareWnd::getCurrentFile()
{
for (QListViewItem *i = listView->firstChild(); i; i = i->nextSibling()) {
FileListItem *item = (FileListItem *) i;
if (!item->isFinished)
return item;
}
return NULL;
}
void ShareWnd::download(FileListItem *item)
{
QCString dst = item->localFile.local8Bit();
QCString src = item->remoteFile.utf8();
downloadFile(dst, src);
}
bool ShareWnd::findFile(const QString &name)
{
QListViewItem *i;
for (i = listView->firstChild(); i; i = i->nextSibling()) {
if (((FileListItem *) i)->remoteFile == name)
return TRUE;
}
return FALSE;
}
void ShareWnd::onListDir(std::list<ENTRY_INFO> &entries)
{
std::list<ENTRY_INFO>::iterator it;
for (it = entries.begin(); it != entries.end(); ++it) {
FileIconViewItem *item = new FileIconViewItem(iconView, *it);
item->setPixmap(item->isDir ? folderIcon : fileIcon);
}
}
void ShareWnd::onListDirFinished()
{
iconView->unsetCursor();
statusBar()->message(tr("%1 item(s)").arg(iconView->count()));
}
void ShareWnd::onFileProgress(int n)
{
FileListItem *item = getCurrentFile();
if (item)
item->progress(n);
}
void ShareWnd::onFileFinished()
{
FileListItem *item = getCurrentFile();
if (!item)
return;
item->setFinished();
item = getCurrentFile();
if (item)
download(item);
}
void ShareWnd::onClose()
{
ShareClient::onClose();
QMessageBox::critical(this, QString::null,
tr("The session is closed."));
close(TRUE);
}
void ShareWnd::slotDoubleClicked(QIconViewItem *i)
{
FileIconViewItem *item = (FileIconViewItem *) i;
if (item->isDir)
changeDirectory(item->text());
}
void ShareWnd::slotSelChanged(QIconViewItem *i)
{
if (i == NULL) {
statusBar()->message(tr("Ready"));
return;
}
FileIconViewItem *item = (FileIconViewItem *) i;
if (item->isDir)
return;
int size = item->size / 1024;
if (size == 0)
size = 1;
statusBar()->message(QString("%1K").arg(size));
}
void ShareWnd::slotParentDir()
{
changeDirectory("..");
}
void ShareWnd::slotRefresh()
{
iconView->clear();
iconView->setCursor(Qt::WaitCursor);
listDirectory(currentDir.utf8());
statusBar()->message(tr("Reading directory..."));
}
void ShareWnd::slotDownload()
{
QIconViewItem *i = iconView->currentItem();
if (i == NULL)
return;
FileIconViewItem *item = (FileIconViewItem *) i;
if (item->isDir)
return;
QString remote = currentDir;
if (!currentDir.endsWith("/"))
remote += '/';
remote += item->text();
if (findFile(remote)) {
int r = QMessageBox::warning(this, tr("Warning"),
tr("This file is already in the download file list. Are you sure to download it again?"),
QMessageBox::Yes, QMessageBox::No);
if (r != QMessageBox::Yes)
return;
}
QString local = QFileDialog::getSaveFileName(
item->text(), QString::null, this);
if (local.isEmpty())
return;
FileListItem *file = new FileListItem(listView, remote, local, item->size);
if (getCurrentFile() == file)
download(file);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -