5#include <QLoggingCategory>
7#include "ListFileModel.h"
10static Q_LOGGING_CATEGORY(log,
"FileTransfer.ListFileModel")
12static QAtomicInt g_Id;
15 const QString& remoteFile,
18 , m_szLocalFile(localFile)
19 , m_LocalPermission(0x0644)
20 , m_szRemoteFile(remoteFile)
21 , m_RemotePermission(0x0644)
26 , m_Priority(Priority::Normal)
33QString CFileTransfer::HeaderData(
int section)
35 switch((ColumnValue)section) {
36 case ColumnValue::LocalFiles:
37 return tr(
"Local files");
38 case ColumnValue::Direction:
39 return tr(
"Direction");
40 case ColumnValue::RemoteFiles:
41 return tr(
"Remote files");
42 case ColumnValue::FileSize:
43 return tr(
"File size");
44 case ColumnValue::Speed:
46 case ColumnValue::State:
48 case ColumnValue::Time:
50 case ColumnValue::Explanation:
51 return tr(
"Explanation");
52 case ColumnValue::Priority:
53 return tr(
"Priority");
60QVariant CFileTransfer::Data(
int column,
int role)
62 if(Qt::TextAlignmentRole == role) {
63 switch((ColumnValue)column) {
64 case ColumnValue::Direction:
65 case ColumnValue::State:
66 case ColumnValue::Priority:
67 return Qt::AlignHCenter;
68 case ColumnValue::FileSize:
69 case ColumnValue::Speed:
70 return Qt::AlignRight;
76 if(Qt::DisplayRole == role) {
78 switch ((ColumnValue)column) {
79 case ColumnValue::LocalFiles:
80 szData = GetLocalFile();
82 case ColumnValue::RemoteFiles:
83 szData = GetRemoteFile();
85 case ColumnValue::FileSize: {
86 szData = CStats::Convertbytes(GetTransferSize()) +
"/" + CStats::Convertbytes(GetFileSize());
89 case ColumnValue::Direction:
90 szData = GetDirectionName();
92 case ColumnValue::State:
93 szData = GetStateName();
95 case ColumnValue::Priority:
96 szData = GetPriority();
98 case ColumnValue::Speed:
99 szData = CStats::Convertbytes(GetSpeed());
101 case ColumnValue::Time:
102 szData = GetFinishTime();
104 case ColumnValue::Explanation:
105 szData = GetExplanation();
116int CFileTransfer::GetId()
121QString CFileTransfer::GetDirectionName()
123 switch ((Direction)GetDirection()) {
124 case Direction::Upload:
127 case Direction::Download:
129 return tr(
"Download");
134CFileTransfer::Direction CFileTransfer::GetDirection()
139void CFileTransfer::SetDirection(Direction d)
144QString CFileTransfer::GetLocalFile()
146 return m_szLocalFile;
149void CFileTransfer::SetLocaleFile(
const QString &szFile)
151 m_szLocalFile = szFile;
154QString CFileTransfer::GetRemoteFile()
156 return m_szRemoteFile;
159void CFileTransfer::SetRemoteFile(
const QString &szFile)
161 m_szRemoteFile = szFile;
164quint64 CFileTransfer::GetFileSize()
169void CFileTransfer::SetFileSize(quint64 size)
174quint64 CFileTransfer::GetTransferSize()
176 return m_nTransferSize;
179void CFileTransfer::slotTransferSize(quint64 nAddSize)
181 m_nTransferSize += nAddSize;
182 QDateTime tmCur = QDateTime::currentDateTime();
183 int nSec = m_tmLast.secsTo(tmCur);
185 m_fSpeed = ((float_t)(m_nTransferSize - m_nLastSize)) / (float_t)nSec;
187 m_nLastSize = m_nTransferSize;
190float_t CFileTransfer::GetSpeed()
195QString CFileTransfer::GetFinishTime()
197 return m_FinishTime.toString(QLocale::system().dateTimeFormat(QLocale::ShortFormat));
200void CFileTransfer::slotFinish()
202 m_FinishTime = QDateTime::currentDateTime();
205void CFileTransfer::SetFinishTime(QString szTime) {
206 if(szTime.isEmpty())
return;
207 m_FinishTime = QDateTime::fromString(szTime, QLocale::system().dateTimeFormat(QLocale::ShortFormat));
210quint32 CFileTransfer::GetLocalPermission()
const
212 return m_LocalPermission;
215void CFileTransfer::SetLocalPermission(quint32 newLocalPermission)
217 m_LocalPermission = newLocalPermission;
220quint32 CFileTransfer::GetRemotePermission()
const
222 return m_RemotePermission;
225void CFileTransfer::SetRemotePermission(quint32 newRemotePermission)
227 m_RemotePermission = newRemotePermission;
230QString CFileTransfer::GetStateName()
232 switch (GetState()) {
236 return tr(
"Opening");
237 case State::Transferring:
238 return tr(
"Transferring");
240 return tr(
"Closing");
250CFileTransfer::State CFileTransfer::GetState()
255void CFileTransfer::slotSetstate(State s)
257 if(State::Opening == s)
258 m_tmLast = QDateTime::currentDateTime();
262QString CFileTransfer::GetPriority()
264 switch((Priority)m_Priority) {
265 case Priority::Height:
267 case Priority::Normal:
269 case Priority::Lower:
277void CFileTransfer::slotSetPrority(Priority p)
282QString CFileTransfer::GetExplanation()
284 return m_szExplanation;
287void CFileTransfer::slotSetExplanation(
const QString &explanation)
289 m_szExplanation = explanation;
292CListFileModel::CListFileModel(QObject *parent)
293 : QAbstractTableModel(parent)
297QVariant CListFileModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
300 if(Qt::DisplayRole != role)
302 if(Qt::Vertical == orientation) {
303 if(m_lstFile.size() <= section || 0 > section)
305 auto p = m_lstFile.at(section);
310 return CFileTransfer::HeaderData(section);
313int CListFileModel::rowCount(
const QModelIndex &parent)
const
316 if (parent.isValid())
318 return m_lstFile.size();
321int CListFileModel::columnCount(
const QModelIndex &parent)
const
324 if (parent.isValid())
327 return (
int)CFileTransfer::ColumnValue::End;
330QVariant CListFileModel::data(
const QModelIndex &index,
int role)
const
333 if (!index.isValid())
337 if(r > m_lstFile.size() || r < 0)
340 auto p = m_lstFile.at(r);
342 return p->Data(index.column(), role);
347QModelIndex CListFileModel::AddFileTransfer(QSharedPointer<CFileTransfer> f)
349 if(!f)
return QModelIndex();
350 int r = m_lstFile.size();
351 beginInsertRows(QModelIndex(), r, r);
354 emit dataChanged(index(r, 0), index(r, (
int)CFileTransfer::ColumnValue::End));
358int CListFileModel::RemoveFileTransfer(
int id)
361 for(
int i = 0; i < m_lstFile.size(); i++) {
362 auto p = m_lstFile.at(i);
364 if(p->GetId() ==
id) {
365 beginRemoveRows(QModelIndex(), i, i);
366 m_lstFile.removeAt(i);
375int CListFileModel::RemoveFileTransfer(QList<int> ids)
377 if(ids.isEmpty())
return 0;
378 std::sort(ids.begin(), ids.end());
380 auto it = std::remove_if(m_lstFile.begin(), m_lstFile.end(),
381 [&](QSharedPointer<CFileTransfer> f){
382 return ids.contains(f->GetId());
384 m_lstFile.erase(it, m_lstFile.end());
389QSharedPointer<CFileTransfer> CListFileModel::GetFileTransfer(
const QModelIndex &index)
391 if (!index.isValid())
392 return QSharedPointer<CFileTransfer>();
394 if(0 > r || m_lstFile.size() <= r)
395 return QSharedPointer<CFileTransfer>();
396 return m_lstFile.at(r);
399bool CListFileModel::removeRows(
int row,
int count,
const QModelIndex &parent)
401 beginRemoveRows(parent, row, row + count - 1);
402#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
403 m_lstFile.remove(row, count);
405 for(
int i = row + count - 1; i >= row && i < m_lstFile.size();) {
406 m_lstFile.removeAt(i--);
413void CListFileModel::UpdateFileTransfer(QSharedPointer<CFileTransfer> f)
416 int r = m_lstFile.indexOf(f);
420 QModelIndex topLeft = index(r, 0);
421 QModelIndex bootRight = index(r, (
int)CFileTransfer::ColumnValue::End - 1);
422 emit dataChanged(topLeft, bootRight);
425int CListFileModel::Load(QSettings &set)
429 nCount = set.value(
"Model/ListFile/Count").toInt();
430 for(
int i = 0; i < nCount; i++) {
431 set.beginGroup(
"Model/ListFile/FileTransfer" + QString::number(i));
432 QString szLocal = set.value(
"Local/File").toString();
433 CFileTransfer::Direction direction =
434 (CFileTransfer::Direction)set.value(
"Direction", (
int)CFileTransfer::Direction::Upload).toInt();
435 QString szRemoteFile = set.value(
"Remote/File").toString();
436 QSharedPointer<CFileTransfer> f(
438 f->SetRemotePermission(set.value(
"Remote/Permission", f->GetRemotePermission()).toULongLong());
439 f->SetFileSize(set.value(
"File/Size", f->GetFileSize()).toULongLong());
440 f->slotTransferSize(set.value(
"File/Size/Transfer", f->GetTransferSize()).toULongLong());
441 CFileTransfer::State state = (CFileTransfer::State)set.value(
"State", (
int)f->GetState()).toInt();
442 if(!(CFileTransfer::State::Finish == state || CFileTransfer::State::Fail == state))
443 state = CFileTransfer::State::No;
444 f->slotSetstate(state);
446 f->slotSetExplanation(set.value(
"Explanation", f->GetExplanation()).toString());
447 f->SetFinishTime(set.value(
"FinishTime", f->GetFinishTime()).toString());
455int CListFileModel::Save(QSettings &set)
457 set.setValue(
"Model/ListFile/Count", m_lstFile.size());
458 for(
int i = 0; i < m_lstFile.size(); i++) {
459 auto f = m_lstFile.at(i);
460 set.beginGroup(
"Model/ListFile/FileTransfer" + QString::number(i));
461 set.setValue(
"Local/File", f->GetLocalFile());
462 set.setValue(
"Direction", (
int)f->GetDirection());
463 set.setValue(
"Remote/File", f->GetRemoteFile());
464 set.setValue(
"Remote/Permission", f->GetRemotePermission());
465 set.setValue(
"File/Size", f->GetFileSize());
466 set.setValue(
"File/Size/Transfer", f->GetTransferSize());
467 CFileTransfer::State state = f->GetState();
468 if(!(CFileTransfer::State::Finish == state || CFileTransfer::State::Fail == state))
469 state = CFileTransfer::State::No;
470 set.setValue(
"State", (
int)state);
472 set.setValue(
"Explanation", f->GetExplanation());
473 set.setValue(
"FinishTime", f->GetFinishTime());