summaryrefslogtreecommitdiff
authorzecke <zecke>2004-09-08 21:51:06 (UTC)
committer zecke <zecke>2004-09-08 21:51:06 (UTC)
commitebb830522c9662bda4c4453e532bcc29631c5d60 (patch) (side-by-side diff)
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 @@
Makefile
Makefile.in
moc_*.cpp
-.moc \ No newline at end of file
+.moc
+*.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
@@ -6,82 +6,85 @@
IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) {
m_mainWindow = mainWindow;
m_parentTab = parentTab;
m_channel = channel;
m_description->setText(tr("Talking on channel") + " <b>" + channel->channelname() + "</b>");
QHBox *hbox = new QHBox(this);
m_textview = new QTextView(hbox);
m_textview->setHScrollBarMode(QScrollView::AlwaysOff);
m_textview->setVScrollBarMode(QScrollView::AlwaysOn);
m_listVisible = TRUE;
m_listButton = new QPushButton(">", m_textview);
+ m_listButton->setFlat( true );
m_textview->setCornerWidget(m_listButton);
m_textview->setTextFormat(RichText);
QWhatsThis::add(m_textview, tr("Channel discussion"));
connect(m_listButton, SIGNAL(clicked()), this, SLOT(toggleList()));
m_list = new IRCChannelList(m_channel, hbox);
m_list->update();
m_list->setMaximumWidth(LISTWIDTH);
m_field = new IRCHistoryLineEdit(this);
connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab()));
connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab()));
- connect(m_field, SIGNAL(closeTab()), this, SIGNAL(closeTab()));
+ connect(m_field, SIGNAL(closeTab()), this, SLOT(remove()));
connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus()));
QWhatsThis::add(m_field, tr("Type your message here to participate in the channel discussion"));
m_popup = new QPopupMenu(m_list);
m_lines = 0;
/* Required so that embedded-style "right" clicks work */
QPEApplication::setStylusOperation(m_list->viewport(), QPEApplication::RightOnHold);
connect(m_list, SIGNAL(mouseButtonPressed(int,QListBoxItem*,const QPoint&)), this, SLOT(mouseButtonPressed(int,QListBoxItem*,const QPoint&)));
/* Construct the popup menu */
QPopupMenu *ctcpMenu = new QPopupMenu(m_list);
- m_popup->insertItem(Resource::loadPixmap("opieirc/ctcp"), tr("CTCP"), ctcpMenu);
m_popup->insertItem(Resource::loadPixmap("opieirc/query"), tr("Query"), this, SLOT(popupQuery()));
ctcpMenu->insertItem(Resource::loadPixmap("opieirc/ping"), tr("Ping"), this, SLOT(popupPing()));
ctcpMenu->insertItem(Resource::loadPixmap("opieirc/version"), tr("Version"), this, SLOT(popupVersion()));
ctcpMenu->insertItem(Resource::loadPixmap("opieirc/whois"), tr("Whois"), this, SLOT(popupWhois()));
connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling()));
m_layout->add(hbox);
hbox->show();
m_layout->add(m_field);
m_field->setFocus();
m_field->setActiveWindow();
connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand()));
+ connect(m_list, SIGNAL(doubleClicked ( QListBoxItem * ) ), this, SLOT(popupQuery( QListBoxItem * ) ));
settingsChanged();
}
void IRCChannelTab::scrolling(){
m_textview->ensureVisible(0, m_textview->contentsHeight());
}
void IRCChannelTab::appendText(QString text) {
/* not using append because it creates layout problems */
- QString txt = m_textview->text() + text + "\n";
+ QString txt = m_textview->text() + IRCTab::appendTimestamp( text );
if (m_maxLines > 0 && m_lines >= m_maxLines) {
int firstBreak = txt.find('\n');
if (firstBreak != -1) {
txt = "<qt bgcolor=\"" + m_backgroundColor + "\"/>" + txt.right(txt.length() - (firstBreak + 1));
}
} else {
m_lines++;
}
m_textview->ensureVisible(0, m_textview->contentsHeight());
m_textview->setText(txt);
m_textview->ensureVisible(0, m_textview->contentsHeight());
int p1, p2;
- if ( (p1 = text.find("ping", 0, false) )!= -1 && (p2 = text.find( m_parentTab->server()->nick(), 0,false )) != -1 ) {
+ if ( text.contains( IRCMessageParser::tr("Received a CTCP PING from ") ) )
+ emit ping( title() );
+ else if ( (p1 = text.find("ping", 0, false) )!= -1 && (p2 = text.find( m_parentTab->server()->nick(), 0,false )) != -1 ) {
int col = text.findRev("color", -1, false);
if ( col < p2 )
emit ping( title() );
}
emit changed(this);
}
IRCChannelTab::~IRCChannelTab() {
m_parentTab->removeChannelTab(this);
}
@@ -123,38 +126,43 @@ void IRCChannelTab::toggleList() {
}
void IRCChannelTab::mouseButtonPressed(int mouse, QListBoxItem *, const QPoint &point) {
switch (mouse) {
case 1:
break;
case 2:
m_popup->popup(point);
break;
};
}
-void IRCChannelTab::popupQuery() {
- if (m_list->currentItem() != -1) {
- IRCPerson *person = session()->getPerson(m_list->item(m_list->currentItem())->text());
+void IRCChannelTab::popupQuery( QListBoxItem *item) {
+ if (item) {
+ IRCPerson *person = session()->getPerson(item->text());
if (person) {
IRCQueryTab *tab = m_parentTab->getTabForQuery(person);
if (!tab) {
tab = new IRCQueryTab(person, m_parentTab, m_mainWindow, (QWidget *)parent());
m_parentTab->addQueryTab(tab);
m_mainWindow->addTab(tab);
}
}
}
}
+void IRCChannelTab::popupQuery() {
+ if ( m_list->currentItem() != -1 )
+ popupQuery( m_list->item(m_list->currentItem()));
+}
+
void IRCChannelTab::popupPing() {
//HAHA, no wonder these don't work
}
void IRCChannelTab::popupVersion() {
}
void IRCChannelTab::popupWhois() {
}
QString IRCChannelTab::title() {
return m_channel->channelname();
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
@@ -44,25 +44,27 @@ public:
IRCChannelList *list();
public:
void appendText(QString text);
public slots:
void remove();
void settingsChanged();
void scrolling();
protected slots:
void processCommand();
void toggleList();
void mouseButtonPressed(int mouse, QListBoxItem *item, const QPoint &point);
/* Popup slots */
+ void popupQuery(QListBoxItem*);
void popupQuery();
+
void popupPing();
void popupVersion();
void popupWhois();
protected:
IRCServerTab *m_parentTab;
IRCChannel *m_channel;
IRCChannelList *m_list;
QPushButton *m_listButton;
MainWindow *m_mainWindow;
QTextView *m_textview;
IRCHistoryLineEdit *m_field;
QPopupMenu *m_popup;
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
@@ -274,24 +274,58 @@ void IRCMessageParser::parseLiteralTopic(IRCMessage *message) {
emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Unknown channel topic - desynchronized?")));
}
}
void IRCMessageParser::parseLiteralError(IRCMessage *message) {
emit outputReady(IRCOutput(OUTPUT_ERROR, message->allParameters()));
}
void IRCMessageParser::parseCTCPPing(IRCMessage *message) {
IRCPerson mask(message->prefix());
m_session->m_connection->sendCTCP(mask.nick(), "PING " + message->allParameters());
emit outputReady(IRCOutput(OUTPUT_CTCP, tr("Received a CTCP PING from ")+mask.nick()));
+
+ //IRCPerson mask(message->prefix());
+ QString dest = message->ctcpDestination();
+ if (dest.startsWith("#")) {
+ IRCChannel *channel = m_session->getChannel(dest.lower());
+ if (channel) {
+ IRCChannelPerson *person = channel->getPerson(mask.nick());
+ if (person) {
+ IRCOutput output(OUTPUT_CHANACTION, tr("Received a CTCP PING from ")+ mask.nick()) ;
+ output.addParam(channel);
+ output.addParam(person);
+ emit outputReady(output);
+ } else {
+ emit outputReady(IRCOutput(OUTPUT_ERROR, tr("CTCP PING with unknown person - Desynchronized?")));
+ }
+ } else {
+ emit outputReady(IRCOutput(OUTPUT_ERROR, tr("CTCP PING with unknown channel - Desynchronized?")));
+ }
+ } else {
+ if (message->ctcpDestination() == m_session->m_server->nick()) {
+ IRCPerson *person = m_session->getPerson(mask.nick());
+ if (!person) {
+ /* Person not yet known, create and add to the current session */
+ person = new IRCPerson(message->prefix());
+ m_session->addPerson(person);
+ }
+ IRCOutput output(OUTPUT_QUERYACTION, tr("Received a CTCP PING from ")+ mask.nick() );
+ output.addParam(person);
+ emit outputReady(output);
+ } else {
+ emit outputReady(IRCOutput(OUTPUT_ERROR, tr("CTCP PING with bad recipient")));
+ }
+ }
+
}
void IRCMessageParser::parseCTCPVersion(IRCMessage *message) {
IRCPerson mask(message->prefix());
m_session->m_connection->sendCTCP(mask.nick(), APP_VERSION " " APP_COPYSTR);
emit outputReady(IRCOutput(OUTPUT_CTCP, tr("Received a CTCP VERSION from ")+mask.nick()));
}
void IRCMessageParser::parseCTCPAction(IRCMessage *message) {
IRCPerson mask(message->prefix());
QString dest = message->ctcpDestination();
if (dest.startsWith("#")) {
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
@@ -58,24 +58,27 @@ OKeyConfigManager* IRCHistoryLineEdit::keyConfigInstance() {
blackList.append( OKeyPair::returnKey() );
blackList.append( OKeyPair::leftArrowKey() );
blackList.append( OKeyPair::upArrowKey() );
blackList.append( OKeyPair::downArrowKey() );
s_manager = new OKeyConfigManager(new OConfig("opieirc-keys"),
"keys", blackList,
false, 0, "irc_history_line_keyconfigm" );
s_manager->addKeyConfig( OKeyConfigItem( tr("Next Tab"), "next_tab", QPixmap(),
KeyNextTab, OKeyPair(Qt::Key_N, Qt::ControlButton) ));
s_manager->addKeyConfig( OKeyConfigItem( tr("Previous Tab"), "prev_tab", QPixmap(),
KeyPrevTab, OKeyPair(Qt::Key_P, Qt::ControlButton) ));
+ s_manager->addKeyConfig( OKeyConfigItem( tr("Close Tab"), "close_tab",
+ QPixmap(), KeyCloseTab,
+ OKeyPair(Qt::Key_C, Qt::ControlButton) ));
s_manager->load();
}
return s_manager;
}
IRCHistoryLineEdit::IRCHistoryLineEdit(QWidget *parent, const char *name) : QLineEdit(parent, name) {
m_index = -1;
installEventFilter(this);
}
@@ -98,24 +101,26 @@ void IRCHistoryLineEdit::keyPressEvent(QKeyEvent *event) {
} else if (key == Key_Return) {
m_history.prepend(text());
m_index = -1;
}
switch( keyConfigInstance()->handleKeyEventId( event ) ) {
case KeyNextTab:
emit nextTab();
return;
case KeyPrevTab:
emit prevTab();
return;
+ case KeyCloseTab:
+ emit closeTab();
default:
break;
}
QLineEdit::keyPressEvent(event);
}
bool IRCHistoryLineEdit::eventFilter(QObject *object, QEvent *event) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *k = (QKeyEvent *) event;
/* Catch tab characters */
if (k->key() == Key_Tab) {
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
@@ -59,25 +59,26 @@ protected:
int insertTab(QTab *, int index = -1);
protected:
QArray<QColor> m_colors;
};
/* A QLineEdit with history functionality and tab completion */
class IRCHistoryLineEdit : public QLineEdit {
Q_OBJECT
public:
enum KeyMode {
KeyNextTab,
- KeyPrevTab
+ KeyPrevTab,
+ KeyCloseTab
};
static Opie::Core::OKeyConfigManager* keyConfigInstance();
IRCHistoryLineEdit(QWidget *parent = 0, const char *name = 0);
virtual bool eventFilter(QObject *object, QEvent *event);
public slots:
void setEditFocus();
signals:
void nextTab();
void prevTab();
void closeTab();
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
@@ -7,37 +7,40 @@ IRCQueryTab::IRCQueryTab(IRCPerson *person, IRCServerTab *parentTab, MainWindow
m_mainWindow = mainWindow;
m_parentTab = parentTab;
m_lines = 0;
m_person = new IRCPerson(*person); /* We need this (the person might sign off and the original IRCPerson gets deleted) */
m_description->setText(tr("Talking to ") + " <b>" + person->nick() + "</b>");
QHBox *hbox = new QHBox(this);
m_textview = new QTextView(hbox);
m_textview->setHScrollBarMode(QScrollView::AlwaysOff);
m_textview->setVScrollBarMode(QScrollView::AlwaysOn);
m_textview->setTextFormat(RichText);
QWhatsThis::add(m_textview, tr("Private discussion"));
m_field = new IRCHistoryLineEdit(this);
+
connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab()));
connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab()));
- connect(m_field, SIGNAL(closeTab()),this, SIGNAL(closeTab()));
-
+ connect(m_field, SIGNAL(closeTab()),this, SLOT(remove()));
+ connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus()));
QWhatsThis::add(m_field, tr("Type your text here in order to send a message to the other person"));
m_layout->add(hbox);
hbox->show();
m_layout->add(m_field);
- m_field->setFocus();
+
connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand()));
connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling()));
settingsChanged();
+ m_field->setFocus();
+ m_field->setActiveWindow();
}
void IRCQueryTab::scrolling(){
m_textview->ensureVisible(0, m_textview->contentsHeight());
}
void IRCQueryTab::appendText(QString text) {
/* not using append because it creates layout problems */
QString txt = m_textview->text() + text + "\n";
if (m_maxLines > 0 && m_lines >= m_maxLines) {
int firstBreak = txt.find('\n');
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
@@ -73,24 +73,29 @@ IRCServerList::IRCServerList(QWidget* parent, const char *name, bool modal, WFla
server.setHostname(m_config->readEntry("Hostname"));
server.setPort(m_config->readNumEntry("Port"));
server.setUsername(m_config->readEntry("Username"));
server.setPassword(m_config->readEntry("Password"));
server.setNick(m_config->readEntry("Nick"));
server.setRealname(m_config->readEntry("Realname"));
server.setChannels(m_config->readEntry("Channels"));
m_list->insertItem(new IRCListBoxServer(server));
}
}
}
+ connect(m_list, SIGNAL(doubleClicked(QListBoxItem*)),
+ this, SLOT(acceptOnClick(QListBoxItem *)));
+ connect(m_list, SIGNAL(returnPressed(QListBoxItem*)),
+ this, SLOT(acceptOnClick(QListBoxItem*)));
+
QPEApplication::showDialog( this );
}
void IRCServerList::addServer()
{
IRCServer server;
IRCServerEditor editor(server, this, "ServerEditor", TRUE);
if (editor.exec() == QDialog::Accepted)
{
server = editor.getServer();
/* Gets deleted by QListBox, so this is ok */
m_list->insertItem(new IRCListBoxServer(server));
@@ -113,24 +118,28 @@ void IRCServerList::editServer()
{
IRCListBoxServer *item = (IRCListBoxServer *)m_list->item(index);
IRCServer server = item->server();
IRCServerEditor editor(server, this, "ServerEditor", TRUE);
if (editor.exec() == QDialog::Accepted)
{
server = editor.getServer();
item->setServer(server);
}
}
}
+void IRCServerList::acceptOnClick( QListBoxItem* ) {
+ accept();
+}
+
int IRCServerList::exec()
{
int returncode = QDialog::exec();
/* Now save the changes */
m_config->setGroup("OpieIRC");
m_config->writeEntry("ServerCount", QString::number(m_list->count()));
for (unsigned int i=0; i<m_list->count(); i++)
{
IRCServer server = ((IRCListBoxServer *)m_list->item(i))->server();
m_config->setGroup("OpieIRC");
m_config->writeEntry("Server"+QString::number(i), server.name());
m_config->setGroup(server.name());
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
@@ -27,24 +27,25 @@
#include <qlist.h>
#include "ircserver.h"
class IRCServerList : public QDialog {
Q_OBJECT
public:
IRCServerList(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags f = 0);
int exec();
/* Check whether a server was selected */
bool hasServer();
/* Return the selected server */
IRCServer server();
-
+
~IRCServerList();
public slots:
void addServer();
void delServer();
void editServer();
+ void acceptOnClick(QListBoxItem*);
protected:
Config *m_config;
QListBox *m_list;
};
#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,19 +1,20 @@
#include <qtextstream.h>
#include <qwhatsthis.h>
#include "ircservertab.h"
bool IRCServerTab::containsPing( const QString& text, IRCServerTab* tab ) {
- return (text.find("ping") != -1 && text.find( tab->server()->nick() != -1));
+ return (text.contains(IRCMessageParser::tr("Received a CTCP PING from "))) ||
+ (text.find("ping") != -1 && text.find( tab->server()->nick() != -1));
}
IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) {
m_server = server;
m_session = new IRCSession(&m_server);
m_mainWindow = mainWindow;
m_close = FALSE;
m_lines = 0;
m_description->setText(tr("Connection to")+" <b>" + server.hostname() + ":" + QString::number(server.port()) + "</b>");
m_textview = new QTextView(this);
m_textview->setHScrollBarMode(QScrollView::AlwaysOff);
@@ -21,38 +22,44 @@ IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *pa
m_textview->setTextFormat(RichText);
QWhatsThis::add(m_textview, tr("Server messages"));
m_layout->add(m_textview);
m_field = new IRCHistoryLineEdit(this);
connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab()));
connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab()));
connect(m_field, SIGNAL(closeTab()), this, SIGNAL(closeTab()));
connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus()));
QWhatsThis::add(m_field, tr("Type commands here. A list of available commands can be found inside the OpieIRC help"));
m_layout->add(m_field);
connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand()));
- m_field->setFocus();
connect(m_session, SIGNAL(outputReady(IRCOutput)), this, SLOT(display(IRCOutput)));
connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling()));
settingsChanged();
+
+ m_field->setFocus();
+ m_field->setActiveWindow();
+
}
void IRCServerTab::scrolling(){
m_textview->ensureVisible(0, m_textview->contentsHeight());
}
void IRCServerTab::appendText(QString text) {
/* not using append because it creates layout problems */
- QString txt = m_textview->text() + text + "\n";
+ QString txt = m_textview->text() + IRCTab::appendTimestamp( text );
+
+
+
if (m_maxLines > 0 && m_lines >= m_maxLines) {
int firstBreak = txt.find('\n');
if (firstBreak != -1) {
txt = "<qt bgcolor=\"" + m_backgroundColor + "\"/>" + txt.right(txt.length() - (firstBreak + 1));
}
} else {
m_lines++;
}
m_textview->setText(txt);
m_textview->ensureVisible(0, m_textview->contentsHeight());
emit changed(this);
}
@@ -225,29 +232,29 @@ void IRCServerTab::doConnect() {
}
void IRCServerTab::remove() {
/* Close requested */
if (m_session->isSessionActive()) {
/* While there is a running session */
m_close = TRUE;
m_session->endSession();
} else {
/* Session has previously been closed */
m_channelTabs.first();
while (m_channelTabs.current() != 0) {
- m_mainWindow->killTab(m_channelTabs.current());
+ m_mainWindow->killTab(m_channelTabs.current(), true);
}
m_queryTabs.first();
while (m_queryTabs.current() != 0) {
- m_mainWindow->killTab(m_queryTabs.current());
+ m_mainWindow->killTab(m_queryTabs.current(), true);
}
m_mainWindow->killTab(this);
}
}
IRCChannelTab *IRCServerTab::getTabForChannel(IRCChannel *channel) {
QListIterator<IRCChannelTab> it(m_channelTabs);
for (; it.current(); ++it) {
if (it.current()->channel() == channel)
return it.current();
}
@@ -263,29 +270,29 @@ IRCQueryTab *IRCServerTab::getTabForQuery(IRCPerson *person) {
}
return 0;
}
void IRCServerTab::display(IRCOutput output) {
/* All messages to be displayed inside the GUI get here */
switch (output.type()) {
case OUTPUT_CONNCLOSE:
if (m_close) {
m_channelTabs.first();
while (m_channelTabs.current() != 0) {
- m_mainWindow->killTab(m_channelTabs.current());
+ m_mainWindow->killTab(m_channelTabs.current(), true);
}
m_queryTabs.first();
while (m_queryTabs.current() != 0) {
- m_mainWindow->killTab(m_queryTabs.current());
+ m_mainWindow->killTab(m_queryTabs.current(), true);
}
m_mainWindow->killTab(this);
} else {
appendText("<font color=\"" + m_errorColor + "\">" + output.htmlMessage() +"</font><br>");
QListIterator<IRCChannelTab> it(m_channelTabs);
for (; it.current(); ++it) {
it.current()->appendText("<font color=\"" + m_serverColor + "\">" + output.htmlMessage() +"</font><br>");
}
}
break;
case OUTPUT_SELFJOIN: {
IRCChannelTab *channeltab = new IRCChannelTab((IRCChannel *)output.getParam(0), this, m_mainWindow, (QWidget *)parent());
@@ -303,32 +310,32 @@ void IRCServerTab::display(IRCOutput output) {
IRCQueryTab *queryTab = getTabForQuery((IRCPerson *)output.getParam(0));
if (!queryTab) {
queryTab = new IRCQueryTab((IRCPerson *)output.getParam(0), this, m_mainWindow, (QWidget *)parent());
m_queryTabs.append(queryTab);
m_mainWindow->addTab(queryTab);
}
queryTab->display(output);
}
break;
case OUTPUT_SELFPART: {
IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0));
if (channelTab)
- m_mainWindow->killTab(channelTab);
+ m_mainWindow->killTab(channelTab, true);
}
break;
case OUTPUT_SELFKICK: {
appendText("<font color=\"" + m_errorColor + "\">" + output.htmlMessage() + "</font><br>");
IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0));
if (channelTab)
- m_mainWindow->killTab(channelTab);
+ m_mainWindow->killTab(channelTab, true);
}
break;
case OUTPUT_CHANACTION: {
IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0));
channelTab->appendText("<font color=\"" + m_otherColor + "\">"+output.htmlMessage()+"</font><br>");
}
break;
case OUTPUT_TOPIC: {
IRCChannel *channel = (IRCChannel *) output.getParam(0);
if (channel) {
IRCChannelTab *channelTab = getTabForChannel(channel);
if (channelTab) {
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
@@ -3,47 +3,61 @@
#include "irctab.h"
#include "ircmisc.h"
/* OPIE */
#include <opie2/ocolorbutton.h>
#include <opie2/otabwidget.h>
#include <opie2/okeyconfigwidget.h>
#include <qpe/qpeapplication.h>
/* QT */
#include <qvalidator.h>
#include <qwhatsthis.h>
+#include <qcheckbox.h>
using namespace Opie;
using namespace Opie::Ui;
IRCSettings::IRCSettings(QWidget* parent, const char* name, bool modal, WFlags) : QDialog(parent, name, modal, WStyle_ContextHelp)
{
setCaption(tr("Settings") );
m_config = new Config("OpieIRC");
m_config->setGroup("OpieIRC");
QHBoxLayout *l = new QHBoxLayout(this, 2, 2);
OTabWidget *tw = new OTabWidget(this);
l->addWidget(tw);
/* General Configuration */
QWidget *genwidget = new QWidget(tw);
- QGridLayout *layout = new QGridLayout(genwidget, 1, 2, 5, 0);
+ QGridLayout *layout = new QGridLayout(genwidget, 1, 4, 5, 0);
QLabel *label = new QLabel(tr("Lines displayed :"), genwidget);
layout->addWidget(label, 0, 0);
m_lines = new QLineEdit(m_config->readEntry("Lines", "100"), genwidget);
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"));
QIntValidator *validator = new QIntValidator(this);
validator->setTop(10000);
validator->setBottom(0);
m_lines->setValidator(validator);
layout->addWidget(m_lines, 0, 1);
+
+ /*
+ * include timestamp
+ */
+ m_displayTime = new QCheckBox( tr("Display time in chat log"), genwidget );
+ m_displayTime->setChecked( m_config->readBoolEntry("DisplayTime", false) );
+ layout->addMultiCellWidget(m_displayTime, 1, 1, 0, 4 );
+
+ // add a spacer
+ layout->addItem( new QSpacerItem(1,1, QSizePolicy::Minimum,
+ QSizePolicy::MinimumExpanding),
+ 2, 0 );
+
tw->addTab(genwidget, "opieirc/settings", tr("General"));
/* Color configuration */
QScrollView *view = new QScrollView(this);
view->setResizePolicy(QScrollView::AutoOneFit);
view->setFrameStyle( QFrame::NoFrame );
QWidget *widget = new QWidget(view->viewport());
view->addChild(widget);
layout = new QGridLayout(widget, 7, 2, 5, 0);
label = new QLabel(tr("Background color :"), widget);
layout->addWidget(label, 0, 0);
m_background = new OColorButton(widget, m_config->readEntry("BackgroundColor", "#FFFFFF"));
@@ -108,21 +122,23 @@ void IRCSettings::accept()
IRCTab::m_maxLines = m_lines->text().toInt();
m_keyConf->save();
m_config->writeEntry("BackgroundColor", IRCTab::m_backgroundColor);
m_config->writeEntry("TextColor", IRCTab::m_textColor);
m_config->writeEntry("ErrorColor", IRCTab::m_errorColor);
m_config->writeEntry("SelfColor", IRCTab::m_selfColor);
m_config->writeEntry("OtherColor", IRCTab::m_otherColor);
m_config->writeEntry("ServerColor", IRCTab::m_serverColor);
m_config->writeEntry("NotificationColor", IRCTab::m_notificationColor);
m_config->writeEntry("Lines", m_lines->text());
+ m_config->writeEntry("DisplayTime", m_displayTime->isChecked() );
+ IRCTab::setUseTimeStamps(m_displayTime->isChecked());
IRCHistoryLineEdit::keyConfigInstance()->save();
QDialog::accept();
}
IRCSettings::~IRCSettings()
{
delete m_config;
}
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
@@ -23,33 +23,35 @@
#include <qpe/config.h>
#include <qdialog.h>
#include <qlineedit.h>
namespace Opie {
class OColorButton;
namespace Ui {
class OKeyConfigWidget;
}
}
+class QCheckBox;
class IRCSettings : public QDialog {
Q_OBJECT
public:
IRCSettings(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags f = 0);
~IRCSettings();
protected slots:
void accept();
protected:
Config *m_config;
Opie::OColorButton *m_background;
Opie::OColorButton *m_text;
Opie::OColorButton *m_error;
Opie::OColorButton *m_self;
Opie::OColorButton *m_server;
Opie::OColorButton *m_other;
Opie::OColorButton *m_notification;
Opie::Ui::OKeyConfigWidget *m_keyConf;
QLineEdit *m_lines;
+ QCheckBox *m_displayTime;
};
#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
@@ -9,24 +9,40 @@
#include <qwhatsthis.h>
QString IRCTab::m_errorColor;
QString IRCTab::m_serverColor;
QString IRCTab::m_textColor;
QString IRCTab::m_backgroundColor;
QString IRCTab::m_selfColor;
QString IRCTab::m_otherColor;
QString IRCTab::m_notificationColor;
int IRCTab::m_maxLines;
+
+static bool g_useTime = false;
+
+void IRCTab::setUseTimeStamps( bool b ) {
+ g_useTime = b;
+}
+
+// ## FIXME use TimeString later for AM/PM Setting
+QString IRCTab::appendTimestamp( const QString& text ) {
+ return g_useTime ?
+ "[" +QTime::currentTime().toString()+"]" + text + "\n" :
+ text + "\n";
+
+}
+
+
IRCTab::IRCTab(QWidget *parent, const char *name, WFlags f) : QWidget(parent, name, f) {
m_layout = new QVBoxLayout(this);
QHBoxLayout *descLayout = new QHBoxLayout(m_layout);
descLayout->setMargin(5);
m_description = new QLabel(tr("Missing description"), this);
QWhatsThis::add(m_description, tr("Description of the tab's content"));
descLayout->addWidget(m_description);
descLayout->setStretchFactor(m_description, 5);
QPushButton *close = new QPushButton(this);
QWhatsThis::add(close, tr("Close this tab"));
close->setPixmap(Resource::loadPixmap("close"));
connect(close, SIGNAL(clicked()), this, SLOT(remove()));
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
@@ -29,24 +29,28 @@
#include "ircsession.h"
/* This is the base class for any tabs which need to be integrated into
the main GUI tab widget */
class IRCTab : public QWidget {
Q_OBJECT
public:
IRCTab(QWidget *parent = 0, const char *name = 0, WFlags f = 0);
/* The ID is required to store the position of this IRCTab inside the IRCTabWidget */
void setID(int id);
int id();
+
+ static void setUseTimeStamps(bool b);
+ static QString appendTimestamp(const QString& tex);
+
virtual QString title() = 0;
virtual IRCSession *session() = 0;
virtual void appendText(QString text) = 0;
signals:
void changed(IRCTab *);
void ping(const QString& );
void nextTab();
void prevTab();
void closeTab();
void editFocus();
public slots:
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
@@ -39,55 +39,67 @@ MainWindow::MainWindow(QWidget *parent, const char *name, WFlags) : QMainWindow(
void MainWindow::loadSettings() {
Config config("OpieIRC");
config.setGroup("OpieIRC");
IRCTab::m_backgroundColor = config.readEntry("BackgroundColor", "#FFFFFF");
IRCTab::m_textColor = config.readEntry("TextColor", "#000000");
IRCTab::m_errorColor = config.readEntry("ErrorColor", "#FF0000");
IRCTab::m_selfColor = config.readEntry("SelfColor", "#CC0000");
IRCTab::m_otherColor = config.readEntry("OtherColor", "#0000BB");
IRCTab::m_serverColor = config.readEntry("ServerColor", "#0000FF");
IRCTab::m_notificationColor = config.readEntry("NotificationColor", "#AA3300");
IRCTab::m_maxLines = config.readNumEntry("Lines", 100);
+ IRCTab::setUseTimeStamps( config.readBoolEntry("DisplayTime", false ) );
}
void MainWindow::selected(QWidget *) {
m_tabWidget->setTabColor(m_tabWidget->currentPageIndex(), black);
emit updateScroll();
}
void MainWindow::addTab(IRCTab *tab) {
connect(tab, SIGNAL(changed(IRCTab*)), this, SLOT(changeEvent(IRCTab*)));
connect(tab, SIGNAL(ping (const QString&)), this, SLOT(slotPing(const QString&)));
connect(tab, SIGNAL(nextTab()), this, SLOT(slotNextTab()));
connect(tab, SIGNAL(prevTab()), this, SLOT(slotPrevTab()));
- connect(tab, SIGNAL(closeTab()), this, SLOT(slotCloseTab()));
m_tabWidget->addTab(tab, tab->title());
m_tabWidget->showPage(tab);
tab->setID(m_tabWidget->currentPageIndex());
m_tabs.append(tab);
}
void MainWindow::changeEvent(IRCTab *tab) {
if (tab->id() != m_tabWidget->currentPageIndex())
m_tabWidget->setTabColor(tab->id(), blue);
}
-void MainWindow::killTab(IRCTab *tab) {
- m_tabWidget->removePage(tab);
- m_tabs.remove(tab);
+void MainWindow::killTab(IRCTab *tab, bool imediate) {
+ m_toDelete.append( tab );
- /* there might be nicer ways to do this .. */
- delete tab;
+ if ( imediate )
+ slotKillTabsLater();
+ else
+ QTimer::singleShot(0, this, SLOT(slotKillTabsLater()) );
+}
+
+void MainWindow::slotKillTabsLater() {
+ for ( QListIterator<IRCTab> it(m_toDelete); it.current(); ++it ) {
+ m_tabWidget->removePage( it.current() );
+ m_tabs.remove( it.current() );
+ }
+
+ m_toDelete.setAutoDelete( true );
+ m_toDelete.clear();
+ m_toDelete.setAutoDelete( false );
}
void MainWindow::newConnection() {
IRCServerList list(this, "ServerList", TRUE);
if (list.exec() == QDialog::Accepted && list.hasServer()) {
IRCServerTab *serverTab = new IRCServerTab(list.server(), this, m_tabWidget);
addTab(serverTab);
serverTab->doConnect();
}
}
void MainWindow::settings() {
@@ -108,22 +120,16 @@ void MainWindow::slotNextTab() {
int j = m_tabWidget->currentPageIndex ();
if ( i == j )
m_tabWidget->setCurrentPage ( 1 );
}
void MainWindow::slotPrevTab() {
int i = m_tabWidget->currentPageIndex ();
if ( i > 1 )
m_tabWidget->setCurrentPage ( i-1 );
}
-void MainWindow::slotCloseTab() {
- IRCTab *tab = (IRCTab *) m_tabWidget->currentPage ();
- if ( tab )
- killTab ( tab );
-}
-
-void MainWindow::slotPing( const QString& channel ) {
+void MainWindow::slotPing( const QString& /*channel*/ ) {
raise();
}
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
@@ -25,36 +25,37 @@
#include <qaction.h>
#include <qlist.h>
#include "mainwindow.h"
#include "ircmisc.h"
#include "irctab.h"
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0, const char *name = 0, WFlags f = 0);
// IRCTabWidget getTabWidget();
void addTab(IRCTab *tab);
- void killTab(IRCTab *tab);
+ void killTab(IRCTab *tab, bool now = false);
static QString appName() { return QString::fromLatin1("opieirc"); }
static QString appCaption();
signals:
void updateScroll();
protected slots:
void newConnection();
void settings();
void selected(QWidget *);
void changeEvent(IRCTab *);
void slotNextTab();
- void slotPrevTab();
- void slotCloseTab();
+ void slotPrevTab();
void slotPing(const QString&);
+ void slotKillTabsLater();
protected:
void loadSettings();
protected:
IRCTabWidget *m_tabWidget;
QList<IRCTab> m_tabs;
+ QList<IRCTab> m_toDelete;
};
#endif /* __MAINWINDOW_H */