~ubuntu-branches/ubuntu/maverick/qgo/maverick

« back to all changes in this revision

Viewing changes to src/tables.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Martin A. Godisch
  • Date: 2005-01-01 23:07:10 UTC
  • Revision ID: james.westby@ubuntu.com-20050101230710-fhng6yidm47xlb2i
Tags: upstream-1.0.0-r2
ImportĀ upstreamĀ versionĀ 1.0.0-r2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *   tables.cpp = part of mainwindow
 
3
 */
 
4
#include "talk_gui.h"
 
5
#include "tables.h"
 
6
#include "mainwin.h"
 
7
#include "maintable.h"
 
8
#include "playertable.h"
 
9
#include "gamestable.h"
 
10
#include "gs_globals.h"
 
11
#include <qlineedit.h>
 
12
//#include <qmultilineedit.h>
 
13
//#include <qtextedit.h>
 
14
#include <qtextbrowser.h> 
 
15
#include <qlayout.h>
 
16
#include <qwidget.h>
 
17
#include <math.h>
 
18
#include <qtooltip.h>
 
19
#include <qpalette.h>
 
20
 
 
21
 
 
22
// prepare tables (clear, ...)
 
23
void ClientWindow::prepare_tables(InfoType cmd)
 
24
{
 
25
        switch (cmd)
 
26
        {
 
27
                case WHO: // delete player table
 
28
                {
 
29
                        QListViewItemIterator lv(ListView_players);
 
30
                        for (QListViewItem *lvi; (lvi = lv.current());)
 
31
                        {
 
32
                                lv++;
 
33
                                delete lvi;
 
34
                        }
 
35
 
 
36
                        // set number of players to 0
 
37
                        myAccount->num_players = 0;
 
38
                        myAccount->num_watchedplayers = 0;
 
39
                        // use this for fast filling
 
40
                        playerListEmpty = true;
 
41
                        statusUsers->setText(" P: 0 / 0 ");
 
42
                        break;
 
43
                }
 
44
 
 
45
                case GAMES: // delete games table
 
46
                {
 
47
                        QListViewItemIterator lv(ListView_games);
 
48
                        for (QListViewItem *lvi; (lvi = lv.current());)
 
49
                        {
 
50
                                lv++;
 
51
                                delete lvi;
 
52
                        }
 
53
 
 
54
                        // set number of games to 0
 
55
                        myAccount->num_games = 0;
 
56
                        statusGames->setText(" G: 0 / 0 ");
 
57
                        break;
 
58
                }
 
59
 
 
60
                case CHANNELS:
 
61
                {
 
62
                        // delete channel info
 
63
                        channellist.clear();
 
64
                        statusChannel->setText("");
 
65
/*                      QListViewItemIterator lv(ListView_ch);
 
66
                        for (QListViewItem *lvi; (lvi = lv.current());)
 
67
                        {
 
68
                                lv++;
 
69
                                delete lvi;
 
70
                        }*/
 
71
                        // delete tooltips too
 
72
                        QToolTip::remove(statusChannel);
 
73
                        QToolTip::add(statusChannel, tr("Current channels and users"));
 
74
                        break;
 
75
                }
 
76
 
 
77
                default: // unknown command???
 
78
                        qWarning("unknown Command in 'prepare_tables()'");
 
79
                        break;
 
80
 
 
81
        }
 
82
}
 
83
 
 
84
// return the rank of a given name
 
85
QString ClientWindow::getPlayerRk(QString player)
 
86
{
 
87
        QListViewItemIterator lvp(ListView_players);
 
88
        QListViewItem *lvpi;
 
89
 
 
90
        // look for players in playerlist
 
91
        for (; (lvpi = lvp.current()); lvp++)
 
92
        {
 
93
                // check if names are identical
 
94
                if (lvpi->text(1) == player)
 
95
                {
 
96
                        return lvpi->text(2);
 
97
                }
 
98
        }
 
99
 
 
100
        return 0;
 
101
}
 
102
 
 
103
// check for exclude list entry of a given name
 
104
QString ClientWindow::getPlayerExcludeListEntry(QString player)
 
105
{
 
106
        QListViewItemIterator lvp(ListView_players);
 
107
        QListViewItem *lvpi;
 
108
 
 
109
        if (DODEBUG)
 
110
                qDebug(QString("getPlayerExcludeListEntry(%1)").arg(player));
 
111
 
 
112
        // look for players in playerlist
 
113
        for (; (lvpi = lvp.current()); lvp++)
 
114
        {
 
115
                // check if names are identical
 
116
                if (lvpi->text(1) == player)
 
117
                {
 
118
                        if (DODEBUG)
 
119
                                qDebug(QString("text(1) = %1, player = %2").arg(lvpi->text(1)).arg(player));
 
120
 
 
121
                        return lvpi->text(6);
 
122
                }
 
123
        }
 
124
 
 
125
        return 0;
 
126
}
 
127
 
 
128
// take a new game from parser
 
129
void ClientWindow::slot_game(Game* g)
 
