Christophe Dumez
12 years ago
13 changed files with 505 additions and 295 deletions
@ -0,0 +1,86 @@
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent. |
||||
* Copyright (C) 2006-2012 Christophe Dumez |
||||
* |
||||
* 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. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||
* |
||||
* In addition, as a special exception, the copyright holders give permission to |
||||
* link this program with the OpenSSL project's "OpenSSL" library (or with |
||||
* modified versions of it that use the same license as the "OpenSSL" library), |
||||
* and distribute the linked executables. You must obey the GNU General Public |
||||
* License in all respects for all of the code used other than "OpenSSL". If you |
||||
* modify file(s), you may extend this exception to your version of the file(s), |
||||
* but you are not obligated to do so. If you do not wish to do so, delete this |
||||
* exception statement from your version. |
||||
* |
||||
* Contact : chris@qbittorrent.org |
||||
*/ |
||||
|
||||
#include "torrentcontentmodelfile.h" |
||||
#include "torrentcontentmodelfolder.h" |
||||
#include "fs_utils.h" |
||||
#include "misc.h" |
||||
|
||||
TorrentContentModelFile::TorrentContentModelFile(const libtorrent::torrent_info& t, |
||||
const libtorrent::file_entry& f, |
||||
TorrentContentModelFolder* parent, |
||||
int file_index) |
||||
: TorrentContentModelItem(parent) |
||||
, m_fileIndex(file_index) |
||||
{ |
||||
Q_ASSERT(parent); |
||||
|
||||
#if LIBTORRENT_VERSION_MINOR >= 16 |
||||
m_name = fsutils::fileName(misc::toQStringU(t.files().file_path(f))); |
||||
#else |
||||
m_name = misc::toQStringU(f.path.filename()); |
||||
#endif |
||||
|
||||
// Do not display incomplete extensions
|
||||
if (m_name.endsWith(".!qB")) |
||||
m_name.chop(4); |
||||
|
||||
m_size = (qulonglong)f.size; |
||||
|
||||
// Update parent
|
||||
m_parentItem->appendChild(this); |
||||
m_parentItem->updateSize(); |
||||
} |
||||
|
||||
int TorrentContentModelFile::fileIndex() const |
||||
{ |
||||
return m_fileIndex; |
||||
} |
||||
|
||||
void TorrentContentModelFile::setPriority(int new_prio, bool update_parent) |
||||
{ |
||||
Q_ASSERT(new_prio != prio::PARTIAL); |
||||
|
||||
if (m_priority == new_prio) |
||||
return; |
||||
|
||||
m_priority = new_prio; |
||||
|
||||
// Reset progress if priority is 0
|
||||
if (m_priority == 0) |
||||
setProgress(0); |
||||
|
||||
// Update parent
|
||||
if (update_parent) { |
||||
m_parentItem->updateSize(); |
||||
m_parentItem->updateProgress(); |
||||
m_parentItem->updatePriority(); |
||||
} |
||||
} |
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent. |
||||
* Copyright (C) 2006-2012 Christophe Dumez |
||||
* |
||||
* 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. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||
* |
||||
* In addition, as a special exception, the copyright holders give permission to |
||||
* link this program with the OpenSSL project's "OpenSSL" library (or with |
||||
* modified versions of it that use the same license as the "OpenSSL" library), |
||||
* and distribute the linked executables. You must obey the GNU General Public |
||||
* License in all respects for all of the code used other than "OpenSSL". If you |
||||
* modify file(s), you may extend this exception to your version of the file(s), |
||||
* but you are not obligated to do so. If you do not wish to do so, delete this |
||||
* exception statement from your version. |
||||
* |
||||
* Contact : chris@qbittorrent.org |
||||
*/ |
||||
|
||||
#ifndef TORRENTCONTENTMODELFILE_H |
||||
#define TORRENTCONTENTMODELFILE_H |
||||
|
||||
#include "torrentcontentmodelitem.h" |
||||
|
||||
class TorrentContentModelFile : public TorrentContentModelItem |
||||
{ |
||||
public: |
||||
TorrentContentModelFile(const libtorrent::torrent_info& t, |
||||
const libtorrent::file_entry& f, |
||||
TorrentContentModelFolder* parent, |
||||
int file_index); |
||||
|
||||
int fileIndex() const; |
||||
void setPriority(int new_prio, bool update_parent = true); |
||||
ItemType itemType() const { return FileType; } |
||||
|
||||
private: |
||||
int m_fileIndex; |
||||
}; |
||||
|
||||
#endif // TORRENTCONTENTMODELFILE_H
|
@ -0,0 +1,185 @@
@@ -0,0 +1,185 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent. |
||||
* Copyright (C) 2006-2012 Christophe Dumez |
||||
* |
||||
* 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. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||
* |
||||
* In addition, as a special exception, the copyright holders give permission to |
||||
* link this program with the OpenSSL project's "OpenSSL" library (or with |
||||
* modified versions of it that use the same license as the "OpenSSL" library), |
||||
* and distribute the linked executables. You must obey the GNU General Public |
||||
* License in all respects for all of the code used other than "OpenSSL". If you |
||||
* modify file(s), you may extend this exception to your version of the file(s), |
||||
* but you are not obligated to do so. If you do not wish to do so, delete this |
||||
* exception statement from your version. |
||||
* |
||||
* Contact : chris@qbittorrent.org |
||||
*/ |
||||
|
||||
#include "torrentcontentmodelfolder.h" |
||||
|
||||
TorrentContentModelFolder::TorrentContentModelFolder(const QString& name, TorrentContentModelFolder* parent) |
||||
: TorrentContentModelItem(parent) |
||||
{ |
||||
Q_ASSERT(parent); |
||||
m_name = name; |
||||
// Do not display incomplete extensions
|
||||
if (m_name.endsWith(".!qB")) |
||||
m_name.chop(4); |
||||
|
||||
// Update parent
|
||||
m_parentItem->appendChild(this); |
||||
} |
||||
|
||||
TorrentContentModelFolder::TorrentContentModelFolder(const QList<QVariant>& data) |
||||
: TorrentContentModelItem(0) |
||||
{ |
||||
Q_ASSERT(data.size() == NB_COL); |
||||
m_itemData = data; |
||||
} |
||||
|
||||
TorrentContentModelFolder::~TorrentContentModelFolder() |
||||
{ |
||||
qDeleteAll(m_childItems); |
||||
} |
||||
|
||||
void TorrentContentModelFolder::deleteAllChildren() |
||||
{ |
||||
Q_ASSERT(isRootItem()); |
||||
qDeleteAll(m_childItems); |
||||
m_childItems.clear(); |
||||
} |
||||
|
||||
const QList<TorrentContentModelItem*>& TorrentContentModelFolder::children() const |
||||
{ |
||||
return m_childItems; |
||||
} |
||||
|
||||
void TorrentContentModelFolder::appendChild(TorrentContentModelItem* item) |
||||
{ |
||||
Q_ASSERT(item); |
||||
|
||||
int i=0; |
||||
for ( ; i < m_childItems.size(); ++i) { |
||||
QString newchild_name = item->name(); |
||||
if (QString::localeAwareCompare(newchild_name, m_childItems.at(i)->name()) < 0) |
||||
break; |
||||
} |
||||
m_childItems.insert(i, item); |
||||
} |
||||
|
||||
TorrentContentModelItem* TorrentContentModelFolder::child(int row) const |
||||
{ |
||||
return m_childItems.value(row, 0); |
||||
} |
||||
|
||||
TorrentContentModelFolder* TorrentContentModelFolder::childFolderWithName(const QString& name) const |
||||
{ |
||||
foreach (TorrentContentModelItem* child, m_childItems) { |
||||
if (child->itemType() == FolderType && child->name() == name) |
||||
return static_cast<TorrentContentModelFolder*>(child); |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
int TorrentContentModelFolder::childCount() const |
||||
{ |
||||
return m_childItems.count(); |
||||
} |
||||
|
||||
// Only non-root folders use this function
|
||||
void TorrentContentModelFolder::updatePriority() |
||||
{ |
||||
if (isRootItem()) |
||||
return; |
||||
|
||||
if (m_childItems.isEmpty()) |
||||
return; |
||||
|
||||
// If all children have the same priority
|
||||
// then the folder should have the same
|
||||
// priority
|
||||
const int prio = m_childItems.first()->priority(); |
||||
for (int i=1; i<m_childItems.size(); ++i) { |
||||
if (m_childItems.at(i)->priority() != prio) { |
||||
setPriority(prio::PARTIAL); |
||||
return; |
||||
} |
||||
} |
||||
// All child items have the same priority
|
||||
// Update own if necessary
|
||||
if (prio != priority()) |
||||
setPriority(prio); |
||||
} |
||||
|
||||
void TorrentContentModelFolder::setPriority(int new_prio, bool update_parent) |
||||
{ |
||||
if (m_priority == new_prio) |
||||
return; |
||||
|
||||
m_priority = new_prio; |
||||
|
||||
// Reset progress if priority is IGNORED
|
||||
if (m_priority == prio::IGNORED) |
||||
setProgress(0); |
||||
|
||||
// Update parent
|
||||
if (update_parent) { |
||||
m_parentItem->updateSize(); |
||||
m_parentItem->updateProgress(); |
||||
m_parentItem->updatePriority(); |
||||
} |
||||
|
||||
// Update children
|
||||
if (m_priority != prio::PARTIAL) { |
||||
qDebug("Updating children items"); |
||||
foreach (TorrentContentModelItem* child, m_childItems) { |
||||
// Do not update the parent since
|
||||
// the parent is causing the update
|
||||
child->setPriority(m_priority, false); |
||||
} |
||||
} |
||||
|
||||
updateSize(); |
||||
updateProgress(); |
||||
} |
||||
|
||||
void TorrentContentModelFolder::updateProgress() |
||||
{ |
||||
if (isRootItem()) |
||||
return; |
||||
|
||||
m_totalDone = 0; |
||||
foreach (TorrentContentModelItem* child, m_childItems) { |
||||
if (child->priority() > 0) |
||||
m_totalDone += child->totalDone(); |
||||
} |
||||
//qDebug("Folder: total_done: %llu/%llu", total_done, getSize());
|
||||
Q_ASSERT(m_totalDone <= size()); |
||||
setProgress(m_totalDone); |
||||
} |
||||
|
||||
void TorrentContentModelFolder::updateSize() |
||||
{ |
||||
if (isRootItem()) |
||||
return; |
||||
|
||||
qulonglong size = 0; |
||||
foreach (TorrentContentModelItem* child, m_childItems) { |
||||
if (child->priority() != prio::IGNORED) |
||||
size += child->size(); |
||||
} |
||||
setSize(size); |
||||
} |
@ -0,0 +1,66 @@
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent. |
||||
* Copyright (C) 2006-2012 Christophe Dumez |
||||
* |
||||
* 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. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||
* |
||||
* In addition, as a special exception, the copyright holders give permission to |
||||
* link this program with the OpenSSL project's "OpenSSL" library (or with |
||||
* modified versions of it that use the same license as the "OpenSSL" library), |
||||
* and distribute the linked executables. You must obey the GNU General Public |
||||
* License in all respects for all of the code used other than "OpenSSL". If you |
||||
* modify file(s), you may extend this exception to your version of the file(s), |
||||
* but you are not obligated to do so. If you do not wish to do so, delete this |
||||
* exception statement from your version. |
||||
* |
||||
* Contact : chris@qbittorrent.org |
||||
*/ |
||||
|
||||
#ifndef TORRENTCONTENTMODELFOLDER_H |
||||
#define TORRENTCONTENTMODELFOLDER_H |
||||
|
||||
#include "torrentcontentmodelitem.h" |
||||
|
||||
class TorrentContentModelFolder : public TorrentContentModelItem |
||||
{ |
||||
public: |
||||
// Folder constructor
|
||||
TorrentContentModelFolder(const QString& name, TorrentContentModelFolder* parent); |
||||
|
||||
// Invisible root item constructor
|
||||
TorrentContentModelFolder(const QList<QVariant>& data); |
||||
|
||||
~TorrentContentModelFolder(); |
||||
|
||||
ItemType itemType() const { return FolderType; } |
||||
|
||||
void updateSize(); |
||||
void updateProgress(); |
||||
void updatePriority(); |
||||
|
||||
void setPriority(int new_prio, bool update_parent = true); |
||||
|
||||
void deleteAllChildren(); |
||||
const QList<TorrentContentModelItem*>& children() const; |
||||
void appendChild(TorrentContentModelItem* item); |
||||
TorrentContentModelItem* child(int row) const; |
||||
TorrentContentModelFolder* childFolderWithName(const QString& name) const; |
||||
int childCount() const; |
||||
|
||||
private: |
||||
QList<TorrentContentModelItem*> m_childItems; |
||||
}; |
||||
|
||||
#endif // TORRENTCONTENTMODELFOLDER_H
|
Loading…
Reference in new issue