source: trunk/qt/file-tree.h @ 13894

Last change on this file since 13894 was 13894, checked in by jordan, 8 years ago

(qt) more futzing with file-tree

  • Property svn:keywords set to Date Rev Author Id
File size: 5.4 KB
Line 
1/*
2 * This file Copyright (C) Mnemosyne LLC
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2
6 * as published by the Free Software Foundation.
7 *
8 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
9 *
10 * $Id: file-tree.h 13894 2013-01-28 18:20:20Z jordan $
11 */
12
13#ifndef QTR_FILE_TREE
14#define QTR_FILE_TREE
15
16#include <QAbstractItemModel>
17#include <QObject>
18#include <QItemDelegate>
19#include <QList>
20#include <QHash>
21#include <QSet>
22#include <QSize>
23#include <QString>
24#include <QTreeView>
25#include <QVariant>
26
27class QSortFilterProxyModel;
28class QStyle;
29
30#include "torrent.h" // FileList
31
32/****
33*****
34****/
35
36class FileTreeItem: public QObject
37{
38    Q_OBJECT;
39
40    enum { LOW=(1<<0), NORMAL=(1<<1), HIGH=(1<<2) };
41
42  public:
43
44    virtual ~FileTreeItem();
45
46    FileTreeItem (const QString& name="", int fileIndex=-1, uint64_t size=0):
47      myFileIndex (fileIndex),
48      myParent (0),
49      myName (name),
50      myPriority (0),
51      myIsWanted (0),
52      myHaveSize (0),
53      myTotalSize (size),
54      myFirstUnhashedRow (0) { }
55
56  public:
57    void appendChild (FileTreeItem *child);
58    FileTreeItem * child (const QString& filename);
59    FileTreeItem * child (int row) { return myChildren.at(row); }
60    int childCount () const { return myChildren.size(); }
61    FileTreeItem * parent () { return myParent; }
62    const FileTreeItem * parent () const { return myParent; }
63    int row () const;
64    const QString& name () const { return myName; }
65    QVariant data (int column, int role) const;
66    bool update (const QString& name, bool want, int priority, uint64_t have, bool updateFields);
67    void twiddleWanted (QSet<int>& fileIds, bool&);
68    void twiddlePriority (QSet<int>& fileIds, int&);
69    int fileIndex () const { return myFileIndex; }
70    uint64_t totalSize () const { return myTotalSize; }
71
72  private:
73    void setSubtreePriority (int priority, QSet<int>& fileIds);
74    void setSubtreeWanted (bool, QSet<int>& fileIds);
75    QString priorityString () const;
76    void getSubtreeSize (uint64_t& have, uint64_t& total) const;
77    QString fileSizeName () const;
78    double progress () const;
79    int priority () const;
80    int isSubtreeWanted () const;
81
82    const int myFileIndex;
83    FileTreeItem * myParent;
84    QList<FileTreeItem*> myChildren;
85    QHash<QString,int> myChildRows;
86    const QHash<QString,int>& getMyChildRows();
87    QString myName;
88    int myPriority;
89    bool myIsWanted;
90    uint64_t myHaveSize;
91    const uint64_t myTotalSize;
92    size_t myFirstUnhashedRow;
93};
94
95class FileTreeModel: public QAbstractItemModel
96{
97    Q_OBJECT
98
99  public:
100    FileTreeModel (QObject *parent = 0, bool isEditable = true);
101    ~FileTreeModel ();
102
103  public:
104    QVariant data (const QModelIndex &index, int role = Qt::DisplayRole) const;
105    Qt::ItemFlags flags (const QModelIndex& index) const;
106    QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
107    QModelIndex index (int row, int column, const QModelIndex& parent = QModelIndex()) const;
108    QModelIndex parent (const QModelIndex& child) const;
109    QModelIndex parent (const QModelIndex& child, int column) const;
110    int rowCount (const QModelIndex& parent = QModelIndex()) const;
111    int columnCount (const QModelIndex &parent = QModelIndex()) const;
112    virtual bool setData (const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
113
114  signals:
115    void priorityChanged (const QSet<int>& fileIndices, int);
116    void wantedChanged (const QSet<int>& fileIndices, bool);
117    void pathEdited (const QString& oldpath, const QString& newname);
118
119  public:
120    void clear ();
121    void addFile (int index, const QString& filename,
122                  bool wanted, int priority,
123                  uint64_t size, uint64_t have,
124                  QList<QModelIndex>& rowsAdded,
125                  bool torrentChanged);
126
127  private:
128    void itemChanged (FileTreeItem *);
129    void clearSubtree (const QModelIndex &);
130    QModelIndex indexOf (FileTreeItem *, int column) const;
131    void parentsChanged (const QModelIndex &, int column);
132    void subtreeChanged (const QModelIndex &, int column);
133    FileTreeItem * findItemForFileIndex (int fileIndex) const;
134    FileTreeItem * itemFromIndex (const QModelIndex&) const;
135
136  private:
137    FileTreeItem * myRootItem;
138    const bool myIsEditable;
139
140  public slots:
141    void clicked (const QModelIndex & index);
142};
143
144class FileTreeDelegate: public QItemDelegate
145{
146    Q_OBJECT
147
148  public:
149    FileTreeDelegate (QObject * parent=0): QItemDelegate(parent) { }
150    virtual ~FileTreeDelegate() { }
151
152  public:
153    virtual QSize sizeHint (const QStyleOptionViewItem&, const QModelIndex&) const;
154    virtual void paint (QPainter*, const QStyleOptionViewItem&, const QModelIndex&) const;
155};
156
157class FileTreeView: public QTreeView
158{
159    Q_OBJECT
160
161  public:
162    FileTreeView (QWidget * parent=0, bool editable=true);
163    virtual ~FileTreeView ();
164    void clear ();
165    void update (const FileList& files, bool updateProperties=true);
166
167  signals:
168    void priorityChanged (const QSet<int>& fileIndices, int priority);
169    void wantedChanged (const QSet<int>& fileIndices, bool wanted);
170    void pathEdited (const QString& oldpath, const QString& newname);
171
172  protected:
173    bool eventFilter (QObject *, QEvent *);
174
175  private:
176    FileTreeModel myModel;
177    QSortFilterProxyModel * myProxy;
178    FileTreeDelegate myDelegate;
179
180  public slots:
181    void onClicked (const QModelIndex& index);
182};
183
184#endif
Note: See TracBrowser for help on using the repository browser.