Git commit f605ff01d8429d7f4b548e15e81f5cc4f6339b76 by Thomas Friedrichsmeier. Committed on 29/09/2018 at 14:47. Pushed by tfry into branch 'master'.
Allow to reference current script file name in plugins (untested) M +1 -0 ChangeLog M +3 -2 doc/rkwardplugins/index.docbook M +8 -2 rkward/plugin/rkstandardcomponent.cpp M +2 -1 rkward/windows/rkcommandeditorwindow.cpp https://commits.kde.org/rkward/f605ff01d8429d7f4b548e15e81f5cc4f6339b76 diff --git a/ChangeLog b/ChangeLog index f794e6ff..13fa1374 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,5 @@ --- Version 0.7.1 - UNRELEASED +- Allow to reference current script file in plugins TODO: Test this - Add various live-preview options for R scripts, including a preview of R markdown rendering - Make it possible to "link" to specific settings pages from the internal documentation - Slighlty less confusing output in case a package is installed from require(), such as in many plugins diff --git a/doc/rkwardplugins/index.docbook b/doc/rkwardplugins/index.docbook index 39c04bd1..516bfe45 100644 --- a/doc/rkwardplugins/index.docbook +++ b/doc/rkwardplugins/index.docbook @@ -1702,9 +1702,10 @@ This chapter contains information on some topics that are useful only to certain </sect1> <sect1 id="current_object"> -<title>Referencing the current object</title> +<title>Referencing the current object or current file</title> <para> - For many plugins it is desirable to work on the <quote>current</quote> object. For instance a <quote>sort</quote> plugin could pre-select the data.frame that is currently being edited for sorting. The name of the current object is available to plugins as a pre-defined property called <parameter>current_object</parameter>. You can connect to this property in the usual way. If no object is current, the property equates to an empty string. + For many plugins it is desirable to work on the <quote>current</quote> object. For instance a <quote>sort</quote> plugin could pre-select the data.frame that is currently being edited for sorting. The name of the current object is available to plugins as a pre-defined property called <parameter>current_object</parameter>. You can connect to this property in the usual way. If no object is current, the property equates to an empty string. Similarly, the url of the current script file + is accessible as a pre-defined property called <parameter>current_filename</parameter>. That property is empty if no script file is currently being edited, or the script file has not been saved, yet. </para> <para> Currently the <parameter>current_object</parameter> can only be of class <function>data.frame</function>, but please do not rely on this, since this will be extended to other types of data in the future. If you are interested in <function>data.frame</function> objects, only, connect to the <parameter>current_dataframe</parameter> property, instead. Alternatively, you can enforce type requirements by using appropriate constraints on your <command><varslot></command>s, or by using <link linkend="logic_scripted">GUI logic scripting</link>. diff --git a/rkward/plugin/rkstandardcomponent.cpp b/rkward/plugin/rkstandardcomponent.cpp index 89538c00..95d05d06 100644 --- a/rkward/plugin/rkstandardcomponent.cpp +++ b/rkward/plugin/rkstandardcomponent.cpp @@ -2,7 +2,7 @@ rkstandardcomponent - description ------------------- begin : Sun Feb 19 2006 - copyright : (C) 2006-2016 by Thomas Friedrichsmeier + copyright : (C) 2006-2018 by Thomas Friedrichsmeier email : [email protected] ***************************************************************************/ @@ -80,13 +80,19 @@ RKStandardComponent::RKStandardComponent (RKComponent *parent_component, QWidget RKComponentPropertyRObjects *current_object_property = new RKComponentPropertyRObjects (this, false); RKComponentPropertyRObjects *current_dataframe_property = new RKComponentPropertyRObjects (this, false); + RKComponentPropertyBase *current_filename_property = new RKComponentPropertyBase (this, false); current_object_property->setInternal (true); current_dataframe_property->setInternal (true); + current_filename_property->setInternal (false); RKMDIWindow *w = RKWorkplace::mainWorkplace ()->activeWindow (RKMDIWindow::AnyWindowState); - if (w) current_object_property->setValue (w->globalContextProperty ("current_object")); + if (w) { + current_object_property->setValue (w->globalContextProperty ("current_object")); + current_filename_property->setValue (w->globalContextProperty ("current_filename")); + } if (current_object_property->objectValue () && current_object_property->objectValue ()->isDataFrame ()) current_dataframe_property->setObjectValue (current_object_property->objectValue ()); addChild ("current_object", current_object_property); addChild ("current_dataframe", current_dataframe_property); + addChild ("current_filename", current_filename_property); // open the main description file for parsing XMLHelper* xml = getXmlHelper (); diff --git a/rkward/windows/rkcommandeditorwindow.cpp b/rkward/windows/rkcommandeditorwindow.cpp index e0d29772..b924a0d8 100644 --- a/rkward/windows/rkcommandeditorwindow.cpp +++ b/rkward/windows/rkcommandeditorwindow.cpp @@ -208,7 +208,8 @@ RKCommandEditorWindow::RKCommandEditorWindow (QWidget *parent, const QUrl _url, preview_widget->hide (); layout->addWidget(preview_splitter); - connect (m_doc, &KTextEditor::Document::documentUrlChanged, this, &RKCommandEditorWindow::updateCaption); + setGlobalContextProperty ("current_filename", m_doc->url ().url ()); + connect (m_doc, &KTextEditor::Document::documentUrlChanged, [this]() { updateCaption(); setGlobalContextProperty ("current_filename", m_doc->url ().url ()); }); connect (m_doc, &KTextEditor::Document::modifiedChanged, this, &RKCommandEditorWindow::updateCaption); // of course most of the time this causes a redundant call to updateCaption. Not if a modification is undone, however. #ifdef __GNUC__ #warning remove this in favor of KTextEditor::Document::restore()
