cfgwadalias.cpp
1 //------------------------------------------------------------------------------
2 // cfgwadalias.cpp
3 //------------------------------------------------------------------------------
4 //
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 // 02110-1301, USA.
19 //
20 //------------------------------------------------------------------------------
21 // Copyright (C) 2014 "Zalewa" <zalewapl@gmail.com>
22 //------------------------------------------------------------------------------
23 #include "cfgwadalias.h"
24 #include "ui_cfgwadalias.h"
25 
26 #include "configuration/doomseekerconfig.h"
27 #include "gui/commongui.h"
28 #include "pathfinder/filealias.h"
29 #include <QTimer>
30 
31 DClass<CFGWadAlias> : public Ui::CFGWadAlias
32 {
33 public:
34  enum Columns
35  {
36  ColWad,
37  ColAliases
38  };
39 
40  QTimer resizeTimer;
41 };
42 
43 DPointeredNoCopy(CFGWadAlias)
44 
45 CFGWadAlias::CFGWadAlias(QWidget *parent)
46 : ConfigPage(parent)
47 {
48  d->setupUi(this);
49 
50  d->resizeTimer.setSingleShot(true);
51  connect(&d->resizeTimer, SIGNAL(timeout()), d->table, SLOT(resizeRowsToContents()));
52 
53  QHeaderView *header = d->table->horizontalHeader();
54  header->resizeSection(PrivData<CFGWadAlias>::ColWad, 150);
55 #if QT_VERSION >= 0x050000
56  header->setSectionResizeMode(PrivData<CFGWadAlias>::ColAliases, QHeaderView::Stretch);
57 #else
58  header->setResizeMode(PrivData<CFGWadAlias>::ColAliases, QHeaderView::Stretch);
59 #endif
60  d->table->sortByColumn(PrivData<CFGWadAlias>::ColWad, Qt::AscendingOrder);
61 }
62 
63 CFGWadAlias::~CFGWadAlias()
64 {
65 }
66 
67 void CFGWadAlias::addAliasToTable(const FileAlias &alias)
68 {
69  bool wasSortingEnabled = d->table->isSortingEnabled();
70  d->table->setSortingEnabled(false);
71 
72  int row = findRowWithWad(alias.name());
73  if (row < 0)
74  {
75  row = d->table->rowCount();
76  d->table->insertRow(row);
77  applyAliasToRow(row, alias);
78  }
79  else
80  {
81  // Merge.
82  FileAlias existingAlias = aliasFromRow(row);
83  existingAlias.addAliases(alias.aliases());
84  applyAliasToRow(row, existingAlias);
85  }
86 
87  d->table->setSortingEnabled(wasSortingEnabled);
88  resizeRowsToContents();
89 }
90 
91 void CFGWadAlias::addDefaults()
92 {
93  QList<FileAlias> aliases = FileAlias::standardWadAliases();
94  foreach (const FileAlias& alias, aliases)
95  {
96  addAliasToTable(alias);
97  }
98 }
99 
100 void CFGWadAlias::addNewEntry()
101 {
102  bool wasSortingEnabled = d->table->isSortingEnabled();
103  d->table->setSortingEnabled(false);
104 
105  int row = d->table->rowCount();
106  d->table->insertRow(row);
107  d->table->setItem(row, PrivData<CFGWadAlias>::ColWad, new QTableWidgetItem());
108  d->table->setItem(row, PrivData<CFGWadAlias>::ColAliases, new QTableWidgetItem());
109 
110  d->table->setSortingEnabled(wasSortingEnabled);
111  resizeRowsToContents();
112 }
113 
114 QList<FileAlias> CFGWadAlias::aliases() const
115 {
116  QList<FileAlias> aliases;
117  for (int row = 0; row < d->table->rowCount(); ++row)
118  {
119  FileAlias alias = aliasFromRow(row);
120  if (alias.isValid())
121  {
122  aliases << alias;
123  }
124  }
125  return FileAliasList::mergeDuplicates(aliases);
126 }
127 
128 FileAlias CFGWadAlias::aliasFromRow(int row) const
129 {
130  FileAlias alias;
131  alias.setName(d->table->item(row, PrivData<CFGWadAlias>::ColWad)->text().trimmed());
132  QStringList candidateAliases = d->table->item(row, PrivData<CFGWadAlias>::ColAliases)->text().split(";");
133  foreach (const QString &candidateAlias, candidateAliases)
134  {
135  if (!candidateAlias.trimmed().isEmpty())
136  {
137  alias.addAlias(candidateAlias.trimmed());
138  }
139  }
140  return alias;
141 }
142 
143 void CFGWadAlias::applyAliasToRow(int row, const FileAlias &alias)
144 {
145  d->table->setItem(row, PrivData<CFGWadAlias>::ColWad, toolTipItem(alias.name()));
146  d->table->setItem(row, PrivData<CFGWadAlias>::ColAliases, toolTipItem(alias.aliases().join("; ")));
147 }
148 
149 int CFGWadAlias::findRowWithWad(const QString &wadName)
150 {
151  for (int row = 0; row < d->table->rowCount(); ++row)
152  {
153  if (d->table->item(row, PrivData<CFGWadAlias>::ColWad)->text().trimmed().compare(
154  wadName.trimmed(), Qt::CaseInsensitive) == 0)
155  {
156  return row;
157  }
158  }
159  return -1;
160 }
161 
162 QIcon CFGWadAlias::icon() const
163 {
164  return QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon);
165 }
166 
168 {
169  while (d->table->rowCount() > 0)
170  {
171  d->table->removeRow(0);
172  }
173  // Aliases from configuration are guaranteed to be unique.
174  QList<FileAlias> aliases = gConfig.doomseeker.wadAliases();
175  foreach (const FileAlias &alias, aliases)
176  {
177  if (alias.isValid())
178  {
179  addAliasToTable(alias);
180  }
181  }
182 }
183 
184 void CFGWadAlias::removeSelected()
185 {
186  CommonGUI::removeSelectedRowsFromQTableWidget(d->table);
187 }
188 
189 void CFGWadAlias::resizeRowsToContents()
190 {
191  d->resizeTimer.start(0);
192 }
193 
195 {
196  gConfig.doomseeker.setWadAliases(aliases());
197 }
198 
199 void CFGWadAlias::showEvent(QShowEvent *event)
200 {
201  resizeRowsToContents();
202 }
203 
204 QTableWidgetItem *CFGWadAlias::toolTipItem(const QString &contents)
205 {
206  QTableWidgetItem *item = new QTableWidgetItem(contents);
207  item->setToolTip(contents);
208  return item;
209 }
bool isValid() const
Valid FileAlias has a name and at least one alias.
Definition: filealias.cpp:112
void addAliases(const QStringList &val)
Will ensure unique values.
Definition: filealias.cpp:42
static QList< FileAlias > standardWadAliases()
Standard/default aliases for configuration init.
Definition: filealias.cpp:127
Definition: dptr.h:31
void readSettings()
Reimplement this to read settings from config into widgets.
void saveSettings()
Reimplement this to write settings to config from widgets.
void addAlias(const QString &val)
Will ensure unique values.
Definition: filealias.cpp:34
QIcon icon() const
Reimplement this to return a displayable icon for the ConfigPage.
Base class for configuration pages.
Definition: configpage.h:43