130
{
 
131
        // insert into ListView
 
132
        QListViewItemIterator lv(ListView_games);
 
133
 
 
134
        if (g->running)
 
135
        {
 
136
                bool found = false;
 
137
                GamesTableItem *lvi_mem = NULL;
 
138
 
 
139
                // check if game already exists
 
140
                if (!playerListEmpty)
 
141
                {
 
142
                        QListViewItemIterator lvii = lv;
 
143
                        for (GamesTableItem *lvi; (lvi = static_cast<GamesTableItem*>(lvii.current())) && !found;)
 
144
                        {
 
145
                                lvii++;
 
146
                                // compare game id
 
147
                                if (lvi->text(0) == g->nr)
 
148
                                {
 
149
                                        found = true;
 
150
                                        lvi_mem = lvi;
 
151
                                }
 
152
                        }
 
153
                }
 
154
                else if (!g->H && !myAccount->num_games)
 
155
                {
 
156
                        // skip games until initial table has loaded
 
157
                        qDebug("game skipped because no init table");
 
158
                        return;
 
159
                }
 
160
 
 
161
                QString excludeMark = "";
 
162
                QString myMark = "B";
 
163
                
 
164
                // check if exclude entry is done later
 
165
                if (g->H) //g->status.length() > 1)
 
166
                {
 
167
                        QString emw;
 
168
                        QString emb;
 
169
 
 
170
                        // no: do it now
 
171
                        emw = getPlayerExcludeListEntry(g->wname);
 
172
                        emb = getPlayerExcludeListEntry(g->bname);
 
173
 
 
174
                        // ensure that my game is listed first
 
175
                        if (emw && emw == "M" || emb && emb == "M")
 
176
                        {
 
177
                                myMark = "A";
 
178
                                excludeMark = "M";
 
179
 
 
180
                                // I'm playing, thus I'm open, except teaching games
 
181
                                if (emw && emw && (emw != "M" || emb != "M"))
 
182
                                {
 
183
                                        // checkbox open
 
184
                                        slot_checkbox(0, true);
 
185
                                }
 
186
                        }
 
187
                        else if (emw && emw == "W" || emb && emb == "W")
 
188
                        {
 
189
                                excludeMark = "W";
 
190
                        }
 
191
                }
 
192
                
 
193
                if (found)
 
194
                {
 
195
                        // supersede entry
 
196
                        //lvi_mem->setText(0, g->nr);
 
197
                        lvi_mem->setText(1, g->wname);
 
198
                        lvi_mem->setText(2, g->wrank);
 
199
                        lvi_mem->setText(3, g->bname);
 
200
                        lvi_mem->setText(4, g->brank);
 
201
                        lvi_mem->setText(5, g->mv);
 
202
                        lvi_mem->setText(6, g->Sz);
 
203
                        lvi_mem->setText(7, g->H);
 
204
                        lvi_mem->setText(8, g->K);
 
205
                        lvi_mem->setText(9, g->By);
 
206
                        lvi_mem->setText(10, g->FR);
 
207
                        lvi_mem->setText(11, g->ob);
 
208
//                      lvi_mem->setText(6, g->status + " (" + g->ob + ")");
 
209
                        lvi_mem->setText(12, myMark + rkToKey(g->wrank) + g->wname.lower() + ":" + excludeMark);
 
210
 
 
211
                        lvi_mem->ownRepaint();
 
212
                }
 
213
                else
 
214
                {
 
215
                        // from GAMES command or game info{...}
 
216
 
 
217
                        if (g->H)
 
218
                        {
 
219
                                lv = new GamesTableItem(ListView_games,
 
220
                                        g->nr,
 
221
                                        g->wname,
 
222
                                        g->wrank,
 
223
                                        g->bname,
 
224
                                        g->brank,
 
225
                                        g->mv,
 
226
                                        g->Sz,
 
227
                                        g->H,
 
228
                                        g->K,
 
229
                                        g->By,
 
230
                                        g->FR,
 
231
                                        g->ob);
 
232
                        }
 
233
                        else
 
234
                        {
 
235
                                lv = new GamesTableItem(ListView_games,
 
236
                                        g->nr,
 
237
                                        g->wname,
 
238
                                        g->wrank,
 
239
                                        g->bname,
 
240
                                        g->brank,
 
241
                                        g->mv,
 
242
                                        g->Sz);
 
243
                        }
 
244
 
 
245
                        lv.current()->setText(12, myMark + rkToKey(g->wrank) + g->wname.lower() + ":" + excludeMark);
 
246
 
 
247
                        static_cast<GamesTableItem*>(lv.current())->ownRepaint();
 
248
 
 
249
                        // increase number of games
 
250
                        myAccount->num_games++;
 
251
                        statusGames->setText(" G: " + QString::number(myAccount->num_games) + " / " + QString::number(myAccount->num_observedgames) + " ");
 
252
                }
 
253
 
 
254
                // update player info if this is not a 'who'-result or if it's me
 
255
                if (!g->H || myMark == "A") //g->status.length() < 2)
 
256
                {
 
257
                        QListViewItemIterator lvp(ListView_players);
 
258
                        QListViewItem *lvpi;
 
259
                        int found = 0;
 
260
 
 
261
                        // look for players in playerlist
 
262
                        for (; (lvpi = lvp.current()) && found < 2;)
 
263
                        {
 
264
                                // check if names are identical
 
265
                                if (lvpi->text(1) == g->wname || lvpi->text(1) == g->bname)
 
266
                                {
 
267
                                        lvpi->setText(3, g->nr);
 
268
                                        found++;
 
269
 
 
270
                                        // check if players has a rank
 
271
                                        if (g->wrank == "??" || g->brank == "??")
 
272
                                        {
 
273
                                                // no rank given in case of continued game -> set rank in games table
 
274
                                                if (lvpi->text(1) == g->wname)
 
275
                                                {
 
276
                                                        lv.current()->setText(2, lvpi->text(2));
 
277
                                                        // correct sorting of col 2 -> set col 12
 
278
                                                        lv.current()->setText(12, myMark + rkToKey(lvpi->text(2)) + lvpi->text(1).lower() + ":" + excludeMark);
 
279
                                                }
 
280
 
 
281
                                                // no else case! bplayer could be identical to wplayer!
 
282
                                                if (lvpi->text(1) == g->bname)
 
283
                                                        lv.current()->setText(4, lvpi->text(2));
 
284
 
 
285
                                                static_cast<GamesTableItem*>(lv.current())->ownRepaint();
 
286
                                        }
 
287
                                }
 
288
 
 
289
                                lvp++;
 
290
                        }
 
291
 
 
292
                        ListView_games->sort();
 
293
                }
 
294
        }
 
295
        else
 
296
        {
 
297
                // from game info {...}
 
298
                bool found = false;
 
299
                QString game_id;
 
300
 
 
301
                if (g->nr != "@")
 
302
                {
 
303
                        for (QListViewItem *lvi; (lvi = lv.current()) && !found;)
 
304
                        {
 
305
                                lv++;
 
306
                                // compare game id
 
307
                                if (lvi->text(0) == g->nr)
 
308
                                {
 
309
                                        lv++;
 
310
                                        delete lvi;
 
311
                                        found = true;;
 
312
                                }
 
313
                        }
 
314
 
 
315
                        // used for player update below
 
316
                        game_id = g->nr;
 
317
                }
 
318
                else
 
319
                {
 
320
                        for (QListViewItem *lvi; (lvi = lv.current()) && !found;)
 
321
                        {
 
322
                                lv++;
 
323
                                // look for name
 
324
                                if (lvi->text(1) == myAccount->acc_name ||
 
325
                                    lvi->text(3) == myAccount->acc_name)
 
326
                                {
 
327
                                        // used for player update below
 
328
                                        game_id = lvi->text(0);
 
329
 
 
330
                                        lv++;
 
331
                                        delete lvi;
 
332
                                        found = true;;
 
333
                                }
 
334
                        }
 
335
                }
 
336
 
 
337
                if (!found)
 
338
                        qWarning("game not found");
 
339
                else
 
340
                {
 
341
                        // decrease number of games
 
342
                        myAccount->num_games--;
 
343
                        statusGames->setText(" G: " + QString::number(myAccount->num_games) + " / " + QString::number(myAccount->num_observedgames) + " ");
 
344
 
 
345
                        QListViewItemIterator lvp(ListView_players);
 
346
                        QListViewItem *lvpi;
 
347
                        int found = 0;
 
348
 
 
349
                        // look for players in playerlist
 
350
                        for (; (lvpi = lvp.current()) && found < 2;)
 
351
                        {
 
352
                                // check if numbers are identical
 
353
                                if (lvpi->text(3) == game_id)
 
354
                                {
 
355
                                        lvpi->setText(3, "-");
 
356
                                        found++;
 
357
                                }
 
358
 
 
359
                                lvp++;
 
360
                        }
 
361
                }
 
362
        }
 
363
}
 
