summaryrefslogtreecommitdiffstats
path: root/src/kvirc/ui/kvi_statusbarapplet.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kvirc/ui/kvi_statusbarapplet.cpp')
-rw-r--r--src/kvirc/ui/kvi_statusbarapplet.cpp563
1 files changed, 563 insertions, 0 deletions
diff --git a/src/kvirc/ui/kvi_statusbarapplet.cpp b/src/kvirc/ui/kvi_statusbarapplet.cpp
new file mode 100644
index 00000000..8e4ec89a
--- /dev/null
+++ b/src/kvirc/ui/kvi_statusbarapplet.cpp
@@ -0,0 +1,563 @@
+//=============================================================================//
+// File : kvi_statusbarapplet.cpp
+// Created on Tue 07 Sep 2004 03:56:46 by Szymon Stefanek
+//
+// This file is part of the KVIrc IRC client distribution
+// Copyright (C) 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_statusbarapplet.h"
+#include "kvi_frame.h"
+#include "kvi_iconmanager.h"
+#include "kvi_window.h"
+#include "kvi_irccontext.h"
+#include "kvi_ircconnection.h"
+#include "kvi_ircconnectionuserinfo.h"
+#include "kvi_ircconnectionstatistics.h"
+#include "kvi_locale.h"
+#include "kvi_app.h"
+#include "kvi_config.h"
+#include "kvi_modulemanager.h"
+#include "kvi_console.h"
+#include "kvi_lagmeter.h"
+#include "kvi_options.h"
+#include "kvi_kvs_script.h"
+
+#include <qpainter.h>
+#include <qstyle.h>
+#include <qlayout.h>
+#include <qtimer.h>
+#include <qcursor.h>
+#include "kvi_tal_popupmenu.h"
+#include <qpixmap.h>
+#ifdef COMPILE_USE_QT4
+ #include <qevent.h>
+#endif
+
+// This class COULD be derived also from KStatusBar but in fact
+// it adds no graphic functionality and it has only useless methods for us.
+// ... for now let's keep it simple :)
+
+
+// FIXME: Applets in modules SHOULD be unregistered automatically on unload!
+
+#include "kvi_time.h"
+#include "kvi_qstring.h"
+
+#include <qfont.h>
+
+/*
+ IDEAS:
+ - Lag meter
+ - Countdown timer
+*/
+
+KviStatusBarAppletDescriptor::KviStatusBarAppletDescriptor(const QString &szVisibleName,const QString &szInternalName,CreateAppletCallback pProc,const QString &szPreloadModule,const QPixmap &pixIcon)
+: KviHeapObject()
+{
+ static int s_iAppletDescriptorUniqueId = 0;
+ m_iId = s_iAppletDescriptorUniqueId;
+ s_iAppletDescriptorUniqueId++;
+ m_szVisibleName = szVisibleName;
+ m_szInternalName = szInternalName;
+ m_szPreloadModule = szPreloadModule;
+ m_pProc = pProc;
+ m_pAppletList = new KviPointerList<KviStatusBarApplet>;
+ m_pAppletList->setAutoDelete(false);
+ if(!pixIcon.isNull())m_pIcon = new QPixmap(pixIcon);
+ else m_pIcon = 0;
+}
+
+KviStatusBarAppletDescriptor::~KviStatusBarAppletDescriptor()
+{
+ while(KviStatusBarApplet * a = m_pAppletList->first())delete a;
+ delete m_pAppletList;
+ if(m_pIcon)delete m_pIcon;
+}
+
+KviStatusBarApplet * KviStatusBarAppletDescriptor::create(KviStatusBar * pBar)
+{
+ return m_pProc(pBar,this);
+}
+
+void KviStatusBarAppletDescriptor::registerApplet(KviStatusBarApplet * a)
+{
+ m_pAppletList->append(a);
+}
+
+void KviStatusBarAppletDescriptor::unregisterApplet(KviStatusBarApplet * a)
+{
+ m_pAppletList->removeRef(a);
+}
+
+
+
+
+
+
+KviStatusBarApplet::KviStatusBarApplet(KviStatusBar * pParent,KviStatusBarAppletDescriptor *pDescriptor)
+: QLabel(pParent), m_pStatusBar(pParent), m_pDescriptor(pDescriptor)
+{
+ m_pDescriptor->registerApplet(this);
+ m_pStatusBar->registerApplet(this);
+ m_bSelected = false;
+}
+
+KviStatusBarApplet::~KviStatusBarApplet()
+{
+ m_pDescriptor->unregisterApplet(this);
+ m_pStatusBar->unregisterApplet(this);
+}
+
+QString KviStatusBarApplet::tipText(const QPoint &)
+{
+ return QString::null;
+}
+
+void KviStatusBarApplet::paintEvent(QPaintEvent * e)
+{
+ QLabel::paintEvent(e);
+ setFont(KVI_OPTION_FONT(KviOption_fontIrcToolBarApplet));
+ if(m_bSelected)
+ {
+ QPainter p(this);
+#ifdef COMPILE_USE_QT4
+ p.setCompositionMode(QPainter::CompositionMode_SourceOut);
+ p.fillRect(rect(),Qt::black);
+ p.setCompositionMode(QPainter::CompositionMode_SourceOver);
+#else
+ p.setRasterOp(Qt::NotROP);
+ p.fillRect(rect(),Qt::black);
+ p.setRasterOp(Qt::CopyROP);
+#endif
+ }
+}
+
+void KviStatusBarApplet::select(bool bSelect)
+{
+ if(m_bSelected == bSelect)return;
+ m_bSelected = bSelect;
+ update();
+}
+
+
+
+
+KviStatusBarAwayIndicator::KviStatusBarAwayIndicator(KviStatusBar * pParent,KviStatusBarAppletDescriptor *pDescriptor)
+: KviStatusBarApplet(pParent,pDescriptor)
+{
+ m_bAwayOnAllContexts = false;
+ connect(pParent->frame(),SIGNAL(activeContextChanged()),this,SLOT(updateDisplay()));
+ connect(pParent->frame(),SIGNAL(activeContextStateChanged()),this,SLOT(updateDisplay()));
+ connect(pParent->frame(),SIGNAL(activeConnectionAwayStateChanged()),this,SLOT(updateDisplay()));
+
+ updateDisplay();
+
+ if(!pixmap())
+ setPixmap(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_NOTAWAY)));
+}
+
+KviStatusBarAwayIndicator::~KviStatusBarAwayIndicator()
+{
+}
+
+void KviStatusBarAwayIndicator::updateDisplay()
+{
+ KviIrcContext * c = statusBar()->frame()->activeContext();
+
+ if(c && c->isConnected())
+ {
+ setPixmap(c->connection()->userInfo()->isAway() ?
+ *(g_pIconManager->getSmallIcon(KVI_SMALLICON_AWAY)) : *(g_pIconManager->getSmallIcon(KVI_SMALLICON_NOTAWAY)));
+ } else {
+ // FIXME: We'd like to appear disabled here... but then we
+ // no longer get mouse events :/
+ setPixmap(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_NOTAWAY)));
+ }
+}
+
+void KviStatusBarAwayIndicator::toggleContext()
+{
+ m_bAwayOnAllContexts = !m_bAwayOnAllContexts;
+}
+
+void KviStatusBarAwayIndicator::fillContextPopup(KviTalPopupMenu *p)
+{
+ int id = p->insertItem(__tr2qs("Apply to all IRC Contexts"),this,SLOT(toggleContext()));
+ p->setItemChecked(id,m_bAwayOnAllContexts);
+}
+
+void KviStatusBarAwayIndicator::loadState(const char * prefix,KviConfig *cfg)
+{
+ KviStr tmp(KviStr::Format,"%s_AwayOnAllContexts",prefix);
+ m_bAwayOnAllContexts = cfg->readBoolEntry(tmp.ptr(),false);
+}
+
+void KviStatusBarAwayIndicator::saveState(const char * prefix,KviConfig *cfg)
+{
+ KviStr tmp(KviStr::Format,"%s_AwayOnAllContexts",prefix);
+ cfg->writeEntry(tmp.ptr(),m_bAwayOnAllContexts);
+}
+
+KviStatusBarApplet * CreateStatusBarAwayIndicator(KviStatusBar * pBar,KviStatusBarAppletDescriptor *pDescriptor)
+{
+ return new KviStatusBarAwayIndicator(pBar,pDescriptor);
+}
+
+void KviStatusBarAwayIndicator::selfRegister(KviStatusBar * pBar)
+{
+ KviStatusBarAppletDescriptor * d = new KviStatusBarAppletDescriptor(
+ __tr2qs("Away Indicator"),"awayindicator",CreateStatusBarAwayIndicator,"",*(g_pIconManager->getSmallIcon(KVI_SMALLICON_AWAY)));
+ pBar->registerAppletDescriptor(d);
+}
+
+// FIXME: Away on all context should know where user is not away/back before toggling status
+void KviStatusBarAwayIndicator::mouseDoubleClickEvent(QMouseEvent * e)
+{
+ if(!(e->button() & Qt::LeftButton))return;
+ KviIrcConnection * c = statusBar()->frame()->activeConnection();
+ if(!c)return;
+ if(c->state() != KviIrcConnection::Connected)return;
+ QString command;
+ if(m_bAwayOnAllContexts)
+ command = "if($away)back -a; else away -a";
+ else
+ command = "if($away)back; else away";
+ KviKvsScript::run(command,c->console());
+}
+
+QString KviStatusBarAwayIndicator::tipText(const QPoint &)
+{
+ KviIrcConnection * c = statusBar()->frame()->activeConnection();
+ QString ret = "<center><b>";
+ if(!c)goto not_connected;
+ if(c->state() != KviIrcConnection::Connected)goto not_connected;
+ if(c->userInfo()->isAway())
+ {
+ QString tmp = KviTimeUtils::formatTimeInterval(kvi_unixTime() - c->userInfo()->awayTime(),KviTimeUtils::NoLeadingEmptyIntervals);
+ ret += __tr2qs("Away since");
+ ret += ' ';
+ ret += tmp;
+ ret += "</b><br>";
+ ret += __tr2qs("Double click to leave away mode");
+ } else {
+ ret += __tr2qs("Not away");
+ ret += "</b><br>";
+ ret += __tr2qs("Double click to enter away mode");
+ }
+ ret += "</center>";
+ return ret;
+
+not_connected:
+ ret += __tr2qs("Not connected");
+ ret += "</b></center>";
+ return ret;
+}
+
+
+KviStatusBarLagIndicator::KviStatusBarLagIndicator(KviStatusBar * pParent,KviStatusBarAppletDescriptor *pDescriptor)
+: KviStatusBarApplet(pParent,pDescriptor)
+{
+ connect(pParent->frame(),SIGNAL(activeContextChanged()),this,SLOT(updateDisplay()));
+ connect(pParent->frame(),SIGNAL(activeContextStateChanged()),this,SLOT(updateDisplay()));
+ connect(pParent->frame(),SIGNAL(activeConnectionLagChanged()),this,SLOT(updateDisplay()));
+
+ updateDisplay();
+
+ QFont f = font();
+ f.setFixedPitch(true);
+ f.setFamily("fixed");
+ setFont(f);
+
+ updateDisplay();
+}
+
+KviStatusBarLagIndicator::~KviStatusBarLagIndicator()
+{
+}
+
+void KviStatusBarLagIndicator::mouseDoubleClickEvent(QMouseEvent *e)
+{
+ if(!(e->button() & Qt::LeftButton))return;
+
+ KviIrcConnection * c = statusBar()->frame()->activeConnection();
+ if(!c)return;
+ if(c->state() != KviIrcConnection::Connected)return;
+ if(!c->lagMeter())
+ {
+ KVI_OPTION_BOOL(KviOption_boolUseLagMeterEngine) = true;
+ g_pApp->restartLagMeters();
+ }
+}
+
+
+QString KviStatusBarLagIndicator::tipText(const QPoint &)
+{
+ KviIrcConnection * c = statusBar()->frame()->activeConnection();
+ QString ret = "<center><b>";
+ if(!c)goto not_connected;
+ if(c->state() != KviIrcConnection::Connected)goto not_connected;
+ if(c->lagMeter())
+ {
+ int lll;
+ if((lll = c->lagMeter()->lag()) > 0)
+ {
+ int llls = lll / 1000;
+ int llld = (lll % 1000) / 100;
+ int lllc = (lll % 100) / 10;
+ KviQString::appendFormatted(ret,__tr2qs("Lag: %d.%d%d"),llls,llld,lllc);
+ ret += "</b><br>";
+ int vss = c->lagMeter()->secondsSinceLastCompleted();
+ int vmm = vss / 60;
+ vss = vss % 60;
+ KviQString::appendFormatted(ret,__tr2qs("Last checked %d mins %d secs ago"),vmm,vss);
+ } else {
+ ret += __tr2qs("Lag measure not available yet");
+ ret += "</b>";
+ }
+ } else {
+ ret += __tr2qs("Lag meter engine disabled");
+ ret += "</b><br>";
+ ret += __tr2qs("Double click to enable it");
+ }
+ ret += "</center>";
+ return ret;
+
+not_connected:
+ ret += __tr2qs("Not connected");
+ ret += "</b></center>";
+ return ret;
+}
+
+void KviStatusBarLagIndicator::updateDisplay()
+{
+ KviIrcContext * c = statusBar()->frame()->activeContext();
+ if(!c)return;
+ if(c->isConnected())
+ {
+ KviIrcConnection * ic = c->connection();
+ if(ic->lagMeter())
+ {
+ int lll;
+ if((lll = ic->lagMeter()->lag()) > 0)
+ {
+ int llls = lll / 1000;
+ int llld = (lll % 1000) / 100;
+ int lllc = (lll % 100) / 10;
+ QString tmp;
+ KviQString::sprintf(tmp,__tr2qs("Lag: %d.%d%d"),llls,llld,lllc);
+ if(lll > 60000)
+ {
+ // one minute lag!
+ // paint it in red
+ tmp.prepend("<nobr><font color=\"#e00000\">");
+ tmp.append("</font></nobr>");
+ }
+ setText(tmp);
+ return;
+ }
+ }
+ }
+ // no lag available
+ setText(__tr2qs("Lag: ?.??"));
+}
+
+KviStatusBarApplet * CreateStatusBarLagIndicator(KviStatusBar * pBar,KviStatusBarAppletDescriptor *pDescriptor)
+{
+ return new KviStatusBarLagIndicator(pBar,pDescriptor);
+}
+
+
+void KviStatusBarLagIndicator::selfRegister(KviStatusBar * pBar)
+{
+ KviStatusBarAppletDescriptor * d = new KviStatusBarAppletDescriptor(
+ __tr2qs("Lag Indicator"),"lagindicator",CreateStatusBarLagIndicator,"",*(g_pIconManager->getSmallIcon(KVI_SMALLICON_SERVERPING)));
+ pBar->registerAppletDescriptor(d);
+}
+
+
+
+KviStatusBarClock::KviStatusBarClock(KviStatusBar * pParent,KviStatusBarAppletDescriptor *pDescriptor)
+: KviStatusBarApplet(pParent,pDescriptor)
+{
+ m_bUtc = false;
+
+ startTimer(1000);
+
+ QFont f = font();
+ f.setFixedPitch(true);
+ f.setFamily("fixed");
+ setFont(f);
+}
+
+KviStatusBarClock::~KviStatusBarClock()
+{
+}
+
+void KviStatusBarClock::timerEvent(QTimerEvent *)
+{
+ kvi_time_t tt = kvi_unixTime();
+ struct tm * t = m_bUtc ? gmtime(&tt) : localtime(&tt);
+ QString tmp;
+ KviQString::sprintf(tmp,"%d%d:%d%d:%d%d",
+ t->tm_hour / 10,
+ t->tm_hour % 10,
+ t->tm_min / 10,
+ t->tm_min % 10,
+ t->tm_sec / 10,
+ t->tm_sec % 10);
+ setText(tmp);
+}
+
+void KviStatusBarClock::fillContextPopup(KviTalPopupMenu * p)
+{
+ int id = p->insertItem("UTC",this,SLOT(toggleUtc()));
+ p->setItemChecked(id,m_bUtc);
+}
+
+void KviStatusBarClock::toggleUtc()
+{
+ m_bUtc = !m_bUtc;
+ timerEvent(0);
+}
+
+void KviStatusBarClock::loadState(const char * prefix,KviConfig *cfg)
+{
+ KviStr tmp(KviStr::Format,"%s_Utc",prefix);
+ m_bUtc = cfg->readBoolEntry(tmp.ptr(),false);
+}
+
+void KviStatusBarClock::saveState(const char * prefix,KviConfig *cfg)
+{
+ KviStr tmp(KviStr::Format,"%s_Utc",prefix);
+ cfg->writeEntry(tmp.ptr(),m_bUtc);
+}
+
+KviStatusBarApplet * CreateStatusBarClock(KviStatusBar * pBar,KviStatusBarAppletDescriptor *pDescriptor)
+{
+ return new KviStatusBarClock(pBar,pDescriptor);
+}
+
+void KviStatusBarClock::selfRegister(KviStatusBar * pBar)
+{
+ KviStatusBarAppletDescriptor * d = new KviStatusBarAppletDescriptor(
+ __tr2qs("Simple Clock"),"clock",CreateStatusBarClock,"",*(g_pIconManager->getSmallIcon(KVI_SMALLICON_TIME)));
+ pBar->registerAppletDescriptor(d);
+}
+
+
+KviStatusBarConnectionTimer::KviStatusBarConnectionTimer(KviStatusBar * pParent,KviStatusBarAppletDescriptor *pDescriptor)
+: KviStatusBarApplet(pParent,pDescriptor)
+{
+ startTimer(1000);
+ m_bTotal=0;
+}
+
+KviStatusBarConnectionTimer::~KviStatusBarConnectionTimer()
+{
+}
+//g_pApp->topmostConnectedConsole()
+void KviStatusBarConnectionTimer::timerEvent(QTimerEvent * e)
+{
+ if(m_bTotal)
+ {
+ setText(KviTimeUtils::formatTimeInterval(KVI_OPTION_UINT(KviOption_uintTotalConnectionTime)));
+ } else {
+ if(g_pActiveWindow)
+ {
+ KviIrcContext * c = g_pActiveWindow->context();
+ if(c)
+ {
+ if(c->isConnected())
+ {
+ KviIrcConnection * cnn = c->connection();
+ if(cnn)
+ {
+ setText(KviTimeUtils::formatTimeInterval(kvi_unixTime() - cnn->statistics()->connectionStartTime()));
+ return;
+ }
+ }
+ }
+ }
+
+ setText(KviTimeUtils::formatTimeInterval(0,KviTimeUtils::FillWithHypens));
+ }
+ return;
+}
+
+void KviStatusBarConnectionTimer::toggleTotal()
+{
+ m_bTotal = !m_bTotal;
+}
+
+void KviStatusBarConnectionTimer::fillContextPopup(KviTalPopupMenu *p)
+{
+ int id = p->insertItem(__tr2qs("Show total connection time"),this,SLOT(toggleTotal()));
+ p->setItemChecked(id,m_bTotal);
+}
+
+void KviStatusBarConnectionTimer::loadState(const char * prefix,KviConfig *cfg)
+{
+ KviStr tmp(KviStr::Format,"%s_Total",prefix);
+ m_bTotal = cfg->readBoolEntry(tmp.ptr(),false);
+}
+
+void KviStatusBarConnectionTimer::saveState(const char * prefix,KviConfig *cfg)
+{
+ KviStr tmp(KviStr::Format,"%s_Total",prefix);
+ cfg->writeEntry(tmp.ptr(),m_bTotal);
+}
+
+KviStatusBarApplet * CreateStatusBarConnectionTimer(KviStatusBar * pBar,KviStatusBarAppletDescriptor *pDescriptor)
+{
+ return new KviStatusBarConnectionTimer(pBar,pDescriptor);
+}
+
+void KviStatusBarConnectionTimer::selfRegister(KviStatusBar * pBar)
+{
+ KviStatusBarAppletDescriptor * d = new KviStatusBarAppletDescriptor(
+ __tr2qs("Connection Timer"),"connectiontimer",CreateStatusBarConnectionTimer,"",*(g_pIconManager->getSmallIcon(KVI_SMALLICON_TIME)));
+ pBar->registerAppletDescriptor(d);
+}
+
+
+
+KviStatusBarSeparator::KviStatusBarSeparator(KviStatusBar * pParent,KviStatusBarAppletDescriptor *pDescriptor)
+: KviStatusBarApplet(pParent,pDescriptor)
+{
+ setFrameStyle(QFrame::VLine | QFrame::Sunken);
+}
+
+KviStatusBarSeparator::~KviStatusBarSeparator()
+{
+}
+
+KviStatusBarApplet * CreateStatusBarSeparator(KviStatusBar * pBar,KviStatusBarAppletDescriptor *pDescriptor)
+{
+ return new KviStatusBarSeparator(pBar,pDescriptor);
+}
+
+void KviStatusBarSeparator::selfRegister(KviStatusBar * pBar)
+{
+ KviStatusBarAppletDescriptor * d = new KviStatusBarAppletDescriptor(
+ __tr2qs("Separator"),"separator",CreateStatusBarSeparator);
+ pBar->registerAppletDescriptor(d);
+}
+