Bug 131170

Summary: add grid/auxiliary lines for perspective correction tool
Product: [Applications] digikam Reporter: Mikolaj Machowski <mikmach>
Component: Plugin-Editor-PerspectiveAssignee: Digikam Developers <digikam-bugs-null>
Status: RESOLVED FIXED    
Severity: wishlist CC: ari.reads
Priority: NOR    
Version: unspecified   
Target Milestone: ---   
Platform: Compiled Sources   
OS: Linux   
Latest Commit: Version Fixed In: 0.9.1

Description Mikolaj Machowski 2006-07-21 17:07:16 UTC
Version:           0.9-svn (using KDE KDE 3.5.3)
Installed from:    Compiled From Sources
Compiler:          gcc4.0.1 
OS:                Linux

To make perspective correct you need some paragon. Without that corrction tool is just waving in an air. Currently I am using kruler to get sense of vertical or horizontal lines but it has many drawbacks (wide, nontransparent object). The best solution would be customizable grid but probably easier to make would be auxiliary lines known from Free Rotation tool.
TIA
Comment 1 caulier.gilles 2006-12-18 07:51:04 UTC
*** Bug 138946 has been marked as a duplicate of this bug. ***
Comment 2 caulier.gilles 2007-01-18 15:49:57 UTC
SVN commit 624957 by cgilles:

digikam from trunk : Perspective tool : 

- Add new option to draw a guide grid (15x15).
- Fix Restore/Save settings between plugin sessions.

CCMAIL: digikam-devel@kde.org
BUG: 131170
BUG: 137545




 M  +20 -16    imageeffect_perspective.cpp  
 M  +4 -3      imageeffect_perspective.h  
 M  +231 -183  perspectivewidget.cpp  
 M  +7 -0      perspectivewidget.h  
Comment 3 caulier.gilles 2007-01-18 20:08:53 UTC
SVN commit 625037 by cgilles:

digikam from trunk : Perspective Tool : add Horizontal/Vertical guide lines like with Free Rotation tool

CCMAIL: digikam-devel@kde.org

CCBUGS: 137545, 131170



 M  +37 -7     imageeffect_perspective.cpp  
 M  +7 -0      imageeffect_perspective.h  
 M  +58 -4     perspectivewidget.cpp  
 M  +12 -3     perspectivewidget.h  


--- trunk/extragear/graphics/digikamimageplugins/perspective/imageeffect_perspective.cpp #625036:625037
@@ -25,6 +25,7 @@
  
 #include <qvgroupbox.h>
 #include <qlabel.h>
+#include <qspinbox.h>
 #include <qpushbutton.h>
 #include <qwhatsthis.h>
 #include <qlayout.h>
@@ -33,6 +34,7 @@
 
 // KDE includes.
 
+#include <kcolorbutton.h>
 #include <kcursor.h>
 #include <kconfig.h>
 #include <klocale.h>
@@ -83,7 +85,7 @@
     
     QFrame *frame = new QFrame(plainPage());
     frame->setFrameStyle(QFrame::Panel|QFrame::Sunken);