364
 
 
365
// take a new player from parser
 
366
void ClientWindow::slot_player(Player *p, bool cmdplayers)
 
367
{
 
368
        // insert into ListView
 
369
 
 
370
        QListViewItemIterator lv(ListView_players);  
 
371
 
 
372
        QPoint pp(0,0);
 
373
        QListViewItem *topViewItem = ListView_players->itemAt(pp);
 
374
        bool deleted_topViewItem = false;
 
375
  
 
376
        if (p->online)
 
377
        {
 
378
                // check if it's an empty list, i.e. all items deleted before
 
379
                if (cmdplayers && !playerListEmpty)
 
380
                {
 
381
                        for (PlayerTableItem *lvi; (lvi = static_cast<PlayerTableItem*>(lv.current()));)
 
382
                        {
 
383
                                lv++;
 
384
                                // compare names
 
385
                                if (lvi->text(1) == p->name)
 
386
                                {
 
387
                                        // check if new player info is less than old
 
388
                                        if (p->info != "??")
 
389
                                        {
 
390
                                                // new entry has more info
 
391
                                                lvi->setText(0, p->info);
 
392
                                                //p->name,
 
393
                                                lvi->setText(2, p->rank);
 
394
                                                lvi->setText(3, p->play_str);
 
395
                                                lvi->setText(4, p->obs_str);
 
396
                                                lvi->setText(5, p->idle);
 
397
                                                //mark,
 
398
                                                lvi->setText(12, rkToKey(p->rank) + p->name.lower());
 
399
 
 
400
                                                if (extUserInfo && myAccount->get_gsname() == IGS)
 
401
                                                {
 
402
                                                        lvi->setText(7, p->extInfo);
 
403
                                                        lvi->setText(8, p->won);
 
404
                                                        lvi->setText(9, p->lost);
 
405
                                                        lvi->setText(10, p->country);
 
406
                                                        lvi->setText(11, p->language);
 
407
                                                }
 
408
 
 
409
                                                lvi->ownRepaint();
 
410
                                        }
 
411
 
 
412
                                        if (p->name == myAccount->acc_name)
 
413
                                        {
 
414
                                                qDebug("updating my account info... (1)");
 
415
                                                // checkbox open
 
416
                                                bool b = (p->info.contains('X') == 0);
 
417
                                                slot_checkbox(0, b);
 
418
                                                // checkbox looking - don't set if closed
 
419
                                                if (p->info.contains('!') != 0)
 
420
                                                        // "!" found
 
421
                                                        slot_checkbox(1, true);
 
422
                                                else if (b)
 
423
                                                        // "!" not found && open
 
424
                                                        slot_checkbox(1, false);
 
425
                                                // checkbox quiet
 
426
                                                // NOT CORRECT REPORTED BY SERVER!
 
427
                                                //b = (p->info.contains('Q') != 0);
 
428
                                                //slot_checkbox(2, b);
 
429
                                                // -> WORKAROUND
 
430
                                                if (p->info.contains('Q') != 0)
 
431
                                                        slot_checkbox(2, true);
 
432
 
 
433
                                                // get rank to calc handicap when matching
 
434
                                                myAccount->set_rank(p->rank);
 
435
                                        }
 
436
 
 
437
                                        return;
 
438
                                }
 
439
                        }
 
440
                }
 
441
                else if (!cmdplayers && !myAccount->num_players)
 
442
                {
 
443
                        qDebug("player skipped because no init table");
 
444
                        // skip players until initial table has loaded
 
445
                        return;
 
446
                }
 
447
 
 
448
 
 
449
                QString mark;
 
450
 
 
451
                // check for watched players
 
452
                if (watch && watch.contains(";" + p->name + ";"))
 
453
                {
 
454
                        mark = "W";
 
455
 
 
456
                        // sound for entering - no sound while "who" cmd is executing
 
457
                        if (!cmdplayers)
 
458
                                qgoif->get_qgo()->playEnterSound();
 
459
                        else if (p->name == myAccount->acc_name)
 
460
                                // it's me
 
461
                                // - only possible if 'who'/'user' cmd is executing
 
462
                                // - I am on the watchlist, however
 
463
                                // don't count!
 
464
                                myAccount->num_watchedplayers--;
 
465
 
 
466
                        myAccount->num_watchedplayers++;
 
467
                }
 
468
                // check for excluded players
 
469
                else if (exclude && exclude.contains(";" + p->name + ";"))
 
470
                {
 
471
                        mark = "X";
 
472
                }
 
473
 
 
474
                // check for open/looking state
 
475
                if (cmdplayers)
 
476
                {
 
477
                        if (p->name == myAccount->acc_name)
 
478
                        {
 
479
                                qDebug("updating my account info...(2)");
 
480
                                // checkbox open
 
481
                                bool b = (p->info.contains('X') == 0);
 
482
                                slot_checkbox(0, b);
 
483
                                // checkbox looking
 
484
                                b = (p->info.contains('!') != 0);
 
485
                                slot_checkbox(1, b);
 
486
                                // checkbox quiet
 
487
                                // NOT CORRECT REPORTED BY SERVER!
 
488
                                //b = (p->info.contains('Q') != 0);
 
489
                                //slot_checkbox(2, b);
 
490
                                // -> WORKAROUND
 
491
                                if (p->info.contains('Q') != 0)
 
492
                                        slot_checkbox(2, true);
 
493
 
 
494
                                // get rank to calc handicap when matching
 
495
                                myAccount->set_rank(p->rank);
 
496
                                mark = "M";
 
497
                        }
 
498
                }
 
499
 
 
500
 
 
501
                // from WHO command or {... has connected}
 
502
                if (extUserInfo && myAccount->get_gsname() == IGS)
 
503
                {
 
504
                        lv = new PlayerTableItem(ListView_players,
 
505
                                        p->info,
 
506
                                        p->name,
 
507
                                        p->rank,
 
508
                                        p->play_str,
 
509
                                        p->obs_str,
 
510
                                        p->idle,
 
511
                                        mark,
 
512
                                        p->extInfo,
 
513
                                        p->won,
 
514
                                        p->lost,
 
515
                                        p->country,
 
516
                                        p->language);
 
517
                        lv.current()->setText(12, rkToKey(p->rank) + p->name.lower());
 
518
                }
 
519
                else
 
520
                {
 
521
                        lv = new PlayerTableItem(ListView_players,
 
522
                                        p->info,
 
523
                                        p->name,
 
524
                                        p->rank,
 
525
                                        p->play_str,
 
526
                                        p->obs_str,
 
527
                                        p->idle,
 
528
                                        mark);
 
529
                        lv.current()->setText(12, rkToKey(p->rank) + p->name.lower());
 
530
                }
 
531
 
 
532
                // increase number of players
 
533
                myAccount->num_players++;
 
534
                statusUsers->setText(" P: " + QString::number(myAccount->num_players) + " / " + QString::number(myAccount->num_watchedplayers) + " ");
 
535
                
 
536
 
 
537
                //if (!cmdplayers)
 
538
                //      ListView_players->sort() ;
 
539
 
 
540
        }
 
541
        else
 
542
        {
 
543
                // {... has disconnected}
 
544
                bool found = false;
 
545
                for (QListViewItem *lvi; (lvi = lv.current()) && !found;)
 
546
                {
 
547
                        lv++;
 
548
                        // compare names
 
549
                        if (lvi->text(1) == p->name)
 
550
                        {
 
551
                                // check if it was a watched player
 
552
                                if (lvi->text(6) == "W")
 
553
                                {
 
554
                                        qgoif->get_qgo()->playLeaveSound();
 
555
                                        myAccount->num_watchedplayers--;
 
556
                                }
 
557
 
 
558
                                lv++;
 
559
                          if (lvi == topViewItem)     // are we trying to delete the 'anchor' of the list viewport ?
 
560
                                deleted_topViewItem = true  ;
 
561
                                delete lvi;
 
562
                                found = true;;
 
563
 
 
564
                                // decrease number of players
 
565
                                myAccount->num_players--;
 
566
                                statusUsers->setText(" P: " + QString::number(myAccount->num_players) + " / " + QString::number(myAccount->num_watchedplayers) + " ");
 
567
                        }
 
568
                }
 
569
 
 
570
                if (!found)
 
571
                        qWarning("disconnected player not found: " + p->name);
 
572
        }
 
573
 
 
574
        if (! deleted_topViewItem) //don't try to refer to a deleted element ...
 
575
        {
 
576
                int ip = topViewItem->itemPos();
 
577
                ListView_players->setContentsPos(0,ip);
 
578
        }
 
579
}
 
