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

List:       koffice-devel
Subject:    kpresenter patch
From:       Thorsten Zachmann <t.zachmann () zagge ! de>
Date:       2004-10-23 3:49:37
Message-ID: 200410230549.37900.t.zachmann () zagge ! de
[Download RAW message or body]

Hello all,

I have reworked the sidebar code of kpresenter. Thats what I did:

o Let drag and dorp of slide in sidebar only generate an call to move the 
slide, but no longer move it itself.
o Moving of slides no longer recreates all OutlineItems but moves the them, 
and updates the titles of the slides in between.

All the changes together give a big speed up, as now the methods are only 
called once and are more effective.

As I'm not the best at this gui stuff I would prefere I someone could have a 
look at the patch before I commit. Maybe there is a much easier way to 
archive this results.

Thorsten

["sidebar-nomove.diff" (text/x-diff)]

? .kpbackground.cc.swp
? .kppixmapobject.cc.swo
? .kprcanvas.cc.swm
? .kprcanvas.cc.swn
? .kprcanvas.cc.swo
? .kprcanvas.h.swo
? .kprcommand.cc.swn
? .kprcommand.cc.swo
? .kprcommand.h.swo
? .kpresenter_doc.cc.swp
? .kpresenter_doc.h.swp
? .kprpage.cc.swo
? .kprpage.h.swo
? .kptextobject.cc.swp
? .sidebar.h.swp
? .slidetransitiondia.cc.swo
? .slidetransitiondia.cc.swp
? .slidetransitiondia.h.swp
? .slidetransitionwidget.h.swp
? .swn
? .swo
? .swp
? .transeffectdia.cc.swp
? effecthandlernew.cc
? effecthandlernew.h
? kppieobject.cc.save
Index: sidebar.cc
===================================================================
RCS file: /home/kde/koffice/kpresenter/sidebar.cc,v
retrieving revision 1.78
diff -u -3 -p -r1.78 sidebar.cc
--- sidebar.cc	19 Oct 2004 08:44:21 -0000	1.78
+++ sidebar.cc	23 Oct 2004 03:36:31 -0000
@@ -94,6 +94,7 @@ public:
     void setPage( KPrPage* p );
 
     void update();
+    void updateTitle();
 
 private:
     KPrPage* m_page;
@@ -570,11 +571,7 @@ void OutlineSlideItem::update()
 {
     if( !m_page ) return;
     KPresenterDoc *doc = m_page->kPresenterDoc();
-    int index = doc->pageList().findRef( m_page );
-    QString title = m_page->pageTitle();
-    if ( !doc->isSlideSelected( index ) )
-        title = i18n( "(%1)" ).arg( title );
-    setText( 0, title );
+    updateTitle();
 
     // add all objects
     OutlineObjectItem *ooi = 0;
@@ -634,6 +631,13 @@ void OutlineSlideItem::update()
         (ooi->listView())->setSelected( ooi, true );
 }
 
+void OutlineSlideItem::updateTitle()
+{
+    QString title = m_page->pageTitle();
+    if ( ! m_page->isSlideSelected() )
+        title = i18n( "(%1)" ).arg( title );
+    setText( 0, title );
+}
 
 OutlineObjectItem::OutlineObjectItem( OutlineSlideItem* parent, KPObject* _object,
                                       bool sticky, const QString& name )
