You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kipi-plugins/kipi-plugins/kameraklient/thumbitem.cpp

384 lines
9.7 KiB

/* ============================================================
* Copyright 2004 by Tudor Calin <tudor@1xtech.com>
* 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, 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.
*
* ============================================================ */
// TQt
#include <tqpixmap.h>
#include <tqfont.h>
#include <tqfontmetrics.h>
#include <tqpalette.h>
#include <tqpainter.h>
#include <tqevent.h>
#include <tqtextedit.h>
// Local
#include "thumbview.h"
#include "thumbitem.h"
namespace KIPIKameraKlientPlugin
{
class ThumbItemLineEdit : public TQTextEdit {
public:
ThumbItemLineEdit(const TQString& text, TQWidget* parent, ThumbItem* item);
private:
void keyPressEvent(TQKeyEvent *e);
void focusOutEvent(TQFocusEvent *e);
ThumbItem *thumbItem;
TQString startText;
};
ThumbItemLineEdit::ThumbItemLineEdit(const TQString& text, TQWidget* parent, ThumbItem* item)
: TQTextEdit(parent), thumbItem(item), startText(text) {
setFrameStyle(TQFrame::Plain | TQFrame::Box);
setLineWidth(1);
setHScrollBarMode( AlwaysOff );
setVScrollBarMode( AlwaysOff );
setWordWrap( WidgetWidth );
setWrapColumnOrWidth(item->pixmapRect().width());
resize(200, 200);
setText(text);
setAlignment(TQt::AlignCenter);
resize(wrapColumnOrWidth() + 2, heightForWidth(wrapColumnOrWidth()) + 2);
}
void ThumbItemLineEdit::keyPressEvent( TQKeyEvent *e ) {
if ( e->key() == Key_Escape) {
thumbItem->setText(startText);
thumbItem->cancelRenameItem();
} else if ( e->key() == Key_Enter || e->key() == Key_Return ) {
thumbItem->renameItem();
} else {
TQTextEdit::keyPressEvent( e );
sync();
}
}
void ThumbItemLineEdit::focusOutEvent( TQFocusEvent *e ) {
if (e->reason() != TQFocusEvent::Popup ) {
thumbItem->cancelRenameItem();
}
}
class ThumbItemPrivate {
public:
TQString text;
TQPixmap* pixmap;
TQRect rect;
TQRect textRect;
TQRect pixmapRect;
bool selected;
TQString key;
};
ThumbItem::ThumbItem(ThumbView* parent, const TQString& text, const TQPixmap& pixmap) {
view = parent;
next = 0;
prev = 0;
renameBox = 0;
d = new ThumbItemPrivate;
d->text = text;
d->pixmap = new TQPixmap(pixmap);
d->selected = false;
d->key = d->text;
// make sure to calcrect before inserting; this will calculate the size of the rect; inserting would move it to the required location
d->rect = TQRect(0, 0, 0, 0);
d->textRect = TQRect(0, 0, 0, 0);
d->pixmapRect = TQRect(0, 0, 0, 0);
calcRect();
view->insertItem(this);
}
ThumbItem::~ThumbItem() {
view->takeItem(this);
delete d->pixmap;
delete d;
}
void ThumbItem::calcRect() {
TQRect rect(d->rect);
TQRect textRect(d->textRect);
TQRect pixmapRect(d->pixmapRect);
// set initial pixrect
int pw = d->pixmap->width();
int ph = d->pixmap->height();
pixmapRect.setWidth(pw);
pixmapRect.setHeight(ph);
// word wrap
TQFontMetrics fm(view->font());
TQRect r = TQRect(fm.boundingRect(0, 0, pixmapRect.width(),
0xFFFFFFFF, TQt::AlignHCenter |
TQt::WordBreak | TQt::BreakAnywhere,
d->text));
r.setWidth(r.width() + 4);
textRect.setWidth(r.width());
textRect.setHeight(r.height());
// Now start updating the rects
int w = TQMAX(textRect.width(), pixmapRect.width());
int h = textRect.height() + pixmapRect.height() + 1;
rect.setWidth(w);
rect.setHeight(h);
// Center the pix and text rect
pixmapRect = TQRect((rect.width() - pixmapRect.width())/2,
0,
pixmapRect.width(), pixmapRect.height());
textRect = TQRect((rect.width() - textRect.width())/2,
rect.height() - textRect.height(),
textRect.width(), textRect.height());
// Finally save the settings
setRect(rect);
setPixmapRect(pixmapRect);
setTextRect(textRect);
}
void ThumbItem::paintItem(TQPainter *, const TQColorGroup& cg) {
TQRect pRect=pixmapRect(true);
TQRect tRect=textRect(true);
TQPixmap pix(rect().width(), rect().height());
pix.fill(cg.base());
TQPainter painter(&pix);
painter.drawPixmap(pRect.x(), pRect.y(), *pixmap() );
if (isSelected()) {
TQPen pen;
pen.setColor(cg.highlight());
painter.setPen(pen);
painter.drawRect(0, 0, pix.width(), pix.height());
painter.fillRect(0, tRect.y(), pix.width(),
tRect.height(), cg.highlight() );
painter.setPen( TQPen( cg.highlightedText() ) );
} else {
painter.setPen( cg.text() );
}
painter.drawText(tRect, TQt::WordBreak|TQt::BreakAnywhere|TQt::AlignHCenter|TQt::AlignTop,text());
painter.end();
TQRect r(rect());
r = TQRect(view->contentsToViewport(TQPoint(r.x(), r.y())), TQSize(r.width(), r.height()));
bitBlt(view->viewport(), r.x(), r.y(), &pix, 0, 0, r.width(), r.height());
}
void ThumbItem::repaint() {
TQRect r(view->contentsRectToViewport(d->rect));
view->viewport()->repaint(r);
}
TQRect ThumbItem::rect() {
return d->rect;
}
TQRect ThumbItem::textRect(bool relative) {
if (relative) {
return d->textRect;
} else {
TQRect r(x() + d->textRect.x(), y() + d->textRect.y(), d->textRect.width(), d->textRect.height());
return r;
}
}
TQRect ThumbItem::pixmapRect(bool relative) {
if (relative) {
return d->pixmapRect;
} else {
TQRect r(x() + d->pixmapRect.x(), y() + d->pixmapRect.y(), d->pixmapRect.width(), d->pixmapRect.height());
return r;
}
}
void ThumbItem::setRect(const TQRect& rect) {
if (rect.isValid()) {
d->rect = rect;
}
}
void ThumbItem::setTextRect(const TQRect& rect)
{
if (rect.isValid()) {
d->textRect = rect;
}
}
void ThumbItem::setPixmapRect(const TQRect& rect) {
if (rect.isValid()) {
d->pixmapRect = rect;
}
}
TQPixmap * ThumbItem::pixmap() const {
return d->pixmap;
}
TQString ThumbItem::text() const {
return d->text;
}
int ThumbItem::x() const {
return d->rect.x();
}
int ThumbItem::y() const {
return d->rect.y();
}
int ThumbItem::width() const {
return d->rect.width();
}
int ThumbItem::height() const {
return d->rect.height();
}
bool ThumbItem::move(int x, int y) {
if (x == this->x() && y == this->y()) {
return false;
}
d->rect.setRect(x, y, d->rect.width(), d->rect.height());
return true;
}
void ThumbItem::setSelected(bool val, bool cb) {
if (cb) {
view->blockSignals(true);
view->clearSelection();
view->blockSignals(false);
}
d->selected = val;
view->selectItem(this, val);
TQRect r(d->rect);
r = TQRect(view->contentsToViewport(TQPoint(r.x(), r.y())), TQSize(r.width(), r.height()));
view->viewport()->update(r);
}
bool ThumbItem::isSelected() {
return d->selected;
}
void ThumbItem::setPixmap(const TQPixmap& pixmap) {
if (d->pixmap) {
delete d->pixmap;
d->pixmap = 0;
}
d->pixmap = new TQPixmap(pixmap);
TQRect oR(d->rect);
calcRect();
oR = oR.unite(d->rect);
oR = TQRect(view->contentsToViewport(TQPoint(oR.x(), oR.y())), TQSize(oR.width(), oR.height()));
view->updateItemContainer(this);
if(oR.intersects(TQRect(view->contentsX(), view->contentsY(), view->visibleWidth(), view->visibleHeight()))) {
view->viewport()->repaint(oR);
}
}
void ThumbItem::setText(const TQString& text) {
d->text = text;
d->key = text;
TQRect oR(d->rect);
calcRect();
oR = oR.unite(d->rect);
oR = TQRect(view->contentsToViewport(TQPoint(oR.x(), oR.y())),
TQSize(oR.width(), oR.height()));
view->updateItemContainer(this);
if(oR.intersects(TQRect(view->contentsX(), view->contentsY(), view->visibleWidth(), view->visibleHeight()))) {
view->viewport()->repaint(oR);
}
}
ThumbItem * ThumbItem::nextItem() {
return next;
}
ThumbItem * ThumbItem::prevItem() {
return prev;
}
ThumbView* ThumbItem::iconView() {
return view;
}
void ThumbItem::rename() {
if (renameBox) {
delete renameBox;
renameBox = 0;
}
renameBox = new ThumbItemLineEdit(d->text, view->viewport(), this);
TQRect tr(textRect(false));
view->addChild(renameBox, tr.x() + (tr.width()/2 - renameBox->width()/2 ), tr.y() - 3);
renameBox->selectAll();
view->viewport()->setFocusProxy(renameBox);
renameBox->setFocus();
renameBox->show();
view->renamingItem = this;
}
void ThumbItem::renameItem() {
if (!renameBox) {
return;
}
setText(renameBox->text());
bool resetFocus = view->viewport()->focusProxy() == renameBox;
delete renameBox;
renameBox = 0;
if (resetFocus) {
view->viewport()->setFocusProxy(view);
view->setFocus();
}
view->renamingItem = 0;
view->emitRenamed(this);
}
void ThumbItem::cancelRenameItem() {
repaint();
bool resetFocus = view->viewport()->focusProxy() == renameBox;
delete renameBox;
renameBox = 0;
if (resetFocus) {
view->viewport()->setFocusProxy(view);
view->setFocus();
}
view->renamingItem = 0;
}
int ThumbItem::compare(ThumbItem *item) {
return key().localeAwareCompare(item->key());
}
TQString ThumbItem::key() const {
return d->key;
}
} // NameSpace KIPIKameraKlientPlugin