580
 
 
581
void ClientWindow::slot_addToObservationList(int flag)
 
582
{
 
583
        if (flag == -1)
 
584
        {
 
585
                if (myAccount->num_observedgames != 0)
 
586
                        myAccount->num_observedgames--;
 
587
        }
 
588
        else if (flag == -2)
 
589
                myAccount->num_observedgames++;
 
590
        else
 
591
                myAccount->num_observedgames = flag;
 
592
 
 
593
        // update status bar
 
594
        statusGames->setText(" G: " + QString::number(myAccount->num_games) + " / " + QString::number(myAccount->num_observedgames) + " ");
 
595
}
 
596
 
 
597
// get channelinfo: ch nr + people
 
598
void ClientWindow::slot_channelinfo(int nr, const QString &txt)
 
599
{
 
600
        qDebug("slot_channelinfo(): " + txt);
 
601
        QString tipstring;
 
602
        Channel *h;
 
603
        Channel *ch = 0;
 
604
 
 
605
        // check if entering a channel
 
606
        if (txt == QString("*on*"))
 
607
        {
 
608
                switch (myAccount->get_gsname())
 
609
                {
 
610
                        case IGS:
 
611
                                sendcommand("channel");
 
612
                                break;
 
613
 
 
614
                        default:
 
615
                                sendcommand("inchannel " + QString::number(nr), false);
 
616
                                break;
 
617
                }
 
618
                return;
 
619
        }
 
620
        else if (txt == QString("*off*"))
 
621
        {
 
622
                // check if channel exists in list
 
623
                bool found = false;
 
624
                for (h = channellist.first(); h != 0 && !found; h = channellist.next())
 
625
                {
 
626
                        // compare numbers
 
627
                        if (h->get_nr() == nr)
 
628
                        {
 
629
                                found = true;
 
630
                                channellist.remove();
 
631
                        }
 
632
                }
 
633
        }
 
634
 
 
635
        // check if I'm in given channel
 
636
        bool flag_add;
 
637
        if (txt.contains(myAccount->acc_name) && !txt.contains("Topic:") && !txt.contains("Title:"))
 
638
                flag_add = true;
 
639
        else
 
640
                flag_add = false;
 
641
 
 
642
        // delete string
 
643
        statusChannel->setText("");
 
644
 
 
645
        // check if channel exists in list
 
646
        bool found = false;
 
647
        for (h = channellist.first(); h != 0 && !found; h = channellist.next())
 
648
        {
 
649
                // compare numbers
 
650
                if (h->get_nr() == nr)
 
651
                {
 
652
                        found = true;
 
653
                        ch = h;
 
654
                }
 
655
        }
 
656
 
 
657
        // if not found insert channel at it's sorted position
 
658
        if (!found)
 
659
        {
 
660
                // init channel
 
661
                ch = new Channel(nr);
 
662
                channellist.inSort(ch);
 
663
        }
 
664
 
 
665
        // now insert channel to list
 
666
        if (flag_add)
 
667
        {
 
668
                QString text = txt.simplifyWhiteSpace();
 
669
                int count = text.contains(" ") + 1;
 
670
                // set user list and user count
 
671
                ch->set_channel(nr, QString(), txt, count);
 
672
        }
 
673
        else if (txt.contains("Topic:") || txt.contains("Title:"))
 
674
        {
 
675
                // set channel's title
 
676
                ch->set_channel(nr, txt);
 
677
        }
 
678
 
 
679
        // reset tooltip
 
680
        QToolTip::remove(statusChannel);
 
681
 
 
682
        // set new tooltip
 
683
        for (h = channellist.first(); h != 0; h = channellist.next())
 
684
        {
 
685
                if (h->get_users().length() > 2)
 
686
                {
 
687
                        // check if users are available; skipped if only title
 
688
                        if (tipstring)
 
689
                                tipstring += "\n";
 
690
                        tipstring += QString("%1: %2\n%3: %4").arg(h->get_nr()).arg(h->get_title()).arg(h->get_nr()).arg(h->get_users());
 
691
                        if (statusChannel->text().length() > 2)
 
692
                                statusChannel->setText(QString("%1 / CH%2:%3").arg(statusChannel->text()).arg(h->get_nr()).arg(h->get_count()));
 
693
                        else
 
694
                                statusChannel->setText(QString("CH%1:%2").arg(h->get_nr()).arg(h->get_count()));
 
695
                }
 
696
        }
 
697
 
 
698
        QToolTip::add(statusChannel, tipstring);
 
699
}
 
