Generate and install scalable icons.
[kdbg.git] / kdbg / pgmargs.cpp
blob1f3e3318108a7d5fb19303924dbe2ea1069d8176
1 /*
2 * Copyright Johannes Sixt
3 * This file is licensed under the GNU General Public License Version 2.
4 * See the file COPYING in the toplevel directory of the source directory.
5 */
7 #include "pgmargs.h"
8 #include <klocale.h> /* i18n */
9 #include <QFileDialog>
10 #include "mydebug.h"
12 PgmArgs::PgmArgs(QWidget* parent, const QString& pgm,
13 const std::map<QString,QString>& envVars,
14 const QStringList& allOptions) :
15 QDialog(parent)
17 setupUi(this);
20 QFileInfo fi = pgm;
21 QString newText = labelArgs->text().arg(fi.fileName());
22 labelArgs->setText(newText);
25 // add options only if the option list is non-empty
26 if (!allOptions.isEmpty())
28 xsldbgOptions->addItems(allOptions);
30 else
32 delete xsldbgOptionsPage;
33 xsldbgOptionsPage = 0;
36 EnvVar val;
37 val.status = EnvVar::EVclean;
38 for (std::map<QString,QString>::const_iterator i = envVars.begin(); i != envVars.end(); ++i)
40 val.value = i->second;
41 val.item = new QTreeWidgetItem(envList, QStringList() << i->first << i->second);
42 m_envVars[i->first] = val;
45 envList->setAllColumnsShowFocus(true);
46 buttonDelete->setEnabled(envList->currentItem() != 0);
49 PgmArgs::~PgmArgs()
53 // initializes the selected options
54 void PgmArgs::setOptions(const QSet<QString>& selectedOptions)
56 if (xsldbgOptionsPage == 0)
57 return;
59 for (int i = 0; i < xsldbgOptions->count(); i++) {
60 if (selectedOptions.contains(xsldbgOptions->item(i)->text()))
62 xsldbgOptions->item(i)->setSelected(true);
67 // returns the selected options
68 QSet<QString> PgmArgs::options() const
70 QSet<QString> sel;
71 if (xsldbgOptionsPage != 0)
73 for (int i = 0; i < xsldbgOptions->count(); i++) {
74 if (xsldbgOptions->item(i)->isSelected())
75 sel.insert(xsldbgOptions->item(i)->text());
78 return sel;
81 // this is a slot
82 void PgmArgs::on_buttonModify_clicked()
84 modifyVar(true); // re-add deleted entries
87 void PgmArgs::modifyVar(bool resurrect)
89 QString name, value;
90 parseEnvInput(name, value);
91 if (name.isEmpty() || name.indexOf(' ') >= 0) // disallow spaces in names
92 return;
94 // lookup the value in the dictionary
95 EnvVar* val;
96 std::map<QString,EnvVar>::iterator i = m_envVars.find(name);
97 if (i != m_envVars.end()) {
98 val = &i->second;
99 // see if this is a zombie
100 if (val->status == EnvVar::EVdeleted) {
101 // resurrect
102 if (resurrect)
104 val->value = value;
105 val->status = EnvVar::EVdirty;
106 val->item = new QTreeWidgetItem(envList, QStringList() << name << value);
108 } else if (value != val->value) {
109 // change the value
110 val->value = value;
111 val->status = EnvVar::EVdirty;
112 val->item->setText(1, value);
114 } else {
115 // add the value
116 val = &m_envVars[name];
117 val->value = value;
118 val->status = EnvVar::EVnew;
119 val->item = new QTreeWidgetItem(envList, QStringList() << name << value);
121 envList->setCurrentItem(val->item);
122 buttonDelete->setEnabled(true);
125 // delete the selected item
126 void PgmArgs::on_buttonDelete_clicked()
128 QTreeWidgetItem* item = envList->currentItem();
129 if (item == 0)
130 return;
131 QString name = item->text(0);
133 // lookup the value in the dictionary
134 std::map<QString,EnvVar>::iterator i = m_envVars.find(name);
135 if (i != m_envVars.end())
137 EnvVar* val = &i->second;
138 // delete from list
139 val->item = 0;
140 // if this is a new item, delete it completely, otherwise zombie-ize it
141 if (val->status == EnvVar::EVnew) {
142 m_envVars.erase(i);
143 } else {
144 // mark value deleted
145 val->status = EnvVar::EVdeleted;
148 delete item;
149 // there is no selected item anymore
150 buttonDelete->setEnabled(false);
153 void PgmArgs::parseEnvInput(QString& name, QString& value)
155 // parse input from edit field
156 QString input = envVar->text();
157 int equalSign = input.indexOf('=');
158 if (equalSign >= 0) {
159 name = input.left(equalSign).trimmed();
160 value = input.mid(equalSign+1);
161 } else {
162 name = input.trimmed();
163 value = QString(); /* value is empty */
167 void PgmArgs::on_envList_currentItemChanged()
169 QTreeWidgetItem* item = envList->currentItem();
170 buttonDelete->setEnabled(item != 0);
171 if (item == 0)
172 return;
174 // must get name from list box
175 QString name = item->text(0);
176 envVar->setText(name + "=" + m_envVars[name].value);
179 void PgmArgs::accept()
181 // simulate that the Modify button was pressed, but don't revive
182 // dead entries even if the user changed the edit box
183 modifyVar(false);
184 QDialog::accept();
187 void PgmArgs::on_wdBrowse_clicked()
189 // browse for the working directory
190 QString newDir = QFileDialog::getExistingDirectory(this, {}, wd());
191 if (!newDir.isEmpty()) {
192 setWd(newDir);
196 void PgmArgs::on_insertFile_clicked()
198 QString caption = i18n("Select a file name to insert as program argument");
200 // use the selection as default
201 QString f = programArgs->selectedText();
202 f = QFileDialog::getSaveFileName(this, caption, f);
203 // don't clear the selection if no file was selected
204 if (!f.isEmpty()) {
205 programArgs->insert(f);
209 void PgmArgs::on_insertDir_clicked()
211 QString caption = i18n("Select a directory to insert as program argument");
213 // use the selection as default
214 QString f = programArgs->selectedText();
215 f = QFileDialog::getExistingDirectory(this, caption, f);
216 // don't clear the selection if no file was selected
217 if (!f.isEmpty()) {
218 programArgs->insert(f);
222 #include "pgmargs.moc"