[kde-doc-english] [calligra] /: Stage: New UI for Create/Edit Custom Slide Shows

Paul Mendez paulestebanms at gmail.com
Fri Jul 22 21:55:17 CEST 2011


Git commit f911dad2a9ea3159defc8cb3fa96679eae59213f by Paul Mendez.
Committed on 22/07/2011 at 21:51.
Pushed by mendez into branch 'master'.

Stage: New UI for Create/Edit Custom Slide Shows

Integrate new UI for manage/create custom slide shows in Slides Sorter View
Several visual improvements to slides sorter view.
Add undo/redo command for delete slides from custom shows.
Add unit tests for new commands.
REVIEW: 101820
GUI: New UI for manage/create custom slide shows on Stage

M  +66   -13   kpresenter/part/KPrViewModeSlidesSorter.h
M  +7    -3    kpresenter/part/CMakeLists.txt
M  +7    -0    libs/kopageapp/KoPADocument.cpp
M  +1    -1    libs/kopageapp/KoPADocumentStructureDocker.cpp
M  +4    -1    kpresenter/part/ui/KPrConfigureSlideShowDialog.h
M  +120  -44   kpresenter/part/KPrSlidesSorterDocumentModel.cpp
M  +31   -0    kpresenter/part/tests/CMakeLists.txt
M  +7    -30   kpresenter/part/ui/KPrConfigureSlideShowDialog.cpp
M  +1    -1    kpresenter/part/KPrDocument.h
M  +3    -1    kpresenter/part/KPrAnimationDirector.cpp
M  +8    -2    kpresenter/part/KPrView.h
D  +0    -46   kpresenter/part/commands/KPrSetCustomSlideShowsCommand.h
M  +4    -9    kpresenter/part/KPrDocument.cpp
D  +0    -56   kpresenter/part/commands/KPrSetCustomSlideShowsCommand.cpp
M  +51   -29   kpresenter/part/KPrSlidesManagerView.cpp
D  +0    -66   kpresenter/part/ui/KPrCustomSlideShowsDialog.h
M  +13   -17   kpresenter/part/KPrView.cpp
D  +0    -301  kpresenter/part/ui/KPrCustomSlideShowsDialog.cpp
M  +355  -116  kpresenter/part/KPrViewModeSlidesSorter.cpp
M  +30   -1    kpresenter/part/KPrCustomSlideShows.cpp
M  +14   -6    kpresenter/part/KPrSlidesManagerView.h
M  +2    -1    kpresenter/part/KPrViewModePresentation.cpp
D  +0    -223  kpresenter/part/ui/KPrCustomSlideShowsDialog.ui
M  +48   -0    kpresenter/part/KPrSlidesSorterDocumentModel.h
M  +37   -3    kpresenter/part/KPrCustomSlideShows.h
M  +9    -0    libs/kopageapp/KoPADocument.h

http://commits.kde.org/calligra/f911dad2a9ea3159defc8cb3fa96679eae59213f

diff --git a/kpresenter/part/CMakeLists.txt b/kpresenter/part/CMakeLists.txt
index 613ff8d..6a2142f 100644
--- a/kpresenter/part/CMakeLists.txt
+++ b/kpresenter/part/CMakeLists.txt
@@ -71,11 +71,17 @@ set( calligrastageprivate_LIB_SRCS
      KPrSlidesManagerView.cpp
      KPrSelectionManager.cpp
      KPrSelectionToggle.cpp
+     KPrCustomSlideShowsModel.cpp
+     KPrSlidesSorterItemDelegate.cpp
 
      commands/KPrAnimationCreateCommand.cpp
      commands/KPrPageEffectSetCommand.cpp
      commands/KPrPageLayoutCommand.cpp
-     commands/KPrSetCustomSlideShowsCommand.cpp
+     commands/KPrEditCustomSlideShowsCommand.cpp
+     commands/KPrAddCustomSlideShowCommand.cpp
+     commands/KPrDelCustomSlideShowCommand.cpp
+     commands/KPrRenameCustomSlideShowCommand.cpp
+     commands/KPrDeleteSlidesCommand.cpp
 
      dockers/KPrPreviewWidget.cpp
      dockers/KPrPageLayoutDockerFactory.cpp
@@ -119,7 +125,6 @@ set( calligrastageprivate_LIB_SRCS
      pagelayout/KPrPageLayoutSharedSavingData.cpp
      pagelayout/KPrPlaceholders.cpp
 
-     ui/KPrCustomSlideShowsDialog.cpp
      ui/KPrConfigureSlideShowDialog.cpp
      ui/KPrConfigurePresenterViewDialog.cpp
      ui/KPrPresentationToolWidget.cpp
@@ -130,7 +135,6 @@ set( calligrastageprivate_LIB_SRCS
    )
 
 kde4_add_ui_files(calligrastageprivate_LIB_SRCS
-     ui/KPrCustomSlideShowsDialog.ui
      ui/KPrConfigureSlideShow.ui
      ui/KPrConfigurePresenterView.ui
      ui/KPrPresentationTool.ui
diff --git a/kpresenter/part/KPrAnimationDirector.cpp b/kpresenter/part/KPrAnimationDirector.cpp
index d9600e22..e731fa9 100644
--- a/kpresenter/part/KPrAnimationDirector.cpp
+++ b/kpresenter/part/KPrAnimationDirector.cpp
@@ -275,7 +275,9 @@ void KPrAnimationDirector::updateActivePage( KoPAPageBase * page )
 
     KPrPage * kprPage = dynamic_cast<KPrPage *>( page );
     Q_ASSERT( kprPage );
-    m_pageIndex = m_pages.indexOf(page);
+    if (m_pageIndex > m_pages.size() || m_pageIndex < 0) {
+        m_pageIndex = m_pages.indexOf(page);
+    }
     m_animations = kprPage->animations().steps();
 
     // it can be that the pages have different sizes. So we need to recalulate
diff --git a/kpresenter/part/KPrCustomSlideShows.cpp b/kpresenter/part/KPrCustomSlideShows.cpp
index 632dda6..e23fd90 100644
--- a/kpresenter/part/KPrCustomSlideShows.cpp
+++ b/kpresenter/part/KPrCustomSlideShows.cpp
@@ -61,6 +61,7 @@ void KPrCustomSlideShows::update( const QString &name, const QList<KoPAPageBase*
     Q_ASSERT( it != m_customSlideShows.constEnd() );
     Q_UNUSED( it ); // only used in the above Q_ASSERT.
     m_customSlideShows.insert( name, slideShow );
+    emit updated();
 }
 void KPrCustomSlideShows::rename( const QString &oldName, const QString &newName )
 {
@@ -86,7 +87,20 @@ QList<KoPAPageBase*> KPrCustomSlideShows::getByName( const QString &name ) const
     return it.value();
 }
 
-void KPrCustomSlideShows::addSlideToAll( KoPAPageBase* page, unsigned int position )
+KoPAPageBase *KPrCustomSlideShows::pageByIndex(const QString &name, int index) const
+{
+    QList<KoPAPageBase*> pages = getByName(name);
+    return pages.value(index);
+}
+
+
+int KPrCustomSlideShows::indexByPage(const QString &name, KoPAPageBase *page) const
+{
+    QList<KoPAPageBase*> pages = getByName(name);
+    return pages.indexOf(page);
+}
+
+void KPrCustomSlideShows::addSlideToAll( KoPAPageBase *page, unsigned int position )
 {
     QMap< QString, QList<KoPAPageBase*> >::iterator it = m_customSlideShows.begin();
     //FIXME: should we allow negative index?
@@ -96,6 +110,7 @@ void KPrCustomSlideShows::addSlideToAll( KoPAPageBase* page, unsigned int positi
         it.value().insert( (position<=size)? position : size, page );
         ++it;
     }
+    emit updated();
 }
 
 void KPrCustomSlideShows::addSlidesToAll( const QList<KoPAPageBase*> &slideShow, unsigned int position )
@@ -114,6 +129,7 @@ void KPrCustomSlideShows::removeSlideFromAll( KoPAPageBase* page )
         it.value().removeAll( page );
         ++it;
     }
+    emit updated();
 }
 
 void KPrCustomSlideShows::removeSlidesFromAll( const QList<KoPAPageBase*> &slideShow )
@@ -179,3 +195,16 @@ void KPrCustomSlideShows::loadOdf( const KoXmlElement & presentationSettings, Ko
         }
     }
 }
+
+QStringList KPrCustomSlideShows::namesByPage(KoPAPageBase *page)
+{
+    QMap< QString, QList<KoPAPageBase*> >::iterator it = m_customSlideShows.begin();
+    QStringList names;
+    while(it != m_customSlideShows.end()) {
+        if (it.value().contains(page)) {
+            names.append(it.key());
+        }
+        ++it;
+    }
+    return names;
+}
diff --git a/kpresenter/part/KPrCustomSlideShows.h b/kpresenter/part/KPrCustomSlideShows.h
index 7d8a91b..e443049 100644
--- a/kpresenter/part/KPrCustomSlideShows.h
+++ b/kpresenter/part/KPrCustomSlideShows.h
@@ -24,6 +24,7 @@
 #include<QMap>
 #include<QList>
 #include<QString>
+#include<QObject>
 
 //Forward declarations
 class KoXmlWriter;
@@ -35,8 +36,9 @@ class KPrDocument;
 
 #include "stage_export.h"
 
-class STAGE_TEST_EXPORT KPrCustomSlideShows
+class STAGE_TEST_EXPORT KPrCustomSlideShows : public QObject
 {
+    Q_OBJECT
 public:
     KPrCustomSlideShows();
     ~KPrCustomSlideShows();
@@ -88,6 +90,25 @@ public:
     QList<KoPAPageBase*> getByName( const QString &name ) const;
 
     /**
+     * @brief Return the object that match the give index in the list with the given name
+     *
+     * @param name the name of the custom SlideShow
+     / @param index the index of the slide to be retrived from the custom SlideShow
+     * @return a Page in the SlideShow if it was found or a null pointer if not.
+     */
+    KoPAPageBase* pageByIndex(const QString &name, int index) const;
+
+    /**
+     * @brief return the index of a page within a custom show
+     *
+     * @param name the name of the custom SlideShow
+     * @param page the KoPAPageBase within the custom SlideShow
+     * @return a int index of the page within the SlideShow if it was found
+     *         -1 if the page was not found
+     */
+    int indexByPage(const QString &name, KoPAPageBase *page) const;
+
+    /**
      * @brief Insert a slide to the right of the given position of all the known custom SlideShows.
      * If the position is higher than the size of the list of the SlideShow, the slide is inserted at the end.
      * 
@@ -96,7 +117,7 @@ public:
      * If it's 0 it will be prepended to the list, if it's the size it will be appended to the list.
      * Negative numbers can be used to count backwards.
      */
-    void addSlideToAll( KoPAPageBase* page, unsigned int position );
+    void addSlideToAll(KoPAPageBase *page, unsigned int position);
 
     /**
      * @brief Insert a  list of slides to the right of the given position of all the known custom SlideShows.
@@ -112,7 +133,7 @@ public:
      *
      * @param slide slide to be removed
      */
-    void removeSlideFromAll( KoPAPageBase* page );
+    void removeSlideFromAll(KoPAPageBase *page);
 
     /**
      * @brief Deletes all the ocurrencies of a given list of slides from all the known custom SlideShows
@@ -136,7 +157,20 @@ public:
      */
     void loadOdf( const KoXmlElement & presentationSettings, KoPALoadingContext & context );
 
+    /**
+     * @brief Return the names of custom shows that contains the given page
+     *
+     * @param page the page to be searched in the custom shows
+     * @return a List of the Slide Show names that contains the page
+     *         a blank list if the page was not found
+     */
+    QStringList namesByPage(KoPAPageBase *page);
+
+signals:
+    void updated();
+
 private:
     QMap< QString, QList<KoPAPageBase*> > m_customSlideShows;
+
 };
 #endif /* KPRCUSTOMSLIDESHOWS_H */
diff --git a/kpresenter/part/KPrDocument.cpp b/kpresenter/part/KPrDocument.cpp
index 02bf53c..841e86a 100644
--- a/kpresenter/part/KPrDocument.cpp
+++ b/kpresenter/part/KPrDocument.cpp
@@ -35,7 +35,7 @@
 #include "KPrPageSelectStrategyActive.h"
 #include "pagelayout/KPrPageLayouts.h"
 #include "tools/KPrPlaceholderToolFactory.h"
-#include "commands/KPrSetCustomSlideShowsCommand.h"
+#include "commands/KPrDeleteSlidesCommand.h"
 #include <KoPACanvas.h>
 #include <KoPACanvasItem.h>
 #include <KoPAViewModeNormal.h>
@@ -259,15 +259,10 @@ void KPrDocument::postRemoveShape( KoPAPageBase * page, KoShape * shape )
     }
 }
 
-void KPrDocument::pageRemoved( KoPAPageBase * page, KUndo2Command * parent )
+void KPrDocument::removePages(QList<KoPAPageBase *> &pages)
 {
-    // only normal pages can be part of a slide show
-    if ( dynamic_cast<KPrPage *>( page ) ) {
-        KPrCustomSlideShows * slideShows = new KPrCustomSlideShows( *customSlideShows() );
-        slideShows->removeSlideFromAll( page );
-        // maybe we should check if old and new are different and only than create the command
-        new KPrSetCustomSlideShowsCommand( this, slideShows, parent );
-    }
+    KPrDeleteSlidesCommand *command = new KPrDeleteSlidesCommand(this, pages);
+    addCommand(command);
 }
 
 void KPrDocument::loadKPrConfig()
diff --git a/kpresenter/part/KPrDocument.h b/kpresenter/part/KPrDocument.h
index 7756f5e..d32ad26 100644
--- a/kpresenter/part/KPrDocument.h
+++ b/kpresenter/part/KPrDocument.h
@@ -188,7 +188,7 @@ protected:
     virtual void postRemoveShape( KoPAPageBase * page, KoShape * shape );
 
     /// reimplemented
-    virtual void pageRemoved( KoPAPageBase * page, KUndo2Command * parent );
+    virtual void removePages(QList<KoPAPageBase*> &pages);
 
     /// load configuration specific to KPresenter
     void loadKPrConfig();
