1
/* Copyright (C) 2009 Michael Jansen <kde@michael-jansen.biz>
3
This library is free software; you can redistribute it and/or
4
modify it under the terms of the GNU Library General Public
5
License as published by the Free Software Foundation; either
6
version 2 of the License, or (at your option) any later version.
8
This library is distributed in the hope that it will be useful,
9
but WITHOUT ANY WARRANTY; without even the implied warranty of
10
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
Library General Public License for more details.
13
You should have received a copy of the GNU Library General Public License
14
along with this library; see the file COPYING.LIB. If not, write to
15
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16
Boston, MA 02110-1301, USA.
19
#include "conditions/conditions_widget.h"
20
#include "conditions/conditions_list_base.h"
21
#include "conditions/conditions_list.h"
22
#include "conditions/condition.h"
23
#include "conditions/conditions.h"
24
#include "conditions/conditions_visitor.h"
25
#include "conditions/existing_window_condition.h"
26
#include "conditions/active_window_condition.h"
28
#include "windows_helper/window_selection_list.h"
30
#include "helper_widgets/window_definition_list_widget.h"
32
#include "condition_type_menu.h"
34
#include <QtCore/QStack>
38
class BuildTree : public KHotKeys::ConditionsVisitor
42
BuildTree(QTreeWidget *tree);
46
virtual void visitConditionsListBase(KHotKeys::Condition_list_base *list);
47
virtual void visitConditionsList(KHotKeys::Condition_list *list);
48
virtual void visitCondition( KHotKeys::Condition *condition );
50
QMap<QTreeWidgetItem*, KHotKeys::Condition*> _items;
54
QStack<QTreeWidgetItem*> _stack;
58
BuildTree::BuildTree( QTreeWidget *tree )
61
_stack.push(_tree->invisibleRootItem());
65
void BuildTree::visitCondition(KHotKeys::Condition *cond)
67
QTreeWidgetItem *item = new QTreeWidgetItem(_stack.top());
68
item->setText(0, cond->description());
69
_items.insert(item, cond);
73
void BuildTree::visitConditionsList(KHotKeys::Condition_list *list)
75
Q_ASSERT(_stack.count()==1);
77
QTreeWidgetItem *parent = _stack.top();
79
QTreeWidgetItem *item = new QTreeWidgetItem(parent);
80
item->setText(0, i18nc("Add a new condition", "And"));
81
_items.insert(item, list);
84
for(KHotKeys::Condition_list_base::Iterator it = list->begin();
95
void BuildTree::visitConditionsListBase(KHotKeys::Condition_list_base *list)
97
QTreeWidgetItem *parent = _stack.top();
99
QTreeWidgetItem *item = new QTreeWidgetItem(parent);
100
item->setText(0, list->description());
101
_items.insert(item, list);
104
for(KHotKeys::Condition_list_base::Iterator it = list->begin();
108
// QTreeWidgetItem *child = new QTreeWidgetItem(item);
109
// child->setText(0, (*it)->description());
110
// _items.insert(child, list);
118
ConditionsWidget::ConditionsWidget(QWidget *parent)
125
connect(ui.edit_button, SIGNAL(clicked(bool)),
128
connect(ui.delete_button, SIGNAL(clicked(bool)),
131
ui.new_button->setMenu(new ConditionTypeMenu(this));
132
connect(ui.new_button->menu(), SIGNAL(triggered(QAction*)),
133
SLOT(slotNew(QAction*)));
137
ConditionsWidget::~ConditionsWidget()
139
delete _working; _working = NULL;
143
void ConditionsWidget::copyFromObject()
145
Q_ASSERT(_conditions_list);
147
// Clear the tree and delete our old working copy
149
if (_working) delete _working;
151
// Create the working copy
152
_working = _conditions_list->copy();
153
Q_ASSERT(_working->count() == _conditions_list->count());
155
kDebug() << _working->count();
156
kDebug() << _conditions_list->count();
159
BuildTree builder(ui.tree);
160
_working->visit(&builder);
161
_items = builder._items;
167
void ConditionsWidget::copyToObject()
171
Q_ASSERT(_conditions_list);
172
if (!_conditions_list) return;
174
// Just copy the content from our working copy to the original
176
// Remove the old content
177
qDeleteAll(*_conditions_list);
178
_conditions_list->clear();
180
for (KHotKeys::Condition_list::Iterator it = _working->begin();
181
it != _working->end();
185
_conditions_list->append((*it)->copy());
188
Q_ASSERT(_working->count() == _conditions_list->count());
193
void ConditionsWidget::emitChanged(bool chgd)
195
if (_changed == ( chgd || _changed ))
198
// Once changed always changed
199
_changed = chgd || _changed;
201
emit changed(_changed);
205
bool ConditionsWidget::hasChanges() const
211
void ConditionsWidget::setConditionsList( KHotKeys::Condition_list *list)
214
_conditions_list = list;
218
void ConditionsWidget::slotDelete()
220
QTreeWidgetItem *citem = ui.tree->currentItem();
222
// If no item is selected just return
225
// TODO: Ask for confirmation before deleting
227
// Get the currently select condition
228
KHotKeys::Condition *cond = _items.value(citem);
230
// Do not allow deleting the root item
231
if (cond==_working) return;
239
void ConditionsWidget::slotEdit()
241
// Get the currently select condition
242
QTreeWidgetItem *citem = ui.tree->currentItem();
244
// If no item is selected just return
247
KHotKeys::Condition *cond = _items.value(citem);
249
// Currently we only allow editing existing and active window conditions.
250
// TODO: Disable buttons according to active item
252
KHotKeys::Existing_window_condition *ewcond =
253
dynamic_cast<KHotKeys::Existing_window_condition*>(cond);
256
WindowDefinitionListDialog dialog(ewcond->window());
257
switch (dialog.exec())
259
case QDialog::Accepted:
261
citem->setText(0, ewcond->description());
266
case QDialog::Rejected:
276
KHotKeys::Active_window_condition *awcond =
277
dynamic_cast<KHotKeys::Active_window_condition*>(cond);
280
WindowDefinitionListDialog dialog(awcond->window());
281
switch (dialog.exec())
283
case QDialog::Accepted:
285
citem->setText(0, awcond->description());
290
case QDialog::Rejected:
304
void ConditionsWidget::slotNew(QAction* action)
306
QTreeWidgetItem *citem = ui.tree->currentItem();
308
KHotKeys::Condition *cond;
311
// If no item is selected create the new condition as a top level
314
citem = ui.tree->invisibleRootItem()->child(0);
319
// Get the currently select condition
320
cond = _items.value(citem);
323
// get the nearest list
324
KHotKeys::Condition_list_base *parent = dynamic_cast<KHotKeys::Condition_list_base*>(cond);
328
parent = cond->parent();
329
citem = citem->parent();
334
switch (action->data().toInt())
336
case ConditionTypeMenu::ACTIVE_WINDOW:
338
KHotKeys::Windowdef_list *list = new KHotKeys::Windowdef_list();
339
WindowDefinitionListDialog dialog(list);
340
switch (dialog.exec())
342
case QDialog::Accepted:
344
KHotKeys::Active_window_condition *cond =
345
new KHotKeys::Active_window_condition(list, parent);
346
QTreeWidgetItem *item = new QTreeWidgetItem(citem);
347
item->setText(0, cond->description());
348
_items.insert(item, cond);
352
case QDialog::Rejected:
364
case ConditionTypeMenu::EXISTING_WINDOW:
366
KHotKeys::Windowdef_list *list = new KHotKeys::Windowdef_list();
367
WindowDefinitionListDialog dialog(list);
368
switch (dialog.exec())
370
case QDialog::Accepted:
372
KHotKeys::Existing_window_condition *cond =
373
new KHotKeys::Existing_window_condition(list, parent);
374
QTreeWidgetItem *item = new QTreeWidgetItem(citem);
375
item->setText(0, cond->description());
376
_items.insert(item, cond);
380
case QDialog::Rejected:
392
case ConditionTypeMenu::AND:
394
KHotKeys::And_condition *cond = new KHotKeys::And_condition(parent);
395
QTreeWidgetItem *item = new QTreeWidgetItem(citem);
396
item->setText(0, cond->description());
397
_items.insert(item, cond);
401
case ConditionTypeMenu::OR:
403
KHotKeys::Or_condition *cond = new KHotKeys::Or_condition(parent);
404
QTreeWidgetItem *item = new QTreeWidgetItem(citem);
405
item->setText(0, cond->description());
406
_items.insert(item, cond);
410
case ConditionTypeMenu::NOT:
412
KHotKeys::Not_condition *cond = new KHotKeys::Not_condition(parent);
413
QTreeWidgetItem *item = new QTreeWidgetItem(citem);
414
item->setText(0, cond->description());
415
_items.insert(item, cond);
427
#include "moc_conditions_widget.cpp"