changeset 16796:1d1f02e0f6b4

GUI: enable clipboard content detection for terminal window context menu * libgui/qterminal/libqterminal/QTerminal.h, libgui/qterminal/libqterminal/QTerminal.cc (QTerminal::handleCustomContentMenuRequested): Use clinboard and tem window selection buffer to determine enable state of copy/paste actions. (QTerminal::QTerminal): save content actions for copy and paste to variables. * libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp, libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h (QUnixTerminalImpl::selectedText): New function. * libgui/qterminal/libqterminal/unix/TerminalView.cpp, libgui/qterminal/libqterminal/unix/TerminalView.h (TerminalView::selectedText): New function. * libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp, libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h (QWinTerminalImpl::selectedText): New function.
author John Donoghue <john.donoghue@ieee.org>
date Thu, 20 Jun 2013 22:04:58 -0400
parents cc1657be1ee7
children 38c1a421f082
files libgui/qterminal/libqterminal/QTerminal.h libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h libgui/qterminal/libqterminal/unix/TerminalView.cpp libgui/qterminal/libqterminal/unix/TerminalView.h libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h
diffstat 7 files changed, 43 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/qterminal/libqterminal/QTerminal.h
+++ b/libgui/qterminal/libqterminal/QTerminal.h
@@ -30,6 +30,8 @@
 #include <QColor>
 #include <QList>
 #include <QMenu>
+#include <QClipboard>
+#include <QApplication>
 
 class QTerminal : public QWidget
 {
@@ -45,11 +47,13 @@
 
   virtual ~QTerminal (void) { }
 
-  virtual void setTerminalFont(const QFont& font) = 0;
+  virtual void setTerminalFont (const QFont& font) = 0;
+
+  virtual void setSize (int h, int v) = 0;
 
-  virtual void setSize(int h, int v) = 0;
+  virtual void sendText (const QString& text) = 0;
 
-  virtual void sendText(const QString& text) = 0;
+  virtual QString selectedText () = 0;
 
   enum CursorType
     {
@@ -88,6 +92,11 @@
 
   virtual void handleCustomContextMenuRequested (const QPoint& at)
   {
+    QClipboard * cb = QApplication::clipboard ();
+
+    _paste_action->setEnabled (cb->text().length() > 0);
+    _copy_action->setEnabled (selectedText().length() > 0);
+    
     _contextMenu->move (mapToGlobal (at));
     _contextMenu->show ();
   }
@@ -102,10 +111,12 @@
 
     _contextMenu = new QMenu (this);
 
-    _contextMenu->addAction (QIcon (":/actions/icons/editcopy.png"),
+    _copy_action = _contextMenu->addAction (
+                             QIcon (":/actions/icons/editcopy.png"),
                              tr ("Copy"), this, SLOT (copyClipboard ()));
 
-    _contextMenu->addAction (QIcon (":/actions/icons/editpaste.png"),
+    _paste_action = _contextMenu->addAction (
+                            QIcon (":/actions/icons/editpaste.png"),
                             tr ("Paste"), this, SLOT (pasteClipboard ()));
 
     _contextMenu->addSeparator ();
@@ -132,6 +143,8 @@
 private:
 
     QMenu *_contextMenu;
+    QAction * _copy_action;
+    QAction * _paste_action;
 };
 
 #endif // QTERMINAL_H
--- a/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp
+++ b/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp
@@ -201,3 +201,7 @@
     m_terminalView->pasteClipboard();
 }
 
+QString QUnixTerminalImpl::selectedText ()
+{
+  return m_terminalView->selectedText ();
+}
--- a/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h
+++ b/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h
@@ -48,6 +48,8 @@
     void setSelectionColor (const QColor& color);
     void setCursorColor (bool useForegroundColor, const QColor& color);
 
+    QString selectedText();
+
 public slots:
     void copyClipboard();
     void pasteClipboard();
--- a/libgui/qterminal/libqterminal/unix/TerminalView.cpp
+++ b/libgui/qterminal/libqterminal/unix/TerminalView.cpp
@@ -2698,3 +2698,9 @@
   _lineSpacing = i;
   setVTFont(font()); // Trigger an update.
 }
+
+QString TerminalView::selectedText ()
+{
+  QString text = _screenWindow->selectedText (_preserveLineBreaks);
+  return text;
+}
--- a/libgui/qterminal/libqterminal/unix/TerminalView.h
+++ b/libgui/qterminal/libqterminal/unix/TerminalView.h
@@ -323,6 +323,8 @@
 
     void setSelection(const QString &t);
 
+    QString selectedText ();
+
     /**
      * Reimplemented.  Has no effect.  Use setVTFont() to change the font
      * used to draw characters in the display.
--- a/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp
+++ b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp
@@ -1461,3 +1461,12 @@
   if (! text.isEmpty ())
     sendText (text);
 }
+
+
+//////////////////////////////////////////////////////////////////////////////
+
+QString QWinTerminalImpl::selectedText ()
+{
+  QString selection = d->getSelection ();
+  return selection;
+}
--- a/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h
+++ b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h
@@ -60,6 +60,8 @@
   void setSelectionColor (const QColor& color);
   void setCursorColor (bool useForegoundColor, const QColor& color);
 
+  QString selectedText ();
+
 public slots:
   void copyClipboard (void);
   void pasteClipboard (void);