diff --git a/kpresenter/part/KPrSlidesManagerView.cpp b/kpresenter/part/KPrSlidesManagerView.cpp
index 39e80b1..a406cda 100644
--- a/kpresenter/part/KPrSlidesManagerView.cpp
+++ b/kpresenter/part/KPrSlidesManagerView.cpp
@@ -24,18 +24,17 @@
 #include <QtCore/qmath.h>
 #include <QPaintEvent>
 #include <QScrollBar>
+#include <QPainter>
+#include <QPen>
 
 //Kde headers
 #include <klocale.h>
 #include <KIconLoader>
 
-//Calligra headers
-#include <KoToolProxy.h>
-
-KPrSlidesManagerView::KPrSlidesManagerView(KoToolProxy *toolProxy, QWidget *parent)
+KPrSlidesManagerView::KPrSlidesManagerView(QWidget *parent)
     : QListView(parent)
     , m_dragingFlag(false)
-    , m_toolProxy(toolProxy)
+    , margin(23)
 {
     setViewMode(QListView::IconMode);
     setFlow(QListView::LeftToRight);
@@ -44,6 +43,7 @@ KPrSlidesManagerView::KPrSlidesManagerView(KoToolProxy *toolProxy, QWidget *pare
     setDragEnabled(true);
     setAcceptDrops(true);
     setDropIndicatorShown(true);
+    setSpacing(m_itemSize.width()/10);
     viewport()->installEventFilter(this);
 }
 
@@ -58,20 +58,21 @@ void KPrSlidesManagerView::paintEvent(QPaintEvent *event)
 
     // Paint the line where the slide should go
     if (isDraging()) {
-
-        QSize size(itemSize().width(), itemSize().height());
-
+        QSize size(itemSize().width() + spacing(), itemSize().height() + spacing());
         QPair <int, int> m_pair = cursorRowAndColumn();
         int numberColumn = m_pair.first;
         int numberRow = m_pair.second;
         int scrollBarValue = verticalScrollBar()->value();
 
-        QPoint point1(numberColumn * size.width(), numberRow * size.height() - scrollBarValue);
-        QPoint point2(numberColumn * size.width(), (numberRow + 1) * size.height() - scrollBarValue);
-
+        QPoint point1(numberColumn * size.width() + spacing() / 2, numberRow * size.height() + spacing() - scrollBarValue);
+        QPoint point2(numberColumn * size.width() + spacing() / 2, (numberRow + 1) * size.height() - scrollBarValue);
         QLineF line(point1, point2);
 
         QPainter painter(this->viewport());
+        QPen pen = QPen(palette().brush(QPalette::Highlight), spacing() / 4);
+        pen.setCapStyle(Qt::RoundCap);
+        painter.setPen(pen);
+        painter.setOpacity(0.8);
         painter.drawLine(line);
     }
 }
@@ -114,6 +115,10 @@ void KPrSlidesManagerView::dropEvent(QDropEvent *ev)
 
     clearSelection();
 
+    if (!model()) {
+        return;
+    }
+
     int newIndex = cursorSlideIndex();
 
     if (newIndex >= model()->rowCount(QModelIndex())) {
@@ -126,16 +131,18 @@ void KPrSlidesManagerView::dropEvent(QDropEvent *ev)
 void KPrSlidesManagerView::dragMoveEvent(QDragMoveEvent *ev)
 {
     ev->accept();
+    if (!model()) {
+        return;
+    }
+    QListView::dragMoveEvent(ev);
     setDragingFlag();
     viewport()->update();
 }
 
 void KPrSlidesManagerView::dragEnterEvent(QDragEnterEvent *event)
 {
-    if (event->mimeData()->hasFormat("application/x-calligra-sliderssorter")) {
-        event->setDropAction(Qt::MoveAction);
-        event->accept();
-    }
+    event->setDropAction(Qt::MoveAction);
+    event->accept();
 }
 
 void KPrSlidesManagerView::dragLeaveEvent(QDragLeaveEvent *e)
@@ -144,6 +151,18 @@ void KPrSlidesManagerView::dragLeaveEvent(QDragLeaveEvent *e)
     setDragingFlag(false);
 }
 