700
 
 
701
// user buttons
 
702
void ClientWindow::slot_pbuser1()
 
703
{
 
704
        slot_toolbaractivated(setting->readEntry("USER1_2"));
 
705
}
 
706
void ClientWindow::slot_pbuser2()
 
707
{
 
708
        slot_toolbaractivated(setting->readEntry("USER2_2"));
 
709
}
 
710
void ClientWindow::slot_pbuser3()
 
711
{
 
712
        slot_toolbaractivated(setting->readEntry("USER3_2"));
 
713
}
 
714
void ClientWindow::slot_pbuser4()
 
715
{
 
716
        slot_toolbaractivated(setting->readEntry("USER4_2"));
 
717
}
 
718
 
 
719
// tell, say, kibitz...
 
720
void ClientWindow::slot_message(QString txt, QColor c)
 
721
{
 
722
        //QColor c0 = MultiLineEdit2->color();
 
723
        MultiLineEdit2->setColor(c);
 
724
        slot_message( txt);
 
725
        MultiLineEdit2->setColor(Qt::black);
 
726
}  
 
727
 
 
728
 
 
729
void ClientWindow::slot_message(QString txt)
 
730
{
 
731
        // Scroll at bottom of text, set cursor to end of line
 
732
        if (MultiLineEdit2->text().endsWith("\n") && txt == "\n")
 
733
                return ;
 
734
    
 
735
        MultiLineEdit2->append(txt);
 
736
}
 
