Git commit 4ec38cf969af48c824cd1fe58e6c5a64e200c79e by Yuri Chornoivan.
Committed on 14/01/2019 at 17:30.
Pushed by yurchor into branch 'master'.

Copy root value or (x,y) pair to clipboard

BUG: 308168
Differential Revision: https://phabricator.kde.org/D17403

M  +23   -1    doc/index.docbook
M  +25   -1    kmplot/maindlg.cpp
M  +3    -0    kmplot/maindlg.h
M  +10   -0    kmplot/view.cpp
M  +6    -0    kmplot/view.h

https://commits.kde.org/kmplot/4ec38cf969af48c824cd1fe58e6c5a64e200c79e

diff --git a/doc/index.docbook b/doc/index.docbook
index 13b7b4c..0af1f56 100644
--- a/doc/index.docbook
+++ b/doc/index.docbook
@@ -406,9 +406,31 @@ 
url="http://edu.kde.org/";>http://edu.kde.org/</ulink></para></abstract>
                </varlistentry>
        </variablelist>
 
-       <para>Depending on the plot type, there will also be up to three tools 
available:</para>
+       <para>Depending on the plot type, there will also be up to five tools 
available:</para>
 
        <variablelist>
+               <varlistentry>
+                       <term><menuchoice><guimenuitem>Copy (x, y)</guimenuitem>
+                               </menuchoice></term>
+                       <listitem>
+                               <para>Copies the current value on the plot to 
the system clipboard.
+                                       This tool can be useful for creating 
tables of function values outside of &kmplot;.
+                               </para>
+                       </listitem>
+               </varlistentry>
+
+               <varlistentry>
+                       <term><menuchoice><guimenuitem>Copy Root 
Value</guimenuitem>
+                               </menuchoice></term>
+                       <listitem>
+                            <para>Copies the root <literal>x</literal> value 
to the system clipboard.
+                                       Only up to the first five digits after 
the decimal point can be copied.
+                                        Use some <ulink 
url="https://en.wikipedia.org/wiki/Computer_algebra_system";>computer algebra 
system</ulink> to determine this root with arbitrary precision.
+                                       This tool is only available when the 
current tracking position is close to a root.
+                               </para>
+                       </listitem>
+               </varlistentry>
+
                <varlistentry>
                        <term><menuchoice><guimenuitem>Plot 
Area...</guimenuitem>
                                </menuchoice></term>
diff --git a/kmplot/maindlg.cpp b/kmplot/maindlg.cpp
index f6a6b86..858b092 100644
--- a/kmplot/maindlg.cpp
+++ b/kmplot/maindlg.cpp
@@ -26,6 +26,7 @@
 #include "maindlg.h"
 
 // Qt includes
+#include <QClipboard>
 #include <QDebug>
 #include <QFileDialog>
 #include <QIcon>
@@ -131,7 +132,8 @@ MainDlg::MainDlg(QWidget *parentWidget, QObject *parent, 
const QVariantList& ) :
                KParts::ReadWritePart( parent ),
                m_recentFiles( 0 ),
                m_modified(false),
-               m_parent(parentWidget)
+               m_parent(parentWidget),
+               m_rootValue( 0 )
 {
        assert( !m_self ); // this class should only be constructed once
        m_self = this;
@@ -389,6 +391,28 @@ void MainDlg::setupActions()
        m_popupmenu->addAction( mnuMinValue );
        m_popupmenu->addAction( mnuMaxValue );
        m_popupmenu->addAction( mnuArea );
+
+       QAction * copyXY = actionCollection()->addAction( "copyXY" );
+       copyXY->setText(i18n("Copy (x, y)"));
+       connect( copyXY, &QAction::triggered, []{
+               QClipboard * cb = QApplication::clipboard();
+               QPointF currentXY = View::self()->getCrosshairPosition();
+               cb->setText( i18nc("Copied pair of coordinates (x, y)", "(%1, 
%2)", QLocale().toString( currentXY.x(), 'f', 5 ), QLocale().toString( 
currentXY.y(), 'f', 5 )), QClipboard::Clipboard );
+       } );
+       m_popupmenu->addAction( copyXY );
+
+       QAction * copyRootValue = actionCollection()->addAction( 
"copyRootValue" );
+       copyRootValue->setText(i18n("Copy Root Value"));
+       connect( View::self(), &View::updateRootValue, [this, copyRootValue]( 
bool haveRoot, double rootValue ){
+               copyRootValue->setVisible(haveRoot);
+               m_rootValue = rootValue;
+       } );
+       connect( copyRootValue, &QAction::triggered, [this]{
+               QClipboard * cb = QApplication::clipboard();
+               cb->setText( QLocale().toString( m_rootValue, 'f', 5 ), 
QClipboard::Clipboard );
+       } );
+       m_popupmenu->addAction( copyRootValue );
+
        //END function popup menu
 }
 
diff --git a/kmplot/maindlg.h b/kmplot/maindlg.h
index 1cf5a68..0f57b79 100644
--- a/kmplot/maindlg.h
+++ b/kmplot/maindlg.h
@@ -215,6 +215,9 @@ private:
        /// A pointer to ourselves
        static MainDlg * m_self;
 
+       /// Root value for copying into clipboard
+       double m_rootValue;
+
 protected slots:
        /**
        * When you click on a File->Open Recent file, it'll open
diff --git a/kmplot/view.cpp b/kmplot/view.cpp
index 44761f0..c1efba5 100644
--- a/kmplot/view.cpp
+++ b/kmplot/view.cpp
@@ -96,6 +96,7 @@ View::View( bool readOnly, QMenu * functionPopup, QWidget* 
parent )
     setAttribute( Qt::WA_StaticContents );
        
        m_haveRoot = false;
+       emit updateRootValue( false, 0 );
        m_xmin = m_xmax = m_ymin = m_ymax = 0.0;
        m_printHeaderTable = false;
        m_printBackground = false;
@@ -3511,10 +3512,14 @@ bool View::updateCrosshairPosition()
                                        str += i18n("root") + ":  x" + 
SubscriptZeroSymbol + " = ";
                                        setStatusBar( 
str+QString().sprintf("%+.5f", x0), RootSection );
                                        m_haveRoot=true;
+                                       emit updateRootValue( true, x0 );
                                }
                        }
                        else
+                       {
                                m_haveRoot=false;
+                               emit updateRootValue( false, 0 );
+                       }
                }
 
                // For Cartesian plots, only adjust the cursor position if it 
is not at the ends of the view
@@ -4248,6 +4253,11 @@ void View::setPrintHeight( double height )
        m_printHeight = height;
 }
 
+QPointF View::getCrosshairPosition() const
+{
+       return m_crosshairPosition;
+}
+
 //END class View
 
 
diff --git a/kmplot/view.h b/kmplot/view.h
index 2ff6d4c..0762f1f 100644
--- a/kmplot/view.h
+++ b/kmplot/view.h
@@ -209,6 +209,11 @@ class View : public QWidget
                        SectionCount            = 4
                };
 
+               /**
+                * Crosshair position in real coordinates
+                */
+               QPointF getCrosshairPosition() const;
+
        public slots:
                /// Called when the user want to cancel the drawing
                void stopDrawing();
@@ -235,6 +240,7 @@ class View : public QWidget
        
        signals:
                void setStatusBarText(const QString &);
+               void updateRootValue(bool haveRoot, double rootValue);
        
        protected:
                /// called when focus is lost

Reply via email to