[prev in list] [next in list] [prev in thread] [next in thread] 

List:       koffice-devel
Subject:    kpresenter patch. more code cleanup
From:       Thorsten Zachmann <t.zachmann () zagge ! de>
Date:       2004-01-14 5:47:05
Message-ID: 200401140647.05861.t.zachmann () zagge ! de
[Download RAW message or body]

Hello all

next part of cleaning up the source code of kpresenter.

This patch cleans up rotation:

- speed up of rotating one object with mouse
- Fix undo of rotation one objetct if it was rotated before. 
  (see down for how to reproduce)
- Fix rotating one object with the mouse. The object follows now the 
  mouse as expected
- move all that is needed for rotation to the rotate command
- commented the variables used for rotation

To reprodude undo problem with mouse rotation.

- rotate one object with the mouse
- rotate this object again
- undo 
-> now the object is not in the same position

Have a nice day.

Thorsten

["patch66" (text/x-diff)]

Index: kprcommand.h
===================================================================
RCS file: /home/kde/koffice/kpresenter/kprcommand.h,v
retrieving revision 1.87
diff -u -3 -p -r1.87 kprcommand.h
--- kprcommand.h	12 Jan 2004 18:36:59 -0000	1.87
+++ kprcommand.h	14 Jan 2004 05:40:48 -0000
@@ -149,20 +149,20 @@ public:
         float angle;
     };
 
-    RotateCmd( const QString &_name, QPtrList<RotateValues> &_oldRotate, float \
                _newAngle,
-               QPtrList<KPObject> &_objects, KPresenterDoc *_doc, bool _addAngle = \
false ); +    RotateCmd( const QString &_name, float newAngle, QPtrList<KPObject> \
&objects,  +               KPresenterDoc *doc, bool addAngle = false );
     ~RotateCmd();
 
     virtual void execute();
     virtual void unexecute();
 
 protected:
-    KPresenterDoc *doc;
-    QPtrList<RotateValues> oldRotate;
-    QPtrList<KPObject> objects;
-    float newAngle;
+    KPresenterDoc *m_doc;
+    QPtrList<RotateValues> m_oldAngles;
+    QPtrList<KPObject> m_objects;
+    float m_newAngle;
     //necessary for duplicate object, we can duplicated and add angle.
-    bool addAngle;
+    bool m_addAngle;
     KPrPage *m_page;
 };
 
Index: kprcommand.cc
===================================================================
RCS file: /home/kde/koffice/kpresenter/kprcommand.cc,v
retrieving revision 1.165
diff -u -3 -p -r1.165 kprcommand.cc
--- kprcommand.cc	12 Jan 2004 18:36:59 -0000	1.165
+++ kprcommand.cc	14 Jan 2004 05:40:52 -0000
@@ -245,59 +245,63 @@ void SetBackCmd::unexecute()
     }
 }
 
-RotateCmd::RotateCmd( const QString &_name, QPtrList<RotateValues> &_oldRotate, \
                float _newAngle,
-                      QPtrList<KPObject> &_objects, KPresenterDoc *_doc, bool \
                _addAngle )
