~openmw/openmw/openmw-packaging2

« back to all changes in this revision

Viewing changes to apps/opencs/view/tools/reporttable.cpp

  • Committer: Scott Howard
  • Date: 2015-11-27 08:01:08 UTC
  • Revision ID: showard@debian.org-20151127080108-vby93jqgdvxj8d6d
Cron update. Git hash: 37c8fea

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 
2
1
#include "reporttable.hpp"
3
2
 
4
3
#include <algorithm>
9
8
#include <QStyledItemDelegate>
10
9
#include <QTextDocument>
11
10
#include <QPainter>
 
11
#include <QContextMenuEvent>
 
12
#include <QMouseEvent>
 
13
#include <QSortFilterProxyModel>
12
14
 
13
15
#include "../../model/tools/reportmodel.hpp"
14
16
 
21
23
        public:
22
24
 
23
25
            RichTextDelegate (QObject *parent = 0);
24
 
            
 
26
 
25
27
            virtual void paint(QPainter *painter, const QStyleOptionViewItem& option,
26
28
                const QModelIndex& index) const;
27
29
    };
61
63
        for (QModelIndexList::const_iterator iter (selectedRows.begin());
62
64
            iter!=selectedRows.end(); ++iter)
63
65
        {
64
 
            QString hint = mModel->data (mModel->index (iter->row(), 2)).toString();
 
66
            QString hint = mProxyModel->data (mProxyModel->index (iter->row(), 2)).toString();
65
67
 
66
68
            if (!hint.isEmpty() && hint[0]=='R')
67
69
            {
72
74
 
73
75
        if (found)
74
76
            menu.addAction (mReplaceAction);
75
 
 
76
77
    }
77
 
    
 
78
 
 
79
    if (mRefreshAction)
 
80
        menu.addAction (mRefreshAction);
 
81
 
78
82
    menu.exec (event->globalPos());
79
83
}
80
84
 
94
98
    selectionModel()->select (index,
95
99
        QItemSelectionModel::Clear | QItemSelectionModel::Select | QItemSelectionModel::Rows);
96
100
 
97
 
    switch (modifiers)
98
 
    {
99
 
        case 0:
 
101
    std::map<Qt::KeyboardModifiers, DoubleClickAction>::iterator iter =
 
102
        mDoubleClickActions.find (modifiers);
 
103
 
 
104
    if (iter==mDoubleClickActions.end())
 
105
    {
 
106
        event->accept();
 
107
        return;
 
108
    }
 
109
 
 
110
    switch (iter->second)
 
111
    {
 
112
        case Action_None:
 
113
 
 
114
            event->accept();
 
115
            break;
 
116
 
 
117
        case Action_Edit:
100
118
 
101
119
            event->accept();
102
120
            showSelection();
103
121
            break;
104
122
 
105
 
        case Qt::ShiftModifier:
 
123
        case Action_Remove:
106
124
 
107
125
            event->accept();
108
126
            removeSelection();
109
127
            break;
110
128
 
111
 
        case Qt::ControlModifier:
 
129
        case Action_EditAndRemove:
112
130
 
113
131
            event->accept();
114
132
            showSelection();
118
136
}
119
137
 
120
138
CSVTools::ReportTable::ReportTable (CSMDoc::Document& document,
121
 
    const CSMWorld::UniversalId& id, bool richTextDescription, QWidget *parent)
122
 
: CSVWorld::DragRecordTable (document, parent), mModel (document.getReport (id))
 
139
    const CSMWorld::UniversalId& id, bool richTextDescription, int refreshState,
 
140
    QWidget *parent)
 
141
: CSVWorld::DragRecordTable (document, parent), mModel (document.getReport (id)),
 
142
  mRefreshAction (0), mRefreshState (refreshState)
