summaryrefslogtreecommitdiffstats
path: root/src/gui/orientationwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/orientationwidget.cpp')
-rw-r--r--src/gui/orientationwidget.cpp255
1 files changed, 255 insertions, 0 deletions
diff --git a/src/gui/orientationwidget.cpp b/src/gui/orientationwidget.cpp
new file mode 100644
index 0000000..28e10c7
--- /dev/null
+++ b/src/gui/orientationwidget.cpp
@@ -0,0 +1,255 @@
+/***************************************************************************
+ * Copyright (C) 2003-2004 by David Saxton *
+ * david@bluehaze.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 "cnitem.h"
+#include "cnitemgroup.h"
+#include "component.h"
+#include "flowpart.h"
+#include "iteminterface.h"
+#include "itemlibrary.h"
+#include "orientationwidget.h"
+#include "node.h"
+
+#include <kstandarddirs.h>
+#include <qbitmap.h>
+#include <qlayout.h>
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qpainter.h>
+#include <qpushbutton.h>
+
+const int _size = 44;
+
+OrientationWidget::OrientationWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ QGridLayout *layout = new QGridLayout( this, 2, 4, 0, 4 );
+ p_activeFlowPart = 0l;
+
+ for ( int row=0; row<2; ++row )
+ {
+ for ( int col=0; col<4; ++col )
+ {
+ QPushButton *btn = new QPushButton(this);
+ m_toolBtn[row][col] = btn;
+ layout->addWidget( btn, row, col );
+ btn->setFixedSize( _size+6, _size+6 );
+// btn->setFlat(true);
+ btn->setEnabled(false);
+ }
+ }
+
+ connect( m_toolBtn[0][0], SIGNAL(clicked()), this, SLOT(set_cio_noflip_0()) );
+ connect( m_toolBtn[0][1], SIGNAL(clicked()), this, SLOT(set_cio_noflip_90()) );
+ connect( m_toolBtn[0][2], SIGNAL(clicked()), this, SLOT(set_cio_noflip_180()) );
+ connect( m_toolBtn[0][3], SIGNAL(clicked()), this, SLOT(set_cio_noflip_270()) );
+ connect( m_toolBtn[1][0], SIGNAL(clicked()), this, SLOT(set_cio_flip_0()) );
+ connect( m_toolBtn[1][1], SIGNAL(clicked()), this, SLOT(set_cio_flip_90()) );
+ connect( m_toolBtn[1][2], SIGNAL(clicked()), this, SLOT(set_cio_flip_180()) );
+ connect( m_toolBtn[1][3], SIGNAL(clicked()), this, SLOT(set_cio_flip_270()) );
+}
+
+
+OrientationWidget::~OrientationWidget()
+{
+}
+
+void OrientationWidget::slotUpdate( CNItem *activeCNItem )
+{
+ p_activeFlowPart = dynamic_cast<FlowPart*>(activeCNItem);
+ if (p_activeFlowPart)
+ {
+ initFromFlowPart(p_activeFlowPart);
+ return;
+ }
+
+ Component *activeComponent = dynamic_cast<Component*>(activeCNItem);
+
+ if ( activeComponent && (activeComponent->canRotate() || activeComponent->canFlip()) )
+ {
+ initFromComponent(activeComponent);
+ return;
+ }
+
+ slotClear();
+}
+
+
+void OrientationWidget::initFromFlowPart( FlowPart *flowPart )
+{
+ if (!flowPart)
+ return;
+
+ uint valid = flowPart->allowedOrientations();
+
+// m_toolBtn[0][0]->setText("b00");
+ for ( uint i=0; i<2; ++i )
+ {
+ for ( uint j=0; j<4; ++j )
+ {
+ uint o = j + 4*i;
+ if ( valid & (1<<o) )
+ {
+ m_toolBtn[i][j]->setEnabled(true);
+ QPixmap pm( 50, 50 );
+ flowPart->orientationPixmap( o, pm );
+ m_toolBtn[i][j]->setPixmap(pm);
+ }
+ }
+ }
+}
+
+
+void OrientationWidget::initFromComponent( Component *component )
+{
+ const QImage im = itemLibrary()->itemImage(component);
+
+ QRect bound = component->boundingRect();
+
+ // We want a nice square bounding rect
+ const int dy = bound.width() - bound.height();
+ if ( dy > 0 )
+ {
+ bound.setTop( bound.top()-(dy/2) );
+ bound.setBottom( bound.bottom()+(dy/2) );
+ }
+ else if ( dy < 0 )
+ {
+ bound.setLeft( bound.left()+(dy/2) );
+ bound.setRight( bound.right()-(dy/2) );
+ }
+
+
+ QPixmap tbPm;
+ tbPm.convertFromImage(im);
+ m_toolBtn[0][0]->setPixmap(tbPm);
+ m_toolBtn[0][0]->setEnabled(true);
+
+ if ( component->canRotate() )
+ {
+// QPixmap tbPm;
+ tbPm.convertFromImage( im.xForm( Component::transMatrix( 90, false, bound.width()/2, bound.height()/2 ) ) );
+ m_toolBtn[0][1]->setPixmap(tbPm);
+ m_toolBtn[0][1]->setEnabled(true);
+
+// QPixmap tbPm;
+ tbPm.convertFromImage( im.xForm( Component::transMatrix( 180, false, bound.width()/2, bound.height()/2 ) ) );
+ m_toolBtn[0][2]->setPixmap(tbPm);
+ m_toolBtn[0][2]->setEnabled(true);
+
+// QPixmap tbPm;
+ tbPm.convertFromImage( im.xForm( Component::transMatrix( 270, false, bound.width()/2, bound.height()/2 ) ) );
+ m_toolBtn[0][3]->setPixmap(tbPm);
+ m_toolBtn[0][3]->setEnabled(true);
+ }
+
+ if ( component->canFlip() )
+ {
+// QPixmap tbPm;
+ tbPm.convertFromImage( im.xForm( Component::transMatrix( 0, true, bound.width()/2, bound.height()/2 ) ) );
+ m_toolBtn[1][0]->setPixmap(tbPm);
+ m_toolBtn[1][0]->setEnabled(true);
+
+ if ( component->canRotate() )
+ {
+// QPixmap tbPm;
+ tbPm.convertFromImage( im.xForm( Component::transMatrix( 90, true, bound.width()/2, bound.height()/2 ) ) );
+ m_toolBtn[1][1]->setPixmap(tbPm);
+ m_toolBtn[1][1]->setEnabled(true);
+
+// QPixmap tbPm;
+ tbPm.convertFromImage( im.xForm( Component::transMatrix( 180, true, bound.width()/2, bound.height()/2 ) ) );
+ m_toolBtn[1][2]->setPixmap(tbPm);
+ m_toolBtn[1][2]->setEnabled(true);
+
+// QPixmap tbPm;
+ tbPm.convertFromImage( im.xForm( Component::transMatrix( 270, true, bound.width()/2, bound.height()/2 ) ) );
+ m_toolBtn[1][3]->setPixmap(tbPm);
+ m_toolBtn[1][3]->setEnabled(true);
+ }
+ }
+}
+
+
+void OrientationWidget::slotClear()
+{
+ for ( int row=0; row<2; ++row )
+ {
+ for ( int col=0; col<4; ++col )
+ {
+ // Hmm...this line has crashed before
+ m_toolBtn[row][col]->setPixmap( QPixmap::QPixmap() );
+ m_toolBtn[row][col]->setEnabled(false);
+ }
+ }
+}
+
+
+void OrientationWidget::set_cio_noflip_0()
+{
+ if (p_activeFlowPart)
+ ItemInterface::self()->setFlowPartOrientation(0);
+ else
+ ItemInterface::self()->setComponentOrientation( 0, false );
+}
+void OrientationWidget::set_cio_noflip_90()
+{
+ if (p_activeFlowPart)
+ ItemInterface::self()->setFlowPartOrientation(1);
+ else
+ ItemInterface::self()->setComponentOrientation( 90, false );
+}
+void OrientationWidget::set_cio_noflip_180()
+{
+ if (p_activeFlowPart)
+ ItemInterface::self()->setFlowPartOrientation(2);
+ else
+ ItemInterface::self()->setComponentOrientation( 180, false );
+}
+void OrientationWidget::set_cio_noflip_270()
+{
+ if (p_activeFlowPart)
+ ItemInterface::self()->setFlowPartOrientation(3);
+ else
+ ItemInterface::self()->setComponentOrientation( 270, false );
+}
+void OrientationWidget::set_cio_flip_0()
+{
+ if (p_activeFlowPart)
+ ItemInterface::self()->setFlowPartOrientation(4);
+ else
+ ItemInterface::self()->setComponentOrientation( 0, true );
+}
+void OrientationWidget::set_cio_flip_90()
+{
+ if (p_activeFlowPart)
+ ItemInterface::self()->setFlowPartOrientation(5);
+ else
+ ItemInterface::self()->setComponentOrientation( 90, true );
+}
+void OrientationWidget::set_cio_flip_180()
+{
+ if (p_activeFlowPart)
+ ItemInterface::self()->setFlowPartOrientation(6);
+ else
+ ItemInterface::self()->setComponentOrientation( 180, true );
+}
+void OrientationWidget::set_cio_flip_270()
+{
+ if (p_activeFlowPart)
+ ItemInterface::self()->setFlowPartOrientation(7);
+ else
+ ItemInterface::self()->setComponentOrientation( 270, true );
+}
+
+#include "orientationwidget.moc"
+
+
+