-    : KNamedCommand( _name ), oldRotate( _oldRotate ), objects( _objects )
+RotateCmd::RotateCmd( const QString &_name, float newAngle, QPtrList<KPObject> \
&objects,  +                      KPresenterDoc *doc, bool addAngle )
+    : KNamedCommand( _name ), m_doc( doc ), m_newAngle( newAngle ), m_addAngle( \
addAngle )  {
-    objects.setAutoDelete( false );
-    oldRotate.setAutoDelete( false );
-    doc = _doc;
-    newAngle = _newAngle;
-
-    addAngle = _addAngle;
-
-    m_page = doc->findSideBarPage( _objects );
-
+    m_objects.setAutoDelete( false );
+    m_oldAngles.setAutoDelete( false );
+    
     QPtrListIterator<KPObject> it( objects );
     for ( ; it.current() ; ++it )
+    {
+        m_objects.append( it.current() );
+        
+        RotateValues *old = new RotateValues;
+        old->angle = it.current()->getAngle();
+        m_oldAngles.append( old );
+        
         it.current()->incCmdRef();
+    }
+    
+    m_page = m_doc->findSideBarPage( m_objects );
 }
 
 RotateCmd::~RotateCmd()
 {
-    QPtrListIterator<KPObject> it( objects );
+    QPtrListIterator<KPObject> it( m_objects );
     for ( ; it.current() ; ++it )
         it.current()->decCmdRef();
-    oldRotate.setAutoDelete( true );
-    oldRotate.clear();
+    m_oldAngles.setAutoDelete( true );
+    m_oldAngles.clear();
 }
 
 void RotateCmd::execute()
 {
-    QPtrListIterator<KPObject> it( objects );
+    QPtrListIterator<KPObject> it( m_objects );
     for ( ; it.current() ; ++it )
     {
-        if ( addAngle )
-            it.current()->rotate( it.current()->getAngle()+newAngle );
+        if ( m_addAngle )
+            it.current()->rotate( it.current()->getAngle() + m_newAngle );
         else
-            it.current()->rotate( newAngle );
+            it.current()->rotate( m_newAngle );
     }
-    doc->updateRuler();
-    doc->repaint( false );
+    m_doc->updateRuler();
+    m_doc->repaint( false );
 
-    int pos=doc->pageList().findRef(m_page);
-    doc->updateSideBarItem(pos, (m_page == doc->stickyPage()) ? true: false );
+    int pos=m_doc->pageList().findRef(m_page);
+    m_doc->updateSideBarItem(pos, (m_page == m_doc->stickyPage()) ? true: false );
 }
 
 void RotateCmd::unexecute()
 {
-    for ( unsigned int i = 0; i < objects.count(); i++ )
-        objects.at(i)->rotate( oldRotate.at( i )->angle );
-    doc->updateRuler();
-    doc->repaint( false );
+    for ( unsigned int i = 0; i < m_objects.count(); i++ )
+        m_objects.at(i)->rotate( m_oldAngles.at( i )->angle );
+    m_doc->updateRuler();
+    m_doc->repaint( false );
 
-    int pos=doc->pageList().findRef(m_page);
-    doc->updateSideBarItem(pos, (m_page == doc->stickyPage()) ? true: false );
+    int pos=m_doc->pageList().findRef(m_page);
+    m_doc->updateSideBarItem(pos, (m_page == m_doc->stickyPage()) ? true: false );
 }
 
 
Index: kprcanvas.h
===================================================================
RCS file: /home/kde/koffice/kpresenter/kprcanvas.h,v
retrieving revision 1.146
diff -u -3 -p -r1.146 kprcanvas.h
--- kprcanvas.h	12 Jan 2004 18:36:59 -0000	1.146
+++ kprcanvas.h	14 Jan 2004 05:40:53 -0000
@@ -519,11 +519,10 @@ private:
     bool showingLastSlide;
     bool mousePressed;
     bool drawContour;
-    double startAngle;
     ModifyType modType;
     unsigned int oldMx, oldMy;
 
-    KPObject *editNum, *rotateNum;
+    KPObject *editNum;
 
     bool fillBlack;
     KPresenterView *m_view;
@@ -538,7 +537,6 @@ private:
     QValueList<int>::Iterator slideListIterator;
     int PM_DM, PM_SM;
     int firstX, firstY;
-    double axisX, axisY;
     int delPageId;
     bool drawRubber;
     QRect rubber;
@@ -553,6 +551,14 @@ private:
     // ratio of the object ( width / height )
     double m_ratio;
     
+    //---- stuff needed for rotating ----
+    // object which gets rotated
+    KPObject *m_rotateObject;
+    // center of the rotated object
+    KoPoint m_rotateCenter;
+    // angle of the object at start of rotate 
+    double m_angleBeforeRotate;
+    
     ToolEditMode toolEditMode;
     QRect insRect;
     KoDocumentEntry partEntry;