-    QVBoxLayout* l = new QVBoxLayout(frame, 5, 0);
+    QVBoxLayout* l  = new QVBoxLayout(frame, 5, 0);
     m_previewWidget = new PerspectiveWidget(525, 350, frame);
     l->addWidget(m_previewWidget);
     QWhatsThis::add( m_previewWidget, i18n("<p>This is the perspective transformation operation preview. "
@@ -97,7 +99,7 @@
     Digikam::ImageIface iface(0, 0);
 
     QWidget *gbox2          = new QWidget(plainPage());
-    QGridLayout *gridLayout = new QGridLayout( gbox2, 11, 2, marginHint(), spacingHint());
+    QGridLayout *gridLayout = new QGridLayout( gbox2, 13, 2, marginHint(), spacingHint());
 
     QLabel *label1  = new QLabel(i18n("New width:"), gbox2);
     m_newWidthLabel = new QLabel(temp.setNum( iface.originalWidth()) + i18n(" px"), gbox2);
@@ -148,8 +150,23 @@
     m_drawGridCheckBox = new QCheckBox(i18n("Draw grid"), gbox2);
     gridLayout->addMultiCellWidget(m_drawGridCheckBox, 10, 10, 0, 2);
 
-    gridLayout->setRowStretch(11, 10);
+    // -------------------------------------------------------------
 
+    QLabel *label7 = new QLabel(i18n("Guide color:"), gbox2);
+    m_guideColorBt = new KColorButton( QColor( Qt::red ), gbox2 );
+    QWhatsThis::add( m_guideColorBt, i18n("<p>Set here the color used to draw guides dashed-lines."));
+    gridLayout->addMultiCellWidget(label7, 11, 11, 0, 0);
+    gridLayout->addMultiCellWidget(m_guideColorBt, 11, 11, 2, 2);
+
+    QLabel *label8 = new QLabel(i18n("Guide width:"), gbox2);
+    m_guideSize    = new QSpinBox( 1, 5, 1, gbox2);
+    QWhatsThis::add( m_guideSize, i18n("<p>Set here the width in pixels used to draw guides dashed-lines."));
+    gridLayout->addMultiCellWidget(label8, 12, 12, 0, 0);
+    gridLayout->addMultiCellWidget(m_guideSize, 12, 12, 2, 2);
+
+    gridLayout->setColStretch(1, 10);
+    gridLayout->setRowStretch(13, 10);
+
     setUserAreaWidget(gbox2);
 
     // -------------------------------------------------------------
@@ -158,10 +175,16 @@
             this, SLOT(slotUpdateInfo(QRect, float, float, float, float)));  
 
     connect(m_drawWhileMovingCheckBox, SIGNAL(toggled(bool)),
-            m_previewWidget, SLOT(toggleDrawWhileMoving(bool)));
+            m_previewWidget, SLOT(slotToggleDrawWhileMoving(bool)));
 
     connect(m_drawGridCheckBox, SIGNAL(toggled(bool)),
-            m_previewWidget, SLOT(toggleDrawGrid(bool)));
+            m_previewWidget, SLOT(slotToggleDrawGrid(bool)));
+
+    connect(m_guideColorBt, SIGNAL(changed(const QColor &)),
+            m_previewWidget, SLOT(slotChangeGuideColor(const QColor &)));
+
+    connect(m_guideSize, SIGNAL(valueChanged(int)),
+            m_previewWidget, SLOT(slotChangeGuideSize(int)));
 }
 
 ImageEffect_Perspective::~ImageEffect_Perspective()
@@ -170,12 +193,17 @@
 
 void ImageEffect_Perspective::readUserSettings(void)
 {
+    QColor defaultGuideColor(Qt::red);
     KConfig *config = kapp->config();
     config->setGroup("perspective Tool Dialog");
     m_drawWhileMovingCheckBox->setChecked(config->readBoolEntry("Draw While Moving", true));
     m_drawGridCheckBox->setChecked(config->readBoolEntry("Draw Grid", false));
-    m_previewWidget->toggleDrawWhileMoving(m_drawWhileMovingCheckBox->isChecked());
-    m_previewWidget->toggleDrawGrid(m_drawGridCheckBox->isChecked());
+    m_guideColorBt->setColor(config->readColorEntry("Guide Color", &defaultGuideColor));
+    m_guideSize->setValue(config->readNumEntry("Guide Width", 1));
+    m_previewWidget->slotToggleDrawWhileMoving(m_drawWhileMovingCheckBox->isChecked());
+    m_previewWidget->slotToggleDrawGrid(m_drawGridCheckBox->isChecked());
+    m_previewWidget->slotChangeGuideColor(m_guideColorBt->color());
+    m_previewWidget->slotChangeGuideSize(m_guideSize->value());
 }
 
 void ImageEffect_Perspective::writeUserSettings(void)
