diff options
Diffstat (limited to 'src/kvirc/ui/kvi_irctoolbar.cpp')
-rw-r--r-- | src/kvirc/ui/kvi_irctoolbar.cpp | 441 |
1 files changed, 441 insertions, 0 deletions
diff --git a/src/kvirc/ui/kvi_irctoolbar.cpp b/src/kvirc/ui/kvi_irctoolbar.cpp new file mode 100644 index 0000000..a7e45f3 --- /dev/null +++ b/src/kvirc/ui/kvi_irctoolbar.cpp @@ -0,0 +1,441 @@ +//============================================================================= +// +// File : kvi_irctoolbar.cpp +// Creation date : Thu Oct 29 2000 14:13:13 CEST by Szymon Stefanek +// +// This file is part of the KVirc irc client distribution +// Copyright (C) 2000-2004 Szymon Stefanek (pragma at kvirc dot net) +// +// This program is FREE software. You can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your opinion) any later version. +// +// This program is distributed in the HOPE that it will be USEFUL, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, write to the Free Software Foundation, +// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//============================================================================= + +#define __KVIRC__ +#include "kvi_irctoolbar.h" +#include "kvi_console.h" +#include "kvi_frame.h" +#include "kvi_locale.h" +#include "kvi_iconmanager.h" +#include "kvi_settings.h" +#include "kvi_options.h" +#include "kvi_frame.h" +#include "kvi_app.h" +#include "kvi_dynamictooltip.h" +#include "kvi_ircurl.h" +#include "kvi_internalcmd.h" +#include "kvi_pointerlist.h" +#include "kvi_ircconnection.h" +#include "kvi_ircconnectionuserinfo.h" +#include "kvi_irccontext.h" +#include "kvi_lagmeter.h" + +#include <qstyle.h> +#include <qpainter.h> +#include "kvi_tal_popupmenu.h" +#include <qlayout.h> + +#ifdef COMPILE_USE_QT4 + #include <qevent.h> +#endif + +#ifdef COMPILE_PSEUDO_TRANSPARENCY + extern QPixmap * g_pShadedChildGlobalDesktopBackground; +#endif + +static QPixmap * g_pIccMemBuffer = 0; +static KviPointerList<KviToolBarGraphicalApplet> * g_pToolBarGraphicalAppletList = 0; + +KviToolBarGraphicalApplet::KviToolBarGraphicalApplet(QWidget * par,const char * name) +: QToolButton(par,name) +{ + if(!g_pToolBarGraphicalAppletList) + { + g_pToolBarGraphicalAppletList = new KviPointerList<KviToolBarGraphicalApplet>(); + g_pToolBarGraphicalAppletList->setAutoDelete(false); + g_pIccMemBuffer = new QPixmap(1,1); + } + + g_pToolBarGraphicalAppletList->append(this); +#ifdef COMPILE_USE_QT4 + setAutoFillBackground(false); +#else + setBackgroundMode(QWidget::NoBackground); +#endif + + setMouseTracking(true); + m_bResizeMode = false; + + m_sizeHint = QSize(180,32); + m_bSizeLoaded = false; +} + +unsigned int KviToolBarGraphicalApplet::loadAppletWidth() +{ + if(KVI_OPTION_UINT(KviOption_uintIrcContextAppletWidth) < 32) + KVI_OPTION_UINT(KviOption_uintIrcContextAppletWidth) = 32; + return KVI_OPTION_UINT(KviOption_uintIrcContextAppletWidth); +} + +void KviToolBarGraphicalApplet::saveAppletWidth(unsigned int uWidth) +{ + KVI_OPTION_UINT(KviOption_uintIrcContextAppletWidth) = uWidth; +} + +void KviToolBarGraphicalApplet::setupSizeHint() +{ + m_sizeHint = QSize(loadAppletWidth(),22); + m_bSizeLoaded = true; +} + +QSize KviToolBarGraphicalApplet::sizeHint() const +{ + // forget constness :( + KviToolBarGraphicalApplet * that = (KviToolBarGraphicalApplet *)this; + if(!m_bSizeLoaded)that->setupSizeHint(); + return m_sizeHint; +} + +/* +toolbar.define(default) +{ + applet(thisandthat); + applet(thisandthat); + applet(thisandthat); + applet(thisandthat); +} +*/ + + +void KviToolBarGraphicalApplet::mouseMoveEvent(QMouseEvent * e) +{ + if(e->state() & Qt::LeftButton) + { + if(m_bResizeMode) + { + int w = e->pos().x(); + if(w < 32)w = 32; + if(w > 480)w = 480; + m_sizeHint = QSize(w,22); + resize(w,height()); + g_pApp->postEvent(parentWidget(),new QEvent(QEvent::LayoutHint)); + } + } else { + if(e->pos().x() > width() - 4) + setCursor(Qt::sizeHorCursor); + else + setCursor(Qt::arrowCursor); + } +} + +void KviToolBarGraphicalApplet::mousePressEvent(QMouseEvent * e) +{ + if(e->button() & Qt::LeftButton) + { + m_bResizeMode = (e->pos().x() > (width() - 4)); + } +} + +void KviToolBarGraphicalApplet::mouseReleaseEvent(QMouseEvent * e) +{ + m_bResizeMode = false; +} + + +KviToolBarGraphicalApplet::~KviToolBarGraphicalApplet() +{ + saveAppletWidth(m_sizeHint.width()); + g_pToolBarGraphicalAppletList->removeRef(this); + if(g_pToolBarGraphicalAppletList->isEmpty()) + { + delete g_pToolBarGraphicalAppletList; + g_pToolBarGraphicalAppletList = 0; + delete g_pIccMemBuffer; + g_pIccMemBuffer = 0; + } else { + // resize the mem buffer to match the maximum width / height of the applets + resizeMemBuffer(); + } +} + +void KviToolBarGraphicalApplet::resizeMemBuffer() +{ + int uMaxW = 0; + int uMaxH = 0; + for(KviToolBarGraphicalApplet * a = g_pToolBarGraphicalAppletList->first();a;a = g_pToolBarGraphicalAppletList->next()) + { + if(uMaxW < a->width())uMaxW = a->width(); + if(uMaxH < a->height())uMaxH = a->height(); + } + g_pIccMemBuffer->resize(uMaxW,uMaxH); +} + +void KviToolBarGraphicalApplet::paintEvent(QPaintEvent *e) +{ + if(!isVisible())return; + + QPainter pa(g_pIccMemBuffer); + +#ifdef COMPILE_PSEUDO_TRANSPARENCY + if(g_pShadedChildGlobalDesktopBackground) + { + QPoint pnt = mapToGlobal(QPoint(0,0)); + pa.drawTiledPixmap(e->rect().left(),e->rect().top(),e->rect().width(),e->rect().height(),*g_pShadedChildGlobalDesktopBackground,pnt.x(),pnt.y()); + } else { +#endif + if(KVI_OPTION_PIXMAP(KviOption_pixmapIrcToolBarAppletBackground).pixmap()) + { + QPoint pnt = mapToGlobal(QPoint(0,0)); + pa.drawTiledPixmap(e->rect().left(),e->rect().top(),e->rect().width(),e->rect().height(),*(KVI_OPTION_PIXMAP(KviOption_pixmapIrcToolBarAppletBackground).pixmap()),pnt.x(),pnt.y()); + } else { + pa.fillRect(e->rect().left(),e->rect().top(),e->rect().width(),e->rect().height(),KVI_OPTION_COLOR(KviOption_colorIrcToolBarAppletBackground)); + } +#ifdef COMPILE_PSEUDO_TRANSPARENCY + } +#endif + + drawContents(&pa); + + //Need to draw the sunken rect around the view now... + pa.setPen(colorGroup().dark()); + pa.drawLine(0,0,width(),0); + pa.drawLine(0,0,0,width()); + pa.setPen(colorGroup().light()); + pa.drawLine(1,height() - 1,width() - 1,height() - 1); + pa.drawLine(width() - 1,1,width() - 1,height()); + +#ifdef COMPILE_USE_QT4 + QPainter qt4SucksBecauseItNeedsAnAdditionalQPainter(this); + qt4SucksBecauseItNeedsAnAdditionalQPainter.drawPixmap(e->rect().left(),e->rect().top(),e->rect().width(),e->rect().height(),*g_pIccMemBuffer,e->rect().left(),e->rect().top(),e->rect().width(),e->rect().height()); +#else + bitBlt(this,e->rect().left(),e->rect().top(),g_pIccMemBuffer,e->rect().left(),e->rect().top(),e->rect().width(),e->rect().height(),Qt::CopyROP); +#endif +} + +void KviToolBarGraphicalApplet::drawContents(QPainter *) +{ + // nothing here +} + +void KviToolBarGraphicalApplet::resizeEvent(QResizeEvent *e) +{ + unsigned int uBufferW = g_pIccMemBuffer->width(); + unsigned int uBufferH = g_pIccMemBuffer->height(); + unsigned int uW = width(); + unsigned int uH = height(); + + if((uBufferW != uW) || (uBufferH != uH)) + { + if((uBufferW < uW) && (uBufferH < uH))g_pIccMemBuffer->resize(uW,uH); + else resizeMemBuffer(); + } +} + + +////////////////////////////////////////////////////////////////////////////// +// +// KviIrcContextDisplay +// +// Main applet of all irc contexts +// Displays the server connection status, server name +// nickname, user mode and the graphical indication of the context +// +////////////////////////////////////////////////////////////////////////////// + +KviIrcContextDisplay::KviIrcContextDisplay(QWidget * par,const char * name) +: KviToolBarGraphicalApplet(par,name) +{ + KviDynamicToolTip * tip = new KviDynamicToolTip(this); + connect(tip,SIGNAL(tipRequest(KviDynamicToolTip *,const QPoint &)),this,SLOT(tipRequest(KviDynamicToolTip *,const QPoint &))); +} + + +KviIrcContextDisplay::~KviIrcContextDisplay() +{ +} + +void KviIrcContextDisplay::tipRequest(KviDynamicToolTip * tip,const QPoint &) +{ + QString txt; + + KviConsole * c = g_pActiveWindow->console(); + + static QString b = "<b>"; + static QString nb = "</b>"; + static QString br = "<br>"; + + if(c) + { + KviIrcConnection * ic = c->connection(); + + txt = b; + + if(!ic) + { + txt += __tr2qs("No connection"); + txt += nb; + txt += br; + } else { + KviStr nickAndMode = ic->userInfo()->nickName(); + if(!(ic->userInfo()->userMode().isEmpty()))nickAndMode.append(KviStr::Format," (+%s)",ic->userInfo()->userMode().utf8().data()); + + txt += ic->currentServerName(); + txt += nb; + txt += br; + txt += nickAndMode.ptr(); + txt += br; + } + + QString szNum; + szNum.setNum(c->ircContextId()); + + QString szIrcContext = QChar('('); + szIrcContext += __tr2qs("IRC Context"); + szIrcContext += QChar(' '); + szIrcContext += szNum; + szIrcContext += QChar(')'); + txt += szIrcContext; + + if(ic && ic->lagMeter() && (KVI_OPTION_BOOL(KviOption_boolShowLagOnContextDisplay))) + { + txt += br; + int lll; + if((lll = ic->lagMeter()->lag()) > 0) + { + int llls = lll / 1000; + int llld = (lll % 1000) / 100; + int lllc = (lll % 100) / 10; + KviQString::appendFormatted(txt,__tr2qs("Lag: %d.%d%d"),llls,llld,lllc); + } else { + txt += __tr2qs("Lag: ?.??"); + } + } + } else { + txt = b; + txt += __tr2qs("No IRC context"); + txt += nb; + } + + tip->tip(rect(),txt); +} + + +/* +QSize KviIrcContextDisplay::sizeHint() const +{ + return QSize(160,22); +} +*/ + +#define KVI_APPLETIRCCONTEXTINDICATORWIDTH 12 + +void KviIrcContextDisplay::drawContents(QPainter * p) +{ + // The context indicator + KviWindow * wnd = g_pActiveWindow; + KviConsole * c = wnd ? wnd->console() : 0; + + if(c) + { + QString serv,nick; + QString tmp; + if(!c->connection()) + { + serv = __tr2qs("Not connected"); + } else { + if(c->isConnected()) + { + KviIrcConnection * ic = c->connection(); + nick = ic->currentNickName(); + if(!ic->userInfo()->userMode().isEmpty()) + { + static QString spp(" (+"); + nick += spp; + nick += ic->userInfo()->userMode(); + if(ic->userInfo()->isAway()) + { + nick += QChar(' '); + nick += __tr2qs("away"); + } + nick += QChar(')'); + } else { + if(ic->userInfo()->isAway()) + { + static QString ugly(" ("); + nick += ugly; + nick += __tr2qs("away"); + nick += QChar(')'); + } + } + serv = ic->currentServerName(); + if(ic->lagMeter() && (KVI_OPTION_BOOL(KviOption_boolShowLagOnContextDisplay))) + { + nick += " "; + int lll; + if((lll = ic->lagMeter()->lag()) > 0) + { + int llls = lll / 1000; + int llld = (lll % 1000) / 100; + int lllc = (lll % 100) / 10; + KviQString::appendFormatted(nick,__tr2qs("Lag: %d.%d%d"),llls,llld,lllc); + } else { + nick += __tr2qs("Lag: ?.??"); + } + } + } else { + serv = __tr2qs("In progress..."); + } + } + + p->setPen(KVI_OPTION_COLOR(KviOption_colorIrcToolBarAppletForegroundHighContrastActive1)); + + p->setClipRect(KVI_APPLETIRCCONTEXTINDICATORWIDTH + 2,2,width() - (KVI_APPLETIRCCONTEXTINDICATORWIDTH + 4),height() - 4); + + if(height() < 30) + { + static QString xxx(" ["); + serv += xxx; + serv += nick; + serv += QChar(']'); + p->drawText(KVI_APPLETIRCCONTEXTINDICATORWIDTH + 4,16,serv,serv.length()); + } else { + p->drawText(KVI_APPLETIRCCONTEXTINDICATORWIDTH + 4,16,serv,serv.length()); + p->drawText(KVI_APPLETIRCCONTEXTINDICATORWIDTH + 4,30,nick,nick.length()); + } + + p->setClipping(false); + + QColor base = colorGroup().background(); + QColor cntx = KVI_OPTION_ICCOLOR(c->ircContextId() % KVI_NUM_ICCOLOR_OPTIONS); + base.setRgb((base.red() + cntx.red()) >> 1,(base.green() + cntx.green()) >> 1, + (base.blue() + cntx.blue()) >> 1); + + p->fillRect(2,2, KVI_APPLETIRCCONTEXTINDICATORWIDTH - 2,height() - 4,base); + } + + p->setPen(KVI_OPTION_COLOR(KviOption_colorIrcToolBarAppletForegroundMidContrast)); + p->drawLine(1,1,width() - 1,1); + p->drawLine(1,1,1,height() - 1); + p->drawLine(2,height() - 2,width() - 1,height() - 2); + p->drawLine(width() - 2,1,width() - 2,height()); + p->drawLine(KVI_APPLETIRCCONTEXTINDICATORWIDTH,2,KVI_APPLETIRCCONTEXTINDICATORWIDTH,height() - 2); + +} + + +#ifdef Bool + #undef Bool +#endif + +#include "kvi_irctoolbar.moc" |