⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sharewnd.cpp

📁 张勇的linQ学习P2P及IM软件的极佳素材代码
💻 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 + -