[LyX/master] Revert "Extended comment and indentation for source code"

Jean-Marc Lasgouttes lasgouttes at lyx.org
Tue Jan 31 22:12:47 UTC 2023


commit 418fd911f81b31ead56587b250ed626bc14093f3
Author: Jean-Marc Lasgouttes <lasgouttes at lyx.org>
Date:   Wed Feb 1 00:12:14 2023 +0100

    Revert "Extended comment and indentation for source code"
    
    This was pushed by mistake. A different version of this patch will
    eventually be committed.
    
    This reverts commit 439c09912482489e79399fd9e10fa2b7f717f565.
---
 src/frontends/qt/GuiDocument.cpp      |   21 ++-
 src/frontends/qt/GuiSourceEdit.cpp    |  311 ---------------------------------
 src/frontends/qt/GuiSourceEdit.h      |   94 ----------
 src/frontends/qt/LaTeXHighlighter.cpp |   18 --
 src/frontends/qt/Makefile.am          |    2 -
 src/frontends/qt/ui/LocalLayoutUi.ui  |    9 +-
 src/frontends/qt/ui/PreambleUi.ui     |    9 +-
 7 files changed, 22 insertions(+), 442 deletions(-)

diff --git a/src/frontends/qt/GuiDocument.cpp b/src/frontends/qt/GuiDocument.cpp
index 7b4cedb..60f9f84 100644
--- a/src/frontends/qt/GuiDocument.cpp
+++ b/src/frontends/qt/GuiDocument.cpp
@@ -479,7 +479,7 @@ PreambleModule::PreambleModule(QWidget * parent)
 	// @ is letter in the LyX user preamble
 	(void) new LaTeXHighlighter(preambleTE->document(), true);
 	preambleTE->setFont(guiApp->typewriterSystemFont());
-	preambleTE->setCommentMarker("%");
+	preambleTE->setWordWrapMode(QTextOption::NoWrap);
 	setFocusProxy(preambleTE);
 	// Install event filter on find line edit to capture return/enter key
 	findLE->installEventFilter(this);
@@ -489,6 +489,15 @@ PreambleModule::PreambleModule(QWidget * parent)
 	connect(editPB, SIGNAL(clicked()), this, SLOT(editExternal()));
 	connect(findLE, SIGNAL(returnPressed()), this, SLOT(findText()));
 	checkFindButton();
+	int const tabStop = 4;
+	QFontMetrics metrics(preambleTE->currentFont());
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
+	// horizontalAdvance() is available starting in 5.11.0
+	// setTabStopDistance() is available starting in 5.10.0
+	preambleTE->setTabStopDistance(tabStop * metrics.horizontalAdvance(' '));
+#else
+	preambleTE->setTabStopWidth(tabStop * metrics.width(' '));
+#endif
 }
 
 
@@ -618,10 +627,20 @@ LocalLayout::LocalLayout(QWidget * parent)
 	: UiWidget<Ui::LocalLayoutUi>(parent), current_id_(nullptr), validated_(false)
 {
 	locallayoutTE->setFont(guiApp->typewriterSystemFont());
+	locallayoutTE->setWordWrapMode(QTextOption::NoWrap);
 	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()));
+	int const tabStop = 4;
+	QFontMetrics metrics(locallayoutTE->currentFont());
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
+	// horizontalAdvance() is available starting in 5.11.0
+	// setTabStopDistance() is available starting in 5.10.0
+	locallayoutTE->setTabStopDistance(tabStop * metrics.horizontalAdvance(' '));
+#else
+	locallayoutTE->setTabStopWidth(tabStop * metrics.width(' '));
+#endif
 }
 
 