737
 
 
738
// shout...
 
739
void ClientWindow::slot_shout(const QString &player, const QString &txt)
 
740
{
 
741
        if (getPlayerExcludeListEntry(player) == "X")
 
742
                return;
 
743
 
 
744
        // check if send to a special handle:
 
745
        if (player.length() && player.contains('*'))
 
746
                slot_talk(player, txt, true);
 
747
        else
 
748
                slot_talk("Shouts*", txt, true);
 
749
}
 
750
 
 
751
// server name found
 
752
void ClientWindow::slot_svname(GSName &gs)
 
753
{
 
754
        // save local at 'gsname'
 
755
        // and change caption
 
756
        myAccount->set_gsname(gs);
 
757
        myAccount->set_caption();
 
758
}
 
759
 
 
760
// account name found
 
761
void ClientWindow::slot_accname(QString &name)
 
762
{
 
763
        // save local at 'gsname'
 
764
        // and change caption
 
765
        myAccount->set_accname(name);
 
766
        myAccount->set_caption();
 
767
}
 
768
 
 
769
// status found
 
770
void ClientWindow::slot_status(Status s)
 
771
{
 
772
        myAccount->set_status(s);
 
773
        myAccount->set_caption();
 
774
}
 
775
 
 
776
// correct viewport
 
777
void ClientWindow::slot_playerContentsMoving(int /*x*/, int /*y*/)
 
778
{
 
779
/*      QPoint p(0,0);
 
780
        QListViewItem *i = ListView_players->itemAt(p);
 
781
 
 
782
        if (i)
 
783
        {
 
784
                ListView_players->clearSelection();
 
785
                ListView_players->setSelected(i, true);
 
786
                ListView_players->clearSelection();
 
787
        }                         */
 
788
}
 
789
 
 
790
// correct viewport
 
791
void ClientWindow::slot_gamesContentsMoving(int /*x*/, int /*y*/)
 
