source: tspsg-svn/trunk/src/tspmodel.cpp @ 15

Last change on this file since 15 was 15, checked in by laleppa, 17 years ago

Finished converting to Qt's model/view architecture

  • Property svn:keywords set to Id URL
File size: 3.7 KB
Line 
1/*
2 *  TSPSG - TSP Solver and Generator
3 *  Copyright (C) 2007 Lёppa <lacontacts[at]gmail[dot]com>
4 *
5 *  $Id: tspmodel.cpp 15 2007-11-05 00:32:40Z laleppa $
6 *  $URL: https://tspsg.svn.sourceforge.net/svnroot/tspsg/trunk/src/tspmodel.cpp $
7 *
8 *  This file is part of TSPSG.
9 *
10 *  TSPSG is free software: you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License as published by
12 *  the Free Software Foundation, either version 3 of the License, or
13 *  (at your option) any later version.
14 *
15 *  TSPSG is distributed in the hope that it will be useful,
16 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 *  GNU General Public License for more details.
19 *
20 *  You should have received a copy of the GNU General Public License
21 *  along with TSPSG.  If not, see <http://www.gnu.org/licenses/>.
22 */
23
24#include "tspmodel.h"
25#include <QTGui>
26
27CTSPModel::CTSPModel(QObject *parent)
28        : QAbstractTableModel(parent), randMin(1), randMax(10), nCities(0)
29{
30}
31
32int CTSPModel::rand(int min, int max)
33{
34        return min + (int)(((float)qrand() / RAND_MAX) * max);
35}
36
37int CTSPModel::rowCount(const QModelIndex &) const
38{
39        return nCities;
40}
41
42int CTSPModel::columnCount(const QModelIndex &) const
43{
44        return nCities;
45}
46
47QVariant CTSPModel::headerData(int section, Qt::Orientation, int role) const
48{
49        if (role == Qt::DisplayRole)
50                return trUtf8("Город %1").arg(section + 1);
51        return QVariant();
52}
53
54QVariant CTSPModel::data(const QModelIndex &index, int role) const
55{
56        if (!index.isValid())
57                return QVariant();
58        if (role == Qt::TextAlignmentRole)
59                return int(Qt::AlignCenter);
60        else if (role == Qt::FontRole) {
61QFont font;
62                font.setBold(true);
63                return font;
64        } else if (role == Qt::DisplayRole || role == Qt::EditRole) {
65                if (index.row() < nCities && index.column() < nCities)
66                        if (table[index.row()][index.column()] == INFINITY)
67                                return trUtf8(INFSTR);
68                        else
69                                // HACK: Converting to string to prevent spinbox in edit mode
70                                return QVariant(table[index.row()][index.column()]).toString();
71                else
72                        return QVariant();
73        } else if (role == Qt::UserRole)
74                return table[index.row()][index.column()];
75        return QVariant();
76}
77
78bool CTSPModel::setData(const QModelIndex &index, const QVariant &value, int role)
79{
80        if (!index.isValid())
81                return false;
82        if (role == Qt::EditRole && index.row() != index.column()) {
83                if (value.toString().compare(INFSTR) == 0)
84                        table[index.row()][index.column()] = INFINITY;
85                else {
86bool ok;
87double tmp = value.toDouble(&ok);
88                        if (!ok || tmp < 0)
89                                return false;
90                        else
91                                table[index.row()][index.column()] = tmp;
92                }
93                emit dataChanged(index,index);
94                return true;
95        }
96        return false;
97}
98
99Qt::ItemFlags CTSPModel::flags(const QModelIndex &index) const
100{
101Qt::ItemFlags flags = QAbstractItemModel::flags(index);
102        if (index.row() != index.column())
103                flags |= Qt::ItemIsEditable;
104        return flags;
105}
106
107int CTSPModel::numCities() const
108{
109        return nCities;
110}
111
112void CTSPModel::setNumCities(int n)
113{
114        if (n == nCities)
115                return;
116        emit layoutAboutToBeChanged();
117        if (n > nCities) {
118                for (int r = 0; r < nCities; r++) {
119                        for (int c = nCities; c < n; c++)
120                                if (r == c)
121                                        table[r][c] = INFINITY;
122                                else
123                                        table[r][c] = rand(randMin,randMax);
124                }
125                for (int r = nCities; r < n; r++) {
126                        for (int c = 0; c < n; c++)
127                                if (r == c)
128                                        table[r][c] = INFINITY;
129                                else
130                                        table[r][c] = rand(randMin,randMax);
131                }
132        }
133        nCities = n;
134        emit layoutChanged();
135}
136
137void CTSPModel::randomize()
138{
139        for (int r = 0; r < nCities; r++)
140                for (int c = 0; c < nCities; c++)
141                        if (r != c)
142                                table[r][c] = rand(randMin,randMax);
143        emit dataChanged(index(0,0),index(nCities - 1,nCities - 1));
144}
145
Note: See TracBrowser for help on using the repository browser.