]> git.lyx.org Git - features.git/commitdiff
Fix bug #991.
authorRichard Heck <rikiheck@lyx.org>
Fri, 20 Apr 2018 03:33:40 +0000 (23:33 -0400)
committerRichard Kimberly Heck <rikiheck@lyx.org>
Wed, 6 Jun 2018 02:26:16 +0000 (22:26 -0400)
Patch adapts Georg's work on #7404 to this case.

src/frontends/qt4/GuiDocument.cpp
src/frontends/qt4/GuiDocument.h
src/frontends/qt4/ui/LocalLayoutUi.ui
src/frontends/qt4/ui/PreambleUi.ui

index 3ed61c8b1b27b283db8ce838bcf030d02a04fbda..ba6963c4021da6098e0d1a63216ea0634bffbf6e 100644 (file)
 #include "insets/InsetListingsParams.h"
 
 #include "support/debug.h"
+#include "support/docstream.h"
 #include "support/FileName.h"
 #include "support/filetools.h"
 #include "support/gettext.h"
 #include "support/lassert.h"
 #include "support/lstrings.h"
+#include "support/TempFile.h"
 
 #include "frontends/alert.h"
 
@@ -472,6 +474,7 @@ PreambleModule::PreambleModule(QWidget * parent)
        connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
        connect(findLE, SIGNAL(textEdited(const QString &)), this, SLOT(checkFindButton()));
        connect(findButtonPB, SIGNAL(clicked()), this, SLOT(findText()));
+       connect(editPB, SIGNAL(clicked()), this, SLOT(editExternal()));
        connect(findLE, SIGNAL(returnPressed()), this, SLOT(findText()));
        checkFindButton();
        // https://stackoverflow.com/questions/13027091/how-to-override-tab-width-in-qt
@@ -546,6 +549,36 @@ void PreambleModule::closeEvent(QCloseEvent * e)
 }
 
 
+void PreambleModule::editExternal() {
+       if (!current_id_)
+               return;
+
+       if (tempfile_) {
+               preambleTE->setReadOnly(false);
+               FileName const tempfilename = tempfile_->name();
+               docstring const s = tempfilename.fileContents("UTF-8");
+               preambleTE->document()->setPlainText(toqstr(s));
+               tempfile_.reset();
+               editPB->setText(qt_("Edit"));
+               changed();
+               return;
+       }
+
+       string const format =
+               current_id_->params().documentClass().outputFormat();
+       string const ext = theFormats().extension(format);
+       tempfile_.reset(new TempFile("preamble_editXXXXXX" + ext));
+       FileName const tempfilename = tempfile_->name();
+       string const name = tempfilename.toFilesystemEncoding();
+       ofdocstream os(name.c_str());
+       os << qstring_to_ucs4(preambleTE->document()->toPlainText());
+       os.close();
+       preambleTE->setReadOnly(true);
+       theFormats().edit(*current_id_, tempfilename, format);
+       editPB->setText(qt_("End Edit"));
+       changed();
+}
+
 /////////////////////////////////////////////////////////////////////
 //
 // LocalLayout
@@ -561,6 +594,7 @@ LocalLayout::LocalLayout(QWidget * parent)
        connect(locallayoutTE, SIGNAL(textChanged()), this, SLOT(textChanged()));
        connect(validatePB, SIGNAL(clicked()), this, SLOT(validatePressed()));
        connect(convertPB, SIGNAL(clicked()), this, SLOT(convertPressed()));
+       connect(editPB, SIGNAL(clicked()), this, SLOT(editExternal()));
 }
 
 
@@ -685,6 +719,38 @@ void LocalLayout::validatePressed() {
 }
 
 
+void LocalLayout::editExternal() {
+       if (!current_id_)
+               return;
+
+       if (tempfile_) {
+               locallayoutTE->setReadOnly(false);
+               FileName const tempfilename = tempfile_->name();
+               docstring const s = tempfilename.fileContents("UTF-8");
+               locallayoutTE->document()->setPlainText(toqstr(s));
+               tempfile_.reset();
+               editPB->setText(qt_("Edit"));
+               changed();
+               return;
+       }
+
+       string const format =
+               current_id_->params().documentClass().outputFormat();
+       string const ext = theFormats().extension(format);
+       tempfile_.reset(new TempFile("preamble_editXXXXXX" + ext));
+       FileName const tempfilename = tempfile_->name();
+       string const name = tempfilename.toFilesystemEncoding();
+       ofdocstream os(name.c_str());
+       os << qstring_to_ucs4(locallayoutTE->document()->toPlainText());
+       os.close();
+       locallayoutTE->setReadOnly(true);
+       theFormats().edit(*current_id_, tempfilename, format);
+       editPB->setText(qt_("End Edit"));
+       validatePB->setEnabled(false);
+       hideConvert();
+       changed();
+}
+
 /////////////////////////////////////////////////////////////////////
 //
 // DocumentDialog
@@ -4262,6 +4328,8 @@ bool GuiDocument::isValid()
        return
                validateListingsParameters().isEmpty() &&
                localLayout->isValid() &&
+               !localLayout->editing() &&
+               !preambleModule->editing() &&
                (
                        // if we're asking for skips between paragraphs
                        !textLayoutModule->skipRB->isChecked() ||
index e4f32e25707e90506c69f9c4cdf267a51ce7cfbb..dd51bac8c4b8fbe99fecac1f999f5f2ea0e0605e 100644 (file)
@@ -44,6 +44,10 @@ class LayoutModuleList;
 class LyXModule;
 class TextClass;
 
+namespace support {
+       class TempFile;
+}
+
 namespace frontend {
 
 class FloatPlacement;
@@ -55,7 +59,7 @@ class LocalLayout;
 class FontModule;
 
 ///
-typedef void const * BufferId;
+typedef Buffer const * BufferId;
 
 template<class UI>
 class UiWidget : public QWidget, public UI
@@ -323,6 +327,7 @@ public:
        PreambleModule(QWidget * parent);
        void update(BufferParams const & params, BufferId id);
        void apply(BufferParams & params);
+       bool editing() const { return (bool)tempfile_; }
 
 Q_SIGNALS:
        /// signal that something's changed in the Widget.
@@ -335,11 +340,13 @@ private:
        typedef std::map<BufferId, std::pair<int,int> > Coords;
        Coords preamble_coords_;
        BufferId current_id_;
+       unique_ptr<support::TempFile> tempfile_;
 
 private Q_SLOTS:
        ///
        void checkFindButton();
        void findText();
+       void editExternal();
 };
 
 
@@ -351,6 +358,7 @@ public:
        void update(BufferParams const & params, BufferId id);
        void apply(BufferParams & params);
        bool isValid() const { return validated_; }
+       bool editing() const { return (bool)tempfile_; }
 
 Q_SIGNALS:
        /// signal that something's changed in the Widget.
@@ -364,10 +372,12 @@ private Q_SLOTS:
        void textChanged();
        void validatePressed();
        void convertPressed();
+       void editExternal();
 
 private:
        BufferId current_id_;
        bool validated_;
+       unique_ptr<support::TempFile> tempfile_;
 };
 
 
index 6698fac7afbc14c81f2bea733616eb16d192450d..7202199ce68a9c7f070f9965393bfbe1fc7d7df9 100644 (file)
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
  <class>LocalLayoutUi</class>
  <widget class="QWidget" name="LocalLayoutUi">
    <string/>
   </property>
   <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0" colspan="2">
-    <widget class="QTextEdit" name="locallayoutTE">
+   <item row="3" column="2">
+    <widget class="QLabel" name="convertLB">
+     <property name="contextMenuPolicy">
+      <enum>Qt::NoContextMenu</enum>
+     </property>
      <property name="toolTip">
-      <string>Document-specific layout information</string>
+      <string>Errors reported in terminal.</string>
      </property>
-     <property name="statusTip">
+     <property name="text">
       <string/>
      </property>
-     <property name="acceptRichText">
-      <bool>false</bool>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
      </property>
     </widget>
    </item>
-   <item row="1" column="0">
-    <widget class="QPushButton" name="validatePB">
-     <property name="toolTip">
-      <string/>
-     </property>
+   <item row="3" column="0">
+    <widget class="QPushButton" name="convertPB">
      <property name="text">
-      <string>&amp;Validate</string>
+      <string>Convert</string>
      </property>
     </widget>
    </item>
-   <item row="1" column="1">
+   <item row="1" column="2">
     <widget class="QLabel" name="validLB">
      <property name="contextMenuPolicy">
       <enum>Qt::NoContextMenu</enum>
      </property>
     </widget>
    </item>
-   <item row="2" column="0">
-    <widget class="QPushButton" name="convertPB">
+   <item row="2" column="2">
+    <widget class="QPushButton" name="editPB">
      <property name="text">
-      <string>Convert</string>
+      <string>Edit</string>
      </property>
     </widget>
    </item>
-   <item row="2" column="1">
-    <widget class="QLabel" name="convertLB">
-     <property name="contextMenuPolicy">
-      <enum>Qt::NoContextMenu</enum>
-     </property>
+   <item row="2" column="0">
+    <widget class="QPushButton" name="validatePB">
      <property name="toolTip">
-      <string>Errors reported in terminal.</string>
+      <string/>
      </property>
      <property name="text">
+      <string>&amp;Validate</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="0" rowspan="2" colspan="3">
+    <widget class="QTextEdit" name="locallayoutTE">
+     <property name="toolTip">
+      <string>Document-specific layout information</string>
+     </property>
+     <property name="statusTip">
       <string/>
      </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
+     <property name="acceptRichText">
+      <bool>false</bool>
      </property>
     </widget>
    </item>
index 1bc1c52879ff791a3b941a58041290ccedf24724..4877b585d2ee601a0c88d563fe20bebbfd2c5b0e 100644 (file)
      </property>
     </widget>
    </item>
-   <item row="0" column="0" colspan="2">
+   <item row="1" column="2">
+    <widget class="QPushButton" name="editPB">
+     <property name="text">
+      <string>Edit</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="0" colspan="3">
     <widget class="QTextEdit" name="preambleTE">
      <property name="acceptRichText">
       <bool>false</bool>