/*************************************************************************** copyright : (C) 2005-2007 by Robby Stephenson email : robby@periapsis.org ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of version 2 of the GNU General Public License as * * published by the Free Software Foundation; * * * ***************************************************************************/ #include "detailedentryitem.h" #include "detailedlistview.h" #include "collection.h" #include "entry.h" #include "tellico_utils.h" #include "latin1literal.h" #include #include #include #include #include #include namespace { static const short ENTRY_MAX_MINUTES_MESSAGE = 5; } using Tellico::DetailedEntryItem; DetailedEntryItem::DetailedEntryItem(DetailedListView* parent_, Data::EntryPtr entry_) : EntryItem(parent_, entry_), m_state(Normal), m_time(0), m_timer(0) { } DetailedEntryItem::~DetailedEntryItem() { delete m_time; m_time = 0; delete m_timer; m_timer = 0; } void DetailedEntryItem::setState(State state_) { if(m_state == state_) { return; } m_state = state_; if(m_state == Normal) { delete m_time; m_time = 0; delete m_timer; m_timer = 0; } else { if(!m_time) { m_time = new TQTime; } m_time->start(); if(!m_timer) { m_timer = new TQTimer(); m_timer->connect(m_timer, TQ_SIGNAL(timeout()), listView(), TQ_SLOT(triggerUpdate())); } m_timer->start(30 * 1000); // every 30 seconds } // have to put this in a timer, or it doesn't update properly TQTimer::singleShot(500, listView(), TQ_SLOT(triggerUpdate())); } void DetailedEntryItem::paintCell(TQPainter* p_, const TQColorGroup& cg_, int column_, int width_, int align_) { if(m_state == Normal) { EntryItem::paintCell(p_, cg_, column_, width_, align_); return; } int t = m_time->elapsed()/(60 * 1000); if(t > ENTRY_MAX_MINUTES_MESSAGE) { setState(Normal); t = 0; } TQFont f = p_->font(); f.setBold(true); if(m_state == New) { f.setItalic(true); } p_->setFont(f); // taken from ListViewItem, but without line drawn to right of cell TQColorGroup cg = cg_; const TQPixmap* pm = listView()->viewport()->backgroundPixmap(); if(pm && !pm->isNull()) { cg.setBrush(TQColorGroup::Base, TQBrush(backgroundColor(column_), *pm)); TQPoint o = p_->brushOrigin(); p_->setBrushOrigin(o.x()-listView()->contentsX(), o.y()-listView()->contentsY()); } else { cg.setColor(listView()->viewport()->backgroundMode() == TQt::FixedColor ? TQColorGroup::Background : TQColorGroup::Base, backgroundColor(column_)); } // don't call TDEListViewItem::paintCell() since that also does alternate painting, etc... TQListViewItem::paintCell(p_, cg, column_, width_, align_); } TQColor DetailedEntryItem::backgroundColor(int column_) { GUI::ListView* lv = listView(); if(!lv || m_state == Normal || isSelected()) { return EntryItem::backgroundColor(column_); } int t = m_time->elapsed()/(60 * 1000); if(t > ENTRY_MAX_MINUTES_MESSAGE) { return EntryItem::backgroundColor(column_); } return blendColors(lv->colorGroup().highlight(), lv->colorGroup().base(), 80 + 20*t/ENTRY_MAX_MINUTES_MESSAGE /* percent */); // no more than 20% of highlight color } void DetailedEntryItem::paintFocus(TQPainter*, const TQColorGroup&, const TQRect&) { // don't paint anything }