Index: kprcanvas.cc
===================================================================
RCS file: /home/kde/koffice/kpresenter/kprcanvas.cc,v
retrieving revision 1.382
diff -u -3 -p -r1.382 kprcanvas.cc
--- kprcanvas.cc	12 Jan 2004 18:36:59 -0000	1.382
+++ kprcanvas.cc	14 Jan 2004 05:41:07 -0000
@@ -111,7 +111,7 @@ KPrCanvas::KPrCanvas( QWidget *parent, c
         modType = MT_NONE;
         m_resizeObject = 0L;
         editNum = 0L;
-        rotateNum = 0L;
+        m_rotateObject = 0L;
         setBackgroundMode( Qt::NoBackground );
         m_view = _view;
         setupMenus();
@@ -750,8 +750,6 @@ void KPrCanvas::mousePressEvent( QMouseE
                 rubber = QRect( e->x(), e->y(), 0, 0 );
             }break;
             case TEM_ROTATE: {
-                //bool deSelAll = true;
-                //bool _resizeObj = false;
                 KPObject *kpobject = 0;
 
                 firstX = contentsPoint.x();
@@ -772,23 +770,16 @@ void KPrCanvas::mousePressEvent( QMouseE
                 // we don't support rotating multiple objects yet
                 deSelectAllObj();
 
-                // deselect all if no object is found
-                if ( !kpobject )
-                    deSelectAllObj();
-
-                // select and raise object
-                else {
-                    rotateNum = kpobject;
-                    startAngle = -kpobject->getAngle();
+                if ( kpobject )
+                {
+                    m_rotateObject = kpobject;
+                    m_angleBeforeRotate = kpobject->getAngle();
                     selectObj( kpobject );
                     raiseObject( kpobject );
-                }
 
-                // set axis to center of selected objects bounding rect
-                if ( kpobject ) {
+                    // set center of selected object bounding rect
                     calcBoundingRect();
-                    axisX = m_boundingRect.center().x();
-                    axisY = m_boundingRect.center().y();
+                    m_rotateCenter = m_boundingRect.center();
                 }
             } break;
             case INS_FREEHAND: case INS_CLOSED_FREEHAND: {
@@ -1312,19 +1303,24 @@ void KPrCanvas::mouseReleaseEvent( QMous
     }break;
     case TEM_ROTATE: {
         drawContour = FALSE;
-        if ( !rotateNum )
+        if ( !m_rotateObject )
             break;
-        if ( startAngle != rotateNum->getAngle() ) {
-            QPtrList<RotateCmd::RotateValues> list;
-            RotateCmd::RotateValues *v = new RotateCmd::RotateValues;
-            v->angle = startAngle;
-            list.append( v );
+        if ( m_angleBeforeRotate != m_rotateObject->getAngle() ) {
             QPtrList<KPObject> objects;
-            objects.append( rotateNum );
-            RotateCmd *rotateCmd = new RotateCmd( i18n( "Change Rotation" ), list,
-                                                  rotateNum->getAngle(),
+            objects.append( m_rotateObject );
+            
+            /* As the object is allready rotated set the angle to 
+             * the m_angleBeforeRotate for the creation of the command, and 
+             * back afterwards. No need for executing the command */
+            float newAngle = m_rotateObject->getAngle();
+            m_rotateObject->rotate( m_angleBeforeRotate );
+            
+            RotateCmd *rotateCmd = new RotateCmd( i18n( "Change Rotation" ), \
                newAngle,
                                                   objects, m_view->kPresenterDoc() \
);  m_view->kPresenterDoc()->addCommand( rotateCmd );
+            
+            m_rotateObject->rotate( newAngle );
+            m_rotateObject = NULL;
         }
     }break;
     case INS_LINE: {
@@ -1563,21 +1559,25 @@ void KPrCanvas::mouseMoveEvent( QMouseEv
                 }
             }break;
             case TEM_ROTATE: {
-                drawContour = TRUE;
-                double angle = KoPoint::getAngle( KoPoint( e->x() + diffx(), e->y() \
                + diffy() ),
-                                                  KoPoint( axisX, axisY ) );
-                double angle1 = KoPoint::getAngle( KoPoint( firstX, firstY ),
-                                                   KoPoint( axisX, axisY ) );
-
-                angle -= angle1;
-                angle -= startAngle;
-                if ( angle < 0 )
-                    angle += 360;
-                else if ( angle > 360 )
-                    angle -= 360;
+                if ( m_rotateObject )
+                {
+                    drawContour = TRUE;
+                    // angle to mouse pos
+                    double angle = KoPoint::getAngle( m_rotateCenter, docPoint );
+                    // angle to start of mouse pos
+                    double angle1 = KoPoint::getAngle( m_rotateCenter,
+                                        m_view->zoomHandler()->unzoomPoint( QPoint( \
firstX, firstY ) ) ); +
+                    angle -= angle1;
+                    angle += m_angleBeforeRotate;
+                    if ( angle < 0 )
+                        angle += 360;
+                    else if ( angle > 360 )
+                        angle -= 360;
 
-                activePage()->rotateObj( angle );
-                stickyPage()->rotateObj( angle );
+                    m_rotateObject->rotate( angle );
+                    _repaint( m_rotateObject );  
+                }
             }break;
             case INS_TEXT: case INS_OBJECT: case INS_TABLE:
             case INS_DIAGRAMM: case INS_FORMULA: case INS_AUTOFORM:
Index: kprpage.cc
===================================================================
RCS file: /home/kde/koffice/kpresenter/kprpage.cc,v
retrieving revision 1.237
diff -u -3 -p -r1.237 kprpage.cc
--- kprpage.cc	12 Jan 2004 18:36:59 -0000	1.237
+++ kprpage.cc	14 Jan 2004 05:41:11 -0000
@@ -2272,49 +2272,32 @@ void KPrPage::repaintObj()
     }
 }
 
-KCommand *KPrPage::rotateObj(float _newAngle,  bool addAngle)
+KCommand *KPrPage::rotateObj( float _newAngle, bool addAngle )
 {
-    RotateCmd *rotateCmd=0L;
-    bool newAngle=false;
-    QPtrList<KPObject> _objects;
-    QPtrList<RotateCmd::RotateValues> _oldRotate;
-    RotateCmd::RotateValues *tmp;
+    RotateCmd * cmd = NULL;
 
+    QPtrList<KPObject> _objects;
     _objects.setAutoDelete( false );
-    _oldRotate.setAutoDelete( false );
 
     QPtrListIterator<KPObject> it( m_objectList );
     for ( ; it.current() ; ++it )
     {
-        //don't rotate a header/footer
-        if ( it.current()== m_doc->header() || it.current()== m_doc->footer())
+        if ( it.current()== m_doc->header() || it.current()== m_doc->footer() )
             continue;
-
-        if ( it.current()->isSelected() ) {
-            tmp = new RotateCmd::RotateValues;
-            tmp->angle =it.current()->getAngle();
-
-            if(!newAngle &&tmp->angle!= _newAngle)
-                newAngle=true;
-
-            _oldRotate.append( tmp );
+        if( it.current()->isSelected() )
+        {
             _objects.append( it.current() );
         }
     }
 
-    if ( !_objects.isEmpty() && newAngle )
-    {
-        rotateCmd = new RotateCmd( i18n( "Change Rotation" ),
-                                   _oldRotate, _newAngle, _objects, m_doc,addAngle \
                );
-        rotateCmd->execute();
-    }
-    else
-    {
-        _oldRotate.setAutoDelete( true );
-        _oldRotate.clear();
+    if ( !_objects.isEmpty() ) {
+        cmd = new RotateCmd( i18n( "Change Rotation" ), _newAngle, _objects, m_doc, \
addAngle ); +        cmd->execute();
     }
-    return rotateCmd;
+    
+    return cmd;
 }
+
 //necessary to use currentPage otherwise when we unsticke object
 //it not take from sticky page.
 KCommand *KPrPage::stickyObj(bool _sticky, KPrPage * currentPage)



_______________________________________________
koffice-devel mailing list
koffice-devel@mail.kde.org
https://mail.kde.org/mailman/listinfo/koffice-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic