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

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

(qt) #5252: disable file editing in the options dialog. remove keyboard shortcuts that conflicted with renaming files in file-tree.c. fix refresh issue in the file-tree when renaming files.

  • Property svn:keywords set to Date Rev Author Id
File size: 5.3 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 13893 2013-01-28 07:01:58Z jordan $
11 */
12
13#ifndef QTR_TREE_FILE_MODEL
14#define QTR_TREE_FILE_MODEL
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      myIndex (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 myIndex; }
70    uint64_t totalSize () const { return myTotalSize; }
71   
72   
73
74  private:
75    void setSubtreePriority (int priority, QSet<int>& fileIds);
76    void setSubtreeWanted (bool, QSet<int>& fileIds);
77    QString priorityString () const;
78    void getSubtreeSize (uint64_t& have, uint64_t& total) const;
79    QString fileSizeName () const;
80    double progress () const;
81    int priority () const;
82    int isSubtreeWanted () const;
83
84    const int myIndex;
85    FileTreeItem * myParent;
86    QList<FileTreeItem*> myChildren;
87    QHash<QString,int> myChildRows;
88    const QHash<QString,int>& getMyChildRows();
89    QString myName;
90    int myPriority;
91    bool myIsWanted;
92    uint64_t myHaveSize;
93    const uint64_t myTotalSize;
94    size_t myFirstUnhashedRow;
95};
96
97class FileTreeModel: public QAbstractItemModel
98{
99    Q_OBJECT
100
101  public:
102    FileTreeModel (QObject *parent = 0, bool isEditable = true);
103    ~FileTreeModel ();
104
105  public:
106    QVariant data (const QModelIndex &index, int role = Qt::DisplayRole) const;
107    Qt::ItemFlags flags (const QModelIndex& index) const;
108    QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
109    QModelIndex index (int row, int column, const QModelIndex& parent = QModelIndex()) const;
110    QModelIndex parent (const QModelIndex& child) const;
111    QModelIndex parent (const QModelIndex& child, int column) const;
112    int rowCount (const QModelIndex& parent = QModelIndex()) const;
113    int columnCount (const QModelIndex &parent = QModelIndex()) const;
114    virtual bool setData (const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
115
116  signals:
117    void priorityChanged (const QSet<int>& fileIndices, int);
118    void wantedChanged (const QSet<int>& fileIndices, bool);
119    void pathEdited (const QString& oldpath, const QString& newname);
120
121  public:
122    void clear ();
123    void addFile (int index, const QString& filename,
124                  bool wanted, int priority,
125                  uint64_t size, uint64_t have,
126                  QList<QModelIndex>& rowsAdded,
127                  bool torrentChanged);
128
129  private:
130    void itemChanged (FileTreeItem *);
131    void clearSubtree (const QModelIndex &);
132    QModelIndex indexOf (FileTreeItem *, int column) const;
133    void parentsChanged (const QModelIndex &, int column);
134    void subtreeChanged (const QModelIndex &, int column);
135    FileTreeItem * findItemForFileIndex (int fileIndex) const;
136
137
138
139  private:
140    FileTreeItem * myRootItem;
141    const bool myIsEditable;
142
143  public slots:
144    void clicked (const QModelIndex & index);
145};
146
147class FileTreeDelegate: public QItemDelegate
148{
149    Q_OBJECT
150
151  public:
152    FileTreeDelegate (QObject * parent=0): QItemDelegate(parent) { }
153    virtual ~FileTreeDelegate() { }
154
155  public:
156    virtual QSize sizeHint (const QStyleOptionViewItem&, const QModelIndex&) const;
157    virtual void paint (QPainter*, const QStyleOptionViewItem&, const QModelIndex&) const;
158};
159
160class FileTreeView: public QTreeView
161{
162    Q_OBJECT
163
164  public:
165    FileTreeView (QWidget * parent=0, bool editable=true);
166    virtual ~FileTreeView ();
167    void clear ();
168    void update (const FileList& files);
169    void update (const FileList& files, bool torrentChanged);
170
171  signals:
172    void priorityChanged (const QSet<int>& fileIndices, int);
173    void wantedChanged (const QSet<int>& fileIndices, bool);
174    void pathEdited (const QString& oldpath, const QString& newname);
175
176  protected:
177    bool eventFilter (QObject *, QEvent *);
178
179  private:
180    FileTreeModel myModel;
181    QSortFilterProxyModel * myProxy;
182    FileTreeDelegate myDelegate;
183
184  public slots:
185    void onClicked (const QModelIndex & index);
186};
187
188#endif
Note: See TracBrowser for help on using the repository browser.