@@ -184,6 +212,8 @@
     config->setGroup("perspective Tool Dialog");
     config->writeEntry("Draw While Moving", m_drawWhileMovingCheckBox->isChecked());
     config->writeEntry("Draw Grid", m_drawGridCheckBox->isChecked());
+    config->writeEntry("Guide Color", m_guideColorBt->color());
+    config->writeEntry("Guide Width", m_guideSize->value());
     config->sync();
 }
 
--- trunk/extragear/graphics/digikamimageplugins/perspective/imageeffect_perspective.h #625036:625037
@@ -32,7 +32,10 @@
 
 class QLabel;
 class QCheckBox;
+class QSpinBox;
 
+class KColorButton;
+
 namespace DigikamPerspectiveImagesPlugin
 {
 
@@ -71,6 +74,10 @@
     QCheckBox         *m_drawWhileMovingCheckBox;
     QCheckBox         *m_drawGridCheckBox;
 
+    QSpinBox          *m_guideSize;
+
+    KColorButton      *m_guideColorBt;
+
     PerspectiveWidget *m_previewWidget;
 };
 
--- trunk/extragear/graphics/digikamimageplugins/perspective/perspectivewidget.cpp #625036:625037
@@ -65,6 +65,8 @@
     m_drawGrid        = false;
     m_drawWhileMoving = true;
     m_currentResizing = ResizingNone;
+    m_guideColor      = Qt::red;
+    m_guideSize       = 1;
 
     m_iface        = new Digikam::ImageIface(w, h);
     uchar *data    = m_iface->setPreviewImageSize(w, h);
@@ -168,6 +170,9 @@
     m_bottomRightPoint.setX(m_w-1);
     m_bottomRightPoint.setY(m_h-1);
 
+    m_spot.setX(m_w / 2);
+    m_spot.setY(m_h / 2);
+
     m_antiAlias = true;
     updatePixmap();
     repaint(false);
@@ -196,25 +201,39 @@
                               targetImg.bits(), targetImg.width(), targetImg.height());
 }
 
-void PerspectiveWidget::toggleAntiAliasing(bool a)
+void PerspectiveWidget::slotToggleAntiAliasing(bool a)
 {
     m_antiAlias = a; 
     updatePixmap();
     repaint(false);
 }
 
-void PerspectiveWidget::toggleDrawWhileMoving(bool draw)
+void PerspectiveWidget::slotToggleDrawWhileMoving(bool draw)
 {
     m_drawWhileMoving = draw;
 }
 
-void PerspectiveWidget::toggleDrawGrid(bool grid)
+void PerspectiveWidget::slotToggleDrawGrid(bool grid)
 {
     m_drawGrid = grid;
     updatePixmap();
     repaint(false);
 }
 