@@ -725,8 +729,6 @@ Outline::Outline( QWidget *parent, KPres
     m_outlineTip = new OutlineToolTip(this);
 
     connect( this, SIGNAL( currentChanged( QListViewItem * ) ), this, SLOT( \
                itemClicked( QListViewItem * ) ) );
-    connect( this, SIGNAL( moved( QListViewItem *, QListViewItem *, QListViewItem * \
                ) ),
-             this, SLOT( movedItems( QListViewItem *, QListViewItem *, QListViewItem \
                * ) ) );
     connect( this, SIGNAL( rightButtonPressed( QListViewItem *, const QPoint &, int \
                ) ),
              this, SLOT( rightButtonPressed( QListViewItem *, const QPoint &, int ) \
) );  
@@ -814,15 +816,32 @@ void Outline::moveItem( int oldPos, int 
     int lowPage = oldPos > newPos ? newPos : oldPos;
     int highPage = oldPos < newPos ? newPos : oldPos;
 
-    // update, for all between lowPage & highPage
-    int page = lowPage;
-    OutlineSlideItem* item = slideItem( page );
-    for( ; item ; ++page ) {
-        KPrPage* newPage = m_doc->pageList().at( page );
-        item->setPage( newPage );
-        item = dynamic_cast<OutlineSlideItem*>( item->nextSibling() );
-        if ( page == highPage ) break;
+    OutlineSlideItem *item = dynamic_cast<OutlineSlideItem*>( firstChild() );
+    QListViewItem *itemToMove = 0;
+    QListViewItem *itemAfter = 0;
+
+    // moving backwards
+    if ( newPos < oldPos )
+        newPos--;
+    
+    for ( int index = 0; item; ++index, item = dynamic_cast<OutlineSlideItem*>( \
item->nextSibling() ) )  +    {
+        if ( index == oldPos )
+            itemToMove = item;
+        if ( index == newPos )
+            itemAfter = item;
+        if ( index >= lowPage && index <= highPage )
+            item->updateTitle();
+    }
+
+    if ( itemAfter == 0 )
+    {
+        QListViewItem *first = firstChild();
+        itemToMove->moveItem( first );
+        itemAfter = itemToMove;
+        itemToMove = first;
     }
+    itemToMove->moveItem( itemAfter );
 }
 
 void Outline::removeItem( int pos )
@@ -918,41 +937,88 @@ void Outline::contentsDropEvent( QDropEv
     connect( this, SIGNAL( currentChanged( QListViewItem * ) ), this, SLOT( \
itemClicked( QListViewItem * ) ) );  }
 
-// when item is about to move (using drag-and-drop), make sure:
-// it's not moved right after object. only slides can move, objects can't.
+/** 
+ * The method no longer moves the item by itself. I just calls m_doc->movePage
+ * which then moves the item. At the moment the method only works as long as
+ * only one object is moves.
+ * When an item is about to move (using drag-and-drop), it makes shure that 
+ * it's not moved right after an object.
+ */
 void Outline::movableDropEvent( QListViewItem* parent, QListViewItem* target )
 {
-    // slide doesn't have parent (always 0)
-    if( parent ) return;
+    /* slide doesn't have parent (always 0)
+     * Only slides can move at the moment, objects can't. */
+    if ( parent ) 
+        return;
 
-    KListView::movableDropEvent( parent, target );
-}
+    // This code is taken from KListView
+    QPtrList<QListViewItem> items, afterFirsts, afterNows;
+    QListViewItem *current=currentItem();
+    bool hasMoved=false;
+    for (QListViewItem *i = firstChild(), *iNext=0; i != 0; i = iNext)
+    {
+        iNext=i->itemBelow();
+        if (!i->isSelected())
+            continue;
 
-void Outline::movedItems( QListViewItem *i, QListViewItem *, QListViewItem *newAfter \
                )
-{
-    m_movedItem = i;
-    m_movedAfter = newAfter;
-    QTimer::singleShot( 300, this, SLOT( doMoveItems() ) );
+        // don't drop an item after itself, or else
+        // it moves to the top of the list
+        if (i==target)
+            continue;
+
+        i->setSelected(false);
+
+        QListViewItem *afterFirst = i->itemAbove();
+
+        if (!hasMoved)
+        {
+            emit aboutToMove();
+            hasMoved=true;
+        }
+
+        // don't move the item as it is allready 
+        moveItem(i, parent, target);
+
+        emit moved(i, afterFirst, target);
+
+        items.append (i);
+        afterFirsts.append (afterFirst);
+        afterNows.append (target);
+
+        target = i;
+        // We only allow to select on object so we break after we have moved it 
+        // otherwise it might move to object twice.
+        break;
+    }
+    
+    emit moved(items,afterFirsts,afterNows);
+
+    if (firstChild())
+        emit moved();
 }
 
-void Outline::doMoveItems()
+void Outline::moveItem( QListViewItem *i, QListViewItem *, QListViewItem *newAfter )
 {
-    OutlineSlideItem* srcItem = dynamic_cast<OutlineSlideItem*>(m_movedItem);
-    if( !srcItem ) return;
+    OutlineSlideItem* srcItem = dynamic_cast<OutlineSlideItem*>( i );
+    if( !srcItem ) 
+        return;
 
     int num = m_doc->pageList().findRef( srcItem->page() );
 
-    OutlineSlideItem* dstItem = dynamic_cast<OutlineSlideItem*>(m_movedAfter);
-    if( m_movedAfter && !dstItem ) return;
-
-    int numNow = m_movedAfter ? m_doc->pageList().findRef( dstItem->page() ) : -1;
-    if ( numNow < num ) numNow++;
+    int numNow = 0;
+    if ( newAfter )
+    {
+        OutlineSlideItem* dstItem = dynamic_cast<OutlineSlideItem*>( newAfter );
+        if( !dstItem ) 
+            return;
 
-    if(num!=numNow) {
-        emit movePage( num, numNow );
-        // this has to be done because moving a page is take + insert the page
-        setSelected( m_movedItem, true );
+        numNow = m_doc->pageList().findRef( dstItem->page() );
+        if ( numNow < num ) 
+            numNow++;
     }
+
+    if( num!=numNow )
+        m_doc->movePage( num, numNow );
 }
 
 void Outline::rightButtonPressed( QListViewItem *, const QPoint &pnt, int )
Index: sidebar.h
===================================================================
RCS file: /home/kde/koffice/kpresenter/sidebar.h,v
retrieving revision 1.29
diff -u -3 -p -r1.29 sidebar.h
--- sidebar.h	19 Oct 2004 08:44:21 -0000	1.29
+++ sidebar.h	23 Oct 2004 03:36:31 -0000
@@ -95,6 +95,7 @@ public:
 protected:
     void contentsDropEvent( QDropEvent *e );
     void movableDropEvent( QListViewItem* parent, QListViewItem* target );
+    void moveItem( QListViewItem *i, QListViewItem *firstAfter, QListViewItem \
*newAfter );  OutlineSlideItem* slideItem( int pageNumber );
 
 signals: // all page numbers 0-based
@@ -109,8 +110,6 @@ public slots:
 private slots:
     void itemClicked( QListViewItem *i );
     void rightButtonPressed( QListViewItem *i, const QPoint &pnt, int c );
-    void movedItems( QListViewItem *i, QListViewItem *firstAfter, QListViewItem \
                *newAfter );
-    void doMoveItems();
 
 private:
     KPresenterDoc *m_doc;



_______________________________________________
koffice-devel mailing list
koffice-devel@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