diff options
Diffstat (limited to 'kdeprint/management/kmiconview.cpp')
-rw-r--r-- | kdeprint/management/kmiconview.cpp | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/kdeprint/management/kmiconview.cpp b/kdeprint/management/kmiconview.cpp new file mode 100644 index 000000000..cabd4496a --- /dev/null +++ b/kdeprint/management/kmiconview.cpp @@ -0,0 +1,237 @@ +/* + * This file is part of the KDE libraries + * Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + **/ + +#include "kmiconview.h" +#include "kmprinter.h" + +#include <qpainter.h> +#include <kiconloader.h> +#include <kdebug.h> + +KMIconViewItem::KMIconViewItem(QIconView *parent, KMPrinter *p) +: QIconViewItem(parent) +{ + m_state = 0; + m_mode = parent->itemTextPos(); + m_pixmap = QString::null; + m_isclass = false; + updatePrinter(p, m_mode); +} + +void KMIconViewItem::paintItem(QPainter *p, const QColorGroup& cg) +{ + if (m_state != 0) + { + QFont f(p->font()); + if (m_state & 0x1) f.setBold(true); + if (m_state & 0x2) f.setItalic(true); + p->setFont(f); + } + QIconViewItem::paintItem(p,cg); +} + +void KMIconViewItem::calcRect(const QString&) +{ + QRect ir(rect()), pr, tr; + + // pixmap rect + pr.setWidth(pixmap()->width()); + pr.setHeight(pixmap()->height()); + + // text rect + QFont f(iconView()->font()); + if (m_state & 0x1) f.setBold(true); + if (m_state & 0x2) f.setItalic(true); + QFontMetrics fm(f); + if (m_mode == QIconView::Bottom) + tr = fm.boundingRect(0, 0, iconView()->maxItemWidth(), 0xFFFFFF, AlignHCenter|AlignTop|WordBreak|BreakAnywhere, text()+"X"); + else + tr = fm.boundingRect(0, 0, 0xFFFFFF, 0xFFFFFF, AlignLeft|AlignTop, text()+"X"); + + // item rect + if (m_mode == QIconView::Bottom) + { + ir.setHeight(pr.height() + tr.height() + 15); + ir.setWidth(QMAX(pr.width(), tr.width()) + 10); + pr = QRect((ir.width()-pr.width())/2, 5, pr.width(), pr.height()); + tr = QRect((ir.width()-tr.width())/2, 10+pr.height(), tr.width(), tr.height()); + } + else + { + ir.setHeight(QMAX(pr.height(), tr.height()) + 4); + ir.setWidth(pr.width() + tr.width() + 6); + pr = QRect(2, (ir.height()-pr.height())/2, pr.width(), pr.height()); + tr = QRect(4+pr.width(), (ir.height()-tr.height())/2, tr.width(), tr.height()); + } + + // set rects + setItemRect(ir); + setTextRect(tr); + setPixmapRect(pr); +} + +void KMIconViewItem::updatePrinter(KMPrinter *p, int mode) +{ + bool update(false); + int oldstate = m_state; + if (p) + { + m_state = ((p->isHardDefault() ? 0x1 : 0x0) | (p->ownSoftDefault() ? 0x2 : 0x0) | (p->isValid() ? 0x4 : 0x0)); + update = (oldstate != m_state); + if (p->name() != text() || update) + { + setText(QString::null); + setText(p->name()); + } + setKey(QString::fromLatin1("%1_%2").arg((p->isSpecial() ? "special" : (p->isClass(false) ? "class" : "printer"))).arg(p->name())); + m_isclass = p->isClass(false); + } + if (mode != m_mode || ((oldstate&0x4) != (m_state&0x4)) || (p && p->pixmap() != m_pixmap)) + { + int iconstate = (m_state&0x4 ? (int)KIcon::DefaultState : (int)KIcon::LockOverlay); + if (p) + m_pixmap = p->pixmap(); + m_mode = mode; + if (m_mode == QIconView::Bottom) + setPixmap(DesktopIcon(m_pixmap, 0, iconstate)); + else + setPixmap(SmallIcon(m_pixmap, 0, iconstate)); + } + //if (update) + // repaint(); + setDiscarded(false); +} + +KMIconView::KMIconView(QWidget *parent, const char *name) +: KIconView(parent,name) +{ + setMode(KIconView::Select); + setSelectionMode(QIconView::Single); + setItemsMovable(false); + setResizeMode(QIconView::Adjust); + + m_items.setAutoDelete(false); + setViewMode(KMIconView::Big); + + connect(this,SIGNAL(contextMenuRequested(QIconViewItem*,const QPoint&)),SLOT(slotRightButtonClicked(QIconViewItem*,const QPoint&))); + connect(this,SIGNAL(selectionChanged()),SLOT(slotSelectionChanged())); +} + +KMIconView::~KMIconView() +{ +} + +KMIconViewItem* KMIconView::findItem(KMPrinter *p) +{ + if (p) + { + QPtrListIterator<KMIconViewItem> it(m_items); + for (;it.current();++it) + if (it.current()->text() == p->name() + && it.current()->isClass() == p->isClass()) + return it.current(); + } + return 0; +} + +void KMIconView::setPrinterList(QPtrList<KMPrinter> *list) +{ + bool changed(false); + + QPtrListIterator<KMIconViewItem> it(m_items); + for (;it.current();++it) + it.current()->setDiscarded(true); + + if (list) + { + QPtrListIterator<KMPrinter> it(*list); + KMIconViewItem *item(0); + for (;it.current();++it) + { + // only keep real printers (no instances) + if (!it.current()->instanceName().isEmpty()) + continue; + item = findItem(it.current()); + if (!item) + { + item = new KMIconViewItem(this,it.current()); + m_items.append(item); + changed = true; + } + else + item->updatePrinter(it.current(), itemTextPos()); + } + } + + for (uint i=0; i<m_items.count(); i++) + if (m_items.at(i)->isDiscarded()) + { + delete m_items.take(i); + i--; + changed = true; + } + + if (changed) sort(); + emit selectionChanged(); +} + +void KMIconView::setViewMode(ViewMode m) +{ + m_mode = m; + bool big = (m == KMIconView::Big); + int mode = (big ? QIconView::Bottom : QIconView::Right); + + QPtrListIterator<KMIconViewItem> it(m_items); + for (;it.current();++it) + it.current()->updatePrinter(0, mode); + + setArrangement((big ? QIconView::LeftToRight : QIconView::TopToBottom)); + setItemTextPos((QIconView::ItemTextPos)mode); + //setGridX((big ? 60 : -1)); + setWordWrapIconText(true); +} + +void KMIconView::slotRightButtonClicked(QIconViewItem *item, const QPoint& p) +{ + emit rightButtonClicked(item ? item->text() : QString::null, p); +} + +void KMIconView::slotSelectionChanged() +{ + KMIconViewItem *item = static_cast<KMIconViewItem*>(currentItem()); + emit printerSelected((item && !item->isDiscarded() && item->isSelected() ? item->text() : QString::null)); +} + +void KMIconView::setPrinter(const QString& prname) +{ + QPtrListIterator<KMIconViewItem> it(m_items); + for (; it.current(); ++it) + if (it.current()->text() == prname) + { + setSelected(it.current(), true); + break; + } +} + +void KMIconView::setPrinter(KMPrinter *p) +{ + setPrinter(p ? p->name() : QString::null); +} + +#include "kmiconview.moc" |