QTfrontend/chatwidget.cpp
author nemo
Sun, 14 Aug 2011 23:52:45 -0400
changeset 5569 8313952b2811
parent 5259 926958e3e87b
child 5735 08ac2d557392
permissions -rw-r--r--
suggestion of mikade's - delete old mines if the collision array shows signs of filling up. This is kind of an edge case, esp now that array is up to 1024, but should prevent (easiest) way to crash by collision array overflow (endless mines/minestrikes).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
480
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
     1
/*
1066
1f1b3686a2b0 Update copyright headers a bit
unc0rr
parents: 575
diff changeset
     2
 * Hedgewars, a free turn based strategy game
486
7ea71cd3acd5 - Change proto version to 4
unc0rr
parents: 480
diff changeset
     3
 * Copyright (c) 2007 Igor Ulyanov <iulyanov@gmail.com>
4976
088d40d8aba2 Happy 2011 :)
koda
parents: 4917
diff changeset
     4
 * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
480
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
     5
 *
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
     8
 * the Free Software Foundation; version 2 of the License
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
     9
 *
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
    13
 * GNU General Public License for more details.
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
    14
 *
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
    15
 * You should have received a copy of the GNU General Public License
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
    16
 * along with this program; if not, write to the Free Software
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
    17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
    18
 */
09434d6c3865 GPL headers added
displacer
parents: 465
diff changeset
    19
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
    20
#include <QDesktopServices>
1520
f72f538eba05 Refactor chat widget to use QTextBrower instead of QListWidget:
unc0rr
parents: 1516
diff changeset
    21
#include <QTextBrowser>
461
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
    22
#include <QLineEdit>
1391
735f6d43780b Implement kick
unc0rr
parents: 1360
diff changeset
    23
#include <QAction>
1587
b8a3d449bed7 Don't escape chat strings which go to engine
unc0rr
parents: 1584
diff changeset
    24
#include <QTextDocument>
2773
e94f240a8a41 Have game beep when someone joins lobby/room. Controlled by Sound option
nemo
parents: 2706
diff changeset
    25
#include <QDir>
e94f240a8a41 Have game beep when someone joins lobby/room. Controlled by Sound option
nemo
parents: 2706
diff changeset
    26
#include <QSettings>
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
    27
#include <QFile>
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
    28
#include <QTextStream>
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
    29
#include <QMenu>
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
    30
#include <QCursor>
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    31
#include <QScrollBar>
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
    32
#include <QItemSelectionModel>
461
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
    33
2773
e94f240a8a41 Have game beep when someone joins lobby/room. Controlled by Sound option
nemo
parents: 2706
diff changeset
    34
#include "hwconsts.h"
e94f240a8a41 Have game beep when someone joins lobby/room. Controlled by Sound option
nemo
parents: 2706
diff changeset
    35
#include "SDLs.h"
e94f240a8a41 Have game beep when someone joins lobby/room. Controlled by Sound option
nemo
parents: 2706
diff changeset
    36
#include "gameuiconfig.h"
461
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
    37
#include "chatwidget.h"
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
    38
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    39
ListWidgetNickItem::ListWidgetNickItem(const QString& nick, bool isFriend, bool isIgnored) : QListWidgetItem(nick)
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    40
{
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    41
    this->aFriend = isFriend;
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    42
    this->isIgnored = isIgnored;
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    43
}
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    44
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    45
void ListWidgetNickItem::setFriend(bool isFriend)
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    46
{
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    47
    this->aFriend = isFriend;
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    48
}
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    49
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    50
void ListWidgetNickItem::setIgnored(bool isIgnored)
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    51
{
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    52
    this->isIgnored = isIgnored;
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    53
}
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    54
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    55
bool ListWidgetNickItem::isFriend()
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    56
{
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    57
    return aFriend;
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    58
}
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    59
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    60
bool ListWidgetNickItem::ignored()
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    61
{
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    62
    return isIgnored;
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    63
}
4876
813ef4e8e385 sort nick lists case-insensitive
sheepluva
parents: 4560
diff changeset
    64
813ef4e8e385 sort nick lists case-insensitive
sheepluva
parents: 4560
diff changeset
    65
