-rw-r--r-- | noncore/net/opieirc/.cvsignore | 3 | ||||
-rw-r--r-- | noncore/net/opieirc/ircchanneltab.cpp | 22 | ||||
-rw-r--r-- | noncore/net/opieirc/ircchanneltab.h | 2 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmessageparser.cpp | 34 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmisc.cpp | 5 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmisc.h | 3 | ||||
-rw-r--r-- | noncore/net/opieirc/ircquerytab.cpp | 9 | ||||
-rw-r--r-- | noncore/net/opieirc/ircserverlist.cpp | 9 | ||||
-rw-r--r-- | noncore/net/opieirc/ircserverlist.h | 3 | ||||
-rw-r--r-- | noncore/net/opieirc/ircservertab.cpp | 25 | ||||
-rw-r--r-- | noncore/net/opieirc/ircsettings.cpp | 18 | ||||
-rw-r--r-- | noncore/net/opieirc/ircsettings.h | 2 | ||||
-rw-r--r-- | noncore/net/opieirc/irctab.cpp | 16 | ||||
-rw-r--r-- | noncore/net/opieirc/irctab.h | 4 | ||||
-rw-r--r-- | noncore/net/opieirc/mainwindow.cpp | 32 | ||||
-rw-r--r-- | noncore/net/opieirc/mainwindow.h | 7 |
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 @@ -2,3 +2,4 @@ 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 @@ -16,4 +16,5 @@ IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainW m_listVisible = TRUE; m_listButton = new QPushButton(">", m_textview); + m_listButton->setFlat( true ); m_textview->setCornerWidget(m_listButton); m_textview->setTextFormat(RichText); @@ -26,5 +27,5 @@ IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainW 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())); @@ -37,5 +38,4 @@ IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainW /* 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())); @@ -50,4 +50,5 @@ IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainW connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); + connect(m_list, SIGNAL(doubleClicked ( QListBoxItem * ) ), this, SLOT(popupQuery( QListBoxItem * ) )); settingsChanged(); } @@ -59,5 +60,5 @@ void IRCChannelTab::scrolling(){ 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'); @@ -73,5 +74,7 @@ void IRCChannelTab::appendText(QString text) { 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 ) @@ -133,7 +136,7 @@ void IRCChannelTab::mouseButtonPressed(int mouse, QListBoxItem *, const QPoint & } -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); @@ -147,4 +150,9 @@ void IRCChannelTab::popupQuery() { } +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 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 @@ -54,5 +54,7 @@ protected slots: void mouseButtonPressed(int mouse, QListBoxItem *item, const QPoint &point); /* Popup slots */ + void popupQuery(QListBoxItem*); void popupQuery(); + void popupPing(); void popupVersion(); 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 @@ -284,4 +284,38 @@ void IRCMessageParser::parseCTCPPing(IRCMessage *message) { 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"))); + } + } + } 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 @@ -68,4 +68,7 @@ OKeyConfigManager* IRCHistoryLineEdit::keyConfigInstance() { 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(); } @@ -108,4 +111,6 @@ void IRCHistoryLineEdit::keyPressEvent(QKeyEvent *event) { emit prevTab(); return; + case KeyCloseTab: + emit closeTab(); default: break; 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 @@ -69,5 +69,6 @@ public: enum KeyMode { KeyNextTab, - KeyPrevTab + KeyPrevTab, + KeyCloseTab }; 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 @@ -17,8 +17,9 @@ IRCQueryTab::IRCQueryTab(IRCPerson *person, IRCServerTab *parentTab, MainWindow 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")); @@ -26,8 +27,10 @@ IRCQueryTab::IRCQueryTab(IRCPerson *person, IRCServerTab *parentTab, MainWindow 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(); } 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 @@ -83,4 +83,9 @@ IRCServerList::IRCServerList(QWidget* parent, const char *name, bool modal, WFla } + connect(m_list, SIGNAL(doubleClicked(QListBoxItem*)), + this, SLOT(acceptOnClick(QListBoxItem *))); + connect(m_list, SIGNAL(returnPressed(QListBoxItem*)), + this, SLOT(acceptOnClick(QListBoxItem*))); + QPEApplication::showDialog( this ); } @@ -123,4 +128,8 @@ void IRCServerList::editServer() } +void IRCServerList::acceptOnClick( QListBoxItem* ) { + accept(); +} + int IRCServerList::exec() { 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 @@ -37,5 +37,5 @@ public: /* Return the selected server */ IRCServer server(); - + ~IRCServerList(); public slots: @@ -43,4 +43,5 @@ public slots: void delServer(); void editServer(); + void acceptOnClick(QListBoxItem*); protected: Config *m_config; 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 @@ -5,5 +5,6 @@ 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)); } @@ -31,8 +32,11 @@ IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *pa 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(); + } @@ -44,5 +48,8 @@ void IRCServerTab::scrolling(){ 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'); @@ -235,9 +242,9 @@ void IRCServerTab::remove() { 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); @@ -273,9 +280,9 @@ void IRCServerTab::display(IRCOutput output) { 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); @@ -313,5 +320,5 @@ void IRCServerTab::display(IRCOutput output) { IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0)); if (channelTab) - m_mainWindow->killTab(channelTab); + m_mainWindow->killTab(channelTab, true); } break; @@ -320,5 +327,5 @@ void IRCServerTab::display(IRCOutput output) { IRCChannelTab *channelTab = getTabForChannel((IRCChannel *)output.getParam(0)); if (channelTab) - m_mainWindow->killTab(channelTab); + m_mainWindow->killTab(channelTab, true); } break; 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 @@ -13,4 +13,5 @@ #include <qvalidator.h> #include <qwhatsthis.h> +#include <qcheckbox.h> using namespace Opie; @@ -26,5 +27,5 @@ IRCSettings::IRCSettings(QWidget* parent, const char* name, bool modal, WFlags) /* 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); @@ -36,4 +37,17 @@ IRCSettings::IRCSettings(QWidget* parent, const char* name, bool modal, WFlags) 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")); @@ -118,4 +132,6 @@ void IRCSettings::accept() 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(); 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 @@ -33,4 +33,5 @@ class OKeyConfigWidget; } +class QCheckBox; class IRCSettings : public QDialog { Q_OBJECT @@ -51,4 +52,5 @@ protected: Opie::Ui::OKeyConfigWidget *m_keyConf; QLineEdit *m_lines; + QCheckBox *m_displayTime; }; 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 @@ -19,4 +19,20 @@ 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); 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 @@ -39,4 +39,8 @@ public: 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; 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 @@ -49,4 +49,5 @@ void MainWindow::loadSettings() { IRCTab::m_notificationColor = config.readEntry("NotificationColor", "#AA3300"); IRCTab::m_maxLines = config.readNumEntry("Lines", 100); + IRCTab::setUseTimeStamps( config.readBoolEntry("DisplayTime", false ) ); } @@ -61,5 +62,4 @@ void MainWindow::addTab(IRCTab *tab) { 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()); @@ -74,10 +74,22 @@ void MainWindow::changeEvent(IRCTab *tab) { } -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 ); } @@ -118,11 +130,5 @@ void MainWindow::slotPrevTab() { } -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 @@ -35,5 +35,5 @@ public: // 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(); @@ -47,7 +47,7 @@ protected slots: void slotNextTab(); - void slotPrevTab(); - void slotCloseTab(); + void slotPrevTab(); void slotPing(const QString&); + void slotKillTabsLater(); protected: @@ -56,4 +56,5 @@ protected: IRCTabWidget *m_tabWidget; QList<IRCTab> m_tabs; + QList<IRCTab> m_toDelete; }; |