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.
tdeedu/kstars/kstars/thumbnaileditor.cpp

213 lines
8.2 KiB

/***************************************************************************
thumbnaileditor.cpp - description
-------------------
begin : Thu Mar 2 2005
copyright : (C) 2005 by Jason Harris
email : kstars@30doradus.org
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include <tqframe.h>
#include <tqimage.h>
#include <tqlayout.h>
#include <tqpainter.h>
#include <tqpoint.h>
#include <tdelocale.h>
#include <kdebug.h>
#include <kpushbutton.h>
#include "thumbnaileditor.h"
#include "thumbnaileditorui.h"
#include "thumbnailpicker.h"
ThumbnailEditor::ThumbnailEditor( TQWidget *parent, const char *name )
: KDialogBase( KDialogBase::Plain, i18n( "Edit Thumbnail Image" ), Ok|Cancel, Ok, parent, name )
{
tp = (ThumbnailPicker*)parent;
TQFrame *page = plainPage();
TQHBoxLayout *hlay = new TQHBoxLayout( page, 0, 0 );
ui = new ThumbnailEditorUI( page );
hlay->addWidget( ui );
ui->ImageCanvas->setCropRect( tp->imageRect()->x(), tp->imageRect()->y(),
tp->imageRect()->width(), tp->imageRect()->height() );
ui->ImageCanvas->setImage( tp->currentListImage() );
connect( ui->ImageCanvas, TQT_SIGNAL(cropRegionModified()), TQT_SLOT( slotUpdateCropLabel() ) );
slotUpdateCropLabel();
update();
}
ThumbnailEditor::~ThumbnailEditor()
{}
TQPixmap ThumbnailEditor::thumbnail() {
TQImage im = ui->ImageCanvas->croppedImage().convertToImage();
im = im.smoothScale( 200, 200 );
TQPixmap pm;
pm.convertFromImage( im );
return pm;
}
void ThumbnailEditor::slotUpdateCropLabel() {
TQRect *r = ui->ImageCanvas->cropRect();
ui->CropLabel->setText( i18n( "Crop region: [%1,%2 %3x%4]" )
.arg( r->left() ).arg( r->top() ).arg( r->width() ).arg( r->height() ) );
}
TQPixmap ThumbImage::croppedImage() {
TQPixmap result( CropRect->width(), CropRect->height() );
bitBlt( &result, 0, 0, Image,
CropRect->left(), CropRect->top(),
CropRect->width(), CropRect->height() );
return result;
}
ThumbImage::ThumbImage( TQWidget *parent, const char *name ) : TQLabel( parent, name )
{
setBackgroundMode( TQWidget::NoBackground );
bMouseButtonDown = false;
bTopLeftGrab = false;
bTopRightGrab = false;
bBottomLeftGrab = false;
bBottomRightGrab = false;
HandleSize = 10;
CropRect = new TQRect();
Anchor = new TQPoint();
Image = new TQPixmap();
}
ThumbImage::~ThumbImage()
{}
void ThumbImage::paintEvent( TQPaintEvent* ) {
TQPixmap c( *Image );
TQPainter p;
p.begin( &c );
p.setPen( TQPen( TQColor( "Grey" ), 2 ) );
p.drawRect( *CropRect );
p.setPen( TQPen( TQColor( "Grey" ), 0 ) );
p.drawRect( TQRect( CropRect->left(), CropRect->top(),
HandleSize, HandleSize ) );
p.drawRect( TQRect( CropRect->right() - HandleSize, CropRect->top(),
HandleSize, HandleSize ) );
p.drawRect( TQRect( CropRect->left(), CropRect->bottom() - HandleSize,
HandleSize, HandleSize ) );
p.drawRect( TQRect( CropRect->right() - HandleSize, CropRect->bottom() - HandleSize,
HandleSize, HandleSize ) );
if ( CropRect->x() > 0 )
p.fillRect( 0, 0, CropRect->x(), c.height(),
TQBrush( TQColor("white"), Dense3Pattern ) );
if ( CropRect->right() < c.width() )
p.fillRect( CropRect->right(), 0, (c.width() - CropRect->right()), c.height(),
TQBrush( TQColor("white"), Dense3Pattern ) );
if ( CropRect->y() > 0 )
p.fillRect( 0, 0, c.width(), CropRect->y(),
TQBrush( TQColor("white"), Dense3Pattern ) );
if ( CropRect->bottom() < c.height() )
p.fillRect( 0, CropRect->bottom(), c.width(), (c.height() - CropRect->bottom()),
TQBrush( TQColor("white"), Dense3Pattern ) );
p.end();
bitBlt( this, 0, 0, &c );
}
void ThumbImage::mousePressEvent( TQMouseEvent *e ) {
if ( e->button() == Qt::LeftButton && CropRect->contains( e->pos() ) ) {
bMouseButtonDown = true;
//The Anchor tells how far from the CropRect corner we clicked
Anchor->setX( e->x() - CropRect->left() );
Anchor->setY( e->y() - CropRect->top() );
if ( e->x() <= CropRect->left() + HandleSize && e->y() <= CropRect->top() + HandleSize ) {
bTopLeftGrab = true;
}
if ( e->x() <= CropRect->left() + HandleSize && e->y() >= CropRect->bottom() - HandleSize ) {
bBottomLeftGrab = true;
Anchor->setY( e->y() - CropRect->bottom() );
}
if ( e->x() >= CropRect->right() - HandleSize && e->y() <= CropRect->top() + HandleSize ) {
bTopRightGrab = true;
Anchor->setX( e->x() - CropRect->right() );
}
if ( e->x() >= CropRect->right() - HandleSize && e->y() >= CropRect->bottom() - HandleSize ) {
bBottomRightGrab = true;
Anchor->setX( e->x() - CropRect->right() );
Anchor->setY( e->y() - CropRect->bottom() );
}
}
}
void ThumbImage::mouseReleaseEvent( TQMouseEvent *e ) {
if ( bMouseButtonDown ) bMouseButtonDown = false;
if ( bTopLeftGrab ) bTopLeftGrab = false;
if ( bTopRightGrab ) bTopRightGrab = false;
if ( bBottomLeftGrab ) bBottomLeftGrab = false;
if ( bBottomRightGrab ) bBottomRightGrab = false;
}
void ThumbImage::mouseMoveEvent( TQMouseEvent *e ) {
if ( bMouseButtonDown ) {
//If a corner was grabbed, we are resizing the box
if ( bTopLeftGrab ) {
if ( e->x() >= 0 && e->x() <= width() ) CropRect->setLeft( e->x() - Anchor->x() );
if ( e->y() >= 0 && e->y() <= height() ) CropRect->setTop( e->y() - Anchor->y() );
if ( CropRect->left() < 0 ) CropRect->setLeft( 0 );
if ( CropRect->top() < 0 ) CropRect->setTop( 0 );
if ( CropRect->width() < 200 ) CropRect->setLeft( CropRect->left() - 200 + CropRect->width() );
if ( CropRect->height() < 200 ) CropRect->setTop( CropRect->top() - 200 + CropRect->height() );
} else if ( bTopRightGrab ) {
if ( e->x() >= 0 && e->x() <= width() ) CropRect->setRight( e->x() - Anchor->x() );
if ( e->y() >= 0 && e->y() <= height() ) CropRect->setTop( e->y() - Anchor->y() );
if ( CropRect->right() > width() ) CropRect->setRight( width() );
if ( CropRect->top() < 0 ) CropRect->setTop( 0 );
if ( CropRect->width() < 200 ) CropRect->setRight( CropRect->right() + 200 - CropRect->width() );
if ( CropRect->height() < 200 ) CropRect->setTop( CropRect->top() - 200 + CropRect->height() );
} else if ( bBottomLeftGrab ) {
if ( e->x() >= 0 && e->x() <= width() ) CropRect->setLeft( e->x() - Anchor->x() );
if ( e->y() >= 0 && e->y() <= height() ) CropRect->setBottom( e->y() - Anchor->y() );
if ( CropRect->left() < 0 ) CropRect->setLeft( 0 );
if ( CropRect->bottom() > height() ) CropRect->setBottom( height() );
if ( CropRect->width() < 200 ) CropRect->setLeft( CropRect->left() - 200 + CropRect->width() );
if ( CropRect->height() < 200 ) CropRect->setBottom( CropRect->bottom() + 200 - CropRect->height() );
} else if ( bBottomRightGrab ) {
if ( e->x() >= 0 && e->x() <= width() ) CropRect->setRight( e->x() - Anchor->x() );
if ( e->y() >= 0 && e->y() <= height() ) CropRect->setBottom( e->y() - Anchor->y() );
if ( CropRect->right() > width() ) CropRect->setRight( width() );
if ( CropRect->bottom() > height() ) CropRect->setBottom( height() );
if ( CropRect->width() < 200 ) CropRect->setRight( CropRect->right() + 200 - CropRect->width() );
if ( CropRect->height() < 200 ) CropRect->setBottom( CropRect->bottom() + 200 - CropRect->height() );
} else { //no corner grabbed; move croprect
CropRect->moveTopLeft( TQPoint( e->x() - Anchor->x(), e->y() - Anchor->y() ) );
if ( CropRect->left() < 0 ) CropRect->moveLeft( 0 );
if ( CropRect->right() > width() ) CropRect->moveRight( width() );
if ( CropRect->top() < 0 ) CropRect->moveTop( 0 );
if ( CropRect->bottom() > height() ) CropRect->moveBottom( height() );
}
emit cropRegionModified();
update();
}
}
#include "thumbnaileditor.moc"