792
{
 
793
        QPoint p(0,0);
 
794
        QListViewItem *i = ListView_games->itemAt(p);
 
795
 
 
796
        if (i)
 
797
        {
 
798
                ListView_games->clearSelection();
 
799
                ListView_games->setSelected(i, true);
 
800
                ListView_games->clearSelection();
 
801
        }
 
802
}
 
803
 
 
804
 
 
805
/*
 
806
 *   account & caption
 
807
 */
 
808
 
 
809
Account::Account(QWidget* parent)
 
810
{
 
811
        // init
 
812
        this->parent = parent;
 
813
        standard.sprintf(PACKAGE + QString("V") + VERSION);
 
814
 
 
815
        set_offline();
 
816
}
 
817
 
 
818
Account::~Account()
 
819
{
 
820
}
 
821
 
 
822
// set caption
 
823
void Account::set_caption()
 
824
{
 
825
        if ((gsName == GS_UNKNOWN) ||
 
826
                  (!acc_name))
 
827
        {
 
828
                // server unknown or no account name
 
829
                // -> standard caption
 
830
                parent->setCaption(standard);
 
831
        }
 
832
  else
 
833
        {
 
834
                if (status == GUEST)
 
835
                        parent->setCaption(svname + " - " + acc_name + " (guest)");
 
836
                else
 
837
                        parent->setCaption(svname + " - " + acc_name);
 
838
        }
 
839
}
 
840
 
 
841
// set go server name
 
842
void Account::set_gsname(GSName gs)
 
843
{
 
844
        gsName = gs;
 
845
 
 
846
        // now we know which server
 
847
        switch (gsName)
 
848
        {
 
849
                case IGS: svname.sprintf("IGS");
 
850
                        break;
 
851
 
 
852
                case NNGS: svname.sprintf("NNGS");
 
853
                        break;
 
854
 
 
855
                case LGS: svname.sprintf("LGS");
 
856
                        break;
 
857
 
 
858
                case WING: svname.sprintf("WING");
 
859
                        break;
 
860
 
 
861
                case CTN: svname.sprintf("CTN");
 
862
                        break;
 
863
 
 
864
                case CWS: svname.sprintf("CWS");
 
865
                        break;
 
866
 
 
867
                default: svname.sprintf("unknown Server");
 
868
                        break;
 
869
        }
 
870
 
 
871
        // set account name
 
872
        if (!acc_name)
 
873
        {
 
874
                // acc_name should be set...
 
875
                acc_name.sprintf("Lulu");
 
876
                qWarning("set_gsname() - acc_name not found!");
 
877
        }
 
878
        
 
879
        if (status == OFFLINE)
 
880
                status = (enum Status) REGISTERED;
 
881
}
 
882
 
 
883
// set account name
 
884
void Account::set_accname(QString &name)
 
885
{
 
886
        acc_name = name;
 
887
}
 
888
 
 
889
// set status
 
890
void Account::set_status(Status s)
 
891
{
 
892
        status = s;
 
893
}
 
894
 
 
895
// set to offline mode
 
896
void Account::set_offline()
 
897
{
 
898
        gsName = GS_UNKNOWN;
 
899
        svname = (QString) NULL;
 
900
        acc_name = (QString) NULL;
 
901
        status = OFFLINE;
 
902
 
 
903
        set_caption();
 
904
 
 
905
        num_players = 0;
 
906
        num_watchedplayers = 0;
 
907
        num_observedgames = 0;
 
908
        num_games = 0;
 
909
}
 
910
 
 
911
// get some variables
 
912
Status Account::get_status()
 
913
{
 
914
        return status;
 
915
}
 
916
 
 
917
GSName Account::get_gsname()
 
918
{
 
919
        return gsName;
 
920
}
 
921
 
 
922
 
 
923
/*
 
924
 *   Host - Class to save Host info
 
925
 */
 
926
 
 
927
Host::Host(const QString &title, const QString &host, const unsigned int port, const QString &login, const QString &pass)
 
928
{
 
929
        t = title;
 
930
        h = host;
 
931
        pt = port;
 
932
        lg = login;
 
933
        pw = pass;
 
934
}
 
935
 
 
936
/*
 
937
 *   List to help keeping things sorted
 
938
 */
 
939
 
 
940
int HostList::compareItems(Item d1, Item d2)
 
941
{
 
942
        Host *s1 = static_cast<Host*>(d1);
 
943
        Host *s2 = static_cast<Host*>(d2);
 
944
 
 
945
        CHECK_PTR(s1);
 
946
        CHECK_PTR(s2);
 
947
 
 
948
        if (s1 > s2)
 
949
                return 1;
 
950
        else if (s1 < s2)
 
951
                return -1;
 
952
        else
 
953
                // s1 == s2;
 
954
                return 0;
 
955
}
 
956
 
 
957
int ChannelList::compareItems(Item d1, Item d2)
 
