1 /***************************************************************************
2 * *
3 * copyright : (C) 2007 The University of Toronto *
4 * netterfield@astro.utoronto.ca *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 ***************************************************************************/
12
13 #include "contenttab.h"
14
15 #include "objectstore.h"
16 #include "relation.h"
17 #include "dialoglauncher.h"
18 #include "geticon.h"
19
20 #include <qdebug.h>
21
22 namespace Kst {
23
ContentTab(QWidget * parent,ObjectStore * store)24 ContentTab::ContentTab(QWidget *parent, ObjectStore *store)
25 : DialogTab(parent), _store(store) {
26
27 setupUi(this);
28
29 _up->setIcon(KstGetIcon("kst_uparrow"));
30 _down->setIcon(KstGetIcon("kst_downarrow"));
31 _add->setIcon(KstGetIcon("kst_rightarrow"));
32 _remove->setIcon(KstGetIcon("kst_leftarrow"));
33 _up->setToolTip(tr("Raise in plot order: Alt+Up"));
34 _down->setToolTip(tr("Lower in plot order: Alt+Down"));
35 _add->setToolTip(tr("Select: Alt+s"));
36 _remove->setToolTip(tr("Remove: Alt+r"));
37
38
39 connect(_add, SIGNAL(clicked()), this, SLOT(addButtonClicked()));
40 connect(_remove, SIGNAL(clicked()), this, SLOT(removeButtonClicked()));
41 connect(_up, SIGNAL(clicked()), this, SLOT(upButtonClicked()));
42 connect(_down, SIGNAL(clicked()), this, SLOT(downButtonClicked()));
43
44 connect(_add, SIGNAL(clicked()), this, SIGNAL(modified()));
45 connect(_remove, SIGNAL(clicked()), this, SIGNAL(modified()));
46 connect(_up, SIGNAL(clicked()), this, SIGNAL(modified()));
47 connect(_down, SIGNAL(clicked()), this, SIGNAL(modified()));
48
49 connect(_availableRelationList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(availableDoubleClicked(QListWidgetItem*)));
50 connect(_displayedRelationList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(displayedDoubleClicked(QListWidgetItem*)));
51
52 connect(_availableRelationList, SIGNAL(itemSelectionChanged()), this, SLOT(updateButtons()));
53 connect(_displayedRelationList, SIGNAL(itemSelectionChanged()), this, SLOT(updateButtons()));
54
55 connect(_editSelectedAvailable, SIGNAL(clicked()), this, SLOT(editSelectedAvailable()));
56 connect(_editSelectedDisplayed, SIGNAL(clicked()), this, SLOT(editSelectedDisplayed()));
57 connect(_curveSearchEntry, SIGNAL(textChanged(QString)), this, SLOT(filterCurves(QString)));
58 connect(_curveSearch, SIGNAL(clicked()), this, SLOT(searchCurves()));
59
60 }
61
62
~ContentTab()63 ContentTab::~ContentTab() {
64 }
65
editSelectedAvailable()66 void ContentTab::editSelectedAvailable() {
67 QList<QListWidgetItem *> selected = _availableRelationList->selectedItems();
68
69 if (selected.count()>1) {
70 QList<ObjectPtr> objects;
71 int n = selected.count();
72 for (int i=0; i<n; i++) {
73 objects.append(_store->retrieveObject(selected.at(i)->text()));
74 }
75 DialogLauncher::self()->showMultiObjectDialog(objects);
76 } else if (selected.count() > 0) {
77 QString name = selected.at(0)->text();
78 RelationPtr relation = kst_cast<Relation>(_store->retrieveObject(name));
79 DialogLauncher::self()->showObjectDialog(relation);
80 }
81 }
82
editSelectedDisplayed()83 void ContentTab::editSelectedDisplayed() {
84 QList<QListWidgetItem *> selected = _displayedRelationList->selectedItems();
85
86
87 if (selected.count()>1) {
88 QList<ObjectPtr> objects;
89 int n = selected.count();
90 for (int i=0; i<n; i++) {
91 objects.append(_store->retrieveObject(selected.at(i)->text()));
92 }
93 DialogLauncher::self()->showMultiObjectDialog(objects);
94 } else if (selected.count() > 0) {
95 QString name = selected.at(0)->text();
96 RelationPtr relation = kst_cast<Relation>(_store->retrieveObject(name));
97 DialogLauncher::self()->showObjectDialog(relation);
98 }
99 }
100
updateButtons()101 void ContentTab::updateButtons() {
102
103 QList<QListWidgetItem *> displayedItems = _displayedRelationList->selectedItems();
104 QListWidgetItem *displayedItem = 0;
105
106 if (displayedItems.count() > 0)
107 displayedItem = displayedItems.first();
108
109 _remove->setEnabled(displayedItems.count() > 0);
110
111 _up->setEnabled(_displayedRelationList->row(displayedItem) > 0);
112 _down->setEnabled(_displayedRelationList->row(displayedItem) >= 0 && _displayedRelationList->row(displayedItem) < (int)_displayedRelationList->count() - 1);
113
114 _add->setEnabled(_availableRelationList->selectedItems().count() > 0);
115 }
116
117
removeButtonClicked()118 void ContentTab::removeButtonClicked() {
119 foreach (QListWidgetItem* item, _displayedRelationList->selectedItems()) {
120 _availableRelationList->addItem(_displayedRelationList->takeItem(_displayedRelationList->row(item)));
121 }
122
123 _availableRelationList->clearSelection();
124 updateButtons();
125 }
126
127
displayedDoubleClicked(QListWidgetItem * item)128 void ContentTab::displayedDoubleClicked(QListWidgetItem * item) {
129 if (item) {
130 _availableRelationList->addItem(_displayedRelationList->takeItem(_displayedRelationList->row(item)));
131 _availableRelationList->clearSelection();
132 emit modified();
133 updateButtons();
134 }
135 }
136
137
addButtonClicked()138 void ContentTab::addButtonClicked() {
139 foreach (QListWidgetItem* item, _availableRelationList->selectedItems()) {
140 _displayedRelationList->addItem(_availableRelationList->takeItem(_availableRelationList->row(item)));
141 }
142 _displayedRelationList->clearSelection();
143 updateButtons();
144 }
145
146
availableDoubleClicked(QListWidgetItem * item)147 void ContentTab::availableDoubleClicked(QListWidgetItem * item) {
148 if (item) {
149 _displayedRelationList->addItem(_availableRelationList->takeItem(_availableRelationList->row(item)));
150 _displayedRelationList->clearSelection();
151 emit modified();
152 updateButtons();
153 }
154 }
155
156
upButtonClicked()157 void ContentTab::upButtonClicked() {
158 _displayedRelationList->setFocus();
159
160 int i = _displayedRelationList->currentRow();
161 if (i != -1) {
162 QListWidgetItem *item = _displayedRelationList->takeItem(i);
163 _displayedRelationList->insertItem(i-1, item);
164 _displayedRelationList->clearSelection();
165 _displayedRelationList->setCurrentItem(item);
166 //item->setSelected(true);
167 updateButtons();
168 }
169 }
170
171
downButtonClicked()172 void ContentTab::downButtonClicked() {
173 _displayedRelationList->setFocus();
174 // move item down
175 int i = _displayedRelationList->currentRow();
176 if (i != -1) {
177 QListWidgetItem *item = _displayedRelationList->takeItem(i);
178 _displayedRelationList->insertItem(i+1, item);
179 _displayedRelationList->clearSelection();
180 _displayedRelationList->setCurrentItem(item);
181 //item->setSelected(true);
182 updateButtons();
183 }
184 }
185
186
setDisplayedRelations(QStringList displayedRelations,QStringList displayedRelationTips)187 void ContentTab::setDisplayedRelations(QStringList displayedRelations, QStringList displayedRelationTips) {
188 _displayedRelationList->clear();
189 _displayedRelationList->addItems(displayedRelations);
190 for (int i=0; i<_displayedRelationList->count(); i++) {
191 _displayedRelationList->item(i)->setToolTip(displayedRelationTips.at(i));
192 }
193 }
194
195
setAvailableRelations(QStringList availableRelations,QStringList availableRelationTips)196 void ContentTab::setAvailableRelations(QStringList availableRelations, QStringList availableRelationTips) {
197 _availableRelationList->clear();
198 _availableRelationList->addItems(availableRelations);
199 for (int i=0; i<_availableRelationList->count(); i++) {
200 _availableRelationList->item(i)->setToolTip(availableRelationTips.at(i));
201 }
202 }
203
204
displayedRelations()205 QStringList ContentTab::displayedRelations() {
206 QStringList relations;
207 for (int i = 0; i < _displayedRelationList->count(); i++) {
208 relations.append(_displayedRelationList->item(i)->text());
209 }
210 return relations;
211 }
212
addObject(QString x)213 void ContentTab::addObject(QString x) {
214 for(int i=0;i<_availableRelationList->count();i++) {
215 if(_availableRelationList->item(i)->text().contains(x)) {
216 _displayedRelationList->addItem(_availableRelationList->takeItem(i));
217 return;
218 }
219 }
220 }
221
removeObject(QString x)222 void ContentTab::removeObject(QString x) {
223 for(int i=0;i<_displayedRelationList->count();i++) {
224 if(_displayedRelationList->item(i)->text().contains(x)) {
225 _availableRelationList->addItem(_displayedRelationList->takeItem(i));
226 return;
227 }
228 }
229 }
230
filterCurves(const QString & filter)231 void ContentTab::filterCurves(const QString &filter) {
232 _availableRelationList->clearSelection();
233
234 if (filter=="*") { // optimization
235 _availableRelationList->selectAll();
236 return;
237 }
238
239 QRegExp re(filter, Qt::CaseSensitive, QRegExp::Wildcard);
240 QStringList selected;
241
242 for (int i = 0; i < _availableRelationList->count(); i++) {
243 QListWidgetItem *item = _availableRelationList->item(i);
244 if (re.exactMatch(item->text())) {
245 item = _availableRelationList->takeItem(i);
246 selected.append(item->text());
247 i--;
248 }
249 }
250
251 _availableRelationList->insertItems(0, selected);
252
253 // special case optimization:
254 // selecting and unselecting individual items is expensive,
255 // but selecting all of them is fast,
256 // so either select or select all, then unselect, which ever is fewer.
257 if (selected.count() > _availableRelationList->count()/2) {
258 _availableRelationList->selectAll();
259 for (int i=selected.count(); i<_availableRelationList->count(); i++) {
260 _availableRelationList->item(i)->setSelected(false);
261 }
262 } else {
263 for (int i=0; i<selected.count(); i++) {
264 _availableRelationList->item(i)->setSelected(true);
265 }
266 }
267
268 if (selected.count()>0) {
269 _availableRelationList->scrollToTop();
270 }
271
272 }
273
searchCurves()274 void ContentTab::searchCurves() {
275 QString s = _curveSearchEntry->text();
276 if (!s.isEmpty()) {
277 if (s[0] != '*') {
278 s = '*' + s;
279 }
280 if (s[s.length()-1] != '*') {
281 s += '*';
282 }
283 _curveSearchEntry->setText(s);
284 }
285 }
286
287 }
288
289 // vim: ts=2 sw=2 et
290