+void PerspectiveWidget::slotChangeGuideColor(const QColor &color)
+{
+    m_guideColor = color;
+    updatePixmap();
+    repaint(false);
+}
+
+void PerspectiveWidget::slotChangeGuideSize(int size)
+{
+    m_guideSize = size;
+    updatePixmap();
+    repaint(false);
+}
+
 void PerspectiveWidget::updatePixmap(void)
 {
     m_topLeftCorner.setRect(m_topLeftPoint.x() + m_rect.topLeft().x(),
@@ -314,6 +333,17 @@
     p.drawEllipse( m_transformedCenter.x()+m_rect.topLeft().x(), 
                    m_transformedCenter.y()+m_rect.topLeft().y(), 4, 4 ); 
 
+    // Drawing vertical and horizontal guide lines.
+
+    int xspot = m_spot.x() + m_rect.x();
+    int yspot = m_spot.y() + m_rect.y();
+    p.setPen(QPen(Qt::white, m_guideSize, Qt::SolidLine));
+    p.drawLine(xspot, m_rect.top(), xspot, m_rect.bottom());
+    p.drawLine(m_rect.left(), yspot, m_rect.right(), yspot);
+    p.setPen(QPen(m_guideColor, m_guideSize, Qt::DotLine));
+    p.drawLine(xspot, m_rect.top(), xspot, m_rect.bottom());
+    p.drawLine(m_rect.left(), yspot, m_rect.right(), yspot);
+
     p.end();
 
     emit signalPerspectiveChanged(getTargetSize(), getAngleTopLeft(), getAngleTopRight(),
@@ -603,6 +633,9 @@
 
 void PerspectiveWidget::resizeEvent(QResizeEvent * e)
 {
+    int old_w = m_w;
+    int old_h = m_h;
+
     delete m_pixmap;
     int w          = e->size().width();
     int h          = e->size().height();
@@ -629,6 +662,9 @@
     m_transformedCenter = QPoint(lroundf(m_transformedCenter.x()*xFactor),
                                  lroundf(m_transformedCenter.y()*yFactor));
 
+    m_spot.setX((int)((float)m_spot.x() * ( (float)m_w / (float)old_w)));
+    m_spot.setY((int)((float)m_spot.y() * ( (float)m_h / (float)old_h)));
+
     updatePixmap();
 }
 
@@ -645,10 +681,15 @@
             m_currentResizing = ResizingTopRight;
         else if ( m_bottomLeftCorner.contains( e->x(), e->y() ) )
             m_currentResizing = ResizingBottomLeft;
+        else
+        {
+            m_spot.setX(e->x()-m_rect.x());
+            m_spot.setY(e->y()-m_rect.y());
+        }
     }
 }
 
-void PerspectiveWidget::mouseReleaseEvent ( QMouseEvent * )
+void PerspectiveWidget::mouseReleaseEvent ( QMouseEvent * e )
 {
     if ( m_currentResizing != ResizingNone )
     {
@@ -662,6 +703,13 @@
             repaint(false);
         }
     }
+    else
+    {
+        m_spot.setX(e->x()-m_rect.x());
+        m_spot.setY(e->y()-m_rect.y());
+        updatePixmap();
+        repaint(false);
+    }
 }
 
 void PerspectiveWidget::mouseMoveEvent ( QMouseEvent * e )
@@ -758,6 +806,12 @@
                 setCursor( KCursor::sizeFDiagCursor() );
             }
 
+            else 
+            {
+                m_spot.setX(e->x()-m_rect.x());
+                m_spot.setY(e->y()-m_rect.y());
+            }
+
             updatePixmap();
             repaint(false);
         }
--- trunk/extragear/graphics/digikamimageplugins/perspective/perspectivewidget.h #625036:625037
@@ -30,6 +30,7 @@
 
 #include <qwidget.h>
 #include <qpoint.h>
+#include <qcolor.h>
 #include <qrect.h>
 
 // Digikam includes.
@@ -77,10 +78,13 @@
 
 public slots:
 
-    void toggleAntiAliasing(bool a);
-    void toggleDrawWhileMoving(bool draw);
-    void toggleDrawGrid(bool grid);
+    void slotToggleAntiAliasing(bool a);
+    void slotToggleDrawWhileMoving(bool draw);
+    void slotToggleDrawGrid(bool grid);
 
+    void slotChangeGuideColor(const QColor &color);
+    void slotChangeGuideSize(int size);    
+
 signals:
 
     void signalPerspectiveChanged( QRect newSize, float topLeftAngle, float topRightAngle,
@@ -130,6 +134,8 @@
 
     int                  m_currentResizing;
 
+    int                  m_guideSize;
+
     QRect                m_rect;
 
     // Tranformed center area for mouse position control.
@@ -147,7 +153,10 @@
     QPoint               m_topRightPoint;
     QPoint               m_bottomLeftPoint;
     QPoint               m_bottomRightPoint;
+    QPoint               m_spot;
 
+    QColor               m_guideColor;
+
     // 60 points will be stored to compute a grid of 15x15 lines.
     QPointArray          m_grid;
 
Comment 4 Mikolaj Machowski 2007-01-18 22:20:34 UTC
Thanks :)
I am using this plugin really often and lack of feedback was big
problem.