958
{
 
959
        Channel *s1 = static_cast<Channel*>(d1);
 
960
        Channel *s2 = static_cast<Channel*>(d2);
 
961
 
 
962
        CHECK_PTR(s1);
 
963
        CHECK_PTR(s2);
 
964
 
 
965
        if (s1 > s2)
 
966
                return 1;
 
967
        else if (s1 < s2)
 
968
                return -1;
 
969
        else
 
970
                // s1 == s2;
 
971
                return 0;
 
972
}
 
973
 
 
974
 
 
975
/*
 
976
 *   Talk - Class to handle  Talk Dialog Windows
 
977
 */
 
978
 
 
979
int Talk::counter = 0;
 
980
 
 
981
Talk::Talk(const QString &playername, QWidget *parent, bool /*isplayer*/)
 
982
        : TalkGui()
 
983
{
 
984
        name = playername;
 
985
 
 
986
        // create a new tab
 
987
        /*widget = new QWidget(parent);
 
988
        TalkDialogWidgetLayout = new QGridLayout(widget); 
 
989
        TalkDialogWidgetLayout->setSpacing(6);
 
990
        TalkDialogWidgetLayout->setMargin(0);  */
 
991
 
 
992
        //MultiLineEdit1 = new QTextEdit(widget, "MultiLineEdit1_" + QString::number(++counter));
 
993
 
 
994
  QString s = "MultiLineEdit1_" + QString::number(++counter);
 
995
  MultiLineEdit1->setName(s.ascii()) ;
 
996
  
 
997
        MultiLineEdit1->setCurrentFont(setting->fontComments); //eb16
 
998
        /*MultiLineEdit1->setProperty("focusPolicy", (int)QTextEdit::NoFocus); //eb16
 
999
        MultiLineEdit1->setProperty("wordWrap", (int)QTextEdit::WidgetWidth);//eb16
 
1000
        MultiLineEdit1->setProperty("readOnly", QVariant( TRUE, 0));
 
1001
 
 
1002
        TalkDialogWidgetLayout->addWidget(MultiLineEdit1, 0, 0);
 
1003
  */
 
1004
        //LineEdit1 = new QLineEdit(widget, "LineEdit1_" + QString::number(counter));
 
1005
  s = "LineEdit1_" + QString::number(++counter);
 
1006
  LineEdit1->setName(s.ascii());
 
1007
        LineEdit1->setFont(setting->fontComments);
 
1008
 
 
1009
        // do not add a button for shouts* tab
 
1010
        if (name.find('*') != -1)
 
1011
        {
 
1012
                /*buttonLayout = new QHBoxLayout();
 
1013
                buttonLayout->addWidget(LineEdit1);
 
1014
                pb_releaseTalkTab = new QPushButton(tr("close"), widget, "SkipAllTalkTabs");
 
1015
                connect(pb_releaseTalkTab, SIGNAL(clicked()), this, SLOT(slot_pbRelTab()));
 
1016
 
 
1017
                buttonLayout->addWidget(pb_releaseTalkTab);
 
1018
                TalkDialogWidgetLayout->addItem(buttonLayout, 1, 0);
 
1019
    */
 
1020
     delete pb_releaseTalkTab;
 
1021
     delete pb_match;
 
1022
     delete stats_layout;
 
1023
        }
 
1024
//      else
 
1025
//              TalkDialogWidgetLayout->addWidget(LineEdit1, 1, 0 );
 
1026
   
 
1027
}
 
1028
 
 
1029
Talk::~Talk()
 
1030
{
 
1031
}
 
1032
 
 
1033
// release current Tab
 
1034
void Talk::slot_pbRelTab()
 
1035
{
 
1036
        emit signal_pbRelOneTab(this);  
 
1037
}
 
1038
 
 
1039
void Talk::slot_returnPressed()
 
1040
{
 
1041
        // read tab
 
1042
        QString txt = LineEdit1->text();
 
1043
        emit signal_talkto(name, txt);
 
1044
        LineEdit1->clear();
 
1045
}
 
1046
 
 
1047
void Talk::slot_match()
 
1048
{
 
1049
  QString txt= name+ " " + stats_rating->text();
 
1050
        emit signal_matchrequest(txt,true);
 
1051
}
 
1052
 
 
1053
 
 
1054
 
 
1055
// write to txt field in dialog
 
1056
// if null string -> check edit field
 
1057
void Talk::write(const QString &text) const
 
1058
{
 
1059
        QString txt;
 
1060
 
 
1061
        // check which text to display
 
1062
        if (text)
 
1063
                // ok, text given
 
1064
                txt = text;
 
1065
        else if (LineEdit1->text())
 
1066
        {
 
1067
                // take txt of edit field
 
1068
                txt = LineEdit1->text();
 
1069
                LineEdit1->clear();
 
1070
        }
 
1071
        else
 
1072
        {
 
1073
                // no text found...
 
1074
                return;
 
1075
        }
 
1076
 
 
1077
        // Scroll at bottom of text, set cursor to end of line
 
1078
        MultiLineEdit1->append(txt); //eb16
 
1079
}
 
1080
 
 
1081
void Talk::setTalkWindowColor(QPalette pal)
 
1082
{
 
1083
        MultiLineEdit1->setPalette(pal);
 
1084
        LineEdit1->setPalette(pal);
 
1085
}