diff --git a/src/frontends/qt/GuiSourceEdit.cpp b/src/frontends/qt/GuiSourceEdit.cpp
deleted file mode 100644
index 9b008a5..0000000
--- a/src/frontends/qt/GuiSourceEdit.cpp
+++ /dev/null
@@ -1,311 +0,0 @@
-// -*- C++ -*-
-/**
- * \file GuiSourceEdit.cpp
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#include <config.h>
-
-#include "GuiSourceEdit.h"
-
-#include "qt_helpers.h"
-
-#include <QMenu>
-#include <QRegularExpression>
-
-namespace lyx {
-namespace frontend {
-
-GuiSourceEdit::GuiSourceEdit(QWidget *parent) : QTextEdit(parent)
-{
-	setWordWrapMode(QTextOption::NoWrap);
-	// Set the default tab stop
-	setTabStop(tabStop_);
-	setContextMenuPolicy(Qt::CustomContextMenu);
-	connect(this, SIGNAL(customContextMenuRequested(QPoint)),
-	        this, SLOT(showMenu(QPoint)));
-}
-
-void GuiSourceEdit::showMenu(const QPoint& pos)
-{
-	// Move the cursor to the click position unless clicked within selection
-	QTextCursor cursor = textCursor();
-	int const textPos = cursorForPosition(pos).position();
-	bool const textPosInSel = textCursor().selectionStart() <= textPos &&
-	                          textPos <= textCursor().selectionEnd();
-	if (!textCursor().hasSelection() || !textPosInSel) {
-		cursor.setPosition(textPos);
-		setTextCursor(cursor);
-	}
-	// The standard menu
-	QMenu * menu = QTextEdit::createStandardContextMenu();
-	QAction * firstAction = menu->actions().at(0);
-	// Insert toggle comment entry at the top
-	QKeySequence keySeq = QKeySequence(Qt::ControlModifier | Qt::Key_Slash);
-	QAction * toggleComment = new QAction(qt_("Toggle Comment") + "\t" +
-		keySeq.toString(QKeySequence::NativeText), menu);
-	connect(toggleComment, SIGNAL(triggered()), this, SLOT(toggleComment()));
-	menu->insertAction(firstAction, toggleComment);
-	// Insert toggle spaces and tabs entry at the top
-	QAction * showTabsAndSpaces = new QAction(qt_("Show Tabs and Spaces"), menu);
-	showTabsAndSpaces->setCheckable(true);
-	auto currentFlags = document()->defaultTextOption().flags();
-	showTabsAndSpaces->setChecked(currentFlags &
-	                              QTextOption::ShowTabsAndSpaces);
-	connect(showTabsAndSpaces, SIGNAL(triggered()), this,
-	        SLOT(toggleShowTabsAndSpaces()));
-	menu->insertAction(firstAction, showTabsAndSpaces);
-	// Add separator to default entries
-	menu->insertSeparator(firstAction);
-	menu->exec(mapToGlobal(pos));
-}
-
-void GuiSourceEdit::setCommentMarker(QString marker)
-{
-	commentMarker_ = marker;
-}
-
-void GuiSourceEdit::setTabStop(int spaces)
-{
-	tabStop_ = spaces;
-	QFontMetrics metrics(currentFont());
-#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
-	// horizontalAdvance() is available starting in 5.11.0
-	// setTabStopDistance() is available starting in 5.10.0
-	setTabStopDistance(tabStop_ * metrics.horizontalAdvance(' '));
-#else
-	setTabStopWidth(tabStop_ * metrics.width(' '));
-#endif
-}
-
-void GuiSourceEdit::setFont(const QFont & font)
-{
-	QTextEdit::setFont(font);
-	// Re-calculate tabstop width based on new font
-	setTabStop(tabStop_);
-}
-
-QTextBlock GuiSourceEdit::blockAtSelPos(Position position) const
-{
-	QTextCursor cursor = textCursor();
-	QTextDocument * doc = cursor.document();
-	int pos = position == START ? qMin(cursor.anchor(), cursor.position()) :
-	                              qMax(cursor.anchor(), cursor.position());
-	return doc->findBlock(pos);
-}
-
-QTextCursor GuiSourceEdit::cursorAt(int position) const {
-	// Create text cursor
-	QTextCursor cursor = textCursor();
-	// Move the cursor to position
-	cursor.setPosition(position);
-	return cursor;
-}
-
-void GuiSourceEdit::removeMarker(int positionStart, QString marker,
-                                 bool addedSpace)
-{
-	// Create text cursor
-	QTextCursor cursor = cursorAt(positionStart);
-	QTextBlock const block = cursor.block();
-	QString blockText = block.text();
-	int const index = blockText.indexOf(marker);
-	int length = marker.length();
-	if (index != -1) {
-		// Check for extra space after marker
-		if (addedSpace && blockText.remove(0, index + length).startsWith(" "))
-			++length;
-		cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::MoveAnchor,
-		                    index);
-		cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor,
-		                    length);
-		cursor.deleteChar();
-	}
-}
-
-void GuiSourceEdit::insertMarkerAtIndentation(int positionStart, QString marker,
-                                              bool addedSpace, int indentation)
-{
-	// Create text cursor
-	QTextCursor cursor = cursorAt(positionStart);
-	// Move the cursor to the given indentation
-	int i = 0;
-	while (i < indentation) {
-		if (toPlainText().at(cursor.position()) == '\t')
-			i += tabStop_;
-		else
-			++i;
-		cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::MoveAnchor);
-	}
-	// Add the comment marker
-	cursor.insertText(marker + (addedSpace ? " " : ""), QTextCharFormat());
-}
-
-void GuiSourceEdit::modifyMarkerInSel(QString marker, Modification modification,
-                                      bool allEmpty, bool addedSpace)
-{
-	QTextBlock const startBlock = blockAtSelPos(START);
-	QTextBlock const endBlock = blockAtSelPos(END);
-	QTextBlock const endBlockNext = endBlock.next();
-	// Create text cursor
-	QTextCursor cursor = textCursor();
-	cursor.beginEditBlock();
-	for (QTextBlock block = startBlock; block != endBlockNext;
-	     block = block.next()) {
-		if (modification == REMOVE)
-			removeMarker(block.position(), marker, addedSpace);
-		// Disregard white space blocks
-		else if (allEmpty || !block.text().trimmed().isEmpty()) {
-			insertMarkerAtIndentation(block.position(), marker, addedSpace,
-			                          selMinIndentation(allEmpty));
-		}
-	}
-	cursor.endEditBlock();
-}
-
-int GuiSourceEdit::getIndentation(QString text) const
-{
-	int tabs = 0;
-	for (QChar c : text) {
-		if (c == QChar::Tabulation)
-			++tabs;
-		if (!c.isSpace())
-			break;
-	}
-	return tabs;
-}
-
-QString GuiSourceEdit::getIndentationString(QString text) const
-{
-	// Regex to capture indentation string (i.e. spaces and tab stops)
-	QRegularExpression static re("^( |\t)+");
-	return re.match(text).captured(0);
-}
-
-void GuiSourceEdit::newLineWithInheritedIndentation()
-{
-	QTextCursor cursor = textCursor();
-	cursor.beginEditBlock();
-	// Start new line
-	cursor.insertText("\n", QTextCharFormat());
-	// Insert as many tabstops as on the previous block
-	QTextBlock const previousBlock = blockAtSelPos(START).previous();
-	QString const indentation = getIndentationString(previousBlock.text());
-	cursor.insertText(indentation);
-	cursor.endEditBlock();
-}
-
-int GuiSourceEdit::getLengthInSpaces(QString const & text) const
-{
-	// Replace tab stops by spaces and return length
-	return QString(text).replace("\t", QString(" ").repeated(tabStop_))
-			.length();
-}
-
-int GuiSourceEdit::selMinIndentation(bool allEmpty) const
-{
-	QTextBlock const startBlock = blockAtSelPos(START);
-	QTextBlock const endBlock = blockAtSelPos(END);
-	QTextBlock const endBlockNext = endBlock.next();
-	QString minIndentationString = getIndentationString(startBlock.text());
-	for (QTextBlock block = startBlock; block != endBlockNext;
-	     block = block.next()) {
-		QString text = block.text();
-		if (allEmpty || !text.trimmed().isEmpty()) {
-			QString curIndentationString = getIndentationString(text);
-			// Chop off indentation until they have the same length
-			while (!minIndentationString.isEmpty()) {
-				int minLen = getLengthInSpaces(minIndentationString);
-				int curLen = getLengthInSpaces(curIndentationString);
-				if (minLen == curLen)
-					break;
-				else if (minLen > curLen)
-					minIndentationString.chop(1);
-				else
-					curIndentationString.chop(1);
-			}
-		}
-	}
-	return getLengthInSpaces(minIndentationString);
-}
-
-bool GuiSourceEdit::selBlocksStartWith(QString marker) const
-{
-	QTextBlock const startBlock = blockAtSelPos(START);
-	QTextBlock const endBlock = blockAtSelPos(END);
-	QTextBlock const endBlockNext = endBlock.next();
-	for (QTextBlock block = startBlock; block != endBlockNext;
-	     block = block.next()) {
-		QString const blockText = block.text();
-		QString trimmedText = blockText.trimmed();
-		// Disregard white space blocks
-		if (trimmedText.isEmpty())
-			continue;
-		else if (!trimmedText.startsWith(marker))
-			return false;
-	}
-	return true;
-}
-
-bool GuiSourceEdit::selBlocksWhiteSpace() const
-{
-	QTextBlock const startBlock = blockAtSelPos(START);
-	QTextBlock const endBlockNext = blockAtSelPos(END).next();
-	for (QTextBlock block = startBlock; block != endBlockNext;
-	     block = block.next()) {
-		QString const blockText = block.text();
-		QString const trimmedText = blockText.trimmed();
-		// Disregard white space blocks
-		if (trimmedText.isEmpty())
-			continue;
-		else
-			return false;
-	}
-	return true;
-}
-
-void GuiSourceEdit::toggleComment()
-{
-	bool const allEmpty = selBlocksWhiteSpace();
-	modifyMarkerInSel(commentMarker_,
-	                  !allEmpty && selBlocksStartWith(commentMarker_) ?
-	                      REMOVE : INSERT,
-	                  allEmpty, addedSpaceAfterComment_);
-}
-
-void GuiSourceEdit::toggleShowTabsAndSpaces()
-{
-	QTextOption option = document()->defaultTextOption();
-	auto currentFlags = document()->defaultTextOption().flags();
-	if (currentFlags & QTextOption::ShowTabsAndSpaces)
-		currentFlags &= ~QTextOption::ShowTabsAndSpaces;
-	else
-		currentFlags |= QTextOption::ShowTabsAndSpaces;
-	option.setFlags(currentFlags);
-	document()->setDefaultTextOption(option);
-}
-
-void GuiSourceEdit::keyPressEvent(QKeyEvent *event)
-{
-	if (event->modifiers() == Qt::ControlModifier &&
-	    event->key() == Qt::Key_Slash)
-		toggleComment();
-	else if (event->key() == Qt::Key_Tab &&
-	         blockAtSelPos(START) != blockAtSelPos(END))
-		modifyMarkerInSel("\t", INSERT, selBlocksWhiteSpace(), false);
-	else if (event->key() == Qt::Key_Backtab)
-		modifyMarkerInSel("\t", REMOVE);
-	else if (event->key() == Qt::Key_Return)
-		newLineWithInheritedIndentation();
-	else
-		// Call base class for other events
-		QTextEdit::keyPressEvent(event);
-}
-
-} // namespace frontend
-} // namespace lyx
-
-#include "moc_GuiSourceEdit.cpp"
diff --git a/src/frontends/qt/GuiSourceEdit.h b/src/frontends/qt/GuiSourceEdit.h
deleted file mode 100644
index 4a8bc1c..0000000
--- a/src/frontends/qt/GuiSourceEdit.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// -*- C++ -*-
-/**
- * \file GuiSourceEdit.h
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#ifndef GUISOURCEEDIT_H
-#define GUISOURCEEDIT_H
-
-#include <QTextEdit>
-#include <QKeyEvent>
-#include <QTextCursor>
-#include <QTextBlock>
-
-namespace lyx {
-namespace frontend {
-
-class GuiSourceEdit : public QTextEdit
-{
-	Q_OBJECT
-
-public:
-	explicit GuiSourceEdit(QWidget *parent = nullptr);
-	// Set and get tab stop in number of spaces
-	void setTabStop(int spaces);
-	int tabStop() const {return tabStop_; };
-	// Set and get line marker, e.g. "//"
-	void setCommentMarker(QString marker);
-	QString commentMarker() const { return commentMarker_; };
-	// Set and get whether a space is added after the line marker
-	void setAddedSpaceAfterComment(int spaces);
-	bool addedSpaceAfterComment() const { return addedSpaceAfterComment_; };
-	// Set font and update tab stop
-	void setFont(const QFont & font);
-
-private Q_SLOTS:
-	void showMenu(const QPoint& pos);
-	void toggleComment();
-	void toggleShowTabsAndSpaces();
-
-protected:
-	void keyPressEvent(QKeyEvent *event) override;
-
-private:
-	enum Modification { INSERT, REMOVE };
-	enum Position { START, END };
-
-	// Get block at selection start/end
-	QTextBlock blockAtSelPos(Position position) const;
-	// Whether all blocks start with marker
-	bool selBlocksStartWith(QString marker) const;
-	// Wehther all blocks are white space
-	bool selBlocksWhiteSpace() const;
-	// Get length of string substituting tabs for spaces
-	int getLengthInSpaces(QString const & text) const;
-	// Minimum tab indentation the paragraphs selected start with
-	int selMinIndentation(bool allEmpty) const;
-	// Number of tabs as indentation
-	int getIndentation(QString text) const;
-	// String of white space
-	QString getIndentationString(QString text) const;
-	// Copy of textCursor() [at position]
-	QTextCursor cursorAt(int position) const;
-
-	// From positionStart remove marker from the line
-	void removeMarker(int positionStart, QString marker,
-	                  bool addedSpace = false);
-	// From positionStart insert marker at indentation
-	void insertMarkerAtIndentation(int positionStart, QString marker,
-	                               bool addedSpace = false,
-	                               int indentation = 0);
-	// Modify (insert/remove) marker
-	void modifyMarkerInSel(QString marker,
-	                       Modification modification = INSERT,
-	                       bool allEmpty = false, bool addedSpace = false);
-	// Create a new line at cursor same indentation
-	void newLineWithInheritedIndentation();
-
-	// The comment marker
-	QString commentMarker_ = "#";
-	// The tab stop in spaces
-	int tabStop_ = 4;
-	// Whether a space gets added after the comment marker
-	bool addedSpaceAfterComment_ = true;
-};
-
-
-} // namespace frontend
-} // namespace lyx
-
-#endif // GUISOURCEEDIT_H
diff --git a/src/frontends/qt/LaTeXHighlighter.cpp b/src/frontends/qt/LaTeXHighlighter.cpp
index 51d5867..80e7a09 100644
--- a/src/frontends/qt/LaTeXHighlighter.cpp
+++ b/src/frontends/qt/LaTeXHighlighter.cpp
@@ -123,14 +123,6 @@ void LaTeXHighlighter::highlightBlock(QString const & text)
 		setFormat(index, length, keywordFormat);
 		index = exprKeyword.indexIn(text, index + length);
 	}
-	// White space
-	QRegExp exprWhiteSpace("\\s");
-	index = exprWhiteSpace.indexIn(text);
-	while (index >= 0) {
-		int length = exprWhiteSpace.matchedLength();
-		setFormat(index, length, commentFormat);
-		index = exprWhiteSpace.indexIn(text, index + length);
-	}
 	// %comment
 	// Treat a line as a comment starting at a percent sign
 	// * that is the first character in a line
@@ -245,16 +237,6 @@ void LaTeXHighlighter::highlightBlock(QString const & text)
 		match = exprKeyword.match(text, index + length);
 		index = match.capturedStart(0);
 	}
-	// White space
-	QRegularExpression exprWhiteSpace("\\s");
-	match = exprWhiteSpace.match(text);
-	index = match.capturedStart(0);
-	while (index >= 0) {
-		int length = match.capturedLength(0);
-		setFormat(index, length, commentFormat);
-		match = exprWhiteSpace.match(text, index + length);
-		index = match.capturedStart(0);
-	}
 	// %comment
 	// Treat a line as a comment starting at a percent sign
 	// * that is the first character in a line
diff --git a/src/frontends/qt/Makefile.am b/src/frontends/qt/Makefile.am
index 486b28f..9ca258d 100644
--- a/src/frontends/qt/Makefile.am
+++ b/src/frontends/qt/Makefile.am
@@ -118,7 +118,6 @@ SOURCEFILES = \
 	GuiSendto.cpp \
 	GuiSetBorder.cpp \
 	GuiShowFile.cpp \
-	GuiSourceEdit.cpp \
 	GuiSpellchecker.cpp \
 	GuiSymbols.cpp \
 	GuiTabular.cpp \
@@ -233,7 +232,6 @@ MOCHEADER = \
 	GuiSendto.h \
 	GuiSetBorder.h \
 	GuiShowFile.h \
-	GuiSourceEdit.h \
 	GuiSpellchecker.h \
 	GuiSymbols.h \
 	GuiTabularCreate.h \
diff --git a/src/frontends/qt/ui/LocalLayoutUi.ui b/src/frontends/qt/ui/LocalLayoutUi.ui
index c2377b1..1a3e178 100644
--- a/src/frontends/qt/ui/LocalLayoutUi.ui
+++ b/src/frontends/qt/ui/LocalLayoutUi.ui
@@ -15,7 +15,7 @@
   </property>
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
-    <widget class="lyx::frontend::GuiSourceEdit" name="locallayoutTE">
+    <widget class="QTextEdit" name="locallayoutTE">
      <property name="toolTip">
       <string>Document-specific layout information</string>
      </property>
@@ -105,13 +105,6 @@
    </item>
   </layout>
  </widget>
- <customwidgets>
-  <customwidget>
-   <class>lyx::frontend::GuiSourceEdit</class>
-   <extends>QTextEdit</extends>
-   <header>GuiSourceEdit.h</header>
-  </customwidget>
- </customwidgets>
  <includes>
   <include location="local">qt_i18n.h</include>
  </includes>
diff --git a/src/frontends/qt/ui/PreambleUi.ui b/src/frontends/qt/ui/PreambleUi.ui
index dece982..eb27e91 100644
--- a/src/frontends/qt/ui/PreambleUi.ui
+++ b/src/frontends/qt/ui/PreambleUi.ui
@@ -54,7 +54,7 @@
     </widget>
    </item>
    <item row="0" column="0" colspan="3">
-    <widget class="lyx::frontend::GuiSourceEdit" name="preambleTE">
+    <widget class="QTextEdit" name="preambleTE">
      <property name="acceptRichText">
       <bool>false</bool>
      </property>
@@ -62,13 +62,6 @@
    </item>
   </layout>
  </widget>
- <customwidgets>
-  <customwidget>
-   <class>lyx::frontend::GuiSourceEdit</class>
-   <extends>QTextEdit</extends>
-   <header>GuiSourceEdit.h</header>
-  </customwidget>
- </customwidgets>
  <includes>
   <include location="local">qt_i18n.h</include>
  </includes>


More information about the lyx-cvs mailing list