1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
|
/*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
*/
/*
Copyright (C) 2006 Dario Abatianni <eisfuchs@tigress.com>
*/
#include "watchednicknames_preferences.h"
#include "watchednicknames_preferencesui.h"
#include "config/preferences.h"
#include "konversationapplication.h"
#include "konversationmainwindow.h"
#include "valuelistviewitem.h"
#include <tqlabel.h>
#include <tqcombobox.h>
#include <tqcheckbox.h>
#include <kapplication.h>
#include <kconfig.h>
#include <kpushbutton.h>
#include <klineedit.h>
#include <klocale.h>
#include <kdebug.h>
WatchedNicknames_Config::WatchedNicknames_Config(TQWidget *parent, const char *name)
: WatchedNicknames_ConfigUI(parent, name)
{
notifyListView->setRenameable(0,false);
notifyListView->setSorting(-1);
// reset flag to defined state (used to block signals when just selecting a new item)
newItemSelected=false;
loadSettings();
connect(kcfg_UseNotify,TQT_SIGNAL (toggled(bool)),this,TQT_SLOT (checkIfEmptyListview(bool)) );
connect(newButton,TQT_SIGNAL (clicked()),this,TQT_SLOT (newNotify()) );
connect(removeButton,TQT_SIGNAL (clicked()),this,TQT_SLOT (removeNotify()) );
connect(notifyListView,TQT_SIGNAL (selectionChanged(TQListViewItem*)),this,TQT_SLOT (entrySelected(TQListViewItem*)) );
connect(notifyListView,TQT_SIGNAL (clicked(TQListViewItem*)),this,TQT_SLOT (entrySelected(TQListViewItem*)) );
connect(networkDropdown,TQT_SIGNAL (activated(const TQString&)),this,TQT_SLOT (networkChanged(const TQString&)) );
connect(nicknameInput,TQT_SIGNAL (textChanged(const TQString&)),this,TQT_SLOT (nicknameChanged(const TQString&)) );
connect(KonversationApplication::instance(), TQT_SIGNAL(serverGroupsChanged(const Konversation::ServerGroupSettings*)),
this, TQT_SLOT(updateNetworkNames()));
}
WatchedNicknames_Config::~WatchedNicknames_Config()
{
}
void WatchedNicknames_Config::restorePageToDefaults()
{
}
// fill in the notify listview with groups and nicknames
void WatchedNicknames_Config::loadSettings()
{
// cleanup, so we won't add duplicate items
notifyListView->clear();
networkDropdown->clear();
// make sure all widgets are disabled
notifyListView->clearSelection();
enableEditWidgets(false);
// get list of server networks
Konversation::ServerGroupList serverGroupList = Preferences::serverGroupList();
// iterate through all networks in the server group list
for(unsigned int gIndex=0;gIndex<serverGroupList.count();gIndex++)
{
// add server group branch to the notify listview so we can add notify items
addNetworkBranch(serverGroupList[gIndex]);
}
// remember current list for hasChanged()
m_oldNotifyList=currentNotifyList();
}
// adds a new network branch to the listview
void WatchedNicknames_Config::addNetworkBranch(Konversation::ServerGroupSettingsPtr serverGroupList)
{
// get the current notify list and an iterator
TQMap<int, TQStringList> notifyList = Preferences::notifyList();
ValueListViewItem* groupItem=new ValueListViewItem(serverGroupList->id(),notifyListView,notifyListView->lastChild(),serverGroupList->name());
// get the group iterator to find all servers in the group
TQMapConstIterator<int, TQStringList> groupIt=notifyList.find(serverGroupList->id());
// get list of nicks for the current group
TQStringList nicks=groupIt.data();
// add group to dropdown list
networkDropdown->insertItem(serverGroupList->name(),0);
// add nicknames to group branch (reverse order again)
for(unsigned int index=nicks.count();index;index--)
{
new KListViewItem(groupItem,nicks[index-1]);
} // for
// unfold group branch
notifyListView->setOpen(groupItem,true);
}
// save list of notifies permanently, taken from the listview
void WatchedNicknames_Config::saveSettings()
{
// create new in-memory notify structure
TQMap<int,TQStringList> notifyList;
// get first notify group
KListView* listView=notifyListView;
TQListViewItem* group=listView->firstChild();
// loop as long as there are more groups in the listview
while(group)
{
int groupId=static_cast<ValueListViewItem*>(group)->getValue();
// later contains all nicks separated by blanks
TQString nicks;
// get first nick in the group
TQListViewItem* nick=group->firstChild();
// loop as long as there are still nicks in this group
while(nick)
{
// add nick to string container and add a blank
nicks+=nick->text(0)+' ';
// get next nick in the group
nick=nick->nextSibling();
} // while
// write nick list to in-memory notify qstringlist
notifyList.insert(groupId,TQStringList::split(' ',nicks.stripWhiteSpace()));
// get next group
group=group->nextSibling();
} // while
// update in-memory notify list
Preferences::setNotifyList(notifyList);
static_cast<KonversationApplication*>(kapp)->saveOptions(false);
// remember current list for hasChanged()
m_oldNotifyList=currentNotifyList();
}
// returns the currently edited notify list
TQStringList WatchedNicknames_Config::currentNotifyList()
{
// prepare list
TQStringList newList;
// get first item
KListView* listView=notifyListView;
TQListViewItem* item=listView->firstChild();
// loop as long as there are more groups in the listview
while(item)
{
newList.append(item->text(0));
item=item->itemBelow();
} // while
// return list
return newList;
}
bool WatchedNicknames_Config::hasChanged()
{
// return true if something has changed
return(m_oldNotifyList!=currentNotifyList());
}
// slots
void WatchedNicknames_Config::updateNetworkNames()
{
// get first notify group
KListView* listView=notifyListView;
TQListViewItem* group=listView->firstChild();
// make sure all widgets are disabled
listView->clearSelection();
enableEditWidgets(false);
// kill dropdown list, the networks might have been renamed
networkDropdown->clear();
// loop as long as there are more groups in the listview
while(group)
{
// get the group id from the listview item
int groupId=static_cast<ValueListViewItem*>(group)->getValue();
// get the name of the group by having a look at the serverGroupSettings
Konversation::ServerGroupSettingsPtr serverGroup=Preferences::serverGroupById(groupId);
// check if the server group still exists
if(serverGroup)
{
// get the new name of the server group
TQString serverGroupName=serverGroup->name();
// update the name of the group in the listview
group->setText(0,serverGroupName);
// re-add group to dropdown list
networkDropdown->insertItem(serverGroupName,-1);
// get next group
group=group->nextSibling();
}
else
{
// get the next group from the listview
TQListViewItem* tmp=group->nextSibling();
// remove the group
delete group;
// set the current group
group=tmp;
}
} // while
// get list of server networks
Konversation::ServerGroupList serverGroupList = Preferences::serverGroupList();
// iterate through all networks in the server group list in reverse order
// to find if any new networks have been added
for(unsigned int gIndex=serverGroupList.count();gIndex;gIndex--)
{
// try to find the network id in the listview
if(!getItemById(listView,serverGroupList[gIndex-1]->id()))
// add new server group branch to the notify listview
addNetworkBranch(serverGroupList[gIndex-1]);
}
// remember current list for hasChanged()
m_oldNotifyList=currentNotifyList();
}
// check if an item with the given id exists in the listview
TQListViewItem* WatchedNicknames_Config::getItemById(TQListView* listView,int id)
{
// get the first item in the listview
TQListViewItem* lookItem=listView->firstChild();
// look for an item with the given id
while(lookItem)
{
// return item if it matches
if(static_cast<ValueListViewItem*>(lookItem)->getValue()==id) return lookItem;
// otherwise jump to the next group
lookItem=lookItem->nextSibling();
} // while
// not found, return 0
return 0;
}
// helper function to disable "New" button on empty listview
void WatchedNicknames_Config::checkIfEmptyListview(bool state)
{
// only enable "New" button if there is at least one group in the list
if(!notifyListView->childCount()) state=false;
newButton->setEnabled(state);
}
// add new notify entry
void WatchedNicknames_Config::newNotify()
{
// get listview object and possible first selected item
KListView* listView=notifyListView;
TQListViewItem* item=listView->selectedItem();
// if there was an item selected, try to find the group it belongs to,
// so the newly created item will go into the same group, otherwise
// just create the new entry inside of the first group
if(item)
{
if(item->parent()) item=item->parent();
}
else
item=listView->firstChild();
// finally insert new item
item=new TQListViewItem(item,i18n("New"));
// make this item the current and selected item
item->setSelected(true);
listView->setCurrentItem(item);
// update network and nickname inputs
entrySelected(item);
// unfold group branch in case it was empty before
listView->ensureItemVisible(item);
nicknameInput->setFocus();
nicknameInput->selectAll();
// tell the config system that something has changed
emit modified();
}
// remove a notify entry from the listview
void WatchedNicknames_Config::removeNotify()
{
// get listview pointer and the selected item
KListView* listView=notifyListView;
TQListViewItem* item=listView->selectedItem();
// sanity check
if(item)
{
// check which item to highlight after we deleted the chosen one
TQListViewItem* itemAfter=item->itemBelow();
if(!itemAfter) itemAfter=item->itemAbove();
delete(item);
// if there was an item, highlight it
if(itemAfter)
{
itemAfter->setSelected(true);
listView->setCurrentItem(itemAfter);
// update input widgets
entrySelected(itemAfter);
}
// tell the config system that something has changed
emit modified();
}
}
// what to do when the user selects an entry
void WatchedNicknames_Config::entrySelected(TQListViewItem* notifyEntry)
{
// play it safe, assume disabling all widgets first
bool enabled=false;
// if there actually was an entry selected ...
if(notifyEntry)
{
// is this entry a nickname?
TQListViewItem* group=notifyEntry->parent();
if(group)
{
// all edit widgets may be enabled
enabled=true;
// tell all now emitted signals that we just clicked on a new item, so they should
// not emit the modified() signal.
newItemSelected=true;
// copy network name and nickname to edit widgets
nicknameInput->setText(notifyEntry->text(0));
networkDropdown->setCurrentText(group->text(0));
// all signals will now emit the modified() signal again
newItemSelected=false;
}
}
enableEditWidgets(enabled);
}
// enable/disable edit widgets
void WatchedNicknames_Config::enableEditWidgets(bool enabled)
{
removeButton->setEnabled(enabled);
networkLabel->setEnabled(enabled);
networkDropdown->setEnabled(enabled);
nicknameLabel->setEnabled(enabled);
nicknameInput->setEnabled(enabled);
}
// user changed the network this nickname is on
void WatchedNicknames_Config::networkChanged(const TQString& newNetwork)
{
// get listview pointer and selected entry
KListView* listView=notifyListView;
TQListViewItem* item=listView->selectedItem();
// sanity check
if(item)
{
// get group the nickname is presently associated to
TQListViewItem* group=item->parent();
// did the user actually change anything?
if(group && group->text(0)!=newNetwork)
{
// find the branch the new network is in
TQListViewItem* lookGroup=listView->firstChild();
while(lookGroup && (lookGroup->text(0)!=newNetwork)) lookGroup=lookGroup->nextSibling();
// if it was found (should never fail)
if(lookGroup)
{
// deselect nickname, unlink it and relink it to the new network
item->setSelected(false);
group->takeItem(item);
lookGroup->insertItem(item);
// make the moved nickname current and selected item
item->setSelected(true);
listView->setCurrentItem(item);
// unfold group branch in case it was empty before
listView->setOpen(lookGroup,true);
// tell the config system that something has changed
if(!newItemSelected) emit modified();
}
}
}
}
// the user edited the nickname
void WatchedNicknames_Config::nicknameChanged(const TQString& newNickname)
{
// get listview pointer and selected item
KListView* listView=notifyListView;
TQListViewItem* item=listView->selectedItem();
// sanity check
if(item)
{
// rename item
item->setText(0,newNickname);
// tell the config system that something has changed
if(!newItemSelected) emit modified();
}
}
#include "watchednicknames_preferences.moc"
|