summaryrefslogtreecommitdiff
authorzecke <zecke>2004-09-08 21:51:06 (UTC)
committer zecke <zecke>2004-09-08 21:51:06 (UTC)
commitebb830522c9662bda4c4453e532bcc29631c5d60 (patch) (unidiff)
tree5cf95975e91cb2db78be5cdf47c01a340109c1f4
parentf0fdb800d57e9a1d95ba593185e9462300539eea (diff)
downloadopie-ebb830522c9662bda4c4453e532bcc29631c5d60.zip
opie-ebb830522c9662bda4c4453e532bcc29631c5d60.tar.gz
opie-ebb830522c9662bda4c4453e532bcc29631c5d60.tar.bz2
-Close Tab Keyboard Accelerator with delayed deletion of the tab
-Optionally add a TimeStamp to the Tab -Remove not implemented CTCP actions from the Channel PopupMenu -Give Focus to the Edit Line -Some more ping handling patch inspired and copied from zautrix fork
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/opieirc/.cvsignore3
-rw-r--r--noncore/net/opieirc/ircchanneltab.cpp22
-rw-r--r--noncore/net/opieirc/ircchanneltab.h2
-rw-r--r--noncore/net/opieirc/ircmessageparser.cpp34
-rw-r--r--noncore/net/opieirc/ircmisc.cpp5
-rw-r--r--noncore/net/opieirc/ircmisc.h3
-rw-r--r--noncore/net/opieirc/ircquerytab.cpp9
-rw-r--r--noncore/net/opieirc/ircserverlist.cpp9
-rw-r--r--noncore/net/opieirc/ircserverlist.h3
-rw-r--r--noncore/net/opieirc/ircservertab.cpp25
-rw-r--r--noncore/net/opieirc/ircsettings.cpp18
-rw-r--r--noncore/net/opieirc/ircsettings.h2
-rw-r--r--noncore/net/opieirc/irctab.cpp16
-rw-r--r--noncore/net/opieirc/irctab.h4
-rw-r--r--noncore/net/opieirc/mainwindow.cpp32
-rw-r--r--noncore/net/opieirc/mainwindow.h7
16 files changed, 155 insertions, 39 deletions
diff --git a/noncore/net/opieirc/.cvsignore b/noncore/net/opieirc/.cvsignore
index d5423d6..0ccbade 100644
--- a/noncore/net/opieirc/.cvsignore
+++ b/noncore/net/opieirc/.cvsignore
@@ -1,4 +1,5 @@
1Makefile 1Makefile
2Makefile.in 2Makefile.in
3moc_*.cpp 3moc_*.cpp
4.moc \ No newline at end of file 4.moc
5*.gch \ No newline at end of file
diff --git a/noncore/net/opieirc/ircchanneltab.cpp b/noncore/net/opieirc/ircchanneltab.cpp
index b6e3954..7610058 100644
--- a/noncore/net/opieirc/ircchanneltab.cpp
+++ b/noncore/net/opieirc/ircchanneltab.cpp
@@ -12,56 +12,57 @@ IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainW
12 QHBox *hbox = new QHBox(this); 12 QHBox *hbox = new QHBox(this);
13 m_textview = new QTextView(hbox); 13 m_textview = new QTextView(hbox);
14 m_textview->setHScrollBarMode(QScrollView::AlwaysOff); 14 m_textview->setHScrollBarMode(QScrollView::AlwaysOff);
15 m_textview->setVScrollBarMode(QScrollView::AlwaysOn); 15 m_textview->setVScrollBarMode(QScrollView::AlwaysOn);
16 m_listVisible = TRUE; 16 m_listVisible = TRUE;
17 m_listButton = new QPushButton(">", m_textview); 17 m_listButton = new QPushButton(">", m_textview);
18 m_listButton->setFlat( true );
18 m_textview->setCornerWidget(m_listButton); 19 m_textview->setCornerWidget(m_listButton);
19 m_textview->setTextFormat(RichText); 20 m_textview->setTextFormat(RichText);
20 QWhatsThis::add(m_textview, tr("Channel discussion")); 21 QWhatsThis::add(m_textview, tr("Channel discussion"));
21 connect(m_listButton, SIGNAL(clicked()), this, SLOT(toggleList())); 22 connect(m_listButton, SIGNAL(clicked()), this, SLOT(toggleList()));
22 m_list = new IRCChannelList(m_channel, hbox); 23 m_list = new IRCChannelList(m_channel, hbox);
23 m_list->update(); 24 m_list->update();
24 m_list->setMaximumWidth(LISTWIDTH); 25 m_list->setMaximumWidth(LISTWIDTH);
25 m_field = new IRCHistoryLineEdit(this); 26 m_field = new IRCHistoryLineEdit(this);
26 connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab())); 27 connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab()));
27 connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab())); 28 connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab()));
28 connect(m_field, SIGNAL(closeTab()), this, SIGNAL(closeTab())); 29 connect(m_field, SIGNAL(closeTab()), this, SLOT(remove()));
29 connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus())); 30 connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus()));
30 31
31 QWhatsThis::add(m_field, tr("Type your message here to participate in the channel discussion")); 32 QWhatsThis::add(m_field, tr("Type your message here to participate in the channel discussion"));
32 m_popup = new QPopupMenu(m_list); 33 m_popup = new QPopupMenu(m_list);
33 m_lines = 0; 34 m_lines = 0;
34 /* Required so that embedded-style "right" clicks work */ 35 /* Required so that embedded-style "right" clicks work */
35 QPEApplication::setStylusOperation(m_list->viewport(), QPEApplication::RightOnHold); 36 QPEApplication::setStylusOperation(m_list->viewport(), QPEApplication::RightOnHold);
36 connect(m_list, SIGNAL(mouseButtonPressed(int,QListBoxItem*,const QPoint&)), this, SLOT(mouseButtonPressed(int,QListBoxItem*,const QPoint&))); 37 connect(m_list, SIGNAL(mouseButtonPressed(int,QListBoxItem*,const QPoint&)), this, SLOT(mouseButtonPressed(int,QListBoxItem*,const QPoint&)));
37 /* Construct the popup menu */ 38 /* Construct the popup menu */
38 QPopupMenu *ctcpMenu = new QPopupMenu(m_list); 39 QPopupMenu *ctcpMenu = new QPopupMenu(m_list);
39 m_popup->insertItem(Resource::loadPixmap("opieirc/ctcp"), tr("CTCP"), ctcpMenu);
40 m_popup->insertItem(Resource::loadPixmap("opieirc/query"), tr("Query"), this, SLOT(popupQuery())); 40 m_popup->insertItem(Resource::loadPixmap("opieirc/query"), tr("Query"), this, SLOT(popupQuery()));
41 ctcpMenu->insertItem(Resource::loadPixmap("opieirc/ping"), tr("Ping"), this, SLOT(popupPing())); 41 ctcpMenu->insertItem(Resource::loadPixmap("opieirc/ping"), tr("Ping"), this, SLOT(popupPing()));
42 ctcpMenu->insertItem(Resource::loadPixmap("opieirc/version"), tr("Version"), this, SLOT(popupVersion())); 42 ctcpMenu->insertItem(Resource::loadPixmap("opieirc/version"), tr("Version"), this, SLOT(popupVersion()));
43 ctcpMenu->insertItem(Resource::loadPixmap("opieirc/whois"), tr("Whois"), this, SLOT(popupWhois())); 43 ctcpMenu->insertItem(Resource::loadPixmap("opieirc/whois"), tr("Whois"), this, SLOT(popupWhois()));
44 connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling())); 44 connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling()));
45 m_layout->add(hbox); 45 m_layout->add(hbox);
46 hbox->show(); 46 hbox->show();
47 m_layout->add(m_field); 47 m_layout->add(m_field);
48 m_field->setFocus(); 48 m_field->setFocus();
49 m_field->setActiveWindow(); 49 m_field->setActiveWindow();
50 50
51 connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); 51 connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand()));
52 connect(m_list, SIGNAL(doubleClicked ( QListBoxItem * ) ), this, SLOT(popupQuery( QListBoxItem * ) ));
52 settingsChanged(); 53 settingsChanged();
53} 54}
54 55
55void IRCChannelTab::scrolling(){ 56void IRCChannelTab::scrolling(){
56 m_textview->ensureVisible(0, m_textview->contentsHeight()); 57 m_textview->ensureVisible(0, m_textview->contentsHeight());
57} 58}
58 59
59void IRCChannelTab::appendText(QString text) { 60void IRCChannelTab::appendText(QString text) {
60 /* not using append because it creates layout problems */ 61 /* not using append because it creates layout problems */
61 QString txt = m_textview->text() + text + "\n"; 62 QString txt = m_textview->text() + IRCTab::appendTimestamp( text );
62 if (m_maxLines > 0 && m_lines >= m_maxLines) { 63 if (m_maxLines > 0 && m_lines >= m_maxLines) {
63 int firstBreak = txt.find('\n'); 64 int firstBreak = txt.find('\n');
64 if (firstBreak != -1) { 65 if (firstBreak != -1) {
65 txt = "<qt bgcolor=\"" + m_backgroundColor + "\"/>" + txt.right(txt.length() - (firstBreak + 1)); 66 txt = "<qt bgcolor=\"" + m_backgroundColor + "\"/>" + txt.right(txt.length() - (firstBreak + 1));
66 } 67 }
67 } else { 68 } else {
@@ -69,13 +70,15 @@ void IRCChannelTab::appendText(QString text) {
69 } 70 }
70 m_textview->ensureVisible(0, m_textview->contentsHeight()); 71 m_textview->ensureVisible(0, m_textview->contentsHeight());
71 m_textview->setText(txt); 72 m_textview->setText(txt);
72 m_textview->ensureVisible(0, m_textview->contentsHeight()); 73 m_textview->ensureVisible(0, m_textview->contentsHeight());
73 74
74 int p1, p2; 75 int p1, p2;
75 if ( (p1 = text.find("ping", 0, false) )!= -1 && (p2 = text.find( m_parentTab->server()->nick(), 0,false )) != -1 ) { 76 if ( text.contains( IRCMessageParser::tr("Received a CTCP PING from ") ) )
77 emit ping( title() );
78 else if ( (p1 = text.find("ping", 0, false) )!= -1 && (p2 = text.find( m_parentTab->server()->nick(), 0,false )) != -1 ) {
76 int col = text.findRev("color", -1, false); 79 int col = text.findRev("color", -1, false);
77 if ( col < p2 ) 80 if ( col < p2 )
78 emit ping( title() ); 81 emit ping( title() );
79 82
80 } 83 }
81 84
@@ -129,26 +132,31 @@ void IRCChannelTab::mouseButtonPressed(int mouse, QListBoxItem *, const QPoint &
129 case 2: 132 case 2:
130 m_popup->popup(point); 133 m_popup->popup(point);
131 break; 134 break;
132 }; 135 };
133} 136}
134 137
135void IRCChannelTab::popupQuery() { 138void IRCChannelTab::popupQuery( QListBoxItem *item) {
136 if (m_list->currentItem() != -1) { 139 if (item) {
137 IRCPerson *person = session()->getPerson(m_list->item(m_list->currentItem())->text()); 140 IRCPerson *person = session()->getPerson(item->text());
138 if (person) { 141 if (person) {
139 IRCQueryTab *tab = m_parentTab->getTabForQuery(person); 142 IRCQueryTab *tab = m_parentTab->getTabForQuery(person);
140 if (!tab) { 143 if (!tab) {
141 tab = new IRCQueryTab(person, m_parentTab, m_mainWindow, (QWidget *)parent()); 144 tab = new IRCQueryTab(person, m_parentTab, m_mainWindow, (QWidget *)parent());
142 m_parentTab->addQueryTab(tab); 145 m_parentTab->addQueryTab(tab);
143 m_mainWindow->addTab(tab); 146 m_mainWindow->addTab(tab);
144 } 147 }
145 } 148 }
146 } 149 }
147} 150}
148 151
152void IRCChannelTab::popupQuery() {
153 if ( m_list->currentItem() != -1 )
154 popupQuery( m_list->item(m_list->currentItem()));
155}
156
149void IRCChannelTab::popupPing() { 157void IRCChannelTab::popupPing() {
150 //HAHA, no wonder these don't work 158 //HAHA, no wonder these don't work
151} 159}
152 160
153void IRCChannelTab::popupVersion() { 161void IRCChannelTab::popupVersion() {
154} 162}
diff --git a/noncore/net/opieirc/ircchanneltab.h b/noncore/net/opieirc/ircchanneltab.h
index 001c96d..70b212c 100644
--- a/noncore/net/opieirc/ircchanneltab.h
+++ b/noncore/net/opieirc/ircchanneltab.h
@@ -50,13 +50,15 @@ public slots:
50 void scrolling(); 50 void scrolling();
51protected slots: 51protected slots:
52 void processCommand(); 52 void processCommand();
53 void toggleList(); 53 void toggleList();
54 void mouseButtonPressed(int mouse, QListBoxItem *item, const QPoint &point); 54 void mouseButtonPressed(int mouse, QListBoxItem *item, const QPoint &point);
55 /* Popup slots */ 55 /* Popup slots */
56 void popupQuery(QListBoxItem*);
56 void popupQuery(); 57 void popupQuery();
58
57 void popupPing(); 59 void popupPing();
58 void popupVersion(); 60 void popupVersion();
59 void popupWhois(); 61 void popupWhois();
60protected: 62protected:
61 IRCServerTab *m_parentTab; 63 IRCServerTab *m_parentTab;
62 IRCChannel *m_channel; 64 IRCChannel *m_channel;
diff --git a/noncore/net/opieirc/ircmessageparser.cpp b/noncore/net/opieirc/ircmessageparser.cpp
index 90280d7..ecc7e9a 100644
--- a/noncore/net/opieirc/ircmessageparser.cpp
+++ b/noncore/net/opieirc/ircmessageparser.cpp
@@ -280,12 +280,46 @@ void IRCMessageParser::parseLiteralError(IRCMessage *message) {
280} 280}
281 281
282void IRCMessageParser::parseCTCPPing(IRCMessage *message) { 282void IRCMessageParser::parseCTCPPing(IRCMessage *message) {
283 IRCPerson mask(message->prefix()); 283 IRCPerson mask(message->prefix());
284 m_session->m_connection->sendCTCP(mask.nick(), "PING " + message->allParameters()); 284 m_session->m_connection->sendCTCP(mask.nick(), "PING " + message->allParameters());
285 emit outputReady(IRCOutput(OUTPUT_CTCP, tr("Received a CTCP PING from ")+mask.nick())); 285 emit outputReady(IRCOutput(OUTPUT_CTCP, tr("Received a CTCP PING from ")+mask.nick()));
286
287 //IRCPerson mask(message->prefix());
288 QString dest = message->ctcpDestination();
289 if (dest.startsWith("#")) {
290 IRCChannel *channel = m_session->getChannel(dest.lower());
291 if (channel) {
292 IRCChannelPerson *person = channel->getPerson(mask.nick());
293 if (person) {
294 IRCOutput output(OUTPUT_CHANACTION, tr("Received a CTCP PING from ")+ mask.nick()) ;
295 output.addParam(channel);
296 output.addParam(person);
297 emit outputReady(output);
298 } else {
299 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("CTCP PING with unknown person - Desynchronized?")));
300 }
301 } else {
302 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("CTCP PING with unknown channel - Desynchronized?")));
303 }
304 } else {
305 if (message->ctcpDestination() == m_session->m_server->nick()) {
306 IRCPerson *person = m_session->getPerson(mask.nick());
307 if (!person) {
308 /* Person not yet known, create and add to the current session */
309 person = new IRCPerson(message->prefix());
310 m_session->addPerson(person);
311 }
312 IRCOutput output(OUTPUT_QUERYACTION, tr("Received a CTCP PING from ")+ mask.nick() );
313 output.addParam(person);
314 emit outputReady(output);
315 } else {
316 emit outputReady(IRCOutput(OUTPUT_ERROR, tr("CTCP PING with bad recipient")));
317 }
318 }
319
286} 320}
287 321
288void IRCMessageParser::parseCTCPVersion(IRCMessage *message) { 322void IRCMessageParser::parseCTCPVersion(IRCMessage *message) {
289 IRCPerson mask(message->prefix()); 323 IRCPerson mask(message->prefix());
290 m_session->m_connection->sendCTCP(mask.nick(), APP_VERSION " " APP_COPYSTR); 324 m_session->m_connection->sendCTCP(mask.nick(), APP_VERSION " " APP_COPYSTR);
291 emit outputReady(IRCOutput(OUTPUT_CTCP, tr("Received a CTCP VERSION from ")+mask.nick())); 325 emit outputReady(IRCOutput(OUTPUT_CTCP, tr("Received a CTCP VERSION from ")+mask.nick()));
diff --git a/noncore/net/opieirc/ircmisc.cpp b/noncore/net/opieirc/ircmisc.cpp
index 9b9bff8..6fc5ba0 100644
--- a/noncore/net/opieirc/ircmisc.cpp
+++ b/noncore/net/opieirc/ircmisc.cpp
@@ -64,12 +64,15 @@ OKeyConfigManager* IRCHistoryLineEdit::keyConfigInstance() {
64 "keys", blackList, 64 "keys", blackList,
65 false, 0, "irc_history_line_keyconfigm" ); 65 false, 0, "irc_history_line_keyconfigm" );
66 s_manager->addKeyConfig( OKeyConfigItem( tr("Next Tab"), "next_tab", QPixmap(), 66 s_manager->addKeyConfig( OKeyConfigItem( tr("Next Tab"), "next_tab", QPixmap(),
67 KeyNextTab, OKeyPair(Qt::Key_N, Qt::ControlButton) )); 67 KeyNextTab, OKeyPair(Qt::Key_N, Qt::ControlButton) ));
68 s_manager->addKeyConfig( OKeyConfigItem( tr("Previous Tab"), "prev_tab", QPixmap(), 68 s_manager->addKeyConfig( OKeyConfigItem( tr("Previous Tab"), "prev_tab", QPixmap(),
69 KeyPrevTab, OKeyPair(Qt::Key_P, Qt::ControlButton) )); 69 KeyPrevTab, OKeyPair(Qt::Key_P, Qt::ControlButton) ));
70 s_manager->addKeyConfig( OKeyConfigItem( tr("Close Tab"), "close_tab",
71 QPixmap(), KeyCloseTab,
72 OKeyPair(Qt::Key_C, Qt::ControlButton) ));
70 s_manager->load(); 73 s_manager->load();
71 } 74 }
72 75
73 return s_manager; 76 return s_manager;
74} 77}
75 78
@@ -104,12 +107,14 @@ void IRCHistoryLineEdit::keyPressEvent(QKeyEvent *event) {
104 case KeyNextTab: 107 case KeyNextTab:
105 emit nextTab(); 108 emit nextTab();
106 return; 109 return;
107 case KeyPrevTab: 110 case KeyPrevTab:
108 emit prevTab(); 111 emit prevTab();
109 return; 112 return;
113 case KeyCloseTab:
114 emit closeTab();
110 default: 115 default:
111 break; 116 break;
112 } 117 }
113 118
114 QLineEdit::keyPressEvent(event); 119 QLineEdit::keyPressEvent(event);
115} 120}
diff --git a/noncore/net/opieirc/ircmisc.h b/noncore/net/opieirc/ircmisc.h
index 37eed28..3cf64df 100644
--- a/noncore/net/opieirc/ircmisc.h
+++ b/noncore/net/opieirc/ircmisc.h
@@ -65,13 +65,14 @@ protected:
65 65
66class IRCHistoryLineEdit : public QLineEdit { 66class IRCHistoryLineEdit : public QLineEdit {
67 Q_OBJECT 67 Q_OBJECT
68public: 68public:
69 enum KeyMode { 69 enum KeyMode {
70 KeyNextTab, 70 KeyNextTab,
71 KeyPrevTab 71 KeyPrevTab,
72 KeyCloseTab
72 }; 73 };
73 74
74 static Opie::Core::OKeyConfigManager* keyConfigInstance(); 75 static Opie::Core::OKeyConfigManager* keyConfigInstance();
75 76
76 IRCHistoryLineEdit(QWidget *parent = 0, const char *name = 0); 77 IRCHistoryLineEdit(QWidget *parent = 0, const char *name = 0);
77 virtual bool eventFilter(QObject *object, QEvent *event); 78 virtual bool eventFilter(QObject *object, QEvent *event);
diff --git a/noncore/net/opieirc/ircquerytab.cpp b/noncore/net/opieirc/ircquerytab.cpp
index 1fddc6d..53474b9 100644
--- a/noncore/net/opieirc/ircquerytab.cpp
+++ b/noncore/net/opieirc/ircquerytab.cpp
@@ -13,25 +13,28 @@ IRCQueryTab::IRCQueryTab(IRCPerson *person, IRCServerTab *parentTab, MainWindow
13 m_textview = new QTextView(hbox); 13 m_textview = new QTextView(hbox);
14 m_textview->setHScrollBarMode(QScrollView::AlwaysOff); 14 m_textview->setHScrollBarMode(QScrollView::AlwaysOff);
15 m_textview->setVScrollBarMode(QScrollView::AlwaysOn); 15 m_textview->setVScrollBarMode(QScrollView::AlwaysOn);
16 m_textview->setTextFormat(RichText); 16 m_textview->setTextFormat(RichText);
17 QWhatsThis::add(m_textview, tr("Private discussion")); 17 QWhatsThis::add(m_textview, tr("Private discussion"));
18 m_field = new IRCHistoryLineEdit(this); 18 m_field = new IRCHistoryLineEdit(this);
19
19 connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab())); 20 connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab()));
20 connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab())); 21 connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab()));
21 connect(m_field, SIGNAL(closeTab()),this, SIGNAL(closeTab())); 22 connect(m_field, SIGNAL(closeTab()),this, SLOT(remove()));
22 23 connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus()));
23 24
24 QWhatsThis::add(m_field, tr("Type your text here in order to send a message to the other person")); 25 QWhatsThis::add(m_field, tr("Type your text here in order to send a message to the other person"));
25 m_layout->add(hbox); 26 m_layout->add(hbox);
26 hbox->show(); 27 hbox->show();
27 m_layout->add(m_field); 28 m_layout->add(m_field);
28 m_field->setFocus(); 29
29 connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); 30 connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand()));
30 connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling())); 31 connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling()));
31 settingsChanged(); 32 settingsChanged();
33 m_field->setFocus();
34 m_field->setActiveWindow();
32} 35}
33 36
34void IRCQueryTab::scrolling(){ 37void IRCQueryTab::scrolling(){
35 m_textview->ensureVisible(0, m_textview->contentsHeight()); 38 m_textview->ensureVisible(0, m_textview->contentsHeight());
36} 39}
37 40
diff --git a/noncore/net/opieirc/ircserverlist.cpp b/noncore/net/opieirc/ircserverlist.cpp
index 62bfc17..3e78469 100644
--- a/noncore/net/opieirc/ircserverlist.cpp
+++ b/noncore/net/opieirc/ircserverlist.cpp
@@ -79,12 +79,17 @@ IRCServerList::IRCServerList(QWidget* parent, const char *name, bool modal, WFla
79 server.setChannels(m_config->readEntry("Channels")); 79 server.setChannels(m_config->readEntry("Channels"));
80 m_list->insertItem(new IRCListBoxServer(server)); 80 m_list->insertItem(new IRCListBoxServer(server));
81 } 81 }
82 } 82 }
83 } 83 }
84 84
85 connect(m_list, SIGNAL(doubleClicked(QListBoxItem*)),
86 this, SLOT(acceptOnClick(QListBoxItem *)));
87 connect(m_list, SIGNAL(returnPressed(QListBoxItem*)),
88 this, SLOT(acceptOnClick(QListBoxItem*)));
89
85 QPEApplication::showDialog( this ); 90 QPEApplication::showDialog( this );
86} 91}
87 92
88void IRCServerList::addServer() 93void IRCServerList::addServer()
89{ 94{
90 IRCServer server; 95 IRCServer server;
@@ -119,12 +124,16 @@ void IRCServerList::editServer()
119 server = editor.getServer(); 124 server = editor.getServer();
120 item->setServer(server); 125 item->setServer(server);
121 } 126 }
122 } 127 }
123} 128}
124 129
130void IRCServerList::acceptOnClick( QListBoxItem* ) {
131 accept();
132}
133
125int IRCServerList::exec() 134int IRCServerList::exec()
126{ 135{
127 int returncode = QDialog::exec(); 136 int returncode = QDialog::exec();
128 /* Now save the changes */ 137 /* Now save the changes */
129 m_config->setGroup("OpieIRC"); 138 m_config->setGroup("OpieIRC");
130 m_config->writeEntry("ServerCount", QString::number(m_list->count())); 139 m_config->writeEntry("ServerCount", QString::number(m_list->count()));
diff --git a/noncore/net/opieirc/ircserverlist.h b/noncore/net/opieirc/ircserverlist.h
index d61210e..869b26f 100644
--- a/noncore/net/opieirc/ircserverlist.h
+++ b/noncore/net/opieirc/ircserverlist.h
@@ -33,18 +33,19 @@ public:
33 IRCServerList(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags f = 0); 33 IRCServerList(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags f = 0);
34 int exec(); 34 int exec();
35 /* Check whether a server was selected */ 35 /* Check whether a server was selected */
36 bool hasServer(); 36 bool hasServer();
37 /* Return the selected server */ 37 /* Return the selected server */
38 IRCServer server(); 38 IRCServer server();
39 39
40 ~IRCServerList(); 40 ~IRCServerList();
41public slots: 41public slots:
42 void addServer(); 42 void addServer();
43 void delServer(); 43 void delServer();
44 void editServer(); 44 void editServer();
45 void acceptOnClick(QListBoxItem*);
45protected: 46protected:
46 Config *m_config; 47 Config *m_config;
47 QListBox *m_list; 48 QListBox *m_list;
48}; 49};
49 50
50#endif /* __IRCSERVERLIST_H */ 51#endif /* __IRCSERVERLIST_H */
diff --git a/noncore/net/opieirc/ircservertab.cpp b/noncore/net/opieirc/ircservertab.cpp
index 2a34c0b..5ca7a29 100644
--- a/noncore/net/opieirc/ircservertab.cpp
+++ b/noncore/net/opieirc/ircservertab.cpp
@@ -1,13 +1,14 @@
1#include <qtextstream.h> 1#include <qtextstream.h>
2#include <qwhatsthis.h> 2#include <qwhatsthis.h>
3#include "ircservertab.h" 3#include "ircservertab.h"
4 4
5 5
6bool IRCServerTab::containsPing( const QString& text, IRCServerTab* tab ) { 6bool IRCServerTab::containsPing( const QString& text, IRCServerTab* tab ) {
7 return (text.find("ping") != -1 && text.find( tab->server()->nick() != -1)); 7 return (text.contains(IRCMessageParser::tr("Received a CTCP PING from "))) ||
8 (text.find("ping") != -1 && text.find( tab->server()->nick() != -1));
8} 9}
9 10
10 11
11IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) { 12IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) {
12 m_server = server; 13 m_server = server;
13 m_session = new IRCSession(&m_server); 14 m_session = new IRCSession(&m_server);
@@ -27,26 +28,32 @@ IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *pa
27 connect(m_field, SIGNAL(closeTab()), this, SIGNAL(closeTab())); 28 connect(m_field, SIGNAL(closeTab()), this, SIGNAL(closeTab()));
28 connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus())); 29 connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus()));
29 30
30 QWhatsThis::add(m_field, tr("Type commands here. A list of available commands can be found inside the OpieIRC help")); 31 QWhatsThis::add(m_field, tr("Type commands here. A list of available commands can be found inside the OpieIRC help"));
31 m_layout->add(m_field); 32 m_layout->add(m_field);
32 connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); 33 connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand()));
33 m_field->setFocus();
34 connect(m_session, SIGNAL(outputReady(IRCOutput)), this, SLOT(display(IRCOutput))); 34 connect(m_session, SIGNAL(outputReady(IRCOutput)), this, SLOT(display(IRCOutput)));
35 connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling())); 35 connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling()));
36 settingsChanged(); 36 settingsChanged();
37
38 m_field->setFocus();
39 m_field->setActiveWindow();
40
37} 41}
38 42
39void IRCServerTab::scrolling(){ 43void IRCServerTab::scrolling(){
40 m_textview->ensureVisible(0, m_textview->contentsHeight()); 44 m_textview->ensureVisible(0, m_textview->contentsHeight());
41} 45}
42 46
43 47
44void IRCServerTab::appendText(QString text) { 48void IRCServerTab::appendText(QString text) {
45 /* not using append because it creates layout problems */ 49 /* not using append because it creates layout problems */
46 QString txt = m_textview->text() + text + "\n"; 50 QString txt = m_textview->text() + IRCTab::appendTimestamp( text );
51
52
53
47 if (m_maxLines > 0 && m_lines >= m_maxLines) { 54 if (m_maxLines > 0 && m_lines >= m_maxLines) {
48 int firstBreak = txt.find('\n'); 55 int firstBreak = txt.find('\n');
49 if (firstBreak != -1) { 56 if (firstBreak != -1) {
50 txt = "<qt bgcolor=\"" + m_backgroundColor + "\"/>" + txt.right(txt.length() - (firstBreak + 1)); 57 txt = "<qt bgcolor=\"" + m_backgroundColor + "\"/>" + txt.right(txt.length() - (firstBreak + 1));
51 } 58 }
52 } else { 59 } else {
@@ -231,17 +238,17 @@ void IRCServerTab::remove() {
231 m_close = TRUE; 238 m_close = TRUE;
232 m_session->endSession(); 239 m_session->endSession();
233 } else { 240 } else {
234 /* Session has previously been closed */ 241 /* Session has previously been closed */
235 m_channelTabs.first(); 242 m_channelTabs.first();
236 while (m_channelTabs.current() != 0) { 243 while (m_channelTabs.current() != 0) {
237 m_mainWindow->killTab(m_channelTabs.current()); 244 m_mainWindow->killTab(m_channelTabs.current(), true);
238 } 245 }
239 m_queryTabs.first(); 246 m_queryTabs.first();
240 while (m_queryTabs.current() != 0) { 247 while (m_queryTabs.current() != 0) {
241 m_mainWindow->killTab(m_queryTabs.current()); 248 m_mainWindow->killTab(m_queryTabs.current(), true);
242 } 249 }
243 m_mainWindow->killTab(this); 250 m_mainWindow->killTab(this);
244 } 251 }
245} 252}
246 253
247IRCChannelTab *IRCServerTab::getTabForChannel(IRCChannel *channel) { 254IRCChannelTab *IRCServerTab::getTabForChannel(IRCChannel *channel) {
@@ -269,17 +276,17 @@ void IRCServerTab::display(IRCOutput output) {
269 /* All messages to be displayed inside the GUI get here */ 276 /* All messages to be displayed inside the GUI get here */
270 switch (output.type()) { 277 switch (output.type()) {
271 case OUTPUT_CONNCLOSE: 278 case OUTPUT_CONNCLOSE:
272 if (m_close) { 279 if (m_close) {
273 m_channelTabs.first(); 280 m_channelTabs.first();
274 while (m_channelTabs.current() != 0) { 281 while (m_channelTabs.current() != 0) {
275 m_mainWindow->killTab(m_channelTabs.current()); 282 m_mainWindow->killTab(m_channelTabs.current(), true);
276 } 283 }
277 m_queryTabs.first(); 284 m_queryTabs.first();
278 while (m_queryTabs.current() != 0) { 285 while (m_queryTabs.current() != 0) {
279 m_mainWindow->killTab(m_queryTabs.current()); 286 m_mainWindow->killTab(m_queryTabs.current(), true);
280 } 287 }
281 m_mainWindow->killTab(this); 288 m_mainWindow->killTab(this);
282 } else { 289 } else {
283 appendText("<font color=\"" + m_errorColor + "\">" + output.htmlMessage() +"</font><br>"); 290 appendText("<font color=\"" + m_errorColor + "\">" + output.htmlMessage() +"</font><br>");
284 QListIterator<IRCChannelTab> it(m_channelTabs); 291 QListIterator<IRCChannelTab> it(m_channelTabs);
285 for (; it.current(); ++it) { 292 for (; it.current(); ++it) {
@@ -309,20 +316,20 @@ void IRCServerTab::display(IRCOutput output) {
309 queryTab->display(output); 316 queryTab->display(output);
310 } 317 }
311 break; 318 break;
312 case OUTPUT_SELFPART: { 319 case OUTPUT_SELFPART: {
313 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0)); 320 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0));
314 if (channelTab) 321 if (channelTab)
315 m_mainWindow->killTab(channelTab); 322 m_mainWindow->killTab(channelTab, true);
316 } 323 }
317 break; 324 break;
318 case OUTPUT_SELFKICK: { 325 case OUTPUT_SELFKICK: {
319 appendText("<font color=\"" + m_errorColor + "\">" + output.htmlMessage() + "</font><br>"); 326 appendText("<font color=\"" + m_errorColor + "\">" + output.htmlMessage() + "</font><br>");
320 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0)); 327 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0));
321 if (channelTab) 328 if (channelTab)
322 m_mainWindow->killTab(channelTab); 329 m_mainWindow->killTab(channelTab, true);
323 } 330 }
324 break; 331 break;
325 case OUTPUT_CHANACTION: { 332 case OUTPUT_CHANACTION: {
326 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0)); 333 IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0));
327 channelTab->appendText("<font color=\"" + m_otherColor + "\">"+output.htmlMessage()+"</font><br>"); 334 channelTab->appendText("<font color=\"" + m_otherColor + "\">"+output.htmlMessage()+"</font><br>");
328 } 335 }
diff --git a/noncore/net/opieirc/ircsettings.cpp b/noncore/net/opieirc/ircsettings.cpp
index 1fba030..7a1dd6c 100644
--- a/noncore/net/opieirc/ircsettings.cpp
+++ b/noncore/net/opieirc/ircsettings.cpp
@@ -9,12 +9,13 @@
9#include <opie2/okeyconfigwidget.h> 9#include <opie2/okeyconfigwidget.h>
10#include <qpe/qpeapplication.h> 10#include <qpe/qpeapplication.h>
11 11
12/* QT */ 12/* QT */
13#include <qvalidator.h> 13#include <qvalidator.h>
14#include <qwhatsthis.h> 14#include <qwhatsthis.h>
15#include <qcheckbox.h>
15 16
16using namespace Opie; 17using namespace Opie;
17using namespace Opie::Ui; 18using namespace Opie::Ui;
18IRCSettings::IRCSettings(QWidget* parent, const char* name, bool modal, WFlags) : QDialog(parent, name, modal, WStyle_ContextHelp) 19IRCSettings::IRCSettings(QWidget* parent, const char* name, bool modal, WFlags) : QDialog(parent, name, modal, WStyle_ContextHelp)
19{ 20{
20 setCaption(tr("Settings") ); 21 setCaption(tr("Settings") );
@@ -22,22 +23,35 @@ IRCSettings::IRCSettings(QWidget* parent, const char* name, bool modal, WFlags)
22 m_config->setGroup("OpieIRC"); 23 m_config->setGroup("OpieIRC");
23 QHBoxLayout *l = new QHBoxLayout(this, 2, 2); 24 QHBoxLayout *l = new QHBoxLayout(this, 2, 2);
24 OTabWidget *tw = new OTabWidget(this); 25 OTabWidget *tw = new OTabWidget(this);
25 l->addWidget(tw); 26 l->addWidget(tw);
26 /* General Configuration */ 27 /* General Configuration */
27 QWidget *genwidget = new QWidget(tw); 28 QWidget *genwidget = new QWidget(tw);
28 QGridLayout *layout = new QGridLayout(genwidget, 1, 2, 5, 0); 29 QGridLayout *layout = new QGridLayout(genwidget, 1, 4, 5, 0);
29 QLabel *label = new QLabel(tr("Lines displayed :"), genwidget); 30 QLabel *label = new QLabel(tr("Lines displayed :"), genwidget);
30 layout->addWidget(label, 0, 0); 31 layout->addWidget(label, 0, 0);
31 m_lines = new QLineEdit(m_config->readEntry("Lines", "100"), genwidget); 32 m_lines = new QLineEdit(m_config->readEntry("Lines", "100"), genwidget);
32 QWhatsThis::add(m_lines, tr("Amount of lines to be displayed in chats before old lines get deleted - this is necessary to restrain memory consumption. Set to 0 if you don't need this")); 33 QWhatsThis::add(m_lines, tr("Amount of lines to be displayed in chats before old lines get deleted - this is necessary to restrain memory consumption. Set to 0 if you don't need this"));
33 QIntValidator *validator = new QIntValidator(this); 34 QIntValidator *validator = new QIntValidator(this);
34 validator->setTop(10000); 35 validator->setTop(10000);
35 validator->setBottom(0); 36 validator->setBottom(0);
36 m_lines->setValidator(validator); 37 m_lines->setValidator(validator);
37 layout->addWidget(m_lines, 0, 1); 38 layout->addWidget(m_lines, 0, 1);
39
40 /*
41 * include timestamp
42 */
43 m_displayTime = new QCheckBox( tr("Display time in chat log"), genwidget );
44 m_displayTime->setChecked( m_config->readBoolEntry("DisplayTime", false) );
45 layout->addMultiCellWidget(m_displayTime, 1, 1, 0, 4 );
46
47 // add a spacer
48 layout->addItem( new QSpacerItem(1,1, QSizePolicy::Minimum,
49 QSizePolicy::MinimumExpanding),
50 2, 0 );
51
38 tw->addTab(genwidget, "opieirc/settings", tr("General")); 52 tw->addTab(genwidget, "opieirc/settings", tr("General"));
39 53
40 /* Color configuration */ 54 /* Color configuration */
41 QScrollView *view = new QScrollView(this); 55 QScrollView *view = new QScrollView(this);
42 view->setResizePolicy(QScrollView::AutoOneFit); 56 view->setResizePolicy(QScrollView::AutoOneFit);
43 view->setFrameStyle( QFrame::NoFrame ); 57 view->setFrameStyle( QFrame::NoFrame );
@@ -114,12 +128,14 @@ void IRCSettings::accept()
114 m_config->writeEntry("ErrorColor", IRCTab::m_errorColor); 128 m_config->writeEntry("ErrorColor", IRCTab::m_errorColor);
115 m_config->writeEntry("SelfColor", IRCTab::m_selfColor); 129 m_config->writeEntry("SelfColor", IRCTab::m_selfColor);
116 m_config->writeEntry("OtherColor", IRCTab::m_otherColor); 130 m_config->writeEntry("OtherColor", IRCTab::m_otherColor);
117 m_config->writeEntry("ServerColor", IRCTab::m_serverColor); 131 m_config->writeEntry("ServerColor", IRCTab::m_serverColor);
118 m_config->writeEntry("NotificationColor", IRCTab::m_notificationColor); 132 m_config->writeEntry("NotificationColor", IRCTab::m_notificationColor);
119 m_config->writeEntry("Lines", m_lines->text()); 133 m_config->writeEntry("Lines", m_lines->text());
134 m_config->writeEntry("DisplayTime", m_displayTime->isChecked() );
135 IRCTab::setUseTimeStamps(m_displayTime->isChecked());
120 IRCHistoryLineEdit::keyConfigInstance()->save(); 136 IRCHistoryLineEdit::keyConfigInstance()->save();
121 137
122 QDialog::accept(); 138 QDialog::accept();
123} 139}
124 140
125IRCSettings::~IRCSettings() 141IRCSettings::~IRCSettings()
diff --git a/noncore/net/opieirc/ircsettings.h b/noncore/net/opieirc/ircsettings.h
index a032aff..b51d535 100644
--- a/noncore/net/opieirc/ircsettings.h
+++ b/noncore/net/opieirc/ircsettings.h
@@ -29,12 +29,13 @@ namespace Opie {
29class OColorButton; 29class OColorButton;
30namespace Ui { 30namespace Ui {
31class OKeyConfigWidget; 31class OKeyConfigWidget;
32} 32}
33} 33}
34 34
35class QCheckBox;
35class IRCSettings : public QDialog { 36class IRCSettings : public QDialog {
36 Q_OBJECT 37 Q_OBJECT
37public: 38public:
38 IRCSettings(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags f = 0); 39 IRCSettings(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags f = 0);
39 ~IRCSettings(); 40 ~IRCSettings();
40protected slots: 41protected slots:
@@ -47,9 +48,10 @@ protected:
47 Opie::OColorButton *m_self; 48 Opie::OColorButton *m_self;
48 Opie::OColorButton *m_server; 49 Opie::OColorButton *m_server;
49 Opie::OColorButton *m_other; 50 Opie::OColorButton *m_other;
50 Opie::OColorButton *m_notification; 51 Opie::OColorButton *m_notification;
51 Opie::Ui::OKeyConfigWidget *m_keyConf; 52 Opie::Ui::OKeyConfigWidget *m_keyConf;
52 QLineEdit *m_lines; 53 QLineEdit *m_lines;
54 QCheckBox *m_displayTime;
53}; 55};
54 56
55#endif /* __IRCSETTINGS_H */ 57#endif /* __IRCSETTINGS_H */
diff --git a/noncore/net/opieirc/irctab.cpp b/noncore/net/opieirc/irctab.cpp
index 2b3ecd4..fbbf303 100644
--- a/noncore/net/opieirc/irctab.cpp
+++ b/noncore/net/opieirc/irctab.cpp
@@ -15,12 +15,28 @@ QString IRCTab::m_textColor;
15QString IRCTab::m_backgroundColor; 15QString IRCTab::m_backgroundColor;
16QString IRCTab::m_selfColor; 16QString IRCTab::m_selfColor;
17QString IRCTab::m_otherColor; 17QString IRCTab::m_otherColor;
18QString IRCTab::m_notificationColor; 18QString IRCTab::m_notificationColor;
19int IRCTab::m_maxLines; 19int IRCTab::m_maxLines;
20 20
21
22static bool g_useTime = false;
23
24void IRCTab::setUseTimeStamps( bool b ) {
25 g_useTime = b;
26}
27
28// ## FIXME use TimeString later for AM/PM Setting
29QString IRCTab::appendTimestamp( const QString& text ) {
30 return g_useTime ?
31 "[" +QTime::currentTime().toString()+"]" + text + "\n" :
32 text + "\n";
33
34}
35
36
21IRCTab::IRCTab(QWidget *parent, const char *name, WFlags f) : QWidget(parent, name, f) { 37IRCTab::IRCTab(QWidget *parent, const char *name, WFlags f) : QWidget(parent, name, f) {
22 m_layout = new QVBoxLayout(this); 38 m_layout = new QVBoxLayout(this);
23 QHBoxLayout *descLayout = new QHBoxLayout(m_layout); 39 QHBoxLayout *descLayout = new QHBoxLayout(m_layout);
24 descLayout->setMargin(5); 40 descLayout->setMargin(5);
25 m_description = new QLabel(tr("Missing description"), this); 41 m_description = new QLabel(tr("Missing description"), this);
26 QWhatsThis::add(m_description, tr("Description of the tab's content")); 42 QWhatsThis::add(m_description, tr("Description of the tab's content"));
diff --git a/noncore/net/opieirc/irctab.h b/noncore/net/opieirc/irctab.h
index 6c29ea5..d17c530 100644
--- a/noncore/net/opieirc/irctab.h
+++ b/noncore/net/opieirc/irctab.h
@@ -35,12 +35,16 @@ class IRCTab : public QWidget {
35 Q_OBJECT 35 Q_OBJECT
36public: 36public:
37 IRCTab(QWidget *parent = 0, const char *name = 0, WFlags f = 0); 37 IRCTab(QWidget *parent = 0, const char *name = 0, WFlags f = 0);
38 /* The ID is required to store the position of this IRCTab inside the IRCTabWidget */ 38 /* The ID is required to store the position of this IRCTab inside the IRCTabWidget */
39 void setID(int id); 39 void setID(int id);
40 int id(); 40 int id();
41
42 static void setUseTimeStamps(bool b);
43 static QString appendTimestamp(const QString& tex);
44
41 virtual QString title() = 0; 45 virtual QString title() = 0;
42 virtual IRCSession *session() = 0; 46 virtual IRCSession *session() = 0;
43 virtual void appendText(QString text) = 0; 47 virtual void appendText(QString text) = 0;
44signals: 48signals:
45 void changed(IRCTab *); 49 void changed(IRCTab *);
46 void ping(const QString& ); 50 void ping(const QString& );
diff --git a/noncore/net/opieirc/mainwindow.cpp b/noncore/net/opieirc/mainwindow.cpp
index 2e674c5..2562f33 100644
--- a/noncore/net/opieirc/mainwindow.cpp
+++ b/noncore/net/opieirc/mainwindow.cpp
@@ -45,43 +45,55 @@ void MainWindow::loadSettings() {
45 IRCTab::m_errorColor = config.readEntry("ErrorColor", "#FF0000"); 45 IRCTab::m_errorColor = config.readEntry("ErrorColor", "#FF0000");
46 IRCTab::m_selfColor = config.readEntry("SelfColor", "#CC0000"); 46 IRCTab::m_selfColor = config.readEntry("SelfColor", "#CC0000");
47 IRCTab::m_otherColor = config.readEntry("OtherColor", "#0000BB"); 47 IRCTab::m_otherColor = config.readEntry("OtherColor", "#0000BB");
48 IRCTab::m_serverColor = config.readEntry("ServerColor", "#0000FF"); 48 IRCTab::m_serverColor = config.readEntry("ServerColor", "#0000FF");
49 IRCTab::m_notificationColor = config.readEntry("NotificationColor", "#AA3300"); 49 IRCTab::m_notificationColor = config.readEntry("NotificationColor", "#AA3300");
50 IRCTab::m_maxLines = config.readNumEntry("Lines", 100); 50 IRCTab::m_maxLines = config.readNumEntry("Lines", 100);
51 IRCTab::setUseTimeStamps( config.readBoolEntry("DisplayTime", false ) );
51} 52}
52 53
53void MainWindow::selected(QWidget *) { 54void MainWindow::selected(QWidget *) {
54 m_tabWidget->setTabColor(m_tabWidget->currentPageIndex(), black); 55 m_tabWidget->setTabColor(m_tabWidget->currentPageIndex(), black);
55 emit updateScroll(); 56 emit updateScroll();
56} 57}
57 58
58void MainWindow::addTab(IRCTab *tab) { 59void MainWindow::addTab(IRCTab *tab) {
59 connect(tab, SIGNAL(changed(IRCTab*)), this, SLOT(changeEvent(IRCTab*))); 60 connect(tab, SIGNAL(changed(IRCTab*)), this, SLOT(changeEvent(IRCTab*)));
60 connect(tab, SIGNAL(ping (const QString&)), this, SLOT(slotPing(const QString&))); 61 connect(tab, SIGNAL(ping (const QString&)), this, SLOT(slotPing(const QString&)));
61 connect(tab, SIGNAL(nextTab()), this, SLOT(slotNextTab())); 62 connect(tab, SIGNAL(nextTab()), this, SLOT(slotNextTab()));
62 connect(tab, SIGNAL(prevTab()), this, SLOT(slotPrevTab())); 63 connect(tab, SIGNAL(prevTab()), this, SLOT(slotPrevTab()));
63 connect(tab, SIGNAL(closeTab()), this, SLOT(slotCloseTab()));
64 64
65 m_tabWidget->addTab(tab, tab->title()); 65 m_tabWidget->addTab(tab, tab->title());
66 m_tabWidget->showPage(tab); 66 m_tabWidget->showPage(tab);
67 tab->setID(m_tabWidget->currentPageIndex()); 67 tab->setID(m_tabWidget->currentPageIndex());
68 m_tabs.append(tab); 68 m_tabs.append(tab);
69} 69}
70 70
71void MainWindow::changeEvent(IRCTab *tab) { 71void MainWindow::changeEvent(IRCTab *tab) {
72 if (tab->id() != m_tabWidget->currentPageIndex()) 72 if (tab->id() != m_tabWidget->currentPageIndex())
73 m_tabWidget->setTabColor(tab->id(), blue); 73 m_tabWidget->setTabColor(tab->id(), blue);
74} 74}
75 75
76void MainWindow::killTab(IRCTab *tab) { 76void MainWindow::killTab(IRCTab *tab, bool imediate) {
77 m_tabWidget->removePage(tab); 77 m_toDelete.append( tab );
78 m_tabs.remove(tab);
79 78
80 /* there might be nicer ways to do this .. */ 79 if ( imediate )
81 delete tab; 80 slotKillTabsLater();
81 else
82 QTimer::singleShot(0, this, SLOT(slotKillTabsLater()) );
83}
84
85void MainWindow::slotKillTabsLater() {
86 for ( QListIterator<IRCTab> it(m_toDelete); it.current(); ++it ) {
87 m_tabWidget->removePage( it.current() );
88 m_tabs.remove( it.current() );
89 }
90
91 m_toDelete.setAutoDelete( true );
92 m_toDelete.clear();
93 m_toDelete.setAutoDelete( false );
82} 94}
83 95
84void MainWindow::newConnection() { 96void MainWindow::newConnection() {
85 IRCServerList list(this, "ServerList", TRUE); 97 IRCServerList list(this, "ServerList", TRUE);
86 if (list.exec() == QDialog::Accepted && list.hasServer()) { 98 if (list.exec() == QDialog::Accepted && list.hasServer()) {
87 IRCServerTab *serverTab = new IRCServerTab(list.server(), this, m_tabWidget); 99 IRCServerTab *serverTab = new IRCServerTab(list.server(), this, m_tabWidget);
@@ -114,16 +126,10 @@ void MainWindow::slotNextTab() {
114void MainWindow::slotPrevTab() { 126void MainWindow::slotPrevTab() {
115 int i = m_tabWidget->currentPageIndex (); 127 int i = m_tabWidget->currentPageIndex ();
116 if ( i > 1 ) 128 if ( i > 1 )
117 m_tabWidget->setCurrentPage ( i-1 ); 129 m_tabWidget->setCurrentPage ( i-1 );
118} 130}
119 131
120void MainWindow::slotCloseTab() { 132void MainWindow::slotPing( const QString& /*channel*/ ) {
121 IRCTab *tab = (IRCTab *) m_tabWidget->currentPage ();
122 if ( tab )
123 killTab ( tab );
124}
125
126void MainWindow::slotPing( const QString& channel ) {
127 raise(); 133 raise();
128} 134}
129 135
diff --git a/noncore/net/opieirc/mainwindow.h b/noncore/net/opieirc/mainwindow.h
index 945fc71..abf205d 100644
--- a/noncore/net/opieirc/mainwindow.h
+++ b/noncore/net/opieirc/mainwindow.h
@@ -31,30 +31,31 @@
31class MainWindow : public QMainWindow { 31class MainWindow : public QMainWindow {
32 Q_OBJECT 32 Q_OBJECT
33public: 33public:
34 MainWindow(QWidget *parent = 0, const char *name = 0, WFlags f = 0); 34 MainWindow(QWidget *parent = 0, const char *name = 0, WFlags f = 0);
35// IRCTabWidget getTabWidget(); 35// IRCTabWidget getTabWidget();
36 void addTab(IRCTab *tab); 36 void addTab(IRCTab *tab);
37 void killTab(IRCTab *tab); 37 void killTab(IRCTab *tab, bool now = false);
38 static QString appName() { return QString::fromLatin1("opieirc"); } 38 static QString appName() { return QString::fromLatin1("opieirc"); }
39 static QString appCaption(); 39 static QString appCaption();
40signals: 40signals:
41 void updateScroll(); 41 void updateScroll();
42protected slots: 42protected slots:
43 void newConnection(); 43 void newConnection();
44 void settings(); 44 void settings();
45 void selected(QWidget *); 45 void selected(QWidget *);
46 void changeEvent(IRCTab *); 46 void changeEvent(IRCTab *);
47 47
48 void slotNextTab(); 48 void slotNextTab();
49 void slotPrevTab(); 49 void slotPrevTab();
50 void slotCloseTab();
51 void slotPing(const QString&); 50 void slotPing(const QString&);
51 void slotKillTabsLater();
52 52
53protected: 53protected:
54 void loadSettings(); 54 void loadSettings();
55protected: 55protected:
56 IRCTabWidget *m_tabWidget; 56 IRCTabWidget *m_tabWidget;
57 QList<IRCTab> m_tabs; 57 QList<IRCTab> m_tabs;
58 QList<IRCTab> m_toDelete;
58}; 59};
59 60
60#endif /* __MAINWINDOW_H */ 61#endif /* __MAINWINDOW_H */