File: TabularModel.h

package info (click to toggle)
sonic-visualiser 5.2.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 24,744 kB
  • sloc: cpp: 158,888; ansic: 11,920; sh: 1,785; makefile: 517; xml: 64; perl: 31
file content (145 lines) | stat: -rw-r--r-- 4,415 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*
    Sonic Visualiser
    An audio file viewer and annotation editor.
    Centre for Digital Music, Queen Mary, University of London.
    This file copyright 2008 QMUL.
    
    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.  See the file
    COPYING included with this distribution for more information.
*/

#ifndef SV_TABULAR_MODEL_H
#define SV_TABULAR_MODEL_H

#include <QVariant>
#include <QString>

#include "base/RealTime.h"

namespace sv {

class Command;

/**
 * TabularModel is an abstract base class for models that support
 * direct access to data in a tabular form.  A model that implements
 * TabularModel may be displayed and, perhaps, edited in a data
 * spreadsheet window.
 *
 * This is very like a cut-down QAbstractItemModel.  It assumes a
 * relationship between row number and frame time.
 */
class TabularModel
{
public:
    virtual ~TabularModel() { }

    /**
     * Return the number of rows (items) in the model.
     */
    virtual int getRowCount() const = 0;

    /** 
     * Return the number of columns (values/labels/etc per item).
     */
    virtual int getColumnCount() const = 0;

    /**
     * Return the heading for a given column, e.g. "Time" or "Value".
     * These are shown directly to the user, so must be translated
     * already.
     */
    virtual QString getHeading(int column) const = 0;

    enum { SortRole = Qt::UserRole };
    enum SortType { SortNumeric, SortAlphabetical };

    /**
     * Get the value in the given cell, for the given role. The role
     * is actually a Qt::ItemDataRole.
     */
    virtual QVariant getData(int row, int column, int role) const = 0;

    /**
     * Return true if the column is the frame time of the item, or an
     * alternative representation of it (i.e. anything that has the
     * same sort order). Duration is not a time value by this meaning.
     */
    virtual bool isColumnTimeValue(int col) const = 0;

    /**
     * Return the sort type (numeric or alphabetical) for the column.
     */
    virtual SortType getSortType(int col) const = 0;

    /**
     * Return the frame time for the given row.
     */
    virtual sv_frame_t getFrameForRow(int row) const = 0;

    /** 
     * Return the number of the first row whose frame time is not less
     * than the given one. If there is none, return getRowCount().
     */
    virtual int getRowForFrame(sv_frame_t frame) const = 0;

    /**
     * Return true if the model is user-editable, false otherwise.
     */
    virtual bool isEditable() const = 0;

    /**
     * Return a command to set the value in the given cell, for the
     * given role, to the contents of the supplied variant.
     *
     * If the model is not editable or the cell or value is out of
     * range, return nullptr.
     */
    virtual Command *getSetDataCommand(int row, int column,
                                       const QVariant &, int role) = 0;

    /**
     * Return a command to insert a new row before the row with the
     * given index.
     *
     * If the model is not editable or the index is out of range,
     * return nullptr.
     */
    virtual Command *getInsertRowCommand(int beforeRow) = 0;

    /**
     * Return a command to delete the row with the given index.
     *
     * If the model is not editable or the index is out of range,
     * return nullptr.
     */
    virtual Command *getRemoveRowCommand(int row) = 0;

protected:
    // Helpers
    
    static QVariant adaptFrameForRole(sv_frame_t frame,
                                      sv_samplerate_t rate,
                                      int role) {
        if (role == SortRole) return int(frame);
        RealTime rt = RealTime::frame2RealTime(frame, rate);
        if (role == Qt::EditRole) return rt.toString().c_str();
        else return rt.toText().c_str();
    }

    static QVariant adaptValueForRole(float value,
                                      QString unit,
                                      int role) {
        if (role == SortRole || role == Qt::EditRole) return value;
        else return QString("%1 %2").arg(value).arg(unit);
    }
};

} // end namespace sv

#endif