bool ListWidgetNickItem::operator< (const QListWidgetItem & other) const
813ef4e8e385 sort nick lists case-insensitive
sheepluva
parents: 4560
diff changeset
    66
{
813ef4e8e385 sort nick lists case-insensitive
sheepluva
parents: 4560
diff changeset
    67
    // case in-sensitive comparison of the associated strings
4877
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    68
    // chars that are no letters are sorted at the end of the list
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    69
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    70
    ListWidgetNickItem otherNick = const_cast<ListWidgetNickItem &>(dynamic_cast<const ListWidgetNickItem &>(other));
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    71
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    72
    // ignored always down
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    73
    if (isIgnored != otherNick.ignored())
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    74
        return !isIgnored;
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    75
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    76
    // friends always up
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    77
    if (aFriend != otherNick.isFriend())
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    78
        return aFriend;
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
    79
4877
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    80
    QString txt1 = text().toLower();
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    81
    QString txt2 = other.text().toLower();
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    82
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    83
    bool firstIsShorter = (txt1.size() < txt2.size());
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    84
    int len = firstIsShorter?txt1.size():txt2.size();
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    85
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    86
    for (int i = 0; i < len; i++)
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    87
    {
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    88
        if (txt1[i] == txt2[i])
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    89
            continue;
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    90
        if (txt1[i].isLetter() != txt2[i].isLetter())
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    91
            return txt1[i].isLetter();
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    92
        return (txt1[i] < txt2[i]);
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    93
    }
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    94
746ddd590dee nick sorting: give letters priority over all other chars
sheepluva
parents: 4876
diff changeset
    95
    return firstIsShorter;
4876
813ef4e8e385 sort nick lists case-insensitive
sheepluva
parents: 4560
diff changeset
    96
}
813ef4e8e385 sort nick lists case-insensitive
sheepluva
parents: 4560
diff changeset
    97
4898
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
    98
const char* HWChatWidget::STYLE = 
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
    99
