FIX issue #19 where multiple widget values led to bad replacements in the command
[qgit4/redivivus.git] / src / customactionimpl.cpp
blob447079a250756ccf29c09ab59db50f83a70d820a
1 /*
2 Description: custom action handling
4 Author: Marco Costalba (C) 2006-2007
6 Copyright: See COPYING file that comes with this distribution
8 */
9 #include <QSettings>
10 #include <QMessageBox>
11 #include <QInputDialog>
12 #include "common.h"
13 #include "customactionimpl.h"
15 using namespace QGit;
17 CustomActionImpl::CustomActionImpl() {
19 setAttribute(Qt::WA_DeleteOnClose);
20 setupUi(this);
22 QSettings settings;
23 restoreGeometry(settings.value(ACT_GEOM_KEY).toByteArray());
24 QStringList actions = settings.value(ACT_LIST_KEY).toStringList();
26 listWidgetNames->insertItems(0, actions);
27 if (listWidgetNames->count())
28 listWidgetNames->setCurrentItem(listWidgetNames->item(0));
29 else
30 listWidgetNames_currentItemChanged(NULL, NULL);
33 void CustomActionImpl::closeEvent(QCloseEvent* ce) {
35 QSettings settings;
36 settings.setValue(ACT_GEOM_KEY, saveGeometry());
37 QWidget::closeEvent(ce);
40 void CustomActionImpl::loadAction(const QString& name) {
42 const QString flags(ACT_GROUP_KEY + name + ACT_FLAGS_KEY);
43 checkBoxRefreshAfterAction->setChecked(testFlag(ACT_REFRESH_F, flags));
44 QSettings set;
45 const QString& data(set.value(ACT_GROUP_KEY + name + ACT_TEXT_KEY, "").toString());
46 textEditAction->setPlainText(data);
49 void CustomActionImpl::removeAction(const QString& name) {
51 QSettings set;
52 set.remove(ACT_GROUP_KEY + name);
55 const QStringList CustomActionImpl::actions() {
57 QStringList actionsList;
58 QListWidgetItem* item;
59 int row = 0;
60 while ((item = listWidgetNames->item(row)) != 0) {
61 actionsList.append(item->text());
62 row++;
64 return actionsList;
67 void CustomActionImpl::updateActions() {
69 QSettings settings;
70 settings.setValue(ACT_LIST_KEY, actions());
71 emit listChanged(actions());
74 void CustomActionImpl::listWidgetNames_currentItemChanged(QListWidgetItem* item, QListWidgetItem*) {
76 bool empty = (item == NULL);
78 if (!empty) {
79 loadAction(item->text());
80 listWidgetNames->scrollToItem(item);
81 } else {
82 textEditAction->clear();
83 if (checkBoxRefreshAfterAction->isChecked())
84 checkBoxRefreshAfterAction->toggle();
86 textEditAction->setEnabled(!empty);
87 checkBoxRefreshAfterAction->setEnabled(!empty);
88 pushButtonRename->setEnabled(!empty);
89 pushButtonRemove->setEnabled(!empty);
90 pushButtonMoveUp->setEnabled(!empty && (item != listWidgetNames->item(0)));
91 int lastRow = listWidgetNames->count() - 1;
92 pushButtonMoveDown->setEnabled(!empty && (item != listWidgetNames->item(lastRow)));
95 bool CustomActionImpl::getNewName(QString& name, const QString& caption) {
97 bool ok;
98 const QString oldName = name;
99 name = QInputDialog::getText(this, caption + " - QGit", "Enter action name:",
100 QLineEdit::Normal, name, &ok);
102 if (!ok || name.isEmpty() || name == oldName)
103 return false;
105 if (actions().contains(name)) {
106 QMessageBox::warning(this, caption + " - QGit", "Sorry, action name "
107 "already exists.\nPlease choose a different name.");
108 return false;
110 return true;
113 void CustomActionImpl::pushButtonNew_clicked() {
115 QString name;
116 if (!getNewName(name, "Create new action"))
117 return;
119 QListWidgetItem* item = new QListWidgetItem(name);
120 listWidgetNames->addItem(item);
121 updateActions();
122 listWidgetNames->setCurrentItem(item);
123 textEditAction->setPlainText("<write here your action's commands sequence>");
124 textEditAction->selectAll();
125 textEditAction->setFocus();
128 void CustomActionImpl::pushButtonRename_clicked() {
130 QListWidgetItem* item = listWidgetNames->currentItem();
131 if (!item || !item->isSelected())
132 return;
134 QString newName(item->text());
135 if (!getNewName(newName, "Rename action"))
136 return;
138 const QString oldActionName(item->text());
139 item->setText(newName);
140 updateActions();
141 listWidgetNames_currentItemChanged(item, item);
142 loadAction(oldActionName);
143 removeAction(oldActionName);
146 void CustomActionImpl::pushButtonRemove_clicked() {
148 QListWidgetItem* item = listWidgetNames->currentItem();
149 if (!item || !item->isSelected())
150 return;
152 removeAction(item->text());
153 delete item;
154 updateActions();
155 if (!listWidgetNames->count())
156 listWidgetNames_currentItemChanged(NULL, NULL);
159 void CustomActionImpl::pushButtonMoveUp_clicked() {
161 QListWidgetItem* item = listWidgetNames->currentItem();
162 int row = listWidgetNames->row(item);
163 if (!item || row == 0)
164 return;
166 item = listWidgetNames->takeItem(row);
167 listWidgetNames->insertItem(row - 1, item);
168 updateActions();
169 listWidgetNames->setCurrentItem(item);
172 void CustomActionImpl::pushButtonMoveDown_clicked() {
174 QListWidgetItem* item = listWidgetNames->currentItem();
175 int row = listWidgetNames->row(item);
176 if (!item || row == listWidgetNames->count() - 1)
177 return;
179 item = listWidgetNames->takeItem(row);
180 listWidgetNames->insertItem(row + 1, item);
181 updateActions();
182 listWidgetNames->setCurrentItem(item);
185 void CustomActionImpl::textEditAction_textChanged() {
187 QListWidgetItem* item = listWidgetNames->currentItem();
188 if (item) {
189 QSettings s;
190 QString key(ACT_GROUP_KEY + item->text() + ACT_TEXT_KEY);
191 s.setValue(key, textEditAction->toPlainText());
195 void CustomActionImpl::checkBoxRefreshAfterAction_toggled(bool b) {
197 QListWidgetItem* item = listWidgetNames->currentItem();
198 if (item) {
199 QString flags(ACT_GROUP_KEY + item->text() + ACT_FLAGS_KEY);
200 setFlag(ACT_REFRESH_F, b, flags);
204 void CustomActionImpl::checkBoxAskArgs_toggled(bool b) {
206 QListWidgetItem* item = listWidgetNames->currentItem();
207 if (item) {
208 QString flags(ACT_GROUP_KEY + item->text() + ACT_FLAGS_KEY);
209 setFlag(ACT_CMD_LINE_F, b, flags);
213 void CustomActionImpl::pushButtonOk_clicked() {
215 close();