pidgin/quail/quail-redux
Clone
Summary
Browse
Changes
Graph
Ensure the buddy icon is displayed
2014-02-23, Phil Hannent
3a8d7a09a248
Ensure the buddy icon is displayed
/**
* @file QQuailBListWindow.cpp Buddy list window
*
* @Copyright (C) 2003-2004 Christian Hammond.
* @Copyright (C) 2013 Phil Hannent.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include
"QuailAccountsWindow.h"
#include
"QuailBListWindow.h"
#include
"QuailBlistItem.h"
#include
"QuailBuddyList.h"
#include
"QuailConvButton.h"
#include
"QuailConvWindow.h"
#include
"QuailDialogs.h"
#include
"QuailMainWindow.h"
#include
"QuailStatusSelector.h"
#include
<libpurple/debug.h>
#include
<libpurple/prefs.h>
#include
<libpurple/request.h>
#include
<libpurple/signals.h>
#include
<QAction>
#include
<QDebug>
#include
<QLayout>
#include
<QMessageBox>
#include
<QMenu>
#include
<QPushButton>
#include
<QToolBar>
#include
<QToolButton>
quail_blist_window
::
quail_blist_window
(
QMainWindow
*
parent
)
:
QMainWindow
(),
parentMainWindow
(
parent
),
convsMenu
(
NULL
)
{
buildInterface
();
}
quail_blist_window
::~
quail_blist_window
()
{
if
(
convsMenu
!=
NULL
)
delete
convsMenu
;
}
void
quail_blist_window
::
buildInterface
()
{
setWindowIcon
(
QIcon
(
":/data/images/logo.png"
));
newChatIconSet
=
QIcon
(
QPixmap
(
":/data/images/actions/new-chat.png"
));
openChatIconSet
=
QIcon
(
QPixmap
(
":/data/images/actions/chat.png"
));
newImIconSet
=
QIcon
(
QPixmap
(
":/data/images/actions/new-im.png"
));
sendImIconSet
=
QIcon
(
QPixmap
(
":/data/images/actions/send-im.png"
));
/* Setup the toolbar */
buildToolBar
();
/* Setup the buddy list */
m_buddy_tree
=
new
quail_buddy_list
(
this
);
connect
(
m_buddy_tree
,
SIGNAL
(
itemClicked
(
QTreeWidgetItem
*
,
int
)),
this
,
SLOT
(
nodeChanged
(
QTreeWidgetItem
*
,
int
)));
connect
(
m_buddy_tree
,
SIGNAL
(
currentItemChanged
(
QTreeWidgetItem
*
,
QTreeWidgetItem
*
)),
this
,
SLOT
(
nodeChanged
(
QTreeWidgetItem
*
,
QTreeWidgetItem
*
)));
connect
(
m_buddy_tree
,
SIGNAL
(
itemDoubleClicked
(
QTreeWidgetItem
*
,
int
)),
this
,
SLOT
(
doubleClickList
(
QTreeWidgetItem
*
,
int
)));
connect
(
m_buddy_tree
,
SIGNAL
(
openIm
(
PurpleBuddy
*
)),
this
,
SLOT
(
openImSlot
(
PurpleBuddy
*
)));
connect
(
m_buddy_tree
,
SIGNAL
(
addBuddy
(
PurpleGroup
*
)),
this
,
SLOT
(
showAddBuddy
(
PurpleGroup
*
)));
connect
(
m_buddy_tree
,
SIGNAL
(
addChat
(
PurpleGroup
*
)),
this
,
SLOT
(
showAddChat
(
PurpleGroup
*
)));
connect
(
m_buddy_tree
,
SIGNAL
(
joinChat
(
PurpleChat
*
)),
this
,
SLOT
(
openChatSlot
(
PurpleChat
*
)));
connect
(
m_buddy_tree
,
SIGNAL
(
removeBuddy
(
PurpleBuddy
*
)),
this
,
SLOT
(
showConfirmRemoveBuddy
(
PurpleBuddy
*
)));
connect
(
m_buddy_tree
,
SIGNAL
(
removeContact
(
PurpleContact
*
)),
this
,
SLOT
(
showConfirmRemoveContact
(
PurpleContact
*
)));
connect
(
m_buddy_tree
,
SIGNAL
(
removeGroup
(
PurpleGroup
*
)),
this
,
SLOT
(
showConfirmRemoveGroup
(
PurpleGroup
*
)));
connect
(
m_buddy_tree
,
SIGNAL
(
removeChat
(
PurpleChat
*
)),
this
,
SLOT
(
showConfirmRemoveChat
(
PurpleChat
*
)));
QVBoxLayout
*
vbox
=
new
QVBoxLayout
(
this
);
vbox
->
addWidget
(
m_buddy_tree
);
quail_status_selector
*
statusSelector
=
new
quail_status_selector
(
this
);
vbox
->
addWidget
(
statusSelector
);
QWidget
*
window
=
new
QWidget
(
this
);
window
->
setLayout
(
vbox
);
setCentralWidget
(
window
);
}
void
quail_blist_window
::
buildToolBar
()
{
QAction
*
a
;
QToolButton
*
button
;
toolbar
=
new
QToolBar
(
this
);
//toolbar->setMovable(false);
// metersButton = new QAction(this);
// metersButton->setText("Connection Meters");
// toolbar->addAction(metersButton);
// connect(metersButton, SIGNAL(triggered()), parentMainWindow, SLOT(slot_show_meters()));
/* Buddy List */
blistButton
=
new
QAction
(
QIcon
(
QPixmap
(
":/data/images/actions/blist.png"
)),
tr
(
"Buddy List"
),
this
);
blistButton
->
setCheckable
(
true
);
blistButton
->
setChecked
(
true
);
toolbar
->
addAction
(
blistButton
);
connect
(
blistButton
,
SIGNAL
(
toggled
(
bool
)),
this
,
SLOT
(
blistToggled
(
bool
)));
/* Accounts */
a
=
new
QAction
(
QIcon
(
QPixmap
(
":/data/images/actions/accounts.png"
)),
tr
(
"Accounts"
),
this
);
toolbar
->
addAction
(
a
);
connect
(
a
,
SIGNAL
(
triggered
(
bool
)),
parentMainWindow
,
SLOT
(
showAccountsWindow
()));
/* Conversations */
a
=
new
QAction
(
QIcon
(
QPixmap
(
":/data/images/actions/conversations.png"
)),
tr
(
"Conversations"
),
this
);
toolbar
->
addAction
(
a
);
connect
(
a
,
SIGNAL
(
triggered
(
bool
)),
parentMainWindow
,
SLOT
(
showConvWindow
()));
/* Now we're going to construct the toolbar on the right. */
toolbar
->
addSeparator
();
/* IM */
imButton
=
new
QAction
(
QIcon
(
QPixmap
(
":/data/images/actions/new-im.png"
)),
tr
(
"Send IM"
),
this
);
toolbar
->
addAction
(
imButton
);
imButton
->
setEnabled
(
false
);
connect
(
imButton
,
SIGNAL
(
triggered
(
bool
)),
this
,
SLOT
(
openImSlot
()));
/* Chat */
chatButton
=
new
QAction
(
newChatIconSet
,
tr
(
"Open Chat"
),
this
);
toolbar
->
addAction
(
chatButton
);
chatButton
->
setEnabled
(
false
);
connect
(
chatButton
,
SIGNAL
(
triggered
(
bool
)),
this
,
SLOT
(
openChatSlot
()));
toolbar
->
addSeparator
();
/* Add */
button
=
new
QToolButton
(
toolbar
);
button
->
setAutoRaise
(
true
);
button
->
setIcon
(
QIcon
(
QPixmap
(
":/data/images/actions/add.png"
)));
button
->
setEnabled
(
true
);
button
->
setPopupMode
(
QToolButton
::
InstantPopup
);
addButton
=
button
;
toolbar
->
addWidget
(
addButton
);
addMenu
=
new
QMenu
(
button
);
button
->
setMenu
(
addMenu
);
/* Add Buddy */
addBuddyButton
=
new
QAction
(
QIcon
(
QPixmap
(
":/data/images/actions/user.png"
)),
tr
(
"Add Buddy"
),
this
);
addMenu
->
addAction
(
addBuddyButton
);
connect
(
addBuddyButton
,
SIGNAL
(
triggered
(
bool
)),
this
,
SLOT
(
showAddBuddy
()));
/* Add Chat */
addChatButton
=
new
QAction
(
newChatIconSet
,
tr
(
"Add Chat"
),
this
);
addMenu
->
addAction
(
addChatButton
);
connect
(
addChatButton
,
SIGNAL
(
triggered
(
bool
)),
this
,
SLOT
(
showAddChat
()));
/* Add Group */
addGroupButton
=
new
QAction
(
QIcon
(
QPixmap
(
":/data/images/actions/new-group.png"
)),
tr
(
"Add Group"
),
this
);
addMenu
->
addAction
(
addGroupButton
);
connect
(
addGroupButton
,
SIGNAL
(
triggered
(
bool
)),
this
,
SLOT
(
showAddGroup
()));
/* Remove */
removeButton
=
new
QAction
(
QIcon
(
QPixmap
(
":/data/images/actions/remove.png"
)),
tr
(
"Remove"
),
this
);
toolbar
->
addAction
(
removeButton
);
removeButton
->
setEnabled
(
true
);
connect
(
removeButton
,
SIGNAL
(
triggered
(
bool
)),
this
,
SLOT
(
showRemoveBuddy
()));
toolbar
->
addSeparator
();
/* Settings menu */
button
=
new
QToolButton
(
toolbar
);
button
->
setAutoRaise
(
true
);
button
->
setIcon
(
QIcon
(
QPixmap
(
":/data/images/actions/settings.png"
)));
settingsMenu
=
new
QMenu
(
this
);
button
->
setMenu
(
settingsMenu
);
button
->
setPopupMode
(
QToolButton
::
InstantPopup
);
toolbar
->
addWidget
(
button
);
/* Show Offline Buddies */
showOfflineButton
=
new
QAction
(
QIcon
(
QPixmap
(
":/data/images/actions/offline_buddies.png"
)),
tr
(
"Show Offline Buddies"
),
this
);
showOfflineButton
->
setCheckable
(
true
);
showOfflineButton
->
setChecked
(
purple_prefs_get_bool
(
"/quail/blist/show_offline_buddies"
));
settingsMenu
->
addAction
(
showOfflineButton
);
connect
(
showOfflineButton
,
SIGNAL
(
toggled
(
bool
)),
this
,
SLOT
(
showOfflineBuddies
(
bool
)));
/* Separator */
settingsMenu
->
addSeparator
();
/* Preferences */
a
=
new
QAction
(
tr
(
"Preferences"
),
this
);
settingsMenu
->
addAction
(
a
);
connect
(
a
,
SIGNAL
(
triggered
(
bool
)),
parentMainWindow
,
SLOT
(
showPrefWindow
()));
this
->
addToolBar
(
toolbar
);
qDebug
()
<<
"QQuailBListWindow::buildToolBar.end"
;
}
void
quail_blist_window
::
setBlist
(
PurpleBuddyList
*
list
)
{
m_buddy_tree
->
setBlist
(
list
);
}
PurpleBuddyList
*
quail_blist_window
::
getBlist
()
const
{
return
m_buddy_tree
->
getBlist
();
}
void
quail_blist_window
::
account_signed_on
(
PurpleAccount
*
account
)
{
PurpleBlistNode
*
gnode
,
*
cnode
;
chatButton
->
setEnabled
(
true
);
addButton
->
setEnabled
(
true
);
addBuddyButton
->
setEnabled
(
true
);
addGroupButton
->
setEnabled
(
true
);
for
(
gnode
=
purple_get_blist
()
->
root
;
gnode
!=
NULL
;
gnode
=
gnode
->
next
)
{
if
(
!
PURPLE_BLIST_NODE_IS_GROUP
(
gnode
))
continue
;
for
(
cnode
=
gnode
->
child
;
cnode
!=
NULL
;
cnode
=
cnode
->
next
)
{
PurpleChat
*
chat
;
if
(
!
PURPLE_BLIST_NODE_IS_CHAT
(
cnode
))
continue
;
chat
=
(
PurpleChat
*
)
cnode
;
if
(
chat
->
account
!=
account
)
continue
;
if
(
purple_blist_node_get_bool
(
cnode
,
"qpe-autojoin"
))
{
serv_join_chat
(
purple_account_get_connection
(
account
),
chat
->
components
);
}
}
}
}
void
quail_blist_window
::
account_signed_off
(
PurpleAccount
*
)
{
if
(
purple_connections_get_all
()
==
NULL
)
{
imButton
->
setEnabled
(
false
);
chatButton
->
setEnabled
(
false
);
addButton
->
setEnabled
(
false
);
removeButton
->
setEnabled
(
false
);
}
}
void
quail_blist_window
::
updateNode
(
PurpleBlistNode
*
node
)
{
m_buddy_tree
->
updateNode
(
node
);
}
void
quail_blist_window
::
reloadList
()
{
m_buddy_tree
->
reload
(
true
);
}
/**************************************************************************
* Slots
**************************************************************************/
void
quail_blist_window
::
currentNodeChanged
(
QTreeWidgetItem
*
item
,
QTreeWidgetItem
*
prevItem
)
{
nodeChanged
(
item
,
prevItem
);
}
void
quail_blist_window
::
nodeChanged
(
QTreeWidgetItem
*
_item
,
QTreeWidgetItem
*
/*prev*/
)
{
qDebug
()
<<
"QQuailBListWindow::nodeChanged"
;
quail_blist_item
*
item
;
PurpleBlistNode
*
node
;
if
(
_item
==
NULL
)
{
imButton
->
setIcon
(
newImIconSet
);
chatButton
->
setIcon
(
newChatIconSet
);
removeButton
->
setEnabled
(
false
);
}
else
{
item
=
(
quail_blist_item
*
)
_item
;
node
=
item
->
getBlistNode
();
imButton
->
setEnabled
(
true
);
chatButton
->
setEnabled
(
true
);
if
(
PURPLE_BLIST_NODE_IS_BUDDY
(
node
)
||
PURPLE_BLIST_NODE_IS_CONTACT
(
node
))
{
imButton
->
setIcon
(
sendImIconSet
);
chatButton
->
setIcon
(
newChatIconSet
);
}
else
if
(
PURPLE_BLIST_NODE_IS_CHAT
(
node
))
{
imButton
->
setIcon
(
newImIconSet
);
chatButton
->
setIcon
(
openChatIconSet
);
}
else
{
imButton
->
setIcon
(
newImIconSet
);
chatButton
->
setIcon
(
newChatIconSet
);
}
removeButton
->
setEnabled
(
true
);
}
}
void
quail_blist_window
::
doubleClickList
(
QTreeWidgetItem
*
_item
,
int
/*col*/
)
{
qDebug
()
<<
"QQuailBListWindow::doubleClickList"
;
quail_blist_item
*
item
;
PurpleBlistNode
*
node
;
item
=
(
quail_blist_item
*
)
_item
;
node
=
item
->
getBlistNode
();
if
(
PURPLE_BLIST_NODE_IS_BUDDY
(
node
)
||
PURPLE_BLIST_NODE_IS_CONTACT
(
node
))
openImSlot
();
else
if
(
PURPLE_BLIST_NODE_IS_CHAT
(
node
))
openChatSlot
();
}
void
quail_blist_window
::
showAddBuddy
(
PurpleGroup
*
group
)
{
qDebug
()
<<
"QQuailBListWindow::showAddBuddy"
;
quail_add_buddy_dialog
*
dialog
;
quail_blist_item
*
item
;
PurpleBlistNode
*
node
;
if
(
group
==
NULL
)
{
item
=
(
quail_blist_item
*
)
m_buddy_tree
->
currentItem
();
if
(
item
!=
NULL
)
{
node
=
item
->
getBlistNode
();
if
(
PURPLE_BLIST_NODE_IS_GROUP
(
node
))
{
group
=
(
PurpleGroup
*
)
node
;
}
else
if
(
PURPLE_BLIST_NODE_IS_BUDDY
(
node
)
||
PURPLE_BLIST_NODE_IS_CHAT
(
node
))
{
group
=
((
PurpleGroup
*
)
node
->
parent
);
}
}
}
dialog
=
new
quail_add_buddy_dialog
(
this
);
if
(
group
!=
NULL
)
dialog
->
setGroup
(
group
->
name
);
dialog
->
show
();
}
void
quail_blist_window
::
showAddBuddy
()
{
showAddBuddy
(
NULL
);
}
void
quail_blist_window
::
showAddChat
(
PurpleGroup
*
group
)
{
qDebug
()
<<
"QQuailBListWindow::showAddChat()"
;
quail_add_chat_dialog
*
dialog
;
quail_blist_item
*
item
;
PurpleBlistNode
*
node
;
if
(
group
==
NULL
)
{
item
=
(
quail_blist_item
*
)
m_buddy_tree
->
currentItem
();
if
(
item
!=
NULL
)
{
node
=
item
->
getBlistNode
();
if
(
PURPLE_BLIST_NODE_IS_GROUP
(
node
))
{
group
=
(
PurpleGroup
*
)
node
;
}
else
if
(
PURPLE_BLIST_NODE_IS_BUDDY
(
node
)
||
PURPLE_BLIST_NODE_IS_CHAT
(
node
))
{
group
=
((
PurpleGroup
*
)
node
->
parent
);
}
}
}
dialog
=
new
quail_add_chat_dialog
(
this
);
if
(
group
!=
NULL
)
dialog
->
setGroup
(
group
->
name
);
dialog
->
show
();
}
void
quail_blist_window
::
showAddChat
()
{
showAddChat
(
NULL
);
}
static
void
addGroupCb
(
void
*
,
const
char
*
groupName
)
{
qDebug
()
<<
"QQuailBListWindow::addGroupCb()"
;
PurpleGroup
*
group
;
group
=
purple_group_new
(
groupName
);
purple_blist_add_group
(
group
,
NULL
);
//TODO: See if this is required any more
//purple_blist_save();
}
void
quail_blist_window
::
showAddGroup
()
{
qDebug
()
<<
"QQuailBListWindow::showAddGroup()"
;
purple_request_input
(
this
,
tr
(
"Add Group"
).
toStdString
().
c_str
(),
tr
(
"Please enter the name of the group to be added."
).
toStdString
().
c_str
(),
NULL
,
NULL
,
FALSE
,
FALSE
,
NULL
,
tr
(
"Add"
).
toStdString
().
c_str
(),
G_CALLBACK
(
addGroupCb
),
tr
(
"Cancel"
).
toStdString
().
c_str
(),
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
}
static
void
removeBuddyCb
(
PurpleBuddy
*
buddy
)
{
qDebug
()
<<
"QQuailBListWindow::removeBuddyCb()"
;
if
(
buddy
==
NULL
)
return
;
PurpleBlistNode
*
node
=
PURPLE_BLIST_NODE
(
buddy
);
if
(
PURPLE_BLIST_NODE_IS_BUDDY
(
node
))
{
purple_blist_remove_buddy
((
PurpleBuddy
*
)
node
);
}
else
if
(
PURPLE_BLIST_NODE_IS_CHAT
(
node
))
{
purple_blist_remove_chat
((
PurpleChat
*
)
node
);
}
else
if
(
PURPLE_BLIST_NODE_IS_GROUP
(
node
))
{
purple_blist_remove_group
((
PurpleGroup
*
)
node
);
}
else
if
(
PURPLE_BLIST_NODE_IS_CONTACT
(
node
))
{
purple_blist_remove_contact
((
PurpleContact
*
)
node
);
}
}
static
void
removeContactCb
(
PurpleContact
*
contact
)
{
qDebug
()
<<
"QQuailBListWindow::removeContactCb()"
;
PurpleBlistNode
*
bnode
,
*
cnode
;
// PurpleGroup *group;
if
(
contact
==
NULL
)
return
;
cnode
=
(
PurpleBlistNode
*
)
contact
;
// group = (PurpleGroup *)cnode->parent;
for
(
bnode
=
cnode
->
child
;
bnode
!=
NULL
;
bnode
=
bnode
->
next
)
{
PurpleBuddy
*
buddy
=
(
PurpleBuddy
*
)
bnode
;
if
(
purple_account_get_connection
(
buddy
->
account
)
!=
NULL
)
{
// serv_remove_buddy(purple_account_get_connection(buddy->account),
// buddy->name, group->name);
}
}
purple_blist_remove_contact
(
contact
);
}
static
void
removeChatCb
(
PurpleChat
*
chat
)
{
qDebug
()
<<
"QQuailBListWindow::removeChatCb()"
;
purple_blist_remove_chat
(
chat
);
}
static
void
removeGroupCb
(
PurpleGroup
*
group
)
{
qDebug
()
<<
"QQuailBListWindow::removeGroupCb()"
;
PurpleBlistNode
*
node
,
*
child
;
for
(
node
=
((
PurpleBlistNode
*
)
group
)
->
child
;
node
!=
NULL
;
node
=
node
->
next
)
{
if
(
PURPLE_BLIST_NODE_IS_CONTACT
(
node
))
{
for
(
child
=
node
->
child
;
child
!=
NULL
;
child
=
child
->
next
)
{
if
(
PURPLE_BLIST_NODE_IS_BUDDY
(
child
))
{
PurpleBuddy
*
buddy
=
(
PurpleBuddy
*
)
child
;
PurpleConversation
*
conv
;
conv
=
purple_find_conversation_with_account
(
PURPLE_CONV_TYPE_CHAT
,
buddy
->
name
,
buddy
->
account
);
if
(
purple_account_is_connected
(
buddy
->
account
))
{
// serv_remove_buddy(purple_account_get_connection(
// buddy->account), buddy->name, group->name);
purple_blist_remove_buddy
(
buddy
);
if
(
conv
!=
NULL
)
{
purple_conversation_update
(
conv
,
PURPLE_CONV_UPDATE_REMOVE
);
}
}
}
}
}
else
if
(
PURPLE_BLIST_NODE_IS_CHAT
(
node
))
{
PurpleChat
*
chat
=
(
PurpleChat
*
)
node
;
if
(
purple_account_is_connected
(
chat
->
account
))
purple_blist_remove_chat
(
chat
);
}
}
purple_blist_remove_group
(
group
);
}
void
quail_blist_window
::
showRemoveBuddy
()
{
qDebug
()
<<
"QQuailBListWindow::showRemoveBuddy()"
;
quail_blist_item
*
item
;
PurpleBlistNode
*
node
;
item
=
(
quail_blist_item
*
)
m_buddy_tree
->
currentItem
();
node
=
item
->
getBlistNode
();
if
(
PURPLE_BLIST_NODE_IS_BUDDY
(
node
))
{
showConfirmRemoveBuddy
((
PurpleBuddy
*
)
node
);
}
else
if
(
PURPLE_BLIST_NODE_IS_CONTACT
(
node
))
{
showConfirmRemoveContact
((
PurpleContact
*
)
node
);
}
else
if
(
PURPLE_BLIST_NODE_IS_CHAT
(
node
))
{
showConfirmRemoveChat
((
PurpleChat
*
)
node
);
}
else
if
(
PURPLE_BLIST_NODE_IS_GROUP
(
node
))
{
showConfirmRemoveGroup
((
PurpleGroup
*
)
node
);
}
}
void
quail_blist_window
::
showConfirmRemoveBuddy
(
PurpleBuddy
*
buddy
)
{
qDebug
()
<<
"QQuailBListWindow::showConfirmRemoveBuddy()"
;
QString
name
=
buddy
->
name
;
int
result
=
QMessageBox
::
information
(
this
,
tr
(
"Remove Buddy"
),
tr
(
"<p>You are about to remove %1 from your buddy list.</p>
\n
"
"<p>Do you want to continue?</p>"
).
arg
(
name
),
tr
(
"&Remove Buddy"
),
tr
(
"&Cancel"
),
QString
::
null
,
1
,
1
);
if
(
result
==
0
)
removeBuddyCb
(
buddy
);
}
void
quail_blist_window
::
showConfirmRemoveContact
(
PurpleContact
*
contact
)
{
qDebug
()
<<
"QQuailBListWindow::showConfirmRemoveContact()"
;
PurpleBuddy
*
buddy
=
purple_contact_get_priority_buddy
(
contact
);
if
(
buddy
==
NULL
)
return
;
if
(((
PurpleBlistNode
*
)
contact
)
->
child
==
(
PurpleBlistNode
*
)
buddy
&&
((
PurpleBlistNode
*
)
buddy
)
->
next
==
NULL
)
{
showConfirmRemoveBuddy
(
buddy
);
}
else
{
int
result
=
QMessageBox
::
information
(
this
,
tr
(
"Remove Contact"
),
tr
(
"<p>You are about to remove the contact containing "
"%1 and %2 other buddies from your buddy list.</p>
\n
"
"<p>Do you want to continue?</p>"
).
arg
(
buddy
->
name
,
contact
->
totalsize
-
1
),
tr
(
"&Remove Contact"
),
tr
(
"&Cancel"
),
QString
::
null
,
1
,
1
);
if
(
result
==
0
)
removeContactCb
(
contact
);
}
}
void
quail_blist_window
::
showConfirmRemoveChat
(
PurpleChat
*
chat
)
{
qDebug
()
<<
"QQuailBListWindow::showConfirmRemoveChat()"
;
QString
name
=
purple_chat_get_name
(
chat
);
int
result
=
QMessageBox
::
information
(
this
,
tr
(
"Remove Chat"
),
tr
(
"<p>You are about to remove the chat %1 from "
"your buddy list.</p>
\n
"
"<p>Do you want to continue?</p>"
).
arg
(
name
),
tr
(
"&Remove Chat"
),
tr
(
"&Cancel"
),
QString
::
null
,
1
,
1
);
if
(
result
==
0
)
removeChatCb
(
chat
);
}
void
quail_blist_window
::
showConfirmRemoveGroup
(
PurpleGroup
*
group
)
{
qDebug
()
<<
"QQuailBListWindow::showConfirmRemoveGroup()"
;
QString
name
=
group
->
name
;
int
result
=
QMessageBox
::
information
(
this
,
tr
(
"Remove Group"
),
tr
(
"<p>You are about to remove %1 and all its members from "
"your buddy list.</p>
\n
"
"<p>Do you want to continue?</p>"
).
arg
(
name
),
tr
(
"&Remove Group"
),
tr
(
"&Cancel"
),
QString
::
null
,
1
,
1
);
if
(
result
==
0
)
removeGroupCb
(
group
);
}
void
quail_blist_window
::
showOfflineBuddies
(
bool
on
)
{
qDebug
()
<<
"QQuailBListWindow::showOfflineBuddies()"
;
purple_prefs_set_bool
(
"/quail/blist/show_offline_buddies"
,
on
);
m_buddy_tree
->
reload
(
true
);
}
void
quail_blist_window
::
blistToggled
(
bool
toggle
)
{
qDebug
()
<<
"QQuailBListWindow::blistToggled()"
;
//TODO: Check to see if this should toggle
blistButton
->
setChecked
(
toggle
);
}
void
quail_blist_window
::
openImSlot
(
PurpleBuddy
*
buddy
)
{
qDebug
()
<<
"QQuailBListWindow::openImSlot()"
;
if
(
buddy
==
NULL
)
buddy
=
m_buddy_tree
->
getSelectedBuddy
();
if
(
buddy
!=
NULL
)
{
qDebug
()
<<
"QQuailBListWindow::openImSlot().1"
;
PurpleConversation
*
conv
;
// QQuailConvWindow *win;
conv
=
purple_conversation_new
(
PURPLE_CONV_TYPE_IM
,
buddy
->
account
,
buddy
->
name
);
purple_conversation_present
(
conv
);
// win = purple_conversation_get_window(conv);
// win->raise();
// purple_conv_window_raise(win);
// purple_conv_window_switch_conversation(win,
// purple_conversation_get_index(conv));
}
else
{
qDebug
()
<<
"QQuailBListWindow::openImSlot().1"
;
quail_new_im_dialog
*
dialog
;
dialog
=
new
quail_new_im_dialog
(
this
);
dialog
->
show
();
}
qDebug
()
<<
"QQuailBListWindow::openImSlot().end"
;
}
void
quail_blist_window
::
openImSlot
()
{
openImSlot
(
NULL
);
}
void
quail_blist_window
::
openChatSlot
(
PurpleChat
*
chat
)
{
qDebug
()
<<
"QQuailBListWindow::openChatSlot()"
;
quail_blist_item
*
item
;
PurpleBlistNode
*
node
=
NULL
;
if
(
chat
==
NULL
)
{
qDebug
()
<<
"QQuailBListWindow::openChatSlot().1"
;
item
=
(
quail_blist_item
*
)
m_buddy_tree
->
currentItem
();
if
(
item
!=
NULL
)
{
qDebug
()
<<
"QQuailBListWindow::openChatSlot().2"
;
node
=
item
->
getBlistNode
();
if
(
PURPLE_BLIST_NODE_IS_CHAT
(
node
))
chat
=
(
PurpleChat
*
)
node
;
}
}
qDebug
()
<<
"QQuailBListWindow::openChatSlot().3"
;
if
(
chat
!=
NULL
)
{
qDebug
()
<<
"QQuailBListWindow::openChatSlot().4"
;
serv_join_chat
(
purple_account_get_connection
(
chat
->
account
),
chat
->
components
);
}
else
{
qDebug
()
<<
"QQuailBListWindow::openChatSlot().5"
;
quail_join_chat_dialog
*
dialog
;
dialog
=
new
quail_join_chat_dialog
(
this
);
dialog
->
show
();
}
qDebug
()
<<
"QQuailBListWindow::openChatSlot().end"
;
}
void
quail_blist_window
::
openChatSlot
()
{
openChatSlot
(
NULL
);
}
/**************************************************************************
* callbacks
**************************************************************************/
static
void
signed_on_callback
(
PurpleConnection
*
gc
,
PurpleBuddyList
*
blist
)
{
quail_blist_window
*
qblist
=
static_cast
<
quail_blist_window
*>
(
blist
->
ui_data
);
qblist
->
account_signed_on
(
purple_connection_get_account
(
gc
));
}
static
void
signed_off_callback
(
PurpleConnection
*
gc
,
PurpleBuddyList
*
blist
)
{
quail_blist_window
*
qblist
=
static_cast
<
quail_blist_window
*>
(
blist
->
ui_data
);
qblist
->
account_signed_off
(
purple_connection_get_account
(
gc
));
}
/**************************************************************************
* blist UI
**************************************************************************/
static
void
quail_blist_new_list_callback
(
PurpleBuddyList
*
blist
)
{
quail_blist_window
*
win
=
qQuailGetMainWindow
()
->
getBlistWindow
();
blist
->
ui_data
=
win
;
win
->
setBlist
(
blist
);
/* Setup some signal handlers */
purple_signal_connect
(
purple_connections_get_handle
(),
"signed-on"
,
blist
->
ui_data
,
PURPLE_CALLBACK
(
signed_on_callback
),
blist
);
purple_signal_connect
(
purple_connections_get_handle
(),
"signed-off"
,
blist
->
ui_data
,
PURPLE_CALLBACK
(
signed_off_callback
),
blist
);
}
static
void
quail_blist_new_node_callback
(
PurpleBlistNode
*
)
{
//qDebug() << "QQuailBListWindow::qQuailBlistNewNode()";
/* This is meant to happen in the BuddyList update functions */
}
static
void
quail_blist_show_callback
(
PurpleBuddyList
*
blist
)
{
quail_blist_window
*
blist_win
=
static_cast
<
quail_blist_window
*>
(
blist
->
ui_data
);
blist_win
->
show
();
}
static
void
quail_blist_update_callback
(
PurpleBuddyList
*
blist
,
PurpleBlistNode
*
node
)
{
quail_blist_window
*
blist_win
=
static_cast
<
quail_blist_window
*>
(
blist
->
ui_data
);
blist_win
->
updateNode
(
node
);
}
static
void
quail_blist_remove_callback
(
PurpleBuddyList
*
blist
,
PurpleBlistNode
*
node
)
{
quail_blist_window
*
blist_win
=
static_cast
<
quail_blist_window
*>
(
blist
->
ui_data
);
quail_blist_item
*
item
=
static_cast
<
quail_blist_item
*>
(
node
->
ui_data
);
quail_blist_item
*
parent
;
if
(
item
!=
NULL
)
{
parent
=
static_cast
<
quail_blist_item
*>
(
item
->
parent
());
delete
item
;
if
(
parent
!=
NULL
)
blist_win
->
updateNode
(
parent
->
getBlistNode
());
}
node
->
ui_data
=
NULL
;
}
static
void
quail_blist_destroy_callback
(
PurpleBuddyList
*
blist
)
{
quail_blist_window
*
qblist
=
static_cast
<
quail_blist_window
*>
(
blist
->
ui_data
);
delete
qblist
;
blist
->
ui_data
=
NULL
;
}
static
void
quail_blist_set_visible_callback
(
PurpleBuddyList
*
blist
,
gboolean
show
)
{
quail_blist_window
*
qblist
=
static_cast
<
quail_blist_window
*>
(
blist
->
ui_data
);
if
(
show
)
qblist
->
show
();
else
qblist
->
hide
();
}
static
PurpleBlistUiOps
blist_ui_ops
=
{
quail_blist_new_list_callback
,
quail_blist_new_node_callback
,
quail_blist_show_callback
,
quail_blist_update_callback
,
quail_blist_remove_callback
,
quail_blist_destroy_callback
,
quail_blist_set_visible_callback
,
NULL
,
/* request_add_buddy */
NULL
,
/* request_add_chat */
NULL
,
/* request_add_group */
NULL
,
/* save_node */
NULL
,
/* remove_node */
NULL
,
/* save_account */
NULL
};
PurpleBlistUiOps
*
quail_get_blist_ui_ops
()
{
return
&
blist_ui_ops
;
}