+void KPrSlidesManagerView::focusOutEvent(QFocusEvent *event)
+{
+    Q_UNUSED(event);
+    emit focusLost();
+}
+
+void KPrSlidesManagerView::focusInEvent(QFocusEvent *event)
+{
+    Q_UNUSED(event);
+    emit focusGot();
+}
+
 void KPrSlidesManagerView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
 {
     if (!this->selectionModel()->selection().isEmpty()) {
@@ -163,6 +182,7 @@ QRect KPrSlidesManagerView::itemSize() const
 void KPrSlidesManagerView::setItemSize(QRect size)
 {
     m_itemSize = size;
+    setSpacing(m_itemSize.width() / 10);
 }
 
 void KPrSlidesManagerView::setDragingFlag(bool flag)
@@ -177,7 +197,7 @@ bool KPrSlidesManagerView::isDraging() const
 
 bool KPrSlidesManagerView::eventFilter(QObject *watched, QEvent *event)
 {
-    if (watched == viewport()) {
+    if (watched == viewport() && model()) {
         switch (event->type()) {
         case QEvent::MouseButtonPress: {
             QModelIndex item = indexAt(QWidget::mapFromGlobal(QCursor::pos()));
@@ -193,12 +213,10 @@ bool KPrSlidesManagerView::eventFilter(QObject *watched, QEvent *event)
             }
             break;
         }
-
         default:
             break;
         }
     }
-
     return QObject::eventFilter(watched, event);
 }
 
@@ -242,7 +260,7 @@ QPixmap KPrSlidesManagerView::createDragPixmap() const
      QPainter painter(&dragPixmap);
      int x = 0;
      int y = 0;
-     foreach (const QModelIndex& selectedIndex, selectedIndexes) {
+     foreach (const QModelIndex &selectedIndex, selectedIndexes) {
          const QIcon icon = (model()->data(selectedIndex, Qt::DecorationRole)).value<QIcon>();
          painter.drawPixmap(x, y, icon.pixmap(size, size));
 
@@ -262,22 +280,21 @@ QPixmap KPrSlidesManagerView::createDragPixmap() const
 int KPrSlidesManagerView::cursorSlideIndex() const
 {
     QPair <int, int> m_pair = cursorRowAndColumn();
-    int slidesNumber = qFloor((contentsRect().width() - 20) / itemSize().width());
+    int slidesNumber = qFloor((contentsRect().width() - (margin + spacing() - contentsMargins().right())) /
+                              (itemSize().width() + spacing()));
     return (m_pair.first + m_pair.second * slidesNumber);
 }
 
 QPair<int, int> KPrSlidesManagerView::cursorRowAndColumn() const
 {
-    //20 is for the margin.
-    int slidesNumber = qFloor((contentsRect().width() - 20) / itemSize().width());
+    QSize size(itemSize().width() + spacing(), itemSize().height() + spacing());
+    int slidesNumber = qFloor((contentsRect().width() - (margin + spacing() - contentsMargins().right())) / size.width());
     int scrollBarValue = verticalScrollBar()->value();
-
-    QSize size(itemSize().width(), itemSize().height());
     QPoint cursorPosition = QWidget::mapFromGlobal(QCursor::pos());
-
     int numberColumn = qFloor(cursorPosition.x() / size.width());
     int numberRow = qFloor((cursorPosition.y() + scrollBarValue) / size.height());
-    int numberMod = (numberColumn + slidesNumber * numberRow) % (model()->rowCount(QModelIndex()) + 1);
+    int numberMod = model()->rowCount(QModelIndex()) > 0 ?
+                (numberColumn + slidesNumber * numberRow) % (model()->rowCount(QModelIndex())) : 0;
 
      int totalRows = qCeil((model()->rowCount(QModelIndex())) / slidesNumber);
 
@@ -285,13 +302,18 @@ QPair<int, int> KPrSlidesManagerView::cursorRowAndColumn() const
         numberColumn = slidesNumber;
     }
 
-    if (numberColumn > numberMod) {
-        numberColumn = numberColumn - (numberMod + 1);
+    if ((numberColumn > numberMod) & (model()->rowCount(QModelIndex()) % slidesNumber != 0)) {
+        numberColumn = model()->rowCount(QModelIndex()) % slidesNumber;
+    }
+
+    if (model()->rowCount(QModelIndex()) % slidesNumber == 0) {
+        totalRows = totalRows - 1;
     }
 
     if (numberRow > totalRows) {
         numberRow = totalRows;
-        numberColumn = model()->rowCount(QModelIndex()) % slidesNumber;
+        numberColumn = model()->rowCount(QModelIndex()) % slidesNumber != 0 ?
+                    model()->rowCount(QModelIndex()) % slidesNumber : slidesNumber;
     }
 
     return QPair<int,int>(numberColumn, numberRow);
diff --git a/kpresenter/part/KPrSlidesManagerView.h b/kpresenter/part/KPrSlidesManagerView.h
index 6f345e0..1e86f96 100644
--- a/kpresenter/part/KPrSlidesManagerView.h
+++ b/kpresenter/part/KPrSlidesManagerView.h
@@ -22,7 +22,6 @@
 #define KPRSLIDESMANAGERVIEW_H
 
 #include <QListView>
-class KoToolProxy;
 
 /**
  * Class meant to hold a List View of slides thumbnails
@@ -34,15 +33,14 @@ class KPrSlidesManagerView : public QListView
 {
     Q_OBJECT
 public:
-    explicit KPrSlidesManagerView(KoToolProxy *toolProxy, QWidget *parent = 0);
+    explicit KPrSlidesManagerView(QWidget *parent = 0);
 
     ~KPrSlidesManagerView();
 
     virtual void paintEvent (QPaintEvent *event);
 
-
-     //It emits a slideDblClick signal and then calls the parent
-     //implementation
+    //It emits a slideDblClick signal and then calls the parent
+    //implementation
     virtual void mouseDoubleClickEvent(QMouseEvent *event);
 
     virtual void contextMenuEvent(QContextMenuEvent *event);
@@ -64,6 +62,10 @@ public:
     //a suitable active item for the context menu.
     virtual bool eventFilter(QObject *watched, QEvent *event);
 
+    void focusOutEvent(QFocusEvent *event);
+
+    void focusInEvent(QFocusEvent *event);
+
     /**
      * Setter of the size with a rect
      *
@@ -107,6 +109,12 @@ signals:
     /** Is emitted when an item is selected */
     void itemSelected();
 
+    /** Is emitted when the view loses focus */
+    void focusLost();
+
+    /** Is emitted when the view get focus */
+    void focusGot();
+
 private:
 
     /**
@@ -132,7 +140,7 @@ private:
 
     QRect m_itemSize;
     bool m_dragingFlag;
-    KoToolProxy *m_toolProxy;
+    int margin;
 
 };
 
diff --git a/kpresenter/part/KPrSlidesSorterDocumentModel.cpp b/kpresenter/part/KPrSlidesSorterDocumentModel.cpp
index 4938e36..6073928 100644
--- a/kpresenter/part/KPrSlidesSorterDocumentModel.cpp
+++ b/kpresenter/part/KPrSlidesSorterDocumentModel.cpp
@@ -19,27 +19,29 @@
 */
 
 #include "KPrSlidesSorterDocumentModel.h"
-
 #include "KPrViewModeSlidesSorter.h"
+#include "KPrDocument.h"
 
 //Calligra headers
 #include <KoPADocument.h>
 #include <KoPAPageBase.h>
 #include <KoPAViewBase.h>
+#include <KoPAView.h>
 #include <KoPAPage.h>
-#include <KoPAPageMoveCommand.h>
 #include <KoPAOdfPageSaveHelper.h>
 #include <KoDrag.h>
+#include <KoPAPageMoveCommand.h>
 #include <KoShapeRenameCommand.h>
+#include <KoPAPageDeleteCommand.h>
+#include "commands/KPrDeleteSlidesCommand.h"
 
 //KDE Headers
 #include <KIcon>
 
 //Qt Headers
 #include <QMimeData>
-#include <QMenu>
 #include <QApplication>
-
+#include <QMenu>
 
 KPrSlidesSorterDocumentModel::KPrSlidesSorterDocumentModel(KPrViewModeSlidesSorter *viewModeSlidesSorter, QWidget *parent, KoPADocument *document)
    : QAbstractListModel(parent)
@@ -81,20 +83,17 @@ QVariant KPrSlidesSorterDocumentModel::data(const QModelIndex &index, int role)
     }
 
     Q_ASSERT(index.model() == this);
-
-    KoPAPageBase *page = m_document->pageByIndex(index.row(), false);
+    KoPAPageBase *page = pageByIndex(index);
 
     switch (role) {
         case Qt::DisplayRole:
         {
             QString name = i18n("Unknown");
-            if (page)
-            {
+            if (page) {
                 name = page->name();
-                if (name.isEmpty())
-                {
+                if (name.isEmpty()) {
                     //Default case
-                    name = i18n("Slide %1",  m_document->pageIndex(page) + 1);
+                    name = i18n("Slide %1", m_document->pageIndex(page) + 1);
                 }
             }
             return name;
@@ -114,7 +113,7 @@ QVariant KPrSlidesSorterDocumentModel::data(const QModelIndex &index, int role)
 
 bool KPrSlidesSorterDocumentModel::setData(const QModelIndex &index, const QVariant &value, int role)
 {
-    if(! index.isValid() || !m_document) {
+    if (!index.isValid() || !m_document) {
         return false;
     }
 
@@ -145,7 +144,6 @@ int KPrSlidesSorterDocumentModel::rowCount(const QModelIndex &parent) const
     if (!m_document) {
         return 0;
     }
-
     return m_document->pages(false).count();
 }
 
@@ -157,7 +155,7 @@ QStringList KPrSlidesSorterDocumentModel::mimeTypes() const
 QMimeData * KPrSlidesSorterDocumentModel::mimeData(const QModelIndexList &indexes) const
 {
     // check if there is data to encode
-    if (! indexes.count()) {
+    if (!indexes.count()) {
         return 0;
     }
 
@@ -174,8 +172,17 @@ QMimeData * KPrSlidesSorterDocumentModel::mimeData(const QModelIndexList &indexe
 
     // encode the data
     QModelIndexList::ConstIterator it = indexes.begin();
-    for (; it != indexes.end(); ++it) {
-        stream << QVariant::fromValue((*it).row());
+    //  order slides
+    QMap<int, KoPAPageBase*> map;
+    for( ; it != indexes.end(); ++it) {
+        map.insert(m_document->pages(false).indexOf((KoPAPageBase*)it->internalPointer()),
+                   (KoPAPageBase*)it->internalPointer());
+    }
+
+    QList<KoPAPageBase *> slides = map.values();
+
+    foreach (KoPAPageBase *slide, slides) {
+        stream << QVariant::fromValue(qulonglong((void*)slide));
     }
 
     data->setData(format, encoded);
@@ -192,7 +199,6 @@ bool KPrSlidesSorterDocumentModel::removeRows(int row, int count, const QModelIn
     bool success = true;
     beginRemoveRows(parent,row, row + count- 1);
     endRemoveRows();
-
     return success;
 }
 
@@ -224,11 +230,7 @@ bool KPrSlidesSorterDocumentModel::dropMimeData(const QMimeData *data, Qt::DropA
         return true;
     }
 
-    if (!data->hasFormat("application/x-calligra-sliderssorter")) {
-        return false;
-    }
-
-    if (column > 0) {
+    if (!data->hasFormat("application/x-calligra-sliderssorter") || (column > 0)) {
         return false;
     }
 
@@ -237,21 +239,16 @@ bool KPrSlidesSorterDocumentModel::dropMimeData(const QMimeData *data, Qt::DropA
     QList<KoPAPageBase *> slides;
 
     // decode the data
-    while (! stream.atEnd()) {
+    while (!stream.atEnd()) {
         QVariant v;
         stream >> v;
-        KoPAPageBase *page = m_document->pageByIndex(v.toInt(),false);
-        if (page) {
-            slides.append(page);
-        }
+        slides.append(static_cast<KoPAPageBase*>((void*)v.value<qulonglong>()));
     }
 
     if (slides.empty()) {
         return false;
     }
 
-    qSort(slides.begin(), slides.end());
-
     int beginRow;
 
     if (row != -1) {
@@ -270,7 +267,7 @@ bool KPrSlidesSorterDocumentModel::dropMimeData(const QMimeData *data, Qt::DropA
         pageAfter = m_document->pageByIndex(beginRow - 1,false);
     }
 
-    if (!slides.empty ()) {
+    if (!slides.empty()) {
         doDrop(slides, pageAfter, action);
     }
 
@@ -280,6 +277,16 @@ bool KPrSlidesSorterDocumentModel::dropMimeData(const QMimeData *data, Qt::DropA
 void KPrSlidesSorterDocumentModel::doDrop(QList<KoPAPageBase *> slides, KoPAPageBase *pageAfter, Qt::DropAction action)
 {
      Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers();
+     bool enableMove = true;
+
+     foreach (KoPAPageBase *slide, slides) {
+         if (!m_document->pages(false).contains(slide)) {
+             KoPAPageBase *newSlide = slide;
+             slides.replace(slides.indexOf(slide), newSlide);
+             enableMove = false;
+             break;
+         }
+     }
 
      if (((modifiers & Qt::ControlModifier) == 0) &&
          ((modifiers & Qt::ShiftModifier) == 0)) {
@@ -297,18 +304,21 @@ void KPrSlidesSorterDocumentModel::doDrop(QList<KoPAPageBase *> slides, KoPAPage
             QAction *popupCancelAction = new QAction(i18n("C&ancel") + '\t' + QKeySequence(Qt::Key_Escape).toString(), this);
             popupCancelAction->setIcon(KIcon("process-stop"));
 
-            popup.addAction(popupMoveAction);
+            if (enableMove) {
+                popup.addAction(popupMoveAction);
+            }
             popup.addAction(popupCopyAction);
-
             popup.addSeparator();
             popup.addAction(popupCancelAction);
 
             QAction *result = popup.exec(QCursor::pos());
 
-            if(result == popupCopyAction)
+            if (result == popupCopyAction) {
                 action = Qt::CopyAction;
-            else if(result == popupMoveAction)
+            }
+            else if (result == popupMoveAction) {
                 action = Qt::MoveAction;
+            }
             else {
                 return;
             }
@@ -323,22 +333,24 @@ void KPrSlidesSorterDocumentModel::doDrop(QList<KoPAPageBase *> slides, KoPAPage
          return;
      }
 
-
     switch (action) {
     case Qt::MoveAction: {
-        KoPAPageMoveCommand *command = new KoPAPageMoveCommand(m_document, slides, pageAfter);
-        m_document->addCommand(command);
-        m_viewModeSlidesSorter->view()->setActivePage(slides.first());
-        m_viewModeSlidesSorter->selectSlides(slides);
+        //You can't move slides that not belong to the current document
+        foreach (KoPAPageBase *slide, slides) {
+            if (!m_document->pages(false).contains(slide)) {
+                slides.removeAll(slide);
+            }
+        }
+        if (slides.isEmpty()) {
+            return;
+        }
+        moveSlides(slides, pageAfter);
         return;
     }
     case Qt::CopyAction: {
-        KoPAOdfPageSaveHelper saveHelper(m_document, slides);
-        KoDrag drag;
-        drag.setOdf(KoOdf::mimeType(m_document->documentType()), saveHelper);
-        drag.addToClipboard();
+        copySlides(slides);
         m_viewModeSlidesSorter->view()->setActivePage(pageAfter);
-        m_viewModeSlidesSorter->editPaste();
+        pasteSlides();
         m_viewModeSlidesSorter->view()->setActivePage(slides.first());
         m_viewModeSlidesSorter->selectSlides(slides);
         return;
@@ -349,4 +361,68 @@ void KPrSlidesSorterDocumentModel::doDrop(QList<KoPAPageBase *> slides, KoPAPage
     }
 }
 
+KoPAPageBase * KPrSlidesSorterDocumentModel::pageByIndex(const QModelIndex &index) const
+{
+    Q_ASSERT(index.internalPointer());
+    return static_cast<KoPAPageBase*>(index.internalPointer());
+}
+
+bool KPrSlidesSorterDocumentModel::removeSlides(const QList<KoPAPageBase *> &slides)
+{
+    if (!slides.empty() && m_document->pages().count() > slides.count()) {
+        KPrDocument *doc = static_cast<KPrDocument *>(m_document);
+        KUndo2Command *cmd = new KPrDeleteSlidesCommand(doc, slides);
+        if (cmd) {
+            m_document->addCommand(cmd);
+            return true;
+        }
+    }
+    return false;
+}
+
+bool KPrSlidesSorterDocumentModel::addNewSlide()
+{
+    KoPAView *view = dynamic_cast<KoPAView *>(m_viewModeSlidesSorter->view());
+    if (view) {
+        view->insertPage();
+        return true;
+    }
+    return false;
+}
+
+bool KPrSlidesSorterDocumentModel::copySlides(const QList<KoPAPageBase *> &slides)
+{
+    if (!slides.empty()) {
+        // Copy Pages
+        KoPAOdfPageSaveHelper saveHelper(m_document, slides);
+        KoDrag drag;
+        drag.setOdf(KoOdf::mimeType(m_document->documentType()), saveHelper);
+        drag.addToClipboard();
+        return true;
+    }
+    return false;
+}
+
+bool KPrSlidesSorterDocumentModel::pasteSlides()
+{
+    KoPAView *view = dynamic_cast<KoPAView *>(m_viewModeSlidesSorter->view());
+    if (view) {
+        view->pagePaste();
+        return true;
+    }
+    return false;
+}
+
+bool KPrSlidesSorterDocumentModel::moveSlides(const QList<KoPAPageBase *> &slides, KoPAPageBase *pageAfter)
+{
+    KoPAPageMoveCommand *command = new KoPAPageMoveCommand(m_document, slides, pageAfter);
+    if (command) {
+        m_document->addCommand(command);
+        m_viewModeSlidesSorter->view()->setActivePage(slides.first());
+        m_viewModeSlidesSorter->selectSlides(slides);
+        return true;
+    }
+    return false;
+}
+
 #include "KPrSlidesSorterDocumentModel.moc"
diff --git a/kpresenter/part/KPrSlidesSorterDocumentModel.h b/kpresenter/part/KPrSlidesSorterDocumentModel.h
index a5b65a4..257a0ee 100644
--- a/kpresenter/part/KPrSlidesSorterDocumentModel.h
+++ b/kpresenter/part/KPrSlidesSorterDocumentModel.h
@@ -75,7 +75,55 @@ public:
      */
     void doDrop(QList<KoPAPageBase *> slides, KoPAPageBase *pageAfter, Qt::DropAction action);
 
+    /**
+     * @brief Return the page that match the give index in the list
+     *
+     / @param index the index of the slide to be retrived
+     * @return a Page in the document if it was found or a null pointer if not.
+     */
+    KoPAPageBase* pageByIndex(const QModelIndex &index) const;
+
+    /**
+     * @brief Deletes a given list of slides from the current document
+     *
+     * @param slides list of slides to be removed
+     * @return true if the command execution was successful
+     */
+    bool removeSlides(const QList<KoPAPageBase *> &slides);
+
+    /**
+     * @brief Add a new slide after the current active page
+     *
+     * @return true if the command execution was successful
+     */
+    bool addNewSlide();
+
+    /**
+     * @brief copy a given list of slides
+     *
+     * @param slides list of slides to be copied
+     * @return true if the command execution was successful
+     */
+    bool copySlides(const QList<KoPAPageBase *> &slides);
+
+    /**
+     * @brief Paste slides from clipboard
+     *
+     * @return true if the command execution was successful
+     */
+    bool pasteSlides();
+
+    /**
+     * @brief Moves a given list of slides after pageAfter slide
+     *
+     * @param slides list of slides to be moved
+     * @param pageAfter indicates where the slides will be moved
+     * @return true if the command execution was successful
+     */
+    bool moveSlides(const QList<KoPAPageBase *> &slides, KoPAPageBase *pageAfter);
+
 public slots:
+    /** emit signals indicating a change in the model layout or items */
     void update();
 
 private:
diff --git a/kpresenter/part/KPrView.cpp b/kpresenter/part/KPrView.cpp
index 04d502d..fb34504 100644
--- a/kpresenter/part/KPrView.cpp
+++ b/kpresenter/part/KPrView.cpp
@@ -53,12 +53,10 @@
 #include "KPrPicturesImport.h"
 #include "KPrFactory.h"
 #include "commands/KPrAnimationCreateCommand.h"
-#include "commands/KPrSetCustomSlideShowsCommand.h"
 #include "dockers/KPrPageLayoutDockerFactory.h"
 #include "dockers/KPrPageLayoutDocker.h"
 #include "KPrHtmlExport.h"
 #include "KPrCustomSlideShows.h"
-#include "ui/KPrCustomSlideShowsDialog.h"
 #include "ui/KPrConfigureSlideShowDialog.h"
 #include "ui/KPrConfigurePresenterViewDialog.h"
 #include "ui/KPrHtmlExportDialog.h"
@@ -135,6 +133,12 @@ KPrViewModePresentation * KPrView::presentationMode() const
     return m_presentationMode;
 }
 
+
+KPrViewModeSlidesSorter * KPrView::slidesSorter() const
+{
+    return m_slidesSorterMode;
+}
+
 bool KPrView::isPresentationRunning() const
 {
     return ( viewMode() == m_presentationMode );
@@ -234,9 +238,9 @@ void KPrView::initActions()
     actionCollection()->addAction( "edit_createanimation", m_actionCreateAnimation );
     connect( m_actionCreateAnimation, SIGNAL( activated() ), this, SLOT( createAnimation() ) );
 
-    m_actionCreateCustomSlideShowsDialog = new KAction( i18n( "Edit Custom Slide Shows..." ), this );
-    actionCollection()->addAction( "edit_customslideshows", m_actionCreateCustomSlideShowsDialog );
-    connect( m_actionCreateCustomSlideShowsDialog, SIGNAL( activated() ), this, SLOT( dialogCustomSlideShows() ) );
+    m_actionEditCustomSlideShows = new KAction( i18n( "Edit Custom Slide Shows..." ), this );
+    actionCollection()->addAction( "edit_customslideshows", m_actionEditCustomSlideShows );
+    connect( m_actionEditCustomSlideShows, SIGNAL( activated() ), this, SLOT( editCustomSlideShows() ) );
 
     m_actionStartPresentation = new KActionMenu( KIcon("view-presentation"), i18n( "Start Presentation" ), this );
     actionCollection()->addAction( "slideshow_start", m_actionStartPresentation );
@@ -367,24 +371,16 @@ void KPrView::showSlidesSorter()
     setViewMode(m_slidesSorterMode);
 }
 
-void KPrView::dialogCustomSlideShows()
+void KPrView::editCustomSlideShows()
 {
-    KPrDocument *doc = static_cast<KPrDocument *>( kopaDocument() );
-    KPrCustomSlideShows *finalSlideShows;
-    KPrCustomSlideShowsDialog dialog( this, doc->customSlideShows(), doc, finalSlideShows );
-    dialog.setModal( true );
-    if ( dialog.exec() == QDialog::Accepted ) {
-        kopaCanvas()->addCommand( new KPrSetCustomSlideShowsCommand( doc, finalSlideShows ) );
-    }
-    else {
-        delete finalSlideShows;
-    }
+    slidesSorter()->setActiveCustomSlideShow(1);
+    showSlidesSorter();
 }
 
 void KPrView::configureSlideShow()
 {
     KPrDocument *doc = static_cast<KPrDocument *>( kopaDocument() );
-    KPrConfigureSlideShowDialog *dialog = new KPrConfigureSlideShowDialog( doc, this );
+    KPrConfigureSlideShowDialog *dialog = new KPrConfigureSlideShowDialog(doc, this);
 
     if ( dialog->exec() == QDialog::Accepted ) {
         doc->setActiveCustomSlideShow( dialog->activeCustomSlideShow() );
diff --git a/kpresenter/part/KPrView.h b/kpresenter/part/KPrView.h
index a558a2e..8c9d461 100644
--- a/kpresenter/part/KPrView.h
+++ b/kpresenter/part/KPrView.h
@@ -37,6 +37,7 @@ class KoPAPageBase;
 class STAGE_EXPORT KPrView : public KoPAView
 {
     Q_OBJECT
+    friend class KPrConfigureSlideShowDialog;
 public:
     explicit KPrView( KPrDocument * document, QWidget * parent = 0 );
     ~KPrView();
@@ -60,6 +61,11 @@ public:
     KPrViewModePresentation * presentationMode() const;
 
     /**
+     * Get the slides sorter view mode
+     */
+    KPrViewModeSlidesSorter *slidesSorter() const;
+
+    /**
      * Find whether the presentation view mode is active
      */
     bool isPresentationRunning() const;
@@ -127,7 +133,7 @@ protected slots:
     void createAnimation();
     void showNotes();
     void showSlidesSorter();
-    void dialogCustomSlideShows();
+    void editCustomSlideShows();
     void configureSlideShow();
     void configurePresenterView();
     void exportToHtml();
@@ -145,7 +151,7 @@ private:
     KAction *m_actionViewModeNormal;
     KAction *m_actionViewModeNotes;
     KAction *m_actionViewModeSlidesSorter;
-    KAction *m_actionCreateCustomSlideShowsDialog;
+    KAction *m_actionEditCustomSlideShows;
     KAction *m_actionExportHtml;
     KAction *m_actionInsertPictures;
     KAction *m_actionDrawOnPresentation;
diff --git a/kpresenter/part/KPrViewModePresentation.cpp b/kpresenter/part/KPrViewModePresentation.cpp
index 46b61e1..7825827 100644
--- a/kpresenter/part/KPrViewModePresentation.cpp
+++ b/kpresenter/part/KPrViewModePresentation.cpp
@@ -220,7 +220,8 @@ void KPrViewModePresentation::deactivate()
     KoPAPageBase * page = m_view->activePage();
     if ( m_endOfSlideShowPage ) {
         if ( page == m_endOfSlideShowPage ) {
-            page = m_view->kopaDocument()->pages().last();
+            KPrDocument *document = static_cast<KPrDocument *>( m_view->kopaDocument() );
+            page = document->slideShow().last();
         }
     }
     m_tool->deactivate();
diff --git a/kpresenter/part/KPrViewModeSlidesSorter.cpp b/kpresenter/part/KPrViewModeSlidesSorter.cpp
index 61866f8..6940cf9 100644
--- a/kpresenter/part/KPrViewModeSlidesSorter.cpp
+++ b/kpresenter/part/KPrViewModeSlidesSorter.cpp
@@ -19,76 +19,170 @@
 */
 
 #include "KPrViewModeSlidesSorter.h"
-
-#include <QtCore/QEvent>
-#include <QtGui/QPainter>
-#include <QVariant>
-#include <QScrollBar>
-#include <QMenu>
-#include <QtCore/qmath.h>
-
 #include "KPrSlidesSorterDocumentModel.h"
 #include "KPrFactory.h"
 #include "KPrSlidesManagerView.h"
 #include "KPrSelectionManager.h"
+#include "KPrCustomSlideShowsModel.h"
+#include "KPrDocument.h"
+#include "KPrCustomSlideShows.h"
+#include "KPrSlidesSorterItemDelegate.h"
+#include "KPrView.h"
 
+//Qt Headers
+#include <QMenu>
+#include <QContextMenuEvent>
+#include <QGridLayout>
+#include <QPushButton>
+#include <QSplitter>
+#include <QComboBox>
+#include <QLabel>
+#include <QPropertyAnimation>
+#include <QLineEdit>
+
+//Calligra Headers
 #include <KoResourceManager.h>
-#include <KoRuler.h>
-#include <KoSelection.h>
-#include <KoShapeLayer.h>
-#include <KoShapeManager.h>
 #include <KoText.h>
-#include <KoToolManager.h>
-#include <KoToolProxy.h>
 #include <KoZoomController.h>
-
 #include <KoPACanvas.h>
 #include <KoPADocument.h>
 #include <KoPAPageBase.h>
 #include <KoPAMasterPage.h>
 #include <KoPAView.h>
-#include <KPrView.h>
-#include <KoPAPageMoveCommand.h>
-#include <KoPAPageDeleteCommand.h>
-#include <KoPAOdfPageSaveHelper.h>
-#include <KoDrag.h>
 #include <KoCanvasController.h>
 #include <KoCopyController.h>
 #include <KoCutController.h>
 
+//KDE Headers
 #include <klocale.h>
 #include <KDebug>
 #include <kconfiggroup.h>
+#include <KIconLoader>
+#include <KGlobalSettings>
+#include <KMessageBox>
 #include <KActionCollection>
 
 KPrViewModeSlidesSorter::KPrViewModeSlidesSorter(KoPAView *view, KoPACanvas *canvas)
-    : KoPAViewMode( view, canvas )
-    , m_slidesSorter( new KPrSlidesManagerView(m_toolProxy, view->parentWidget()))
-    , m_documentModel(new KPrSlidesSorterDocumentModel(this, view->parentWidget()))
-    , m_iconSize( QSize(200, 200) )
-{
-    m_slidesSorter->hide();
-    m_slidesSorter->setIconSize( m_iconSize );
-
-    connect(m_slidesSorter, SIGNAL(requestContextMenu(QContextMenuEvent*)), this, SLOT(slidesSorterContextMenu(QContextMenuEvent*)));
-    connect(m_slidesSorter, SIGNAL(slideDblClick()), this, SLOT(activateNormalViewMode()));
-    connect(m_slidesSorter, SIGNAL(selectionCleared()), this, SLOT(disableEditActions()));
-    connect(m_slidesSorter, SIGNAL(itemSelected()), this, SLOT(enableEditActions()));
-
-    //connect signals for manage standard edit actions
+    : KoPAViewMode(view, canvas)
+    , m_slidesSorterView(new KPrSlidesManagerView())
+    , m_customSlideShowView(new KPrSlidesManagerView())
+    , m_slidesSorterModel(new KPrSlidesSorterDocumentModel(this, view->parentWidget()))
+    , m_centralWidget(new QWidget(view->parentWidget()))
+    , m_customSlideShowModel(new KPrCustomSlideShowsModel(static_cast<KPrDocument *>(view->kopaDocument()), view->parentWidget()))
+    , m_iconSize(QSize(200, 200))
+    , m_editCustomSlideShow(false)
+{
+    //Create customSlideShow GUI
+    QWidget *m_customShowsToolBar = new QWidget();
+
+    QHBoxLayout *toolBarLayout = new QHBoxLayout(m_customShowsToolBar);
+    QVBoxLayout *centralWidgetLayout = new QVBoxLayout(m_centralWidget);
+
+    QLabel *slideShowsLabel = new QLabel(i18n("Slide Show: "));
+    m_customSlideShowsList = new QComboBox;
+    m_customSlideShowsList->setEditable(false);
+    m_customSlideShowsList->setInsertPolicy(QComboBox::NoInsert);
+    m_customSlideShowsList->setMinimumContentsLength(30);
+    slideShowsLabel->setBuddy(m_customSlideShowsList);
+
+    m_buttonAddCustomSlideShow = new QToolButton();
+    m_buttonAddCustomSlideShow->setIcon(SmallIcon("list-add"));
+    m_buttonAddCustomSlideShow->setToolTip(i18n("Add a new custom slide show"));
+
+    m_buttonDelCustomSlideShow = new QToolButton();
+    m_buttonDelCustomSlideShow->setIcon(SmallIcon("list-remove"));
+    m_buttonDelCustomSlideShow->setEnabled(false);
+    m_buttonDelCustomSlideShow->setToolTip(i18n("Delete current custom slide show"));
+
+    m_buttonAddSlideToCurrentShow = new QToolButton();
+    m_buttonAddSlideToCurrentShow->setIcon(SmallIcon("arrow-down"));
+    m_buttonAddSlideToCurrentShow->setToolTip(i18n("Add slides to current custom slide show"));
+    m_buttonAddSlideToCurrentShow->setEnabled(false);
+
+    m_buttonDelSlideFromCurrentShow = new QToolButton();
+    m_buttonDelSlideFromCurrentShow->setIcon(SmallIcon("arrow-up"));
+    m_buttonDelSlideFromCurrentShow->setToolTip(i18n("Remove slides from current custom slide show"));
+    m_buttonDelSlideFromCurrentShow->setEnabled(false);
+
+    QSplitter *viewsSplitter = new QSplitter(Qt::Vertical);
+
+    //hide Custom Shows View
+    m_customSlideShowView->setMaximumHeight(0);
+
+    //Layout Widgets
+    toolBarLayout->addWidget(slideShowsLabel);
+    toolBarLayout->addWidget(m_customSlideShowsList);
+    toolBarLayout->addWidget(m_buttonAddCustomSlideShow);
+    toolBarLayout->addWidget(m_buttonDelCustomSlideShow);
+    toolBarLayout->addStretch();
+    toolBarLayout->addWidget(m_buttonAddSlideToCurrentShow);
+    toolBarLayout->addWidget(m_buttonDelSlideFromCurrentShow);
+
+    viewsSplitter->addWidget(m_slidesSorterView);
+    viewsSplitter->addWidget(m_customSlideShowView);
+    centralWidgetLayout->addWidget(viewsSplitter);
+    centralWidgetLayout->addWidget(m_customShowsToolBar);
+
+    //initialize widgets
+    m_centralWidget->hide();
+    m_slidesSorterView->setIconSize(m_iconSize);
+    m_slidesSorterView->setAutoScroll(true);
+    m_customSlideShowView->setIconSize(m_iconSize);
+    m_customSlideShowView->setAutoScroll(true);
+
+    //Populate ComboBox
+    customShowChanged(0);
+    updateCustomSlideShowsList();
+
+    //Setup customSlideShows view
+    m_customSlideShowView->setModel(m_customSlideShowModel);
+    m_customSlideShowView->setSelectionBehavior(QAbstractItemView::SelectRows);
+    m_customSlideShowView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+    m_customSlideShowView->setDragDropMode(QAbstractItemView::InternalMove);
+
+    //Setup slides sorter view
+    m_slidesSorterModel->setDocument(m_view->kopaDocument());
+    m_slidesSorterView->setModel(m_slidesSorterModel);
+    m_slidesSorterView->setSelectionBehavior(QAbstractItemView::SelectRows);
+    m_slidesSorterView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+    m_slidesSorterView->setDragDropMode(QAbstractItemView::InternalMove);
+
+    //setup signals
+    connect(m_slidesSorterView, SIGNAL(requestContextMenu(QContextMenuEvent*)), this, SLOT(slidesSorterContextMenu(QContextMenuEvent*)));
+    connect(m_customSlideShowView, SIGNAL(requestContextMenu(QContextMenuEvent*)), this, SLOT(customSlideShowsContextMenu(QContextMenuEvent*)));
+    connect(m_slidesSorterView, SIGNAL(slideDblClick()), this, SLOT(activateNormalViewMode()));
+    connect(m_buttonAddCustomSlideShow, SIGNAL(clicked()), this, SLOT(addCustomSlideShow()));
+    connect(m_buttonDelCustomSlideShow, SIGNAL(clicked()), this, SLOT(removeCustomSlideShow()));
+    connect(m_buttonAddSlideToCurrentShow, SIGNAL(clicked()), this, SLOT(addSlideToCustomShow()));
+    connect(m_buttonDelSlideFromCurrentShow, SIGNAL(clicked()), this, SLOT(deleteSlidesFromCustomShow()));
+    connect(m_customSlideShowModel, SIGNAL(customSlideShowsChanged()), this, SLOT(updateCustomSlideShowsList()));
+
+    //setup signals for manage edit actions
     connect(view->copyController(), SIGNAL(copyRequested()), this, SLOT(editCopy()));
     connect(view->cutController(), SIGNAL(copyRequested()), this, SLOT(editCut()));
-    connect(view, SIGNAL(selectAllRequested()), m_slidesSorter, SLOT(selectAll()));
-    connect(view, SIGNAL(deselectAllRequested()), m_slidesSorter, SLOT(clearSelection()));
+    connect(view, SIGNAL(selectAllRequested()), m_slidesSorterView, SLOT(selectAll()));
+    connect(view, SIGNAL(deselectAllRequested()), m_slidesSorterView, SLOT(clearSelection()));
+    connect(m_slidesSorterView, SIGNAL(selectionCleared()), this, SLOT(disableEditActions()));
+    connect(m_slidesSorterView, SIGNAL(itemSelected()), this, SLOT(enableEditActions()));
+    connect(m_slidesSorterView, SIGNAL(focusLost()), SLOT(disableEditActions()));
+    connect(m_slidesSorterView, SIGNAL(focusGot()), SLOT(manageAddRemoveSlidesButtons()));
+    connect(m_customSlideShowView, SIGNAL(focusGot()), SLOT(disableEditActions()));
+    connect(m_customSlideShowView, SIGNAL(focusGot()), SLOT(manageAddRemoveSlidesButtons()));
 
-    //install selection manager for Slides Sorter View
-    m_selectionManagerSlidesSorter = new KPrSelectionManager(m_slidesSorter);
+    //install selection manager for Slides Sorter View and Custom Shows View
+    new KPrSelectionManager(m_slidesSorterView);
+    new KPrSelectionManager(m_customSlideShowView);
+
+    //install delegate for Slides Sorter View
+    KPrSlidesSorterItemDelegate *slidesSorterDelegate = new KPrSlidesSorterItemDelegate(m_slidesSorterView);
+    m_slidesSorterView->setItemDelegate(slidesSorterDelegate);
 }
 
 KPrViewModeSlidesSorter::~KPrViewModeSlidesSorter()
 {
     //save zoom value
     saveZoomConfig(zoom());
+    delete m_centralWidget;
 }
 
 void KPrViewModeSlidesSorter::paint(KoPACanvasBase* /*canvas*/, QPainter& /*painter*/, const QRectF &/*paintRect*/)
@@ -156,12 +250,13 @@ void KPrViewModeSlidesSorter::activate(KoPAViewMode *previousViewMode)
     if (view) {
         view->hide();
     }
-    m_slidesSorter->show();
-    m_slidesSorter->setFocus(Qt::ActiveWindowFocusReason);
+    m_centralWidget->show();
+    m_slidesSorterView->setFocus(Qt::ActiveWindowFocusReason);
     updateToActivePageIndex();
 
-    connect(m_slidesSorter,SIGNAL(indexChanged(QModelIndex)), this, SLOT(itemClicked(QModelIndex)));
-    connect(m_slidesSorter, SIGNAL(pressed(QModelIndex)), this, SLOT(itemClicked(const QModelIndex)));
+    //setup signals
+    connect(m_slidesSorterView,SIGNAL(indexChanged(QModelIndex)), this, SLOT(itemClicked(QModelIndex)));
+    connect(m_slidesSorterView, SIGNAL(pressed(QModelIndex)), this, SLOT(itemClicked(const QModelIndex)));
     connect(m_view->proxyObject, SIGNAL(activePageChanged()), this, SLOT(updateToActivePageIndex()));
     connect(m_view->kopaDocument(),SIGNAL(pageAdded(KoPAPageBase*)),this, SLOT(updateSlidesSorterDocumentModel()));
     connect(m_view->kopaDocument(),SIGNAL(pageRemoved(KoPAPageBase*)),this, SLOT(updateSlidesSorterDocumentModel()));
@@ -181,7 +276,7 @@ void KPrViewModeSlidesSorter::activate(KoPAViewMode *previousViewMode)
 
 void KPrViewModeSlidesSorter::deactivate()
 {
-    m_slidesSorter->hide();
+    m_centralWidget->hide();
     // Give the ressources back to the canvas
     m_canvas->resourceManager()->setResource(KoText::ShowTextFrames, 0);
     // Active the view as a basic but active one
@@ -197,10 +292,8 @@ void KPrViewModeSlidesSorter::deactivate()
 
     //change zoom saving slot and restore normal view zoom values
     disconnect(m_view->zoomController(), SIGNAL(zoomChanged(KoZoomMode::Mode, qreal)), this, SLOT(updateZoom(KoZoomMode::Mode, qreal)));
-
     m_view->zoomController()->zoomAction()->setZoomModes(KoZoomMode::ZOOM_PAGE | KoZoomMode::ZOOM_WIDTH);
-
-    m_view->setActivePage(m_view->kopaDocument()->pageByIndex(m_slidesSorter->currentIndex().row(), false));
+    m_view->setActivePage(m_view->kopaDocument()->pageByIndex(m_slidesSorterView->currentIndex().row(), false));
 
     KPrView *kPrview = dynamic_cast<KPrView *>(m_view);
     if (kPrview) {
@@ -209,13 +302,12 @@ void KPrViewModeSlidesSorter::deactivate()
         connect(kPrview->deleteSelectionAction(), SIGNAL(triggered()), kPrview, SLOT(editDeleteSelection()));
         disconnect(kPrview->deleteSelectionAction(), SIGNAL(triggered()), this, SLOT(deleteSlide()));
     }
-
     disableEditActions();
 }
 
 void KPrViewModeSlidesSorter::updateSlidesSorterDocumentModel()
 {
-    m_documentModel->update();
+    m_slidesSorterModel->update();
     updateToActivePageIndex();
 }
 
@@ -230,13 +322,13 @@ void KPrViewModeSlidesSorter::updateActivePage( KoPAPageBase *page )
 void KPrViewModeSlidesSorter::updateToActivePageIndex()
 {
     int row = m_view->kopaDocument()->pageIndex(m_view->activePage());
-    QModelIndex index = m_documentModel->index(row, 0, QModelIndex());
-    m_slidesSorter->setCurrentIndex(index);
+    QModelIndex index = m_slidesSorterModel->index(row, 0, QModelIndex());
+    m_slidesSorterView->setCurrentIndex(index);
 }
 
 void KPrViewModeSlidesSorter::updateActivePageToCurrentIndex()
 {
-    QModelIndex c_index = m_slidesSorter->currentIndex();
+    QModelIndex c_index = m_slidesSorterView->currentIndex();
     m_view->setActivePage(m_view->kopaDocument()->pageByIndex(c_index.row(), false));
 }
 
@@ -252,15 +344,12 @@ void KPrViewModeSlidesSorter::removeShape( KoShape *shape )
 
 void KPrViewModeSlidesSorter::populate()
 {
-    m_documentModel->setDocument(m_view->kopaDocument());
-    m_slidesSorter->setModel(m_documentModel);
+    //Init m_slidesSorter view
+    QModelIndex item = m_slidesSorterModel->index(0, 0, QModelIndex());
+    m_slidesSorterView->setItemSize(m_slidesSorterView->visualRect(item));
 
-    m_slidesSorter->setSelectionBehavior(QAbstractItemView::SelectRows);
-    m_slidesSorter->setSelectionMode(QAbstractItemView::ExtendedSelection);
-
-    m_slidesSorter->setDragDropMode(QAbstractItemView::InternalMove);
-    QModelIndex item = m_documentModel->index(0, 0, QModelIndex());
-    m_slidesSorter->setItemSize (m_slidesSorter->visualRect(item));
+    //Init m_customSlidesShowsView
+    m_customSlideShowView->setItemSize(m_slidesSorterView->visualRect(item));
 }
 
 QSize KPrViewModeSlidesSorter::iconSize() const
@@ -268,6 +357,23 @@ QSize KPrViewModeSlidesSorter::iconSize() const
     return m_iconSize;
 }
 
+void KPrViewModeSlidesSorter::selectSlides(const QList<KoPAPageBase *> &slides)
+{
+    if (slides.isEmpty()) {
+        return;
+    }
+
+    m_slidesSorterView->clearSelection();
+
+    foreach (KoPAPageBase *slide, slides) {
+        int row = m_view->kopaDocument()->pageIndex(slide);
+        QModelIndex index = m_slidesSorterModel->index(row, 0, QModelIndex());
+        if (index.isValid()) {
+            m_slidesSorterView->selectionModel()->select(index, QItemSelectionModel::Select);
+        }
+    }
+}
+
 void KPrViewModeSlidesSorter::activateNormalViewMode()
 {
     KPrView *view = static_cast<KPrView *>(m_view);
@@ -281,12 +387,11 @@ void KPrViewModeSlidesSorter::itemClicked(const QModelIndex index)
     }
 
     //Avoid deselect slides when dragging
-    if (m_slidesSorter->selectionModel()->selectedIndexes().length () > 1) {
+    if (m_slidesSorterView->selectionModel()->selectedIndexes().length () > 1) {
         return;
     }
 
     KoPAPageBase *page = m_view->kopaDocument()->pageByIndex(index.row(), false);
-
     if (page) {
         m_view->setActivePage(page);
     }
@@ -296,50 +401,48 @@ void KPrViewModeSlidesSorter::itemClicked(const QModelIndex index)
 QList<KoPAPageBase *> KPrViewModeSlidesSorter::extractSelectedSlides()
 {
     QList<KoPAPageBase *> slides;
-
-    QModelIndexList selectedItems = m_slidesSorter->selectionModel()->selectedIndexes();
+    QModelIndexList selectedItems = m_slidesSorterView->selectionModel()->selectedIndexes();
     if (selectedItems.count() == 0) {
         return slides;
     }
 
-    qSort(selectedItems.begin(), selectedItems.end());
-
-    foreach (const QModelIndex & index, selectedItems) {
+    foreach (const QModelIndex &index, selectedItems) {
         KoPAPageBase *page = m_view->kopaDocument()->pageByIndex(index.row (), false);
         if (page) {
             slides.append(page);
         }
     }
 
+    //order slides
+    QMap<int, KoPAPageBase*> map;
+    foreach (KoPAPageBase *slide, slides)
+        map.insert(m_view->kopaDocument()->pages(false).indexOf(slide), slide);
+    slides = map.values();
+
     return slides;
 }
 
 void KPrViewModeSlidesSorter::deleteSlide()
 {
-    // create a list with all selected slides
-    QList<KoPAPageBase*> selectedSlides = extractSelectedSlides();
-
-    if (!selectedSlides.empty() && m_view->kopaDocument()->pages().count() > selectedSlides.count()) {
-         KUndo2Command *cmd = new KoPAPageDeleteCommand(m_view->kopaDocument(), selectedSlides);
-        if (cmd) {
-            m_view->kopaDocument()->addCommand(cmd);
-        }
+    if (m_slidesSorterView->hasFocus()) {
+        // create a list with all selected slides
+        QList<KoPAPageBase*> selectedSlides = extractSelectedSlides();
+        m_slidesSorterModel->removeSlides(selectedSlides);
+    }
+    else if (m_customSlideShowView->hasFocus()) {
+        deleteSlidesFromCustomShow();
     }
 }
 
 void KPrViewModeSlidesSorter::addSlide()
 {
-    KoPAView *view = dynamic_cast<KoPAView *>(m_view);
-    if (view) {
-        view->insertPage();
-    }
+    m_slidesSorterModel->addNewSlide();
 }
 
 void KPrViewModeSlidesSorter::renameCurrentSlide()
 {
-    QModelIndexList selectedItems = m_slidesSorter->selectionModel()->selectedIndexes();
-    m_slidesSorter->edit(selectedItems.first());
-
+    QModelIndexList selectedItems = m_slidesSorterView->selectionModel()->selectedIndexes();
+    m_slidesSorterView->edit(selectedItems.first());
 }
 
 void KPrViewModeSlidesSorter::editCut()
@@ -351,37 +454,29 @@ void KPrViewModeSlidesSorter::editCut()
 void KPrViewModeSlidesSorter::editCopy()
 {
     // separate selected layers and selected shapes
-    QList<KoPAPageBase*> slides = extractSelectedSlides();;
-
-    if (!slides.empty()) {
-        // Copy Pages
-        KoPAOdfPageSaveHelper saveHelper(m_view->kopaDocument (), slides);
-        KoDrag drag;
-        drag.setOdf(KoOdf::mimeType(m_view->kopaDocument()->documentType()), saveHelper);
-        drag.addToClipboard();
-    }
+    QList<KoPAPageBase*> slides = extractSelectedSlides();
+    m_slidesSorterModel->copySlides(slides);
 }
 
 void KPrViewModeSlidesSorter::editPaste()
 {
-    KoPAView *view = dynamic_cast<KoPAView *>(m_view);
-    if (view) {
-        view->pagePaste();
-    }
+    m_slidesSorterModel->pasteSlides();
 }
 
 void KPrViewModeSlidesSorter::updateZoom(KoZoomMode::Mode mode, qreal zoom)
 {
     Q_UNUSED(mode);
-
     //at zoom 100%, iconSize is set in 200 x 200
     //KPrSlidesSorterDocumentModel uses iconSize function in decorate Role.
     setIconSize(QSize(qRound(zoom*200),qRound(zoom*200)));
-    m_slidesSorter->setIconSize(iconSize());
+    m_slidesSorterView->setIconSize(iconSize());
+    m_customSlideShowModel->setIconSize(iconSize());
+    m_customSlideShowView->setIconSize(iconSize());
 
     //update item size
-    QModelIndex item = m_documentModel->index(0, 0, QModelIndex());
-    m_slidesSorter->setItemSize(m_slidesSorter->visualRect(item));
+    QModelIndex item = m_slidesSorterModel->index(0, 0, QModelIndex());
+    m_slidesSorterView->setItemSize(m_slidesSorterView->visualRect(item));
+    m_customSlideShowView->setItemSize(m_slidesSorterView->visualRect(item));
 
     setZoom(qRound(zoom * 100.));
 }
@@ -391,7 +486,6 @@ void KPrViewModeSlidesSorter::setIconSize(QSize size)
     if (size != m_iconSize) {
         m_iconSize = size;
     }
-
 }
 
 void KPrViewModeSlidesSorter::loadZoomConfig()
@@ -425,21 +519,27 @@ int KPrViewModeSlidesSorter::zoom()
 
 void KPrViewModeSlidesSorter::slidesSorterContextMenu(QContextMenuEvent *event)
 {
-    QMenu menu(m_slidesSorter);
-
+    QMenu menu(m_slidesSorterView);
     menu.addAction(KIcon("document-new"), i18n("Add a new slide"), this, SLOT(addSlide()));
     menu.addAction(KIcon("edit-delete"), i18n("Delete selected slides"), this, SLOT(deleteSlide()));
 
-    menu.addAction(KIcon("edit-cut"), i18n("Cut"), this,  SLOT(editCut()));
-    menu.addAction(KIcon("edit-copy"), i18n("Copy"), this,  SLOT(editCopy()));
-    menu.addAction(KIcon("edit-paste"), i18n("Paste"), this, SLOT(editPaste()));
-
-    QModelIndexList selectedItems = m_slidesSorter->selectionModel()->selectedIndexes();
-
+    QModelIndexList selectedItems = m_slidesSorterView->selectionModel()->selectedIndexes();
     if (selectedItems.count() == 1 && selectedItems.first().isValid()) {
         menu.addAction(KIcon("edit-rename"), i18n("Rename"), this, SLOT(renameCurrentSlide()));
     }
 
+    menu.addSeparator();
+    menu.addAction(KIcon("edit-cut"), i18n("Cut"), this,  SLOT(editCut()));
+    menu.addAction(KIcon("edit-copy"), i18n("Copy"), this,  SLOT(editCopy()));
+    menu.addAction(KIcon("edit-paste"), i18n("Paste"), this, SLOT(editPaste()));
+    menu.exec(event->globalPos());
+    enableEditActions();
+}
+
+void KPrViewModeSlidesSorter::customSlideShowsContextMenu(QContextMenuEvent *event)
+{
+    QMenu menu(m_customSlideShowView);
+    menu.addAction(KIcon("edit-delete"), i18n("Delete selected slides"), this, SLOT(deleteSlidesFromCustomShow()));
     menu.exec(event->globalPos());
 }
 
@@ -459,19 +559,158 @@ void KPrViewModeSlidesSorter::disableEditActions()
     ac->action("edit_delete")->setEnabled(false);
 }
 
-void KPrViewModeSlidesSorter::selectSlides(const QList<KoPAPageBase *> &slides)
+void KPrViewModeSlidesSorter::customShowChanged(int showNumber)
 {
-    if (slides.isEmpty()) {
+    QString name = m_customSlideShowsList->itemText(showNumber);
+
+    bool panelVisible = true;
+    if (showNumber < 1) {
+        panelVisible = false;
+        name = QString();
+    }
+
+    //Change document current custom slide show
+    KPrDocument *doc = static_cast<KPrDocument *>(m_view->kopaDocument());
+    doc->setActiveCustomSlideShow(name);
+
+    //Decide show or hide Custom Slide Shows View
+    if (panelVisible != m_editCustomSlideShow) {
+        const bool animate = KGlobalSettings::graphicEffectsLevel() && KGlobalSettings::SimpleAnimationEffects;
+        const int duration = animate ? 250 : 1;
+        QPropertyAnimation *animation = new QPropertyAnimation(m_customSlideShowView, "maximumHeight");
+
+        if (!panelVisible) {
+            animation->setDuration(duration);
+            animation->setStartValue(m_customSlideShowView->maximumHeight());
+            animation->setEndValue(0);
+            //Deactivate tool buttons and edition
+            disableEditCustomShowButtons();
+            m_slidesSorterView->setAutoScroll(true);
+        }
+        else {
+            animation->setDuration(duration);
+            animation->setStartValue(0);
+            animation->setEndValue(m_slidesSorterView->height() / 2);
+            //Activate tool buttons and edition
+            enableEditCustomShowButtons();
+            m_slidesSorterView->setAutoScroll(false);
+        }
+        animation->start();
+    }
+
+    m_editCustomSlideShow = panelVisible;
+
+    //Populate Custom Slide Shows View if visible
+    if (panelVisible) {
+        m_customSlideShowModel->setActiveSlideShow(showNumber - 1);
+    }
+}
+
+void KPrViewModeSlidesSorter::deleteSlidesFromCustomShow()
+{
+    QModelIndexList selectedItems = m_customSlideShowView->selectionModel()->selectedIndexes();
+    if (selectedItems.count() == 0) {
         return;
     }
+    m_customSlideShowModel->removeSlidesByIndexes(selectedItems);
+}
 
-    m_slidesSorter->clearSelection();
+void KPrViewModeSlidesSorter::addSlideToCustomShow()
+{
+    // create a list with all selected slides
+    QList<KoPAPageBase*> selectedSlides = extractSelectedSlides();
+    int row = (m_customSlideShowView->currentIndex().row() >= 0) ? m_customSlideShowView->currentIndex().row() + 1 : 0;
+    m_customSlideShowModel->addSlides(selectedSlides, row);
+}
 
-    foreach (KoPAPageBase *slide, slides) {
-        int row = m_view->kopaDocument()->pageIndex(slide);
-        QModelIndex index = m_documentModel->index(row, 0, QModelIndex());
-        if (index.isValid()) {
-            m_slidesSorter->selectionModel()->select(index, QItemSelectionModel::Select);
-        }
+void KPrViewModeSlidesSorter::addCustomSlideShow()
+{
+    //We create a different default name for every SlideShow:
+    static int newSlideShowsCount = 1;
+    while(m_customSlideShowModel->customShowsNamesList().contains(i18n("Slide Show %1", newSlideShowsCount)))
+    {
+        ++newSlideShowsCount;
+    }
+
+    m_customSlideShowModel->addNewCustomShow(i18n("Slide Show %1", newSlideShowsCount));
+}
+
+
+void KPrViewModeSlidesSorter::removeCustomSlideShow()
+{
+    m_customSlideShowModel->removeCustomShow(m_customSlideShowsList->currentText());
+}
+
+void KPrViewModeSlidesSorter::updateCustomSlideShowsList()
+{
+    disconnect(m_customSlideShowsList, SIGNAL(currentIndexChanged(int)), this, SLOT(customShowChanged(int)));
+
+    QStringList slideShows;
+    slideShows << i18n("All slides") << (m_customSlideShowModel->customShowsNamesList());
+    m_customSlideShowsList->clear();
+    m_customSlideShowsList->addItems(slideShows);
+    int index = slideShows.indexOf(m_customSlideShowModel->activeCustomSlideShow());
+    m_customSlideShowsList->setCurrentIndex(index >= 0 ? index : 0);
+    customShowChanged(m_customSlideShowsList->currentIndex());
+
+    connect(m_customSlideShowsList, SIGNAL(currentIndexChanged(int)), this, SLOT(customShowChanged(int)));
+}
+
+void KPrViewModeSlidesSorter::renameCustomSlideShow()
+{
+    QString newName = m_customSlideShowsList->currentText();
+
+    if (newName == m_customSlideShowModel->activeCustomSlideShow()) {
+        return;
+    }
+
+    // Empty string is not allowed as a name, if the name is empty, revert back to previous name
+    if (newName.isEmpty()) {
+        updateCustomSlideShowsList();
+    }
+    //If the name is not already in use, use it, otherwise let the user know
+    else if (!m_customSlideShowModel->customShowsNamesList().contains(newName)) {
+       m_customSlideShowModel->renameCustomShow(m_customSlideShowModel->activeCustomSlideShow(), newName);
+       updateCustomSlideShowsList();
+    }
+    else {
+        KMessageBox Message;
+        Message.sorry(m_customSlideShowView, i18n("There cannot be two slideshows with the same name."), i18n("Error"),
+                      KMessageBox::Notify);
+        updateCustomSlideShowsList();
     }
 }
+
+void KPrViewModeSlidesSorter::enableEditCustomShowButtons()
+{
+    m_customSlideShowsList->setEditable(true);
+    connect(m_customSlideShowsList->lineEdit(), SIGNAL(editingFinished()), this, SLOT(renameCustomSlideShow()));
+    m_buttonDelCustomSlideShow->setEnabled(true);
+}
+
+void KPrViewModeSlidesSorter::disableEditCustomShowButtons()
+{
+    m_customSlideShowsList->setEditable(false);
+    m_buttonDelCustomSlideShow->setEnabled(false);
+    m_buttonAddSlideToCurrentShow->setEnabled(false);
+    m_buttonDelSlideFromCurrentShow->setEnabled(false);
+}
+
+void KPrViewModeSlidesSorter::manageAddRemoveSlidesButtons()
+{
+    m_buttonAddSlideToCurrentShow->setEnabled(m_slidesSorterView->hasFocus());
+    m_buttonDelSlideFromCurrentShow->setEnabled(m_customSlideShowView->hasFocus());
+    KActionCollection *ac = canvas()->canvasController()->actionCollection();
+    ac->action("edit_delete")->setEnabled(m_customSlideShowView->hasFocus() ||
+                                          !m_slidesSorterView->selectionModel()->selectedIndexes().isEmpty());
+}
+
+void KPrViewModeSlidesSorter::setActiveCustomSlideShow(int index)
+{
+    disconnect(m_customSlideShowsList, SIGNAL(currentIndexChanged(int)), this, SLOT(customShowChanged(int)));
+
+    m_customSlideShowsList->setCurrentIndex(index >= 0 && index < m_customSlideShowsList->count() ? index : 0);
+    customShowChanged(m_customSlideShowsList->currentIndex());
+
+    connect(m_customSlideShowsList, SIGNAL(currentIndexChanged(int)), this, SLOT(customShowChanged(int)));
+}
diff --git a/kpresenter/part/KPrViewModeSlidesSorter.h b/kpresenter/part/KPrViewModeSlidesSorter.h
index 240bd9e..a87c39c 100644
--- a/kpresenter/part/KPrViewModeSlidesSorter.h
+++ b/kpresenter/part/KPrViewModeSlidesSorter.h
@@ -31,9 +31,18 @@ class KoPAPageBase;
 class KPrSlidesSorterDocumentModel;
 class KPrSlidesManagerView;
 class KPrSelectionManager;
-
-//This view mode holds Slides Sorter view widget and
-//TODO: holds view and toolbar to manage custom slides shows
+class KPrCustomSlideShowsModel;
+class KPrCustomSlideShows;
+class QToolButton;
+class QComboBox;
+
+/**
+  * This view mode holds Slides Sorter view widget and
+  * holds view and toolbar to manage custom slide shows
+  * This class also manages all interaction between
+  * the standard GUI and the slides sorter view and between
+  * slides sorter view - custom slide shows view
+  */
 class KPrViewModeSlidesSorter : public KoPAViewMode
 {
     Q_OBJECT
@@ -41,7 +50,7 @@ public:
     KPrViewModeSlidesSorter(KoPAView *view, KoPACanvas *canvas);
     ~KPrViewModeSlidesSorter();
 
-    void paint(KoPACanvasBase *canvas, QPainter& painter, const QRectF &paintRect);
+    void paint(KoPACanvasBase *canvas, QPainter &painter, const QRectF &paintRect);
     void paintEvent(KoPACanvas *canvas, QPaintEvent *event);
     void tabletEvent(QTabletEvent *event, const QPointF &point);
     void mousePressEvent(QMouseEvent *event, const QPointF &point);
@@ -84,6 +93,9 @@ public:
      */
     void selectSlides(const QList<KoPAPageBase *> &slides);
 
+    /** Set active custom slide show */
+    void setActiveCustomSlideShow(int index);
+
 protected:
 
     /**
@@ -123,14 +135,19 @@ protected:
     void saveZoomConfig(int zoom);
 
 private:
-    KPrSlidesManagerView *m_slidesSorter;
-    KPrSlidesSorterDocumentModel *m_documentModel;
-    QSize m_iconSize;
+    KPrSlidesManagerView *m_slidesSorterView;
+    KPrSlidesManagerView *m_customSlideShowView;
+    KPrSlidesSorterDocumentModel *m_slidesSorterModel;
     int m_zoom;
-    KPrSelectionManager *m_selectionManagerSlidesSorter;
-
-public slots:
-    void editPaste();
+    QWidget *m_centralWidget;
+    KPrCustomSlideShowsModel *m_customSlideShowModel;
+    QSize m_iconSize;
+    bool m_editCustomSlideShow;
+    QToolButton *m_buttonAddCustomSlideShow;
+    QToolButton *m_buttonDelCustomSlideShow;
+    QToolButton *m_buttonAddSlideToCurrentShow;
+    QToolButton *m_buttonDelSlideFromCurrentShow;
+    QComboBox *m_customSlideShowsList;
 
 private slots:
     /** Changes the view active page to match the slides sorter current index*/
@@ -139,6 +156,9 @@ private slots:
     /** Update the slides sorter document model*/
     void updateSlidesSorterDocumentModel();
 
+    /** Updates custom slide Shows list */
+    void updateCustomSlideShowsList();
+
     /** Changes the view active page to match the slides sorter item selected*/
     void itemClicked(const QModelIndex);
 
@@ -157,6 +177,9 @@ private slots:
     /** copy the current selected slides*/
     void editCopy();
 
+    /** paste slides in slides sorter view*/
+    void editPaste();
+
     /** update the zoom of the Slides Sorter view*/
     void updateZoom(KoZoomMode::Mode mode, qreal zoom);
 
@@ -169,11 +192,41 @@ private slots:
     /** Provides a custom context menu for the slides sorter view*/
     void slidesSorterContextMenu(QContextMenuEvent *event);
 
-    /** Enable standard edit actions */
+    /** Provides a custom context menu for the slides sorter view*/
+    void customSlideShowsContextMenu(QContextMenuEvent *event);
+
+    /** Updates the UI according to the custom Show selected */
+    void customShowChanged(int showNumber);
+
+    /** Delete selected slides from the current custom slide show */
+    void deleteSlidesFromCustomShow();
+
+    /** Add slides selected on Slides Sorter view to the current custom slide show */
+    void addSlideToCustomShow();
+
+    /** Add a new slides custom Show */
+    void addCustomSlideShow();
+
+    /** Remove a new slides custom Show */
+    void removeCustomSlideShow();
+
+    /** Renames current custom slide show */
+    void renameCustomSlideShow();
+
+    /** Enable standard edit actions for Slides Sorter View */
     void enableEditActions();
 
-    /** Disable standard edit actions */
+    /** Disable standard edit actions for Slides Sorter View */
     void disableEditActions();
+
+    /** Enable edit buttons for Custom Slide Shows List*/
+    void enableEditCustomShowButtons();
+
+    /** Disable edit buttons for Custom Slide Shows View and List*/
+    void disableEditCustomShowButtons();
+
+    /** Enable/Disable add and remove slides buttons for Custom Slide Show View */
+    void manageAddRemoveSlidesButtons();
 };
 
 #endif // KPRVIEWMODESLIDESSORTER_H
diff --git a/kpresenter/part/commands/KPrSetCustomSlideShowsCommand.cpp b/kpresenter/part/commands/KPrSetCustomSlideShowsCommand.cpp
deleted file mode 100644
index 24b9996..0000000
--- a/kpresenter/part/commands/KPrSetCustomSlideShowsCommand.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/* This file is part of the KDE project
- * Copyright (C) 2008 Thorsten Zachmann <zachmann at kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or ( at your option ) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "KPrSetCustomSlideShowsCommand.h"
-
-#include "KPrCustomSlideShows.h"
-#include "KPrDocument.h"
-
-KPrSetCustomSlideShowsCommand::KPrSetCustomSlideShowsCommand( KPrDocument * doc, KPrCustomSlideShows * newSlideShows, KUndo2Command *parent )
-: KUndo2Command( parent )
-, m_doc( doc )
-, m_oldSlideShows( doc->customSlideShows() )
-, m_newSlideShows( newSlideShows )
-, m_deleteNewSlideShows( true )
-{
-    // TODO 2.1 change text to "Edit custom slide shows"
-    setText( i18nc("(qtundo-format)", "Edit") );
-}
-
-KPrSetCustomSlideShowsCommand::~KPrSetCustomSlideShowsCommand()
-{
-    if ( m_deleteNewSlideShows ) {
-        delete m_newSlideShows;
-    }
-    else {
-        delete m_oldSlideShows;
-    }
-}
-
-void KPrSetCustomSlideShowsCommand::redo()
-{
-    m_doc->setCustomSlideShows( m_newSlideShows );
-    m_deleteNewSlideShows = false;
-}
-
-void KPrSetCustomSlideShowsCommand::undo()
-{
-    m_doc->setCustomSlideShows( m_oldSlideShows );
-    m_deleteNewSlideShows = true;
-}
diff --git a/kpresenter/part/commands/KPrSetCustomSlideShowsCommand.h b/kpresenter/part/commands/KPrSetCustomSlideShowsCommand.h
deleted file mode 100644
index 6cc29e2..0000000
--- a/kpresenter/part/commands/KPrSetCustomSlideShowsCommand.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* This file is part of the KDE project
- * Copyright (C) 2008 Thorsten Zachmann <zachmann at kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or ( at your option ) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifndef KPRSETCUSTOMSLIDESHOWSCOMMAND_H
-#define KPRSETCUSTOMSLIDESHOWSCOMMAND_H
-
-#include <kundo2command.h>
-
-class KPrCustomSlideShows;
-class KPrDocument;
-
-class KPrSetCustomSlideShowsCommand : public KUndo2Command
-{
-public:
-    KPrSetCustomSlideShowsCommand( KPrDocument * doc, KPrCustomSlideShows * newSlideShows, KUndo2Command *parent = 0 );
-    virtual ~KPrSetCustomSlideShowsCommand();
-
-    /// redo the command
-    virtual void redo();
-    /// revert the actions done in redo
-    virtual void undo();
-
-private:
-    KPrDocument * m_doc;
-    KPrCustomSlideShows * m_oldSlideShows;
-    KPrCustomSlideShows * m_newSlideShows;
-    bool m_deleteNewSlideShows;
-};
-
-#endif /* KPRSETCUSTOMSLIDESHOWSCOMMAND_H */
diff --git a/kpresenter/part/tests/CMakeLists.txt b/kpresenter/part/tests/CMakeLists.txt
index f9b56a6..85b0e24 100644
--- a/kpresenter/part/tests/CMakeLists.txt
+++ b/kpresenter/part/tests/CMakeLists.txt
@@ -17,3 +17,34 @@ kde4_add_unit_test(TestCustomSlideShows TESTNAME stage-part-TestCustomSlideShows
 
 target_link_libraries(TestCustomSlideShows calligrastageprivate ${QT_QTTEST_LIBRARY})
 
+########### next target ###############
+
+set(TestEditCustomSlideShowsCommand_test_SRCS TestEditCustomSlideShowsCommand.cpp )
+
+kde4_add_unit_test(TestEditCustomSlideShowsCommand TESTNAME stage-part-TestEditCustomSlideShowsCommand  ${TestEditCustomSlideShowsCommand_test_SRCS})
+
+target_link_libraries(TestEditCustomSlideShowsCommand calligrastageprivate ${QT_QTTEST_LIBRARY})
+
+########### next target ###############
+
+set(TestAddCustomSlideShowCommand_test_SRCS TestAddCustomSlideShowCommand.cpp )
+
+kde4_add_unit_test(TestAddCustomSlideShowCommand TESTNAME stage-part-TestAddCustomSlideShowCommand  ${TestAddCustomSlideShowCommand_test_SRCS})
+
+target_link_libraries(TestAddCustomSlideShowCommand calligrastageprivate ${QT_QTTEST_LIBRARY})
+
+########### next target ###############
+
+set(TestDelCustomSlideShowCommand_test_SRCS TestDelCustomSlideShowCommand.cpp )
+
+kde4_add_unit_test(TestDelCustomSlideShowCommand TESTNAME stage-part-TestDelCustomSlideShowCommand  ${TestDelCustomSlideShowCommand_test_SRCS})
+
+target_link_libraries(TestDelCustomSlideShowCommand calligrastageprivate ${QT_QTTEST_LIBRARY})
+
+########### next target ###############
+
+set(TestRenameCustomSlideShowCommand_test_SRCS TestRenameCustomSlideShowCommand.cpp )
+
+kde4_add_unit_test(TestRenameCustomSlideShowCommand TESTNAME stage-part-TestRenameCustomSlideShowCommand  ${TestRenameCustomSlideShowCommand_test_SRCS})
+
+target_link_libraries(TestRenameCustomSlideShowCommand calligrastageprivate ${QT_QTTEST_LIBRARY})
diff --git a/kpresenter/part/ui/KPrConfigureSlideShowDialog.cpp b/kpresenter/part/ui/KPrConfigureSlideShowDialog.cpp
index 847a5a5..7117762 100644
--- a/kpresenter/part/ui/KPrConfigureSlideShowDialog.cpp
+++ b/kpresenter/part/ui/KPrConfigureSlideShowDialog.cpp
@@ -25,13 +25,14 @@
 #include <KDebug>
 
 #include "KPrDocument.h"
+#include "KPrView.h"
 #include "KPrCustomSlideShows.h"
-#include "KPrCustomSlideShowsDialog.h"
-#include "commands/KPrSetCustomSlideShowsCommand.h"
+#include "KPrViewModeSlidesSorter.h"
 
-KPrConfigureSlideShowDialog::KPrConfigureSlideShowDialog( KPrDocument *document, QWidget *parent )
+KPrConfigureSlideShowDialog::KPrConfigureSlideShowDialog( KPrDocument *document, KPrView *parent )
     : KDialog( parent )
     , m_document( document )
+    , m_view(parent)
 {
     QWidget *widget = new QWidget( this );
 
@@ -70,33 +71,9 @@ QString KPrConfigureSlideShowDialog::activeCustomSlideShow() const
 
 void KPrConfigureSlideShowDialog::editCustomSlideShow()
 {
-    KPrCustomSlideShows *finalSlideShows;
-
-    KPrCustomSlideShowsDialog dialog( this, m_document->customSlideShows(), m_document, finalSlideShows );
-    dialog.setModal( true );
-    if ( dialog.exec() == QDialog::Accepted ) {
-        m_document->addCommand( new KPrSetCustomSlideShowsCommand( m_document, finalSlideShows ) );
-        QString activeSlideShow = ui.slidesComboBox->currentText();
-        int index = ui.slidesComboBox->currentIndex();
-
-        // re-add all custom slide shows
-        ui.slidesComboBox->clear();
-        ui.slidesComboBox->addItem( i18n( "All slides" ) );
-        ui.slidesComboBox->addItems( finalSlideShows->names() );
-
-        QList<QString> customSlideShows = finalSlideShows->names();
-        if ( !customSlideShows.contains( activeSlideShow ) || index == 0 ) {
-            index = 0;
-        }
-        else {
-            index = customSlideShows.indexOf( activeSlideShow ) + 1;
-        }
-        Q_ASSERT( index < ui.slidesComboBox->count() );
-        ui.slidesComboBox->setCurrentIndex( index );
-    }
-    else {
-        delete finalSlideShows;
-    }
+    m_view->slidesSorter()->setActiveCustomSlideShow(ui.slidesComboBox->currentIndex());
+    m_view->showSlidesSorter();
+    accept();
 }
 
 #include "KPrConfigureSlideShowDialog.moc"
diff --git a/kpresenter/part/ui/KPrConfigureSlideShowDialog.h b/kpresenter/part/ui/KPrConfigureSlideShowDialog.h
index 1c7794a..e8b1902 100644
--- a/kpresenter/part/ui/KPrConfigureSlideShowDialog.h
+++ b/kpresenter/part/ui/KPrConfigureSlideShowDialog.h
@@ -21,6 +21,7 @@
 #define KPRCONFIGURESLIDESHOWDIALOG_H
 
 #include <KDialog>
+class KPrView;
 
 #include "ui_KPrConfigureSlideShow.h"
 
@@ -29,8 +30,9 @@ class KPrDocument;
 class KPrConfigureSlideShowDialog : public KDialog
 {
     Q_OBJECT
+
 public:
-    explicit KPrConfigureSlideShowDialog( KPrDocument *document, QWidget *parent=0 );
+    explicit KPrConfigureSlideShowDialog( KPrDocument *document, KPrView *parent=0 );
 
     QString activeCustomSlideShow() const;
 
@@ -40,6 +42,7 @@ private slots:
 private:
     Ui::KPrConfigureSlideShow ui;
     KPrDocument *m_document;
+    KPrView *m_view;
 };
 
 #endif // KPRCONFIGUREPRESENTERVIEWDIALOG_H
diff --git a/kpresenter/part/ui/KPrCustomSlideShowsDialog.cpp b/kpresenter/part/ui/KPrCustomSlideShowsDialog.cpp
deleted file mode 100644
index da697e0..0000000
--- a/kpresenter/part/ui/KPrCustomSlideShowsDialog.cpp
+++ /dev/null
@@ -1,301 +0,0 @@
-/* This file is part of the KDE project
-   Copyright (C) 2008 Carlos Licea <carlos.licea at kdemail.net>
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public
-   License as published by the Free Software Foundation; either
-   version 2 of the License, or (at your option) any later version.
-
-   This library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public License
-   along with this library; see the file COPYING.LIB.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
-*/
-
-#include "KPrCustomSlideShowsDialog.h"
-
-//Qt includes
-#include <QDebug>
-#include <QStringList>
-#include <QListWidgetItem>
-#include <QIcon>
-#include <QList>
-
-//KDE includes
-#include <KMessageBox>
-
-//Calligra includes
-#include <KoPAPageBase.h>
-#include <KPrDocument.h>
-
-//KPresenter includes
-#include <KPrCustomSlideShows.h>
-
-//so to be able to use it in a QVariant
-Q_DECLARE_METATYPE(KoPAPageBase*)
-
-KPrCustomSlideShowsDialog::KPrCustomSlideShowsDialog( QWidget *parent, KPrCustomSlideShows *slideShows,
-                                                      KPrDocument *doc, KPrCustomSlideShows *&newSlideShows )
-: QDialog(parent)
-, m_firstTime( true )
-, m_slideShows( new KPrCustomSlideShows(*slideShows) )
-, m_oldSlideShows(slideShows)
-, m_doc(doc)
-{
-    m_uiWidget.setupUi( this );
-    //Conections
-    connect( m_uiWidget.addButton, SIGNAL( clicked() ), this, SLOT( addCustomSlideShow() ) );
-    connect( m_uiWidget.okButton, SIGNAL( clicked() ), this, SLOT( accept() ) );
-    connect( m_uiWidget.deleteButton, SIGNAL( clicked() ), this, SLOT( deleteCustomSlideShow() ) );
-    connect( m_uiWidget.undoButton, SIGNAL( clicked() ), this, SLOT( loadCustomSlideShowsData() ) );
-    connect( m_uiWidget.addSlideButton, SIGNAL( clicked() ), this, SLOT( addSlidesToCurrentSlideShow() ) );
-    connect( m_uiWidget.customSlideShowsList, SIGNAL( currentItemChanged(QListWidgetItem*, QListWidgetItem*) ),
-             this, SLOT( changedSelectedSlideshow(QListWidgetItem*, QListWidgetItem*) ) );
-    connect( m_uiWidget.deleteSlideButton, SIGNAL( clicked() ),
-             this, SLOT( removeSlidesFromCurrentSlideShow() ) );
-    connect( m_uiWidget.currentSlidesList, SIGNAL( itemDoubleClicked( QListWidgetItem* ) ),
-             this, SLOT( removeSlidesFromCurrentSlideShow( QListWidgetItem* ) ) );
-    connect( m_uiWidget.availableSlidesList, SIGNAL( itemDoubleClicked( QListWidgetItem* ) ),
-             this, SLOT( addSlidesToCurrentSlideShow( QListWidgetItem* ) ) );
-
-    //Set the size of the icon
-    m_uiWidget.availableSlidesList->setIconSize( QSize(75,75) );
-    m_uiWidget.currentSlidesList->setIconSize( QSize(75,75) );
-
-    //Make the newSlideShows be the same as m_slideShows
-    newSlideShows = m_slideShows;
-
-    //Load the CustomSlideShows already created
-    loadCustomSlideShowsData();
-
-    //Load the available slides
-    int currentPage = 1;
-    QListWidgetItem * item;
-
-    foreach( KoPAPageBase* page, doc->pages() )
-    {
-        item = new QListWidgetItem( QIcon( page->thumbnail( QSize(75,75) ) ), i18n("Slide %1", currentPage++), m_uiWidget.availableSlidesList );
-        item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable );
-        item->setData( SlideData, QVariant::fromValue(page) );
-    }
-}
-
-KPrCustomSlideShowsDialog::~KPrCustomSlideShowsDialog()
-{
-}
-
-void KPrCustomSlideShowsDialog::addCustomSlideShow()
-{
-    //We create a different default name for every SlideShow:
-    static int newSlideShowsCount = 1;
-    while( m_slideShows->names().contains( i18n("New Slide Show %1", newSlideShowsCount) ) )
-    {
-        ++newSlideShowsCount;
-    }
-    QListWidgetItem * item = new QListWidgetItem( i18n("New Slide Show %1", newSlideShowsCount) );
-    item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
-    item->setData( SlideShowNameData, QVariant(i18n("New Slide Show %1", newSlideShowsCount)) );
-
-    //we add it to the display and the slideShows
-    m_uiWidget.customSlideShowsList->addItem( item );
-
-    m_slideShows->insert( i18n("New Slide Show %1", newSlideShowsCount), QList<KoPAPageBase*>() );
-
-    //Let the user choose the name
-    m_uiWidget.customSlideShowsList->editItem( item );
-}
-
-void KPrCustomSlideShowsDialog::renameCustomSlideShow( QListWidgetItem *item )
-{
-    //We disconect the signal so not to call this function over and over:
-    disconnect( m_uiWidget.customSlideShowsList, SIGNAL( itemChanged( QListWidgetItem*) ),
-                this, SLOT( renameCustomSlideShow(QListWidgetItem*) ) );
-
-    // Empty string is not allowed as a name, if the name is empty, revert back to previous name
-    if ( item->data( Qt::DisplayRole ).toString().isEmpty() ) {
-        item->setText( item->data( SlideShowNameData ).toString() );
-    }
-    //If the name is not already in use, use it
-    else if( !m_slideShows->names().contains( item->data( Qt::DisplayRole ).toString() ) )
-    {
-        m_slideShows->rename( item->data( SlideShowNameData ).toString(), item->data( Qt::DisplayRole ).toString() );
-        item->setData( SlideShowNameData, item->data( Qt::DisplayRole ) );
-    }
-    //otherwise let the user know
-    else
-    {
-        KMessageBox Message;
-        Message.sorry(this, i18n("There cannot be two slideshows with the same name."), i18n("Error"), KMessageBox::Notify );
-
-        item->setText( item->data( SlideShowNameData ).toString() );
-        m_uiWidget.customSlideShowsList->editItem( item );
-    }
-
-    //Reconect the rename function.
-    connect( m_uiWidget.customSlideShowsList, SIGNAL( itemChanged( QListWidgetItem*) ),
-             this, SLOT( renameCustomSlideShow(QListWidgetItem*) ) );
-}
-
-void KPrCustomSlideShowsDialog::deleteCustomSlideShow()
-{
-    //Ask the user if he is sure about it
-    KMessageBox Message;
-    int clickedButton = Message.warningContinueCancel(this, i18n("Are you sure you want to delete the selected slide show?"), i18n("Confirm action") );
-
-    if( clickedButton == KMessageBox::Cancel )
-    {
-        return;
-    }
-
-    QListWidgetItem* item = m_uiWidget.customSlideShowsList->currentItem();
-    //Use item, which points to current item, to calculate the row to
-    //take it from the widget:
-    m_uiWidget.customSlideShowsList->takeItem( m_uiWidget.customSlideShowsList->row(item) );
-    if( item )
-    {
-        m_slideShows->remove( item->data(SlideShowNameData).toString() );
-        delete item;
-    }
-    if( m_uiWidget.customSlideShowsList->count() == 0 )
-    {
-        m_selectedSlideShowName.clear();
-        m_uiWidget.currentSlidesList->clear();
-        m_uiWidget.addSlideButton->setEnabled( false );
-        m_uiWidget.deleteButton->setEnabled( false );
-    }
-}
-
-void KPrCustomSlideShowsDialog::loadCustomSlideShowsData()
-{
-    //We disconect the signal so not to call the rename function over and over:
-    disconnect( m_uiWidget.customSlideShowsList, SIGNAL( itemChanged( QListWidgetItem*) ),
-                this, SLOT( renameCustomSlideShow(QListWidgetItem*) ) );
-
-    //check if is our first load so to use the work already done
-    if( !m_firstTime )
-    {
-        delete m_slideShows;
-        m_slideShows = new KPrCustomSlideShows(*m_oldSlideShows);
-        m_uiWidget.customSlideShowsList->clear();
-    }
-    m_firstTime = false;
-
-    bool deleteEnabled = true;
-    if( m_oldSlideShows->names().size() == 0 )
-    {
-        deleteEnabled = false;
-    }
-    m_uiWidget.deleteButton->setEnabled( deleteEnabled );
-
-    //build, configure and insert every Item:
-    QListWidgetItem * item;
-    foreach( QString slideShowName, m_oldSlideShows->names() )
-    {
-        item = new QListWidgetItem( slideShowName, m_uiWidget.customSlideShowsList );
-        item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
-        item->setData( SlideShowNameData, QVariant(slideShowName) );
-    }
-
-    //clear the slides if no slideShow is left a selected
-    if( m_uiWidget.customSlideShowsList->count() == 0 )
-    {
-        m_uiWidget.currentSlidesList->clear();
-    }
-    //Reconect the rename function.
-    connect( m_uiWidget.customSlideShowsList, SIGNAL( itemChanged( QListWidgetItem*) ),
-             this, SLOT( renameCustomSlideShow(QListWidgetItem*) ) );
-}
-
-void KPrCustomSlideShowsDialog::changedSelectedSlideshow(QListWidgetItem* current, QListWidgetItem* previous)
-{
-    Q_UNUSED(previous);
-
-    //If we aren't selecting anything don't do anything
-    if( !current )
-    {
-        return;
-    }
-
-    m_uiWidget.currentSlidesList->clear();
-
-    //if we have selected a slideShow we can safelly try to add slides to it
-    m_uiWidget.addSlideButton->setEnabled( true );
-    //and allow to delete slideShows
-    m_uiWidget.deleteButton->setEnabled( true );
-
-    //get the slideShow and its pages
-    m_selectedSlideShowName = current->data( SlideShowNameData ).toString();
-    QList<KoPAPageBase*> pages = m_slideShows->getByName( m_selectedSlideShowName );
-
-    //insert them into the current slideShow list
-    QListWidgetItem * item;
-    foreach( KoPAPageBase* page, pages )
-    {
-        item = new QListWidgetItem( QIcon( page->thumbnail( QSize(75,75) ) ), i18n( "Slide %1", m_doc->pageIndex(page)+1 ), m_uiWidget.currentSlidesList );
-        item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable );
-        item->setData( SlideData, QVariant::fromValue<KoPAPageBase*>( page ) );
-    }
-}
-
-void KPrCustomSlideShowsDialog::addSlidesToCurrentSlideShow()
-{
-    //get the selected items and slideshow
-    QList<QListWidgetItem*> selectedPages = m_uiWidget.availableSlidesList->selectedItems();
-    QList<KoPAPageBase*> selectedSlideShow = m_slideShows->getByName( m_selectedSlideShowName );
-
-    //insert the slides at the end and update the Widget
-    foreach( QListWidgetItem* item, selectedPages )
-    {
-        KoPAPageBase* page( (item->data( SlideData ).value<KoPAPageBase*>()));
-        selectedSlideShow.append( page );
-
-        item = new QListWidgetItem( QIcon( page->thumbnail( QSize(75,75) ) ), i18n("Slide %1", m_doc->pageIndex(page)+1 ), m_uiWidget.currentSlidesList );
-        item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable );
-        item->setData( SlideData, QVariant::fromValue<KoPAPageBase*>( page ) );
-    }
-    //update the SlideShow with the resulting list
-    m_slideShows->update( m_selectedSlideShowName, selectedSlideShow );
-}
-
-void KPrCustomSlideShowsDialog::addSlidesToCurrentSlideShow( QListWidgetItem* currentItem )
-{
-    Q_UNUSED(currentItem);
-    if( !m_selectedSlideShowName.isNull() )
-    {
-        addSlidesToCurrentSlideShow();
-    }
-}
-
-void KPrCustomSlideShowsDialog::removeSlidesFromCurrentSlideShow()
-{
-    //get the selected items and slideshow
-    QList<QListWidgetItem*> selectedPages = m_uiWidget.currentSlidesList->selectedItems();
-    if( m_selectedSlideShowName.isEmpty())
-        return;
-
-    QList<KoPAPageBase*> selectedSlideShow = m_slideShows->getByName( m_selectedSlideShowName );
-
-    //remove the slides and update the widget
-    foreach( QListWidgetItem* item, selectedPages )
-    {
-        int row = m_uiWidget.currentSlidesList->row(item);
-        m_uiWidget.currentSlidesList->takeItem( row );
-        selectedSlideShow.removeAt( row );
-        delete item;
-    }
-    //update the selected SlideShow
-    m_slideShows->update( m_selectedSlideShowName, selectedSlideShow );
-}
-
-void KPrCustomSlideShowsDialog::removeSlidesFromCurrentSlideShow( QListWidgetItem* currentItem )
-{
-    Q_UNUSED(currentItem);
-    removeSlidesFromCurrentSlideShow();
-}
-
-#include "KPrCustomSlideShowsDialog.moc"
diff --git a/kpresenter/part/ui/KPrCustomSlideShowsDialog.h b/kpresenter/part/ui/KPrCustomSlideShowsDialog.h
deleted file mode 100644
index f5d53f9..0000000
--- a/kpresenter/part/ui/KPrCustomSlideShowsDialog.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* This file is part of the KDE project
-   Copyright (C) 2008 Carlos Licea <carlos.licea at kdemail.net>
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public
-   License as published by the Free Software Foundation; either
-   version 2 of the License, or (at your option) any later version.
-
-   This library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public License
-   along with this library; see the file COPYING.LIB.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
-*/
-
-#ifndef KPRCUSTOMSLIDESHOWSDIALOG_H
-#define KPRCUSTOMSLIDESHOWSDIALOG_H
-
-#include <QtGui/QDialog>
-
-#include "ui_KPrCustomSlideShowsDialog.h"
-
-class KPrCustomSlideShows;
-class KoPAPageBase;
-class QListWidgetItem;
-class KPrCustomSlideShows;
-class KPrDocument;
-
-class KPrCustomSlideShowsDialog : public QDialog
-{
-    Q_OBJECT
-
-public:
-    KPrCustomSlideShowsDialog( QWidget *parent, KPrCustomSlideShows *slideShows, KPrDocument *doc, KPrCustomSlideShows *&newSlideShows );
-    ~KPrCustomSlideShowsDialog();
-private Q_SLOTS:
-    void addCustomSlideShow();
-    void addSlidesToCurrentSlideShow();
-    void addSlidesToCurrentSlideShow( QListWidgetItem* currentItem );
-    void deleteCustomSlideShow();
-    void renameCustomSlideShow( QListWidgetItem *item );
-    void loadCustomSlideShowsData();
-    void changedSelectedSlideshow( QListWidgetItem *current, QListWidgetItem *previous );
-    void removeSlidesFromCurrentSlideShow();
-    void removeSlidesFromCurrentSlideShow( QListWidgetItem* currentItem );
-
-//     Q_SIGNALS:
-private:
-    enum {
-        SlideShowNameData = 33,
-        SlideData = 34
-    };
-
-    bool m_firstTime;
-    QString m_selectedSlideShowName;
-
-    Ui::CustomSlideShowsWidget m_uiWidget;
-    KPrCustomSlideShows *m_slideShows;
-    KPrCustomSlideShows *m_oldSlideShows;
-    KPrDocument *m_doc;
-};
-#endif
diff --git a/kpresenter/part/ui/KPrCustomSlideShowsDialog.ui b/kpresenter/part/ui/KPrCustomSlideShowsDialog.ui
deleted file mode 100644
index be25bc8..0000000
--- a/kpresenter/part/ui/KPrCustomSlideShowsDialog.ui
+++ /dev/null
@@ -1,223 +0,0 @@
-<ui version="4.0" >
- <class>CustomSlideShowsWidget</class>
- <widget class="QWidget" name="CustomSlideShowsWidget" >
-  <property name="windowModality" >
-   <enum>Qt::WindowModal</enum>
-  </property>
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>771</width>
-    <height>507</height>
-   </rect>
-  </property>
-  <property name="sizePolicy" >
-   <sizepolicy vsizetype="Minimum" hsizetype="Minimum" >
-    <horstretch>0</horstretch>
-    <verstretch>0</verstretch>
-   </sizepolicy>
-  </property>
-  <property name="windowTitle" >
-   <string>Custom Slideshows editor</string>
-  </property>
-  <layout class="QGridLayout" >
-   <item rowspan="5" row="0" column="0" >
-    <layout class="QVBoxLayout" >
-     <item>
-      <widget class="QLabel" name="label" >
-       <property name="sizePolicy" >
-        <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text" >
-        <string>Customs Slideshows</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QListWidget" name="customSlideShowsList" >
-       <property name="sizePolicy" >
-        <sizepolicy vsizetype="Expanding" hsizetype="Ignored" >
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="selectionMode" >
-        <enum>QAbstractItemView::SingleSelection</enum>
-       </property>
-       <property name="selectionBehavior" >
-        <enum>QAbstractItemView::SelectItems</enum>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="addButton" >
-       <property name="text" >
-        <string>Add new slideshow</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="deleteButton" >
-       <property name="text" >
-        <string>Delete slideshow</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item row="0" column="1" >
-    <widget class="QLabel" name="label_3" >
-     <property name="text" >
-      <string>Available Slides</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1" >
-    <widget class="QListWidget" name="availableSlidesList" >
-     <property name="dragEnabled" >
-      <bool>true</bool>
-     </property>
-     <property name="dragDropMode" >
-      <enum>QAbstractItemView::DropOnly</enum>
-     </property>
-     <property name="selectionMode" >
-      <enum>QAbstractItemView::ExtendedSelection</enum>
-     </property>
-     <property name="movement" >
-      <enum>QListView::Static</enum>
-     </property>
-     <property name="flow" >
-      <enum>QListView::LeftToRight</enum>
-     </property>
-     <property name="viewMode" >
-      <enum>QListView::IconMode</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1" >
-    <layout class="QHBoxLayout" >
-     <item>
-      <widget class="QLabel" name="label_2" >
-       <property name="text" >
-        <string>Current Slideshow:</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <spacer>
-       <property name="orientation" >
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0" >
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QPushButton" name="addSlideButton" >
-       <property name="enabled" >
-        <bool>false</bool>
-       </property>
-       <property name="text" >
-        <string>Add Slide</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="deleteSlideButton" >
-       <property name="text" >
-        <string>Delete Slide</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item row="3" column="1" >
-    <widget class="QListWidget" name="currentSlidesList" >
-     <property name="verticalScrollBarPolicy" >
-      <enum>Qt::ScrollBarAsNeeded</enum>
-     </property>
-     <property name="dragEnabled" >
-      <bool>true</bool>
-     </property>
-     <property name="dragDropMode" >
-      <enum>QAbstractItemView::DropOnly</enum>
-     </property>
-     <property name="movement" >
-      <enum>QListView::Static</enum>
-     </property>
-     <property name="flow" >
-      <enum>QListView::LeftToRight</enum>
-     </property>
-     <property name="viewMode" >
-      <enum>QListView::IconMode</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="1" >
-    <layout class="QHBoxLayout" >
-     <item>
-      <spacer>
-       <property name="orientation" >
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0" >
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QPushButton" name="undoButton" >
-       <property name="text" >
-        <string>Undo</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="okButton" >
-       <property name="text" >
-        <string>Ok</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="closeButton" >
-       <property name="text" >
-        <string>Close</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>closeButton</sender>
-   <signal>clicked()</signal>
-   <receiver>CustomSlideShowsWidget</receiver>
-   <slot>close()</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>719</x>
-     <y>381</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>452</x>
-     <y>393</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/libs/kopageapp/KoPADocument.cpp b/libs/kopageapp/KoPADocument.cpp
index 2a03e42..a88eac0 100644
--- a/libs/kopageapp/KoPADocument.cpp
+++ b/libs/kopageapp/KoPADocument.cpp
@@ -560,6 +560,13 @@ void KoPADocument::removePage( KoPAPageBase * page )
     addCommand( command );
 }
 
+
+void KoPADocument::removePages(QList<KoPAPageBase *> &pages)
+{
+    KoPAPageDeleteCommand *command = new KoPAPageDeleteCommand(this, pages);
+    addCommand(command);
+}
+
 void KoPADocument::pageRemoved( KoPAPageBase * page, KUndo2Command * parent )
 {
     Q_UNUSED( page );
diff --git a/libs/kopageapp/KoPADocument.h b/libs/kopageapp/KoPADocument.h
index 9347ae9..cfc9822 100644
--- a/libs/kopageapp/KoPADocument.h
+++ b/libs/kopageapp/KoPADocument.h
@@ -155,6 +155,15 @@ public:
      */
     virtual void removePage( KoPAPageBase * page );
 
+    /**
+     * Remove the given pages from the document
+     *
+     * This generates the command and adds the command that deletes the pages
+     *
+     * @param pages The list of pages that gets removed
+     */
+    virtual void removePages(QList<KoPAPageBase*> &pages);
+
     void addShape( KoShape *shape );
     void removeShape( KoShape* shape );
 
diff --git a/libs/kopageapp/KoPADocumentStructureDocker.cpp b/libs/kopageapp/KoPADocumentStructureDocker.cpp
index 02af382..a17e85c 100644
--- a/libs/kopageapp/KoPADocumentStructureDocker.cpp
+++ b/libs/kopageapp/KoPADocumentStructureDocker.cpp
@@ -380,7 +380,7 @@ void KoPADocumentStructureDocker::deleteItem()
         cmd = new KoShapeDeleteCommand( m_doc, selectedShapes );
     }
     else if (!selectedPages.isEmpty() && selectedPages.count() < m_doc->pages().count()) {
-        cmd = new KoPAPageDeleteCommand(m_doc, selectedPages);
+        m_doc->removePages(selectedPages);
     }
 
     if( cmd )


More information about the kde-doc-english mailing list