"\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   100
a { color:#c8c8ff; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   101
.nick { text-decoration: none; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   102
.UserChat .nick { color:#ffec20; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   103
.FriendChat { color: #08e008; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   104
.FriendChat .nick { color: #20ff20; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   105
.UserJoin { color: #c0c0c0; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   106
.UserJoin .nick { color: #d0d0d0; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   107
.FriendJoin { color: #c0e0c0; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   108
.FriendJoin .nick { color: #d0f0d0; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   109
.UserAction { color: #ff80ff; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   110
.UserAction .nick { color: #ffa0ff; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   111
.FriendAction { color: #ff00ff; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   112
.FriendAction .nick { color: #ff30ff; }\
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   113
";
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   114
2775
3445ce5e9c79 Only beep in room, load sound in constructor
nemo
parents: 2774
diff changeset
   115
HWChatWidget::HWChatWidget(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli, bool notify) :
461
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   116
  QWidget(parent),
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   117
  mainLayout(this)
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   118
{
2773
e94f240a8a41 Have game beep when someone joins lobby/room. Controlled by Sound option
nemo
parents: 2706
diff changeset
   119
    this->gameSettings = gameSettings;
e94f240a8a41 Have game beep when someone joins lobby/room. Controlled by Sound option
nemo
parents: 2706
diff changeset
   120
    this->sdli = sdli;
2775
3445ce5e9c79 Only beep in room, load sound in constructor
nemo
parents: 2774
diff changeset
   121
    this->notify = notify;
3019
d6e19f35d98d Frontend:
smxx
parents: 2948
diff changeset
   122
    if(notify && gameSettings->value("frontend/sound", true).toBool()) {
5238
46ddaf14509d Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents: 5140
diff changeset
   123
        QFile tmpfile;
46ddaf14509d Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents: 5140
diff changeset
   124
        sdli->SDLMusicInit();
46ddaf14509d Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents: 5140
diff changeset
   125
        for(int i=0;i<4;i++) {
46ddaf14509d Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents: 5140
diff changeset
   126
            tmpfile.setFileName(cfgdir->absolutePath() + "/Data/Sounds/voices/Classic/Hello.ogg");
46ddaf14509d Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents: 5140
diff changeset
   127
            if (tmpfile.exists()) sound[i] = Mix_LoadWAV(QFileInfo(tmpfile).absoluteFilePath().toLocal8Bit().constData());
46ddaf14509d Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents: 5140
diff changeset
   128
            else sound[i] = Mix_LoadWAV(QString(datadir->absolutePath() + 
46ddaf14509d Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents: 5140
diff changeset
   129
                "/Sounds/voices/Classic/Hello.ogg").toLocal8Bit().constData());
46ddaf14509d Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents: 5140
diff changeset
   130
        }
2775
3445ce5e9c79 Only beep in room, load sound in constructor
nemo
parents: 2774
diff changeset
   131
    }
2773
e94f240a8a41 Have game beep when someone joins lobby/room. Controlled by Sound option
nemo
parents: 2706
diff changeset
   132
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   133
    mainLayout.setSpacing(1);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   134
    mainLayout.setMargin(1);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   135
    mainLayout.setSizeConstraint(QLayout::SetMinimumSize);
3790
8f48b54f42ce patch by inu to fix a glitch in netgame chatbox
koda
parents: 3697
diff changeset
   136
    mainLayout.setColumnStretch(0, 76);
8f48b54f42ce patch by inu to fix a glitch in netgame chatbox
koda
parents: 3697
diff changeset
   137
    mainLayout.setColumnStretch(1, 24);
461
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   138
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   139
    chatEditLine = new QLineEdit(this);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   140
    chatEditLine->setMaxLength(300);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   141
    connect(chatEditLine, SIGNAL(returnPressed()), this, SLOT(returnPressed()));
461
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   142
5094
9c3553254100 - Update .pro file
unc0rr
parents: 4976
diff changeset
   143
    mainLayout.addWidget(chatEditLine, 2, 0);
462
91baab07b79a resizing and grid problems
displacer
parents: 461
diff changeset
   144
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   145
    chatText = new QTextBrowser(this);
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   146
    chatText->document()->setDefaultStyleSheet(STYLE);
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   147
    chatText->setMinimumHeight(20);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   148
    chatText->setMinimumWidth(10);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   149
    chatText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   150
    chatText->setOpenLinks(false);
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   151
    connect(chatText, SIGNAL(anchorClicked(const QUrl&)),
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   152
        this, SLOT(linkClicked(const QUrl&)));
5094
9c3553254100 - Update .pro file
unc0rr
parents: 4976
diff changeset
   153
    mainLayout.addWidget(chatText, 0, 0, 2, 1);
462
91baab07b79a resizing and grid problems
displacer
parents: 461
diff changeset
   154
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   155
    chatNicks = new QListWidget(this);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   156
    chatNicks->setMinimumHeight(10);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   157
    chatNicks->setMinimumWidth(10);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   158
    chatNicks->setSortingEnabled(true);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   159
    chatNicks->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   160
    chatNicks->setContextMenuPolicy(Qt::ActionsContextMenu);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   161
    connect(chatNicks, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   162
        this, SLOT(chatNickDoubleClicked(QListWidgetItem *)));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   163
    connect(chatNicks, SIGNAL(currentRowChanged(int)),
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   164
        this, SLOT(chatNickSelected(int)));
2706
935b7d618cf0 sheepluva's patch to add a "follow" command to server and frontend, in order to stalk people and join them in their rooms
koda
parents: 2428
diff changeset
   165
5259
926958e3e87b display player count below and with label, just because it's funny to mess with unC0Rr's code and make him cry :P
sheepluva
parents: 5252
diff changeset
   166
    mainLayout.addWidget(chatNicks, 0, 1, 3, 1);
1391
735f6d43780b Implement kick
unc0rr
parents: 1360
diff changeset
   167
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   168
    acInfo = new QAction(QAction::tr("Info"), chatNicks);
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   169
    acInfo->setIcon(QIcon(":/res/info.png"));
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   170
    connect(acInfo, SIGNAL(triggered(bool)), this, SLOT(onInfo()));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   171
    acKick = new QAction(QAction::tr("Kick"), chatNicks);
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   172
    acKick->setIcon(QIcon(":/res/kick.png"));
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   173
    connect(acKick, SIGNAL(triggered(bool)), this, SLOT(onKick()));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   174
    acBan = new QAction(QAction::tr("Ban"), chatNicks);
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   175
    acBan->setIcon(QIcon(":/res/ban.png"));
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   176
    connect(acBan, SIGNAL(triggered(bool)), this, SLOT(onBan()));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   177
    acFollow = new QAction(QAction::tr("Follow"), chatNicks);
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   178
    acFollow->setIcon(QIcon(":/res/follow.png"));
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   179
    connect(acFollow, SIGNAL(triggered(bool)), this, SLOT(onFollow()));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   180
    acIgnore = new QAction(QAction::tr("Ignore"), chatNicks);
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   181
    acIgnore->setIcon(QIcon(":/res/ignore.png"));
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   182
    connect(acIgnore, SIGNAL(triggered(bool)), this, SLOT(onIgnore()));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   183
    acFriend = new QAction(QAction::tr("Add friend"), chatNicks);
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   184
    acFriend->setIcon(QIcon(":/res/addfriend.png"));
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   185
    connect(acFriend, SIGNAL(triggered(bool)), this, SLOT(onFriend()));
2377
f3fab2b09e0c And in frontend
nemo
parents: 1921
diff changeset
   186
4892
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   187
    chatNicks->insertAction(0, acFriend);
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   188
    chatNicks->insertAction(0, acInfo);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   189
    chatNicks->insertAction(0, acIgnore);
3697
d5b30d6373fc remove trailing spaces from end of line
koda
parents: 3236
diff changeset
   190
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   191
    showReady = false;
4892
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   192
    setShowFollow(true);
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   193
}
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   194
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   195
void HWChatWidget::linkClicked(const QUrl & link)
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   196
{
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   197
    if (link.scheme() == "http")
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   198
        QDesktopServices::openUrl(link);
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   199
    if (link.scheme() == "hwnick")
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   200
    {
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   201
        // decode nick
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   202
        const QString& nick = QString::fromUtf8(QByteArray::fromBase64(link.encodedQuery()));
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   203
        QList<QListWidgetItem *> items = chatNicks->findItems(nick, Qt::MatchExactly);
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   204
        if (items.size() < 1)
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   205
            return;
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   206
        QMenu * popup = new QMenu();
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   207
        // selecting an item will automatically scroll there, so let's save old position
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   208
        QScrollBar * scrollBar = chatNicks->verticalScrollBar();
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   209
        int oldScrollPos = scrollBar->sliderPosition();
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   210
        // select the nick which we want to see the actions for
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   211
        chatNicks->setCurrentItem(items[0], QItemSelectionModel::Clear);
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   212
        // selecting an item will automatically scroll there, so let's save old position
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   213
        scrollBar->setSliderPosition(oldScrollPos);
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   214
        // load actions
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   215
        popup->addActions(chatNicks->actions());
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   216
        // display menu popup at mouse cursor position
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   217
        popup->popup(QCursor::pos());
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   218
    }
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   219
}
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   220
4892
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   221
void HWChatWidget::setShowFollow(bool enabled)
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   222
{
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   223
    if (enabled) {
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   224
        if (!(chatNicks->actions().contains(acFollow)))
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   225
            chatNicks->insertAction(acFriend, acFollow);
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   226
    }
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   227
    else {
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   228
        if (chatNicks->actions().contains(acFollow))
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   229
            chatNicks->removeAction(acFollow);
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   230
    }
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   231
}
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   232
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   233
void HWChatWidget::loadList(QStringList & list, const QString & file)
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   234
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   235
    list.clear();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   236
    QFile txt((cfgdir->absolutePath() + "/" + file).toLocal8Bit().constData());
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   237
    if(!txt.open(QIODevice::ReadOnly))
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   238
        return;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   239
    QTextStream stream(&txt);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   240
    stream.setCodec("UTF-8");
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   241
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   242
    while(!stream.atEnd())
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   243
    {
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   244
        QString str = stream.readLine();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   245
        if(str.startsWith(";") || str.length() == 0)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   246
            continue;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   247
        list << str.trimmed();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   248
    }
3058
2ebc20485344 Engine:
smxx
parents: 3019
diff changeset
   249
    //readd once we require newer Qt than 4.4
2ebc20485344 Engine:
smxx
parents: 3019
diff changeset
   250
    //list.removeDuplicates();
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   251
    txt.close();
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   252
}
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   253
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   254
void HWChatWidget::saveList(QStringList & list, const QString & file)
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   255
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   256
    QFile txt((cfgdir->absolutePath() + "/" + file).toLocal8Bit().constData());
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   257
    if(!txt.open(QIODevice::WriteOnly | QIODevice::Truncate))
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   258
        return;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   259
    QTextStream stream(&txt);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   260
    stream.setCodec("UTF-8");
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   261
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   262
    stream << "; this list is used by Hedgewars - do not edit it unless you know what you're doing!" << endl;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   263
    for(int i = 0; i < list.size(); i++)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   264
        stream << list[i] << endl;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   265
    txt.close();
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   266
}
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   267
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   268
void HWChatWidget::updateNickItem(QListWidgetItem *nickItem)
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   269
{
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   270
    QString nick = nickItem->text();
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   271
    ListWidgetNickItem * item = dynamic_cast<ListWidgetNickItem*>(nickItem);
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   272
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   273
    item->setFriend(friendsList.contains(nick, Qt::CaseInsensitive));
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   274
    item->setIgnored(ignoreList.contains(nick, Qt::CaseInsensitive));
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   275
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   276
    if(item->ignored())
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   277
    {
3925
44b4218605f6 Missing file extensions for icons was screwing up Qt 4.7
nemo
parents: 3807
diff changeset
   278
        item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_ignore_on.png" : ":/res/chat_ignore_off.png") : ":/res/chat_ignore.png"));
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   279
        item->setForeground(Qt::gray);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   280
    }
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   281
    else if(item->isFriend())
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   282
    {
3925
44b4218605f6 Missing file extensions for icons was screwing up Qt 4.7
nemo
parents: 3807
diff changeset
   283
        item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_friend_on.png" : ":/res/chat_friend_off.png") : ":/res/chat_friend.png"));
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   284
        item->setForeground(Qt::green);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   285
    }
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   286
    else
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   287
    {
3925
44b4218605f6 Missing file extensions for icons was screwing up Qt 4.7
nemo
parents: 3807
diff changeset
   288
        item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_default_on.png" : ":/res/chat_default_off.png") : ":/res/chat_default.png"));
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   289
        item->setForeground(QBrush(QColor(0xff, 0xcc, 0x00)));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   290
    }
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   291
}
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   292
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   293
void HWChatWidget::updateNickItems()
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   294
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   295
    for(int i = 0; i < chatNicks->count(); i++)
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   296
        updateNickItem(chatNicks->item(i));
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   297
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   298
    chatNicks->sortItems();
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   299
}
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   300
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   301
void HWChatWidget::loadLists(const QString & nick)
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   302
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   303
    loadList(ignoreList, nick.toLower() + "_ignore.txt");
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   304
    loadList(friendsList, nick.toLower() + "_friends.txt");
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   305
    updateNickItems();
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   306
}
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   307
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   308
void HWChatWidget::saveLists(const QString & nick)
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   309
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   310
    saveList(ignoreList, nick.toLower() + "_ignore.txt");
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   311
    saveList(friendsList, nick.toLower() + "_friends.txt");
461
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   312
}
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   313
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   314
void HWChatWidget::returnPressed()
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   315
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   316
    emit chatLine(chatEditLine->text());
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   317
    chatEditLine->clear();
461
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   318
}
2846
1cb8b4c425ed Frontend:
smxx
parents: 2845
diff changeset
   319
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   320
1360
d3e285281c26 Fix doubling chat message
unc0rr
parents: 1357
diff changeset
   321
void HWChatWidget::onChatString(const QString& str)
461
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   322
{
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   323
    onChatString("", str);
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   324
}
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   325
4899
8163c9aaad0c automatically convert hedgewars.org urls to actual links (in order to make support in the lobby/rooms easier
sheepluva
parents: 4898
diff changeset
   326
const QRegExp HWChatWidget::URLREGEXP = QRegExp("(http://)?(www\\.)?(hedgewars\\.org(/[^ ]*)?)");
8163c9aaad0c automatically convert hedgewars.org urls to actual links (in order to make support in the lobby/rooms easier
sheepluva
parents: 4898
diff changeset
   327
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   328
void HWChatWidget::onChatString(const QString& nick, const QString& str)
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   329
{
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   330
    bool isFriend = false;
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   331
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   332
    if (!nick.isEmpty()) {
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   333
        // don't show chat lines that are from ignored nicks
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   334
        if (ignoreList.contains(nick, Qt::CaseInsensitive))
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   335
            return;
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   336
        // friends will get special treatment, of course
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   337
        isFriend = friendsList.contains(nick, Qt::CaseInsensitive);
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   338
    }
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   339
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   340
    if (chatStrings.size() > 250)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   341
        chatStrings.removeFirst();
1626
58fd5bc49a04 Colorize join/quit messages
unc0rr
parents: 1589
diff changeset
   342
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   343
    QString formattedStr = Qt::escape(str.mid(1));
4899
8163c9aaad0c automatically convert hedgewars.org urls to actual links (in order to make support in the lobby/rooms easier
sheepluva
parents: 4898
diff changeset
   344
    // make hedgewars.org urls actual links
8163c9aaad0c automatically convert hedgewars.org urls to actual links (in order to make support in the lobby/rooms easier
sheepluva
parents: 4898
diff changeset
   345
    formattedStr = formattedStr.replace(URLREGEXP, "<a href=\"http://\\3\">\\3</a>");
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   346
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   347
    // "link" nick, but before that encode it in base64 to make sure it can't intefere with html/url syntax
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   348
    // the nick is put as querystring as putting it as host would convert it to it's lower case variant
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   349
    if(!nick.isEmpty())
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   350
        formattedStr.replace("|nick|",QString("<a href=\"hwnick://?%1\" class=\"nick\">%2</a>").arg(QString(nick.toUtf8().toBase64())).arg(nick));
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   351
4898
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   352
    QString cssClass("UserChat");
3697
d5b30d6373fc remove trailing spaces from end of line
koda
parents: 3236
diff changeset
   353
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   354
    // check first character for color code and set color properly
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   355
    switch (str[0].toAscii()) {
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   356
        case 3:
4898
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   357
            cssClass = (isFriend ? "FriendJoin" : "UserJoin");
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   358
            break;
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   359
        case 2:
4898
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   360
            cssClass = (isFriend ? "FriendAction" : "UserAction");
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   361
            break;
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   362
        default:
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   363
            if (isFriend)
4898
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   364
                cssClass = "FriendChat";
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   365
    }
2396
e13a1117152b Colorize chat messages in frontend and engine
unc0rr
parents: 2380
diff changeset
   366
4898
7a94005874c9 stylesheet-based chat coloring (only internal for now)
sheepluva
parents: 4897
diff changeset
   367
    formattedStr = QString("<span class=\"%2\">%1</span>").arg(formattedStr).arg(cssClass);
2377
f3fab2b09e0c And in frontend
nemo
parents: 1921
diff changeset
   368
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   369
    chatStrings.append(formattedStr);
2377
f3fab2b09e0c And in frontend
nemo
parents: 1921
diff changeset
   370
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   371
    chatText->setHtml(chatStrings.join("<br>"));
1587
b8a3d449bed7 Don't escape chat strings which go to engine
unc0rr
parents: 1584
diff changeset
   372
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   373
    chatText->moveCursor(QTextCursor::End);
1587
b8a3d449bed7 Don't escape chat strings which go to engine
unc0rr
parents: 1584
diff changeset
   374
}
b8a3d449bed7 Don't escape chat strings which go to engine
unc0rr
parents: 1584
diff changeset
   375
b8a3d449bed7 Don't escape chat strings which go to engine
unc0rr
parents: 1584
diff changeset
   376
void HWChatWidget::onServerMessage(const QString& str)
b8a3d449bed7 Don't escape chat strings which go to engine
unc0rr
parents: 1584
diff changeset
   377
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   378
    if (chatStrings.size() > 250)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   379
        chatStrings.removeFirst();
2377
f3fab2b09e0c And in frontend
nemo
parents: 1921
diff changeset
   380
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   381
    chatStrings.append("<hr>" + str + "<hr>");
2377
f3fab2b09e0c And in frontend
nemo
parents: 1921
diff changeset
   382
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   383
    chatText->setHtml(chatStrings.join("<br>"));
1516
bb9fa5809c49 Limit chat history to 250 entries to avoid DoS attack with its use
unc0rr
parents: 1457
diff changeset
   384
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   385
    chatText->moveCursor(QTextCursor::End);
461
105af110b0e6 chatWidget with layout
displacer
parents:
diff changeset
   386
}
465
07eca0a2546c chatWidget with nicks ready
displacer
parents: 464
diff changeset
   387
2777
95a1a69d491c tweak. no chirp on room creation.
nemo
parents: 2776
diff changeset
   388
void HWChatWidget::nickAdded(const QString& nick, bool notifyNick)
465
07eca0a2546c chatWidget with nicks ready
displacer
parents: 464
diff changeset
   389
{
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   390
    QListWidgetItem * item = new ListWidgetNickItem(nick, friendsList.contains(nick, Qt::CaseInsensitive), ignoreList.contains(nick, Qt::CaseInsensitive));
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   391
    updateNickItem(item);
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   392
    chatNicks->addItem(item);
2773
e94f240a8a41 Have game beep when someone joins lobby/room. Controlled by Sound option
nemo
parents: 2706
diff changeset
   393
5259
926958e3e87b display player count below and with label, just because it's funny to mess with unC0Rr's code and make him cry :P
sheepluva
parents: 5252
diff changeset
   394
    emit nickCountUpdate(chatNicks->count());
5094
9c3553254100 - Update .pro file
unc0rr
parents: 4976
diff changeset
   395
3019
d6e19f35d98d Frontend:
smxx
parents: 2948
diff changeset
   396
    if(notifyNick && notify && gameSettings->value("frontend/sound", true).toBool()) {
2779
e1ae0019d43f Suggestion from Tiy. Use a random hi. Could maybe be shorter sounds, using the 4 shortest voicepacks already
nemo
parents: 2777
diff changeset
   397
       Mix_PlayChannel(-1, sound[rand()%4], 0);
2773
e94f240a8a41 Have game beep when someone joins lobby/room. Controlled by Sound option
nemo
parents: 2706
diff changeset
   398
    }
465
07eca0a2546c chatWidget with nicks ready
displacer
parents: 464
diff changeset
   399
}
07eca0a2546c chatWidget with nicks ready
displacer
parents: 464
diff changeset
   400
07eca0a2546c chatWidget with nicks ready
displacer
parents: 464
diff changeset
   401
void HWChatWidget::nickRemoved(const QString& nick)
07eca0a2546c chatWidget with nicks ready
displacer
parents: 464
diff changeset
   402
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   403
    QList<QListWidgetItem *> items = chatNicks->findItems(nick, Qt::MatchExactly);
5140
932307228d05 Change a few iterations over list to what is apparently a modification safe syntax, may fix issue #208 and #217 - needs testing of course.
nemo
parents: 5094
diff changeset
   404
    QListIterator<QListWidgetItem *> it(items);
932307228d05 Change a few iterations over list to what is apparently a modification safe syntax, may fix issue #208 and #217 - needs testing of course.
nemo
parents: 5094
diff changeset
   405
    while(it.hasNext()) chatNicks->takeItem(chatNicks->row(it.next()));
5094
9c3553254100 - Update .pro file
unc0rr
parents: 4976
diff changeset
   406
5259
926958e3e87b display player count below and with label, just because it's funny to mess with unC0Rr's code and make him cry :P
sheepluva
parents: 5252
diff changeset
   407
    emit nickCountUpdate(chatNicks->count());
465
07eca0a2546c chatWidget with nicks ready
displacer
parents: 464
diff changeset
   408
}
07eca0a2546c chatWidget with nicks ready
displacer
parents: 464
diff changeset
   409
07eca0a2546c chatWidget with nicks ready
displacer
parents: 464
diff changeset
   410
void HWChatWidget::clear()
07eca0a2546c chatWidget with nicks ready
displacer
parents: 464
diff changeset
   411
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   412
    chatText->clear();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   413
    chatStrings.clear();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   414
    chatNicks->clear();
465
07eca0a2546c chatWidget with nicks ready
displacer
parents: 464
diff changeset
   415
}
1391
735f6d43780b Implement kick
unc0rr
parents: 1360
diff changeset
   416
735f6d43780b Implement kick
unc0rr
parents: 1360
diff changeset
   417
void HWChatWidget::onKick()
735f6d43780b Implement kick
unc0rr
parents: 1360
diff changeset
   418
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   419
    QListWidgetItem * curritem = chatNicks->currentItem();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   420
    if (curritem)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   421
        emit kick(curritem->text());
1391
735f6d43780b Implement kick
unc0rr
parents: 1360
diff changeset
   422
}
1405
ee4b28a1861d Show players ready status in chat nick list
unc0rr
parents: 1391
diff changeset
   423
1860
ce140b2b928a Some work on players lists context menus
unc0rr
parents: 1666
diff changeset
   424
void HWChatWidget::onBan()
ce140b2b928a Some work on players lists context menus
unc0rr
parents: 1666
diff changeset
   425
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   426
    QListWidgetItem * curritem = chatNicks->currentItem();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   427
    if (curritem)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   428
        emit ban(curritem->text());
1860
ce140b2b928a Some work on players lists context menus
unc0rr
parents: 1666
diff changeset
   429
}
ce140b2b928a Some work on players lists context menus
unc0rr
parents: 1666
diff changeset
   430
1577
e3e37c730dc0 - Decrease font size in chat
unc0rr
parents: 1521
diff changeset
   431
void HWChatWidget::onInfo()
e3e37c730dc0 - Decrease font size in chat
unc0rr
parents: 1521
diff changeset
   432
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   433
    QListWidgetItem * curritem = chatNicks->currentItem();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   434
    if (curritem)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   435
        emit info(curritem->text());
1577
e3e37c730dc0 - Decrease font size in chat
unc0rr
parents: 1521
diff changeset
   436
}
e3e37c730dc0 - Decrease font size in chat
unc0rr
parents: 1521
diff changeset
   437
2706
935b7d618cf0 sheepluva's patch to add a "follow" command to server and frontend, in order to stalk people and join them in their rooms
koda
parents: 2428
diff changeset
   438
void HWChatWidget::onFollow()
935b7d618cf0 sheepluva's patch to add a "follow" command to server and frontend, in order to stalk people and join them in their rooms
koda
parents: 2428
diff changeset
   439
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   440
    QListWidgetItem * curritem = chatNicks->currentItem();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   441
    if (curritem)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   442
        emit follow(curritem->text());
2706
935b7d618cf0 sheepluva's patch to add a "follow" command to server and frontend, in order to stalk people and join them in their rooms
koda
parents: 2428
diff changeset
   443
}
935b7d618cf0 sheepluva's patch to add a "follow" command to server and frontend, in order to stalk people and join them in their rooms
koda
parents: 2428
diff changeset
   444
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   445
void HWChatWidget::onIgnore()
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   446
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   447
    QListWidgetItem * curritem = chatNicks->currentItem();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   448
    if(!curritem)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   449
        return;
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   450
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   451
    if(ignoreList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   452
    {
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   453
        ignoreList.removeAll(curritem->text().toLower());
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   454
        onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your ignore list").arg('\x03').arg(curritem->text()));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   455
    }
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   456
    else // not on list - add
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   457
    {
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   458
        // don't consider ignored people friends
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   459
        if(friendsList.contains(curritem->text(), Qt::CaseInsensitive))
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   460
            emit onFriend();
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   461
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   462
        // scroll down on first ignore added so that people see where that nick went to
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   463
        if (ignoreList.isEmpty())
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   464
            chatNicks->scrollToBottom();
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   465
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   466
        ignoreList << curritem->text().toLower();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   467
        onChatString(HWChatWidget::tr("%1 *** %2 has been added to your ignore list").arg('\x03').arg(curritem->text()));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   468
    }
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   469
    updateNickItem(curritem); // update icon/sort order/etc
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   470
    chatNicks->sortItems();
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   471
    chatNickSelected(0); // update context menu
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   472
}
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   473
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   474
void HWChatWidget::onFriend()
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   475
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   476
    QListWidgetItem * curritem = chatNicks->currentItem();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   477
    if(!curritem)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   478
        return;
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   479
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   480
    if(friendsList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   481
    {
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   482
        friendsList.removeAll(curritem->text().toLower());
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   483
        onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your friends list").arg('\x03').arg(curritem->text()));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   484
    }
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   485
    else // not on list - add
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   486
    {
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   487
        // don't ignore the new friend
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   488
        if(ignoreList.contains(curritem->text(), Qt::CaseInsensitive))
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   489
            emit onIgnore();
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   490
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   491
        // scroll up on first friend added so that people see where that nick went to
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   492
        if (friendsList.isEmpty())
4897
11598e7aa7e6 make names in chats clickable. still color adjustments needed; and testing
sheepluva
parents: 4892
diff changeset
   493
            chatNicks->scrollToTop();
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   494
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   495
        friendsList << curritem->text().toLower();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   496
        onChatString(HWChatWidget::tr("%1 *** %2 has been added to your friends list").arg('\x03').arg(curritem->text()));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   497
    }
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   498
    updateNickItem(curritem); // update icon/sort order/etc
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   499
    chatNicks->sortItems();
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   500
    chatNickSelected(0); // update context menu
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   501
}
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   502
2706
935b7d618cf0 sheepluva's patch to add a "follow" command to server and frontend, in order to stalk people and join them in their rooms
koda
parents: 2428
diff changeset
   503
void HWChatWidget::chatNickDoubleClicked(QListWidgetItem * item)
935b7d618cf0 sheepluva's patch to add a "follow" command to server and frontend, in order to stalk people and join them in their rooms
koda
parents: 2428
diff changeset
   504
{
4917
8ff92bdc9f98 Convert READY and NOT_READY messages to CLIENT_FLAGS message
unc0rr
parents: 4899
diff changeset
   505
    Q_UNUSED(item);
8ff92bdc9f98 Convert READY and NOT_READY messages to CLIENT_FLAGS message
unc0rr
parents: 4899
diff changeset
   506
4892
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   507
    QList<QAction *> actions = chatNicks->actions();
b0610081ee95 nicklist actions:
sheepluva
parents: 4884
diff changeset
   508
    actions.first()->activate(QAction::Trigger);
2706
935b7d618cf0 sheepluva's patch to add a "follow" command to server and frontend, in order to stalk people and join them in their rooms
koda
parents: 2428
diff changeset
   509
}
935b7d618cf0 sheepluva's patch to add a "follow" command to server and frontend, in order to stalk people and join them in their rooms
koda
parents: 2428
diff changeset
   510
2847
cde320fd3122 Frontend:
smxx
parents: 2846
diff changeset
   511
void HWChatWidget::chatNickSelected(int index)
2846
1cb8b4c425ed Frontend:
smxx
parents: 2845
diff changeset
   512
{
4560
5d6c7f88db73 - Some work on drawMap widget and scene to allow undo, clear, save and load operations
unc0rr
parents: 3925
diff changeset
   513
    Q_UNUSED(index);
5d6c7f88db73 - Some work on drawMap widget and scene to allow undo, clear, save and load operations
unc0rr
parents: 3925
diff changeset
   514
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   515
    QListWidgetItem* item = chatNicks->currentItem();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   516
    if (!item)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   517
        return;
2846
1cb8b4c425ed Frontend:
smxx
parents: 2845
diff changeset
   518
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   519
    // update context menu labels according to possible action
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   520
    if(ignoreList.contains(item->text(), Qt::CaseInsensitive))
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   521
    {
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   522
        acIgnore->setText(QAction::tr("Unignore"));
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   523
        acIgnore->setIcon(QIcon(":/res/unignore.png"));
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   524
    }
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   525
    else
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   526
    {
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   527
        acIgnore->setText(QAction::tr("Ignore"));
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   528
        acIgnore->setIcon(QIcon(":/res/ignore.png"));
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   529
    }
2846
1cb8b4c425ed Frontend:
smxx
parents: 2845
diff changeset
   530
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   531
    if(friendsList.contains(item->text(), Qt::CaseInsensitive))
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   532
    {
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   533
        acFriend->setText(QAction::tr("Remove friend"));
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   534
        acFriend->setIcon(QIcon(":/res/remfriend.png"));
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   535
    }
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   536
    else
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   537
    {
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   538
        acFriend->setText(QAction::tr("Add friend"));
3123
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   539
        acFriend->setIcon(QIcon(":/res/addfriend.png"));
b0a02930a1dc Engine:
smxx
parents: 3058
diff changeset
   540
    }
2846
1cb8b4c425ed Frontend:
smxx
parents: 2845
diff changeset
   541
}
1cb8b4c425ed Frontend:
smxx
parents: 2845
diff changeset
   542
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   543
void HWChatWidget::setShowReady(bool s)
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   544
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   545
    showReady = s;
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   546
}
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   547
1405
ee4b28a1861d Show players ready status in chat nick list
unc0rr
parents: 1391
diff changeset
   548
void HWChatWidget::setReadyStatus(const QString & nick, bool isReady)
ee4b28a1861d Show players ready status in chat nick list
unc0rr
parents: 1391
diff changeset
   549
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   550
    QList<QListWidgetItem *> items = chatNicks->findItems(nick, Qt::MatchExactly);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   551
    if (items.size() != 1)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   552
    {
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   553
        qWarning("Bug: cannot find user in chat");
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   554
        return;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   555
    }
1405
ee4b28a1861d Show players ready status in chat nick list
unc0rr
parents: 1391
diff changeset
   556
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   557
    items[0]->setData(Qt::UserRole, isReady); // bulb status
4884
b2006a9f0fbc nicklists:
sheepluva
parents: 4877
diff changeset
   558
    updateNickItem(items[0]);
2845
19db164dd20d Frontend:
smxx
parents: 2779
diff changeset
   559
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   560
    // ensure we're still showing the status bulbs
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   561
    showReady = true;
1405
ee4b28a1861d Show players ready status in chat nick list
unc0rr
parents: 1391
diff changeset
   562
}
1860
ce140b2b928a Some work on players lists context menus
unc0rr
parents: 1666
diff changeset
   563
ce140b2b928a Some work on players lists context menus
unc0rr
parents: 1666
diff changeset
   564
void HWChatWidget::adminAccess(bool b)
ce140b2b928a Some work on players lists context menus
unc0rr
parents: 1666
diff changeset
   565
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   566
    chatNicks->removeAction(acKick);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   567
    chatNicks->removeAction(acBan);
2377
f3fab2b09e0c And in frontend
nemo
parents: 1921
diff changeset
   568
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   569
    if(b)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   570
    {
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   571
        chatNicks->insertAction(0, acKick);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   572
//      chatNicks->insertAction(0, acBan);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2847
diff changeset
   573
    }
1860
ce140b2b928a Some work on players lists context menus
unc0rr
parents: 1666
diff changeset
   574
}