00001 #include "qsegraphscansmodel.h"
00002 #include "qsedataset.h"
00003 #include <QBrush>
00004 #include <QTableView>
00005
00006 QseGraphScansModel::QseGraphScansModel
00007 (QseDataSet *dataSet, QTableView *table, QObject *parent)
00008 : QAbstractTableModel(parent),
00009 m_DataSet(dataSet),
00010 m_TableView(table),
00011 m_PrevRowCount(0),
00012 m_PrevColumnCount(3)
00013 {
00014
00015
00016 connect(dataSet, SIGNAL(operationCompleted()),
00017 this, SLOT(operationCompleted()));
00018 }
00019
00020 bool
00021 QseGraphScansModel::scanSelected(int s)
00022 {
00023 QItemSelectionModel *m = m_TableView -> selectionModel();
00024
00025 return (m->isRowSelected(s, QModelIndex()));
00026 }
00027
00028 void
00029 QseGraphScansModel::operationCompleted()
00030 {
00031 int nrows = m_DataSet -> scanCount();
00032 int ncols = 3;
00033
00034 if (ncols > m_PrevColumnCount) {
00035 beginInsertColumns(QModelIndex(), m_PrevColumnCount, ncols-1);
00036 m_PrevColumnCount = ncols;
00037 endInsertColumns();
00038 } else if (ncols < m_PrevColumnCount) {
00039 beginRemoveColumns(QModelIndex(), ncols, m_PrevColumnCount-1);
00040 m_PrevColumnCount = ncols;
00041 endRemoveColumns();
00042 }
00043
00044 if (nrows > m_PrevRowCount) {
00045 beginInsertRows(QModelIndex(), m_PrevRowCount, nrows-1);
00046
00047 if (scanSelected(m_PrevRowCount-1)) {
00048 QItemSelectionModel *m = m_TableView -> selectionModel();
00049
00050 if (scanSelected(m_PrevRowCount-2)) {
00051 m -> select(index(nrows-1,0),
00052 QItemSelectionModel::Current | QItemSelectionModel::Rows |
00053 QItemSelectionModel::Select);
00054 } else {
00055 QItemSelection ss(index(m_PrevRowCount-1,0),index(m_PrevRowCount-1,0));
00056 ss.select(index(nrows-1,0),index(nrows-1,0));
00057 m -> select(ss,
00058 QItemSelectionModel::Current | QItemSelectionModel::Rows |
00059 QItemSelectionModel::Toggle);
00060 }
00061 }
00062
00063 m_PrevRowCount = nrows;
00064 endInsertRows();
00065 } else if (nrows < m_PrevRowCount) {
00066 beginRemoveRows(QModelIndex(), nrows, m_PrevRowCount-1);
00067 m_PrevRowCount = nrows;
00068 endRemoveRows();
00069 }
00070
00071 QModelIndex topLeft = createIndex(0,0);
00072 QModelIndex botRight = createIndex(m_PrevRowCount,m_PrevColumnCount);
00073
00074 emit dataChanged(topLeft, botRight);
00075
00076 m_TableView -> resizeRowsToContents();
00077 m_TableView -> resizeColumnsToContents();
00078 }
00079
00080 QModelIndex
00081 QseGraphScansModel::indexOfScan(int n)
00082 {
00083 return index(n,0,QModelIndex());
00084 }
00085
00086 int
00087 QseGraphScansModel::rowCount(const QModelIndex &parent) const
00088 {
00089 if (parent.column() > 0) {
00090 return 0;
00091 }
00092
00093 int res = m_DataSet -> scanCount();
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 return res;
00104 }
00105
00106 int
00107 QseGraphScansModel::columnCount(const QModelIndex &parent) const
00108 {
00109 int res = 3;
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 return res;
00120 }
00121
00122 static int min(int a, int b)
00123 {
00124 if (a<b) {
00125 return a;
00126 } else {
00127 return b;
00128 }
00129 }
00130
00131 static
00132 const char* role_string(int role)
00133 {
00134 switch (role) {
00135 case Qt::DisplayRole:
00136 return "Qt::DisplayRole";
00137 break;
00138 case Qt::DecorationRole:
00139 return "Qt::DecorationRole";
00140 break;
00141 case Qt::EditRole:
00142 return "Qt::EditRole";
00143 break;
00144 case Qt::ToolTipRole:
00145 return "Qt::ToolTipRole";
00146 break;
00147 case Qt::StatusTipRole:
00148 return "Qt::StatusTipRole";
00149 break;
00150 case Qt::WhatsThisRole:
00151 return "Qt::WhatsThisRole";
00152 break;
00153 case Qt::SizeHintRole:
00154 return "Qt::SizeHintRole";
00155 break;
00156 case Qt::FontRole:
00157 return "Qt::FontRole";
00158 break;
00159 case Qt::TextAlignmentRole:
00160 return "Qt::TextAlignmentRole";
00161 break;
00162 case Qt::BackgroundRole:
00163 return "Qt::BackgroundRole";
00164 break;
00165
00166
00167
00168 case Qt::ForegroundRole:
00169 return "Qt::ForegroundRole";
00170 break;
00171
00172
00173
00174 case Qt::CheckStateRole:
00175 return "Qt::CheckStateRole";
00176 break;
00177 case Qt::AccessibleTextRole:
00178 return "Qt::AccessibleTextRole";
00179 break;
00180 case Qt::AccessibleDescriptionRole:
00181 return "Qt::AccessibleDescriptionRole";
00182 break;
00183 case Qt::UserRole:
00184 return "Qt::UserRole";
00185 break;
00186 default:
00187 return "Other role";
00188 }
00189 }
00190
00191 QVariant
00192 QseGraphScansModel::data(const QModelIndex &index, int role) const
00193 {
00194 if (!index.isValid()) {
00195 return QVariant();
00196 }
00197
00198 int row = index.row();
00199 int col = index.column();
00200
00201 QseScan *scan = m_DataSet->scan(row);
00202
00203 switch (role) {
00204 case Qt::DisplayRole:
00205 switch (col) {
00206 case 0:
00207 return scan -> name();
00208 break;
00209 case 1:
00210 return scan -> maxRowCount();
00211 break;
00212 case 2:
00213 return scan -> columnCount();
00214 break;
00215 default:
00216 return QVariant();
00217 }
00218 break;
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 case Qt::ToolTipRole:
00229 {
00230 const int maxlines = 15;
00231 const int maxlength = 80;
00232
00233 QString res;
00234 QStringList hdr = scan -> header();
00235 int nlines = min(hdr.size(),maxlines);
00236 for (int i=0; i<nlines; i++) {
00237 QString l = hdr[i];
00238 if (l.size()>maxlength) {
00239 res += l.mid(0,maxlength) + " ...\n";
00240 } else {
00241 res += l + "\n";
00242 }
00243 }
00244 if (hdr.size()>maxlines) {
00245 res += "...";
00246 }
00247 return res;
00248 }
00249 break;
00250
00251 default:
00252
00253 return QVariant();
00254 }
00255 }
00256
00257 QVariant
00258 QseGraphScansModel::headerData
00259 (int section, Qt::Orientation orientation, int role) const
00260 {
00261 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
00262 switch (section) {
00263 case 0:
00264 return "Scan";
00265 break;
00266 case 1:
00267 return "rows";
00268 break;
00269 case 2:
00270 return "cols";
00271 break;
00272 default:
00273 return QVariant();
00274 }
00275 }
00276
00277 if (orientation == Qt::Vertical && role == Qt::DisplayRole) {
00278 return section;
00279 }
00280
00281 return QVariant();
00282 }