/* This file is part of Akregator. Copyright (C) 2004 Stanislav Karchebny 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 option) 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. As a special exception, permission is given to link this program with any edition of TQt, and distribute the resulting executable, without including the source code for TQt in the source distribution. */ #include "akregatorconfig.h" #include "trayicon.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Akregator { TrayIcon* TrayIcon::m_instance = 0; TrayIcon* TrayIcon::getInstance() { return m_instance; } void TrayIcon::setInstance(TrayIcon* trayIcon) { m_instance = trayIcon; } TrayIcon::TrayIcon(TQWidget *parent, const char *name) : KSystemTray(parent, name), m_unread(0) { m_defaultIcon=KSystemTray::loadIcon("akregator"); TQPixmap m_unreadIcon=KSystemTray::loadIcon("akregator_empty"); m_lightIconImage=m_unreadIcon.convertToImage(); TDEIconEffect::deSaturate(m_lightIconImage, 0.60); setPixmap(m_defaultIcon); TQToolTip::add(this, i18n("Akregator - RSS Feed Reader")); } TrayIcon::~TrayIcon() {} void TrayIcon::mousePressEvent(TQMouseEvent *e) { if (e->button() == TQt::LeftButton) { emit showPart(); } KSystemTray::mousePressEvent(e); } TQPixmap TrayIcon::takeScreenshot() const { TQPoint g = mapToGlobal(pos()); int desktopWidth = kapp->desktop()->width(); int desktopHeight = kapp->desktop()->height(); int tw = width(); int th = height(); int w = desktopWidth / 4; int h = desktopHeight / 9; int x = g.x() + tw/2 - w/2; // Center the rectange in the systray icon int y = g.y() + th/2 - h/2; if (x < 0) x = 0; // Move the rectangle to stay in the desktop limits if (y < 0) y = 0; if (x + w > desktopWidth) x = desktopWidth - w; if (y + h > desktopHeight) y = desktopHeight - h; // Grab the desktop and draw a circle arround the icon: TQPixmap shot = TQPixmap::grabWindow(tqt_xrootwin(), x, y, w, h); TQPainter painter(&shot); const int MARGINS = 6; const int WIDTH = 3; int ax = g.x() - x - MARGINS -1; int ay = g.y() - y - MARGINS -1; painter.setPen( TQPen(TQt::red/*TDEApplication::palette().active().highlight()*/, WIDTH) ); painter.drawArc(ax, ay, tw + 2*MARGINS, th + 2*MARGINS, 0, 16*360); painter.end(); // Paint the border const int BORDER = 1; TQPixmap finalShot(w + 2*BORDER, h + 2*BORDER); finalShot.fill(TDEApplication::palette().active().foreground()); painter.begin(&finalShot); painter.drawPixmap(BORDER, BORDER, shot); painter.end(); return shot; // not finalShot?? -fo } void TrayIcon::resizeEvent(TQResizeEvent *) { setUnread(m_unread, true); } void TrayIcon::slotSetUnread(int unread) { setUnread(unread, false); } void TrayIcon::setUnread(int unread, bool force) { if ((unread==m_unread) && (!force)) { return; } m_unread=unread; TQToolTip::remove(this); TQToolTip::add(this, i18n("Akregator - 1 unread article", "Akregator - %n unread articles", unread > 0 ? unread : 0)); if (unread <= 0) { setPixmap(m_defaultIcon); } else { // from KMSystemTray int oldW = pixmap()->size().width(); int oldH = pixmap()->size().height(); TQString uStr=TQString::number( unread ); TQFont f=TDEGlobalSettings::generalFont(); f.setBold(true); // increase the size of the font for the number of unread messages if the // icon size is less than 22 pixels // see bug 1251 int realIconHeight = height(); if (realIconHeight < 22) { f.setPointSizeFloat( f.pointSizeFloat() * 2.0 ); } // decrease the size of the font for the number of unread articles if the // number doesn't fit into the available space float pointSize=f.pointSizeFloat(); TQFontMetrics fm(f); int w=fm.width(uStr); if( w > (oldW) ) { pointSize *= float(oldW) / float(w); f.setPointSizeFloat(pointSize); } TQPixmap pix(oldW, oldH); pix.fill(TQt::white); TQPainter p(&pix); p.setFont(f); p.setPen(Settings::unreadTextColor()); p.drawText(pix.rect(), TQt::AlignCenter, uStr); pix.setMask(pix.createHeuristicMask()); TQImage img=pix.convertToImage(); // overlay TQImage overlayImg=m_lightIconImage.copy(); TDEIconEffect::overlay(overlayImg, img); TQPixmap icon; icon.convertFromImage(overlayImg); setPixmap(icon); } } void TrayIcon::viewButtonClicked() { TQWidget *p=TQT_TQWIDGET(parent()); KWin::forceActiveWindow(p->winId()); } void TrayIcon::settingsChanged() { if ( Settings::showTrayIcon() ) { show(); setUnread(m_unread, true); } else { hide(); } } } #include "trayicon.moc"