123
143
{
 
144
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
 
145
    horizontalHeader()->setSectionResizeMode (QHeaderView::Interactive);
 
146
#else
124
147
    horizontalHeader()->setResizeMode (QHeaderView::Interactive);
 
148
#endif
125
149
    horizontalHeader()->setStretchLastSection (true);
126
150
    verticalHeader()->hide();
127
151
    setSortingEnabled (true);
128
152
    setSelectionBehavior (QAbstractItemView::SelectRows);
129
153
    setSelectionMode (QAbstractItemView::ExtendedSelection);
130
154
 
131
 
    setModel (mModel);
 
155
    mProxyModel = new QSortFilterProxyModel (this);
 
156
    mProxyModel->setSourceModel (mModel);
 
157
 
 
158
    setModel (mProxyModel);
132
159
    setColumnHidden (2, true);
133
160
 
134
161
    mIdTypeDelegate = CSVWorld::IdTypeDelegateFactory().makeDelegate (0,
138
165
 
139
166
    if (richTextDescription)
140
167
        setItemDelegateForColumn (mModel->columnCount()-1, new RichTextDelegate (this));
141
 
    
 
168
 
142
169
    mShowAction = new QAction (tr ("Show"), this);
143
170
    connect (mShowAction, SIGNAL (triggered()), this, SLOT (showSelection()));
144
171
    addAction (mShowAction);
149
176
 
150
177
    mReplaceAction = new QAction (tr ("Replace"), this);
151
178
    connect (mReplaceAction, SIGNAL (triggered()), this, SIGNAL (replaceRequest()));
152
 
    addAction (mReplaceAction);    
 
179
    addAction (mReplaceAction);
 
180
 
 
181
    if (mRefreshState)
 
182
    {
 
183
        mRefreshAction = new QAction (tr ("Refresh"), this);
 
184
        mRefreshAction->setEnabled (!(mDocument.getState() & mRefreshState));
 
185
        connect (mRefreshAction, SIGNAL (triggered()), this, SIGNAL (refreshRequest()));
 
186
        addAction (mRefreshAction);
 
187
    }
 
188
 
 
189
    mDoubleClickActions.insert (std::make_pair (Qt::NoModifier, Action_Edit));
 
190
    mDoubleClickActions.insert (std::make_pair (Qt::ShiftModifier, Action_Remove));
 
191
    mDoubleClickActions.insert (std::make_pair (Qt::ControlModifier, Action_EditAndRemove));
153
192
}
154
193
 
155
194
std::vector<CSMWorld::UniversalId> CSVTools::ReportTable::getDraggedRecords() const
161
200
    for (QModelIndexList::const_iterator iter (selectedRows.begin()); iter!=selectedRows.end();
162
201
        ++iter)
163
202
    {
164
 
        ids.push_back (mModel->getUniversalId (iter->row()));
 
203
        ids.push_back (mModel->getUniversalId (mProxyModel->mapToSource (*iter).row()));
165
204
    }
166
205
 
167
206
    return ids;
170
209
void CSVTools::ReportTable::updateUserSetting (const QString& name, const QStringList& list)
171
210
{
172
211
    mIdTypeDelegate->updateUserSetting (name, list);
 
212
 
 
213
    QString base ("report-input/double");
 
214
    if (name.startsWith (base))
 
215
    {
 
216
        QString modifierString = name.mid (base.size());
 
217
        Qt::KeyboardModifiers modifiers = 0;
 
218
 
 
219
        if (modifierString=="-s")
 
220
            modifiers = Qt::ShiftModifier;
 
221
        else if (modifierString=="-c")
 
222
            modifiers = Qt::ControlModifier;
 
223
        else if (modifierString=="-sc")
 
224
            modifiers = Qt::ShiftModifier | Qt::ControlModifier;
 
225
 
 
226
        DoubleClickAction action = Action_None;
 
227
 
 
228
        QString value = list.at (0);
 
229
 
 
230
        if (value=="Edit")
 
231
            action = Action_Edit;
 
232
        else if (value=="Remove")
 
233
            action = Action_Remove;
 
234
        else if (value=="Edit And Remove")
 
235
            action = Action_EditAndRemove;
 
236
 
 
237
        mDoubleClickActions[modifiers] = action;
 
238
 
 
239
        return;
 
240
    }
173
241
}
174
242
 
175
243
std::vector<int> CSVTools::ReportTable::getReplaceIndices (bool selection) const
180
248
    {
181
249
        QModelIndexList selectedRows = selectionModel()->selectedRows();
182
250
 
 
251
        std::vector<int> rows;
 
252
 
183
253
        for (QModelIndexList::const_iterator iter (selectedRows.begin()); iter!=selectedRows.end();
184
254
            ++iter)
185
255
        {
186
 
            QString hint = mModel->data (mModel->index (iter->row(), 2)).toString();
 
256
            rows.push_back (mProxyModel->mapToSource (*iter).row());
 
257
        }
 
258
 
 
259
        std::sort (rows.begin(), rows.end());
 
260
 
 
261
        for (std::vector<int>::const_iterator iter (rows.begin()); iter!=rows.end(); ++iter)
 
262
        {
 
263
            QString hint = mModel->data (mModel->index (*iter, 2)).toString();
187
264
 
188
265
            if (!hint.isEmpty() && hint[0]=='R')
189
 
                indices.push_back (iter->row());
 
266
                indices.push_back (*iter);
190
267
        }
191
268
    }
192
269
    else
207
284
{
208
285
    mModel->flagAsReplaced (index);
209
286
}
210
 
            
 
287
 
211
288
void CSVTools::ReportTable::showSelection()
212
289
{
213
290
    QModelIndexList selectedRows = selectionModel()->selectedRows();
214
291
 
215
292
    for (QModelIndexList::const_iterator iter (selectedRows.begin()); iter!=selectedRows.end();
216
293
        ++iter)
217
 
        emit editRequest (mModel->getUniversalId (iter->row()), mModel->getHint (iter->row()));
 
294
    {
 
295
        int row = mProxyModel->mapToSource (*iter).row();
 
296
        emit editRequest (mModel->getUniversalId (row), mModel->getHint (row));
 
297
    }
218
298
}
219
299
 
220
300
void CSVTools::ReportTable::removeSelection()
221
301
{
222
302
    QModelIndexList selectedRows = selectionModel()->selectedRows();
223
303
 
224
 
    std::reverse (selectedRows.begin(), selectedRows.end());
 
304
    std::vector<int> rows;
225
305
 
226
 
    for (QModelIndexList::const_iterator iter (selectedRows.begin()); iter!=selectedRows.end();
 
306
    for (QModelIndexList::iterator iter (selectedRows.begin()); iter!=selectedRows.end();
227
307
        ++iter)
228
 
        mModel->removeRows (iter->row(), 1);
 
308
    {
 
309
        rows.push_back (mProxyModel->mapToSource (*iter).row());
 
310
    }
 
311
 
 
312
    std::sort (rows.begin(), rows.end());
 
313
 
 
314
    for (std::vector<int>::const_reverse_iterator iter (rows.rbegin()); iter!=rows.rend(); ++iter)
 
315
        mProxyModel->removeRows (*iter, 1);
229
316
 
230
317
    selectionModel()->clear();
231
318
}
234
321
{
235
322
    mModel->clear();
236
323
}
 
324
 
 
325
void CSVTools::ReportTable::stateChanged (int state, CSMDoc::Document *document)
 
326
{
 
327
    if (mRefreshAction)
 
328
        mRefreshAction->setEnabled (!(state & mRefreshState));
 
329
}