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 
30 DClass<CFGWadAlias> : public Ui::CFGWadAlias
31 {
32 public:
33  enum Columns
34  {
35  ColWad,
36  ColAliases
37  };
38 };
39 
40 DPointered(CFGWadAlias)
41 
42 CFGWadAlias::CFGWadAlias(QWidget *parent)
43 : ConfigurationBaseBox(parent)
44 {
45  d->setupUi(this);
46  QHeaderView *header = d->table->horizontalHeader();
47  header->resizeSection(PrivData<CFGWadAlias>::ColWad, 150);
48  header->setResizeMode(PrivData<CFGWadAlias>::ColAliases, QHeaderView::Stretch);
49  d->table->sortByColumn(PrivData<CFGWadAlias>::ColWad, Qt::AscendingOrder);
50 }
51 
52 CFGWadAlias::~CFGWadAlias()
53 {
54 }
55 
56 void CFGWadAlias::addAliasToTable(const FileAlias &alias)
57 {
58  bool wasSortingEnabled = d->table->isSortingEnabled();
59  d->table->setSortingEnabled(false);
60 
61  int row = findRowWithWad(alias.name());
62  if (row < 0)
63  {
64  row = d->table->rowCount();
65  d->table->insertRow(row);
66  applyAliasToRow(row, alias);
67  }
68  else
69  {
70  // Merge.
71  FileAlias existingAlias = aliasFromRow(row);
72  existingAlias.addAliases(alias.aliases());
73  applyAliasToRow(row, existingAlias);
74  }
75 
76  d->table->setSortingEnabled(wasSortingEnabled);
77  d->table->resizeRowsToContents();
78 }
79 
80 void CFGWadAlias::addDefaults()
81 {
82  QList<FileAlias> aliases = FileAlias::standardWadAliases();
83  foreach (const FileAlias& alias, aliases)
84  {
85  addAliasToTable(alias);
86  }
87 }
88 
89 void CFGWadAlias::addNewEntry()
90 {
91  bool wasSortingEnabled = d->table->isSortingEnabled();
92  d->table->setSortingEnabled(false);
93 
94  int row = d->table->rowCount();
95  d->table->insertRow(row);
96  d->table->setItem(row, PrivData<CFGWadAlias>::ColWad, new QTableWidgetItem());
97  d->table->setItem(row, PrivData<CFGWadAlias>::ColAliases, new QTableWidgetItem());
98 
99  d->table->setSortingEnabled(wasSortingEnabled);
100 }
101 
102 QList<FileAlias> CFGWadAlias::aliases() const
103 {
104  QList<FileAlias> aliases;
105  for (int row = 0; row < d->table->rowCount(); ++row)
106  {
107  FileAlias alias = aliasFromRow(row);
108  if (alias.isValid())
109  {
110  aliases << alias;
111  }
112  }
113  return FileAliasList::mergeDuplicates(aliases);
114 }
115 
116 FileAlias CFGWadAlias::aliasFromRow(int row) const
117 {
118  FileAlias alias;
119  alias.setName(d->table->item(row, PrivData<CFGWadAlias>::ColWad)->text().trimmed());
120  QStringList candidateAliases = d->table->item(row, PrivData<CFGWadAlias>::ColAliases)->text().split(";");
121  foreach (const QString &candidateAlias, candidateAliases)
122  {
123  if (!candidateAlias.trimmed().isEmpty())
124  {
125  alias.addAlias(candidateAlias.trimmed());
126  }
127  }
128  return alias;
129 }
130 
131 void CFGWadAlias::applyAliasToRow(int row, const FileAlias &alias)
132 {
133  d->table->setItem(row, PrivData<CFGWadAlias>::ColWad, toolTipItem(alias.name()));
134  d->table->setItem(row, PrivData<CFGWadAlias>::ColAliases, toolTipItem(alias.aliases().join("; ")));
135 }
136 
137 int CFGWadAlias::findRowWithWad(const QString &wadName)
138 {
139  for (int row = 0; row < d->table->rowCount(); ++row)
140  {
141  if (d->table->item(row, PrivData<CFGWadAlias>::ColWad)->text().trimmed().compare(
142  wadName.trimmed(), Qt::CaseInsensitive) == 0)
143  {
144  return row;
145  }
146  }
147  return -1;
148 }
149 
150 QIcon CFGWadAlias::icon() const
151 {
152  return QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon);
153 }
154 
156 {
157  while (d->table->rowCount() > 0)
158  {
159  d->table->removeRow(0);
160  }
161  // Aliases from configuration are guaranteed to be unique.
162  QList<FileAlias> aliases = gConfig.doomseeker.wadAliases();
163  foreach (const FileAlias &alias, aliases)
164  {
165  if (alias.isValid())
166  {
167  addAliasToTable(alias);
168  }
169  }
170 }
171 
172 void CFGWadAlias::removeSelected()
173 {
174  CommonGUI::removeSelectedRowsFromQTableWidget(d->table);
175 }
176 
178 {
179  gConfig.doomseeker.setWadAliases(aliases());
180 }
181 
182 QTableWidgetItem *CFGWadAlias::toolTipItem(const QString &contents)
183 {
184  QTableWidgetItem *item = new QTableWidgetItem(contents);
185  item->setToolTip(contents);
186  return item;
187 }
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.
Base class for configuration pages.
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 ConfigurationBaseBox.