[kde-doc-english] [kate] part: GUI: "Clipboard History" menu in edit/popup

Christoph Cullmann cullmann at kde.org
Sun Nov 4 17:19:57 UTC 2012


Git commit 6367aa17b1716a2074c0675e4fbabbec3bc50c77 by Christoph Cullmann.
Committed on 04/11/2012 at 18:19.
Pushed by cullmann into branch 'master'.

GUI: "Clipboard History" menu in edit/popup
allows you to paste the latest xx things you copied/cutted, atm history size 10

M  +3    -1    part/data/katepartui.rc
M  +1    -3    part/document/katedocument.cpp
M  +1    -1    part/document/katedocument.h
M  +28   -1    part/utils/kateglobal.cpp
M  +26   -0    part/utils/kateglobal.h
M  +16   -4    part/view/kateview.cpp
M  +3    -2    part/view/kateview.h
M  +44   -0    part/view/kateviewhelpers.cpp
M  +16   -0    part/view/kateviewhelpers.h
M  +1    -1    part/view/kateviewinternal.cpp

http://commits.kde.org/kate/6367aa17b1716a2074c0675e4fbabbec3bc50c77

diff --git a/part/data/katepartui.rc b/part/data/katepartui.rc
index f5cdcb1..7e55a52 100644
--- a/part/data/katepartui.rc
+++ b/part/data/katepartui.rc
@@ -1,5 +1,5 @@
 <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
-<kpartgui name="KatePartView" version="65">
+<kpartgui name="KatePartView" version="66">
 <MenuBar>
   <Menu name="file" noMerge="1"><text>&File</text>
     <Action name="file_save" group="save_merge" />
@@ -16,6 +16,7 @@
     <Action name="edit_cut" group="edit_paste_merge" />
     <Action name="edit_copy" group="edit_paste_merge" />
     <Action name="edit_paste" group="edit_paste_merge" />
+    <Action name="edit_paste_menu" group="edit_paste_merge" />
     <Separator group="edit_paste_merge" />
     <Action name="edit_select_all" group="edit_select_merge" />
     <Action name="edit_deselect" group="edit_select_merge" />
@@ -130,6 +131,7 @@
   <Action name="edit_cut" group="popup_operations" />
   <Action name="edit_copy" group="popup_operations" />
   <Action name="edit_paste" group="popup_operations" />
+  <Action name="edit_paste_menu" group="popup_operations" />
   <Separator group="popup_operations" />
   <Action name="edit_select_all" group="popup_operations" />
   <Action name="edit_deselect" group="popup_operations" />
diff --git a/part/document/katedocument.cpp b/part/document/katedocument.cpp
index f9462b5..21e0a77 100644
--- a/part/document/katedocument.cpp
+++ b/part/document/katedocument.cpp
@@ -2825,10 +2825,8 @@ void KateDocument::del( KateView *view, const KTextEditor::Cursor& c )
   }
 }
 
-void KateDocument::paste ( KateView* view, QClipboard::Mode mode )
+void KateDocument::paste ( KateView* view, const QString &s )
 {
-  QString s = QApplication::clipboard()->text(mode);
-
   if (s.isEmpty())
     return;
 
diff --git a/part/document/katedocument.h b/part/document/katedocument.h
index b7a97aa..327049c 100644
--- a/part/document/katedocument.h
+++ b/part/document/katedocument.h
@@ -725,7 +725,7 @@ Q_SIGNALS:
     void del(           KateView *view, const KTextEditor::Cursor& );
     void transpose(     const KTextEditor::Cursor& );
 
-    void paste ( KateView* view, QClipboard::Mode = QClipboard::Clipboard );
+    void paste ( KateView* view, const QString &s );
 
   public:
     void indent ( KTextEditor::Range range, int change );
diff --git a/part/utils/kateglobal.cpp b/part/utils/kateglobal.cpp
index 36133ee..c4df0e8 100644
--- a/part/utils/kateglobal.cpp
+++ b/part/utils/kateglobal.cpp
@@ -49,8 +49,8 @@
 #include <kiconloader.h>
 
 #include <QtCore/QPointer>
-
 #include <QtGui/QBoxLayout>
+#include <QApplication>
 
 KateGlobal *KateGlobal::s_self = 0;
 
@@ -542,4 +542,31 @@ void KateGlobal::updateColorPalette()
   m_rendererConfig->updateConfig();
 }
 
+void KateGlobal::copyToClipboard (const QString &text)
+{
+  /**
+   * empty => nop
+   */
+  if (text.isEmpty())
+    return;
+  
+  /**
+   * move to clipboard
+   */
+  QApplication::clipboard()->setText (text, QClipboard::Clipboard);
+  
+  /**
+   * remember in history
+   * cut after 10 entries
+   */
+  m_clipboardHistory.prepend (text);
+  if (m_clipboardHistory.size () > 10)
+    m_clipboardHistory.removeLast ();
+  
+  /**
+   * notify about change
+   */
+  emit clipboardHistoryChanged ();
+}
+
 // kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/part/utils/kateglobal.h b/part/utils/kateglobal.h
index 0464de6..491e8f8 100644
--- a/part/utils/kateglobal.h
+++ b/part/utils/kateglobal.h
@@ -410,6 +410,27 @@ class KATEPART_TESTS_EXPORT KateGlobal : public KTextEditor::Editor, public KTex
     KTextEditor::TemplateScript* registerTemplateScript (QObject* owner, const QString& script);
     void unregisterTemplateScript(KTextEditor::TemplateScript* templateScript);
 
+    /**
+     * Copy text to clipboard an remember it in the history
+     * @param text text to copy to clipboard, does nothing if empty!
+     */
+    void copyToClipboard (const QString &text);
+    
+    /**
+     * Clipboard history, filled with text we ever copied
+     * to clipboard via copyToClipboard.
+     */
+    const QStringList &clipboardHistory () const
+    {
+        return m_clipboardHistory;
+    }
+    
+  Q_SIGNALS:
+    /**
+     * Emitted if the history of clipboard changes via copyToClipboard
+     */
+    void clipboardHistoryChanged ();
+    
   private Q_SLOTS:
     void updateColorPalette();
 
@@ -535,6 +556,11 @@ class KATEPART_TESTS_EXPORT KateGlobal : public KTextEditor::Editor, public KTex
      * session config
      */
     KSharedConfig::Ptr m_sessionConfig;
+    
+    /**
+     * clipboard history
+     */
+    QStringList m_clipboardHistory;
 };
 
 #endif
diff --git a/part/view/kateview.cpp b/part/view/kateview.cpp
index e9822d9..dafe153 100644
--- a/part/view/kateview.cpp
+++ b/part/view/kateview.cpp
@@ -346,7 +346,10 @@ void KateView::setupActions()
 
   m_copy = a = ac->addAction(KStandardAction::Copy, this, SLOT(copy()));
   a->setWhatsThis(i18n( "Use this command to copy the currently selected text to the system clipboard."));
-
+  
+  m_pasteMenu = ac->addAction("edit_paste_menu", new KatePasteMenu (i18n("Clipboard &History"), this));
+  connect (KateGlobal::self(), SIGNAL(clipboardHistoryChanged()), this, SLOT(slotClipboardHistoryChanged()));
+   
   if (!m_doc->readOnly())
   {
     a = ac->addAction(KStandardAction::Save, m_doc, SLOT(documentSave()));
@@ -449,6 +452,7 @@ void KateView::setupActions()
   {
     m_cut->setEnabled (false);
     m_paste->setEnabled (false);
+    m_pasteMenu->setEnabled (false);
     m_editUndo = 0;
     m_editRedo = 0;
   }
@@ -678,6 +682,7 @@ void KateView::setupActions()
   //widget and setting the shortcut context
   setupEditActions();
   setupCodeFolding();
+  slotClipboardHistoryChanged ();
 
   ac->addAssociatedWidget(m_viewInternal);
 
@@ -1155,6 +1160,7 @@ void KateView::slotReadWriteChanged ()
 
   m_cut->setEnabled (m_doc->isReadWrite() && (selection() || m_config->smartCopyCut()));
   m_paste->setEnabled (m_doc->isReadWrite());
+  m_pasteMenu->setEnabled (m_doc->isReadWrite() && !KateGlobal::self()->clipboardHistory().isEmpty());
   m_setEndOfLine->setEnabled (m_doc->isReadWrite());
 
   QStringList l;
@@ -1177,6 +1183,11 @@ void KateView::slotReadWriteChanged ()
     m_searchBar->slotReadWriteChanged ();
 }
 
+void KateView::slotClipboardHistoryChanged ()
+{
+  m_pasteMenu->setEnabled (m_doc->isReadWrite() && !KateGlobal::self()->clipboardHistory().isEmpty());
+}
+
 void KateView::slotUpdateUndo()
 {
   if (m_doc->readOnly())
@@ -2097,7 +2108,8 @@ void KateView::copy() const
     m_viewInternal->moveEdge(KateViewInternal::left, false);
   }
 
-  QApplication::clipboard()->setText(text);
+  // copy to clipboard and our history!
+  KateGlobal::self()->copyToClipboard (text);
 }
 
 void KateView::applyWordWrap ()
@@ -2272,9 +2284,9 @@ void KateView::sendCompletionAborted()
   emit completionAborted(this);
 }
 
-void KateView::paste( )
+void KateView::paste(const QString *textToPaste)
 {
-  m_doc->paste( this );
+  m_doc->paste( this, textToPaste ? *textToPaste : QApplication::clipboard()->text(QClipboard::Clipboard) );
   emit selectionChanged (this);
   m_viewInternal->repaint();
 }
diff --git a/part/view/kateview.h b/part/view/kateview.h
index 8ad8d4b..8d06906 100644
--- a/part/view/kateview.h
+++ b/part/view/kateview.h
@@ -114,8 +114,7 @@ class KATEPART_TESTS_EXPORT KateView : public KTextEditor::View,
   // KTextEditor::ClipboardInterface
   //
   public Q_SLOTS:
-    // TODO: Factor out of m_viewInternal
-    void paste();
+    void paste(const QString *textToPaste = 0);
     void cut();
     void copy() const;
 
@@ -564,6 +563,7 @@ class KATEPART_TESTS_EXPORT KateView : public KTextEditor::View,
     void switchToCmdLine ();
     void switchToConsole ();
     void slotReadWriteChanged ();
+    void slotClipboardHistoryChanged ();
 
   Q_SIGNALS:
     void dropEventPass(QDropEvent*);
@@ -594,6 +594,7 @@ class KATEPART_TESTS_EXPORT KateView : public KTextEditor::View,
     QList<QAction*>        m_editActions;
     KAction*               m_editUndo;
     KAction*               m_editRedo;
+    KAction*               m_pasteMenu;
     KRecentFilesAction*    m_fileRecent;
     KToggleAction*         m_toggleFoldingMarkers;
     KToggleAction*         m_toggleIconBar;
diff --git a/part/view/kateviewhelpers.cpp b/part/view/kateviewhelpers.cpp
index a83f41b..626b611 100644
--- a/part/view/kateviewhelpers.cpp
+++ b/part/view/kateviewhelpers.cpp
@@ -2565,6 +2565,50 @@ void KateViewBar::hideEvent(QHideEvent* event)
 
 //END KateViewBar related classes
 
+KatePasteMenu::KatePasteMenu (const QString& text, KateView *view)
+  : KActionMenu(text, view)
+  , m_view (view)
+{
+  connect(menu(),SIGNAL(aboutToShow()),this,SLOT(slotAboutToShow()));
+}
+
+void KatePasteMenu::slotAboutToShow()
+{
+  menu()->clear ();
+  
+  /**
+   * insert complete paste history
+   */
+  int i = 0;
+  Q_FOREACH (const QString &text, KateGlobal::self()->clipboardHistory()) {
+    /**
+     * get text for the menu ;)
+     */
+    QString leftPart = text.left(48).replace ("\n", " ");
+    QAction *a=menu()->addAction ( leftPart + "...", this, SLOT(paste()));
+    a->setData(i++);
+  }
+}
+
+void KatePasteMenu::paste ()
+{
+  if (!sender())
+    return;
+  
+  QAction *action = qobject_cast<QAction*>(sender());
+  if (!action)
+    return;
+  
+  // get index
+  int i = action->data().toInt();
+  if (i >= KateGlobal::self()->clipboardHistory().size())
+    return;
+  
+  // paste
+  m_view->paste (&KateGlobal::self()->clipboardHistory()[i]);
+}
+
+
 #include "kateviewhelpers.moc"
 
 // kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/part/view/kateviewhelpers.h b/part/view/kateviewhelpers.h
index 670b3ba..88ec2e5 100644
--- a/part/view/kateviewhelpers.h
+++ b/part/view/kateviewhelpers.h
@@ -24,6 +24,7 @@
 #include <kselectaction.h>
 #include <kencodingprober.h>
 #include <klineedit.h>
+#include <KActionMenu>
 
 #include <QtGui/QPixmap>
 #include <QtGui/QColor>
@@ -480,6 +481,21 @@ class KateCmdLineEdit : public KLineEdit
     QTimer *m_hideTimer;
 };
 
+class KatePasteMenu : public KActionMenu
+{
+  Q_OBJECT
+
+  public:
+    KatePasteMenu (const QString& text, KateView *view);
+
+  private:
+    KateView *m_view;
+
+  private Q_SLOTS:
+    void slotAboutToShow();
+    void paste ();
+};
+
 #endif
 
 // kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/part/view/kateviewinternal.cpp b/part/view/kateviewinternal.cpp
index 5551e06..d1f1a09 100644
--- a/part/view/kateviewinternal.cpp
+++ b/part/view/kateviewinternal.cpp
@@ -2825,7 +2825,7 @@ void KateViewInternal::mouseReleaseEvent( QMouseEvent* e )
 
       if( doc()->isReadWrite() )
       {
-        doc()->paste( m_view, QClipboard::Selection );
+        doc()->paste( m_view, QApplication::clipboard()->text(QClipboard::Selection) );
         repaint();
       }
 


More information about the kde-doc-english mailing list