Commit edab564c authored by Nikolai Kosjar's avatar Nikolai Kosjar

Beautifier: ClangFormat: Add action "Disable Formatting for Selected Text"

Change-Id: I0786dfdc0679bbdf1cf1157067bd7f572ac7d108
Reviewed-by: Ivan Donchevskii's avatarIvan Donchevskii <ivan.donchevskii@qt.io>
Reviewed-by: Riitta-Leena Miettinen's avatarLeena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: Tim Jenssen's avatarTim Jenssen <tim.jenssen@qt.io>
Reviewed-by: default avatarLorenz Haas <lorenz.haas@histomatics.de>
parent 189dbc58
...@@ -58,6 +58,7 @@ For Windows: ...@@ -58,6 +58,7 @@ For Windows:
In Menu: Tools > Options > Environment > Keyboard In Menu: Tools > Options > Environment > Keyboard
* ClangFormat / FormatFile - e.g. Alt+C, F * ClangFormat / FormatFile - e.g. Alt+C, F
* ClangFormat / FormatSelectedText - e.g. Alt+C, S * ClangFormat / FormatSelectedText - e.g. Alt+C, S
* ClangFormat / DisableFormattingSelectedText - e.g. Alt+C, D
Due to several issues outlined below the FormatFile action might be of limited Due to several issues outlined below the FormatFile action might be of limited
use. use.
......
...@@ -178,4 +178,8 @@ ...@@ -178,4 +178,8 @@
select it when no text is selected, the whole file is formatted by default. select it when no text is selected, the whole file is formatted by default.
To disable this behavior, deselect the To disable this behavior, deselect the
\uicontrol {Format entire file if no text was selected} check box. \uicontrol {Format entire file if no text was selected} check box.
ClangFormat provides additionally the \uicontrol {Disable Formatting for
Selected Text} command. If you select it, the selected lines will be
wrapped within \c {// clang-format off} and \c {// clang-format on}.
*/ */
...@@ -496,6 +496,12 @@ QString BeautifierPlugin::msgFormatSelectedText() ...@@ -496,6 +496,12 @@ QString BeautifierPlugin::msgFormatSelectedText()
return tr("Format &Selected Text"); return tr("Format &Selected Text");
} }
QString BeautifierPlugin::msgDisableFormattingSelectedText()
{
//: Menu entry
return tr("&Disable Formatting for Selected Text");
}
QString BeautifierPlugin::msgCommandPromptDialogTitle(const QString &command) QString BeautifierPlugin::msgCommandPromptDialogTitle(const QString &command)
{ {
//: File dialog title for path chooser when choosing binary //: File dialog title for path chooser when choosing binary
......
...@@ -80,6 +80,7 @@ public: ...@@ -80,6 +80,7 @@ public:
static QString msgCannotGetConfigurationFile(const QString &command); static QString msgCannotGetConfigurationFile(const QString &command);
static QString msgFormatCurrentFile(); static QString msgFormatCurrentFile();
static QString msgFormatSelectedText(); static QString msgFormatSelectedText();
static QString msgDisableFormattingSelectedText();
static QString msgCommandPromptDialogTitle(const QString &command); static QString msgCommandPromptDialogTitle(const QString &command);
static void showError(const QString &error); static void showError(const QString &error);
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include <QAction> #include <QAction>
#include <QMenu> #include <QMenu>
#include <QTextBlock>
namespace Beautifier { namespace Beautifier {
namespace Internal { namespace Internal {
...@@ -88,6 +89,14 @@ bool ClangFormat::initialize() ...@@ -88,6 +89,14 @@ bool ClangFormat::initialize()
menu->addAction(cmd); menu->addAction(cmd);
connect(m_formatRange, &QAction::triggered, this, &ClangFormat::formatSelectedText); connect(m_formatRange, &QAction::triggered, this, &ClangFormat::formatSelectedText);
m_disableFormattingSelectedText
= new QAction(BeautifierPlugin::msgDisableFormattingSelectedText(), this);
cmd = Core::ActionManager::registerAction(
m_disableFormattingSelectedText, Constants::ClangFormat::ACTION_DISABLEFORMATTINGSELECTED);
menu->addAction(cmd);
connect(m_disableFormattingSelectedText, &QAction::triggered,
this, &ClangFormat::disableFormattingSelectedText);
Core::ActionManager::actionContainer(Constants::MENU_ID)->addMenu(menu); Core::ActionManager::actionContainer(Constants::MENU_ID)->addMenu(menu);
connect(m_settings, &ClangFormatSettings::supportedMimeTypesChanged, connect(m_settings, &ClangFormatSettings::supportedMimeTypesChanged,
...@@ -130,6 +139,42 @@ void ClangFormat::formatSelectedText() ...@@ -130,6 +139,42 @@ void ClangFormat::formatSelectedText()
} }
} }
void ClangFormat::disableFormattingSelectedText()
{
TextEditor::TextEditorWidget *widget = TextEditor::TextEditorWidget::currentTextEditorWidget();
if (!widget)
return;
const QTextCursor tc = widget->textCursor();
if (!tc.hasSelection())
return;
// Insert start marker
const QTextBlock selectionStartBlock = tc.document()->findBlock(tc.selectionStart());
QTextCursor insertCursor(tc.document());
insertCursor.beginEditBlock();
insertCursor.setPosition(selectionStartBlock.position());
insertCursor.insertText("// clang-format off\n");
const int positionToRestore = tc.position();
// Insert end marker
QTextBlock selectionEndBlock = tc.document()->findBlock(tc.selectionEnd());
insertCursor.setPosition(selectionEndBlock.position() + selectionEndBlock.length() - 1);
insertCursor.insertText("\n// clang-format on");
insertCursor.endEditBlock();
// Reset the cursor position in order to clear the selection.
QTextCursor restoreCursor(tc.document());
restoreCursor.setPosition(positionToRestore);
widget->setTextCursor(restoreCursor);
// The indentation of these markers might be undesired, so reformat.
// This is not optimal because two undo steps will be needed to remove the markers.
const int reformatTextLength = insertCursor.position() - selectionStartBlock.position();
m_beautifierPlugin->formatCurrentFile(command(selectionStartBlock.position(),
reformatTextLength));
}
Command ClangFormat::command() const Command ClangFormat::command() const
{ {
Command command; Command command;
......
...@@ -55,9 +55,11 @@ public: ...@@ -55,9 +55,11 @@ public:
private: private:
void formatFile(); void formatFile();
void formatSelectedText(); void formatSelectedText();
void disableFormattingSelectedText();
BeautifierPlugin *m_beautifierPlugin; BeautifierPlugin *m_beautifierPlugin;
QAction *m_formatFile = nullptr; QAction *m_formatFile = nullptr;
QAction *m_formatRange = nullptr; QAction *m_formatRange = nullptr;
QAction *m_disableFormattingSelectedText = nullptr;
ClangFormatSettings *m_settings; ClangFormatSettings *m_settings;
Command command(int offset, int length) const; Command command(int offset, int length) const;
}; };
......
...@@ -34,6 +34,7 @@ namespace ClangFormat { ...@@ -34,6 +34,7 @@ namespace ClangFormat {
const char DISPLAY_NAME[] = QT_TRANSLATE_NOOP("Beautifier::Internal::ClangFormat::ClangFormat", "ClangFormat"); const char DISPLAY_NAME[] = QT_TRANSLATE_NOOP("Beautifier::Internal::ClangFormat::ClangFormat", "ClangFormat");
const char ACTION_FORMATFILE[] = "ClangFormat.FormatFile"; const char ACTION_FORMATFILE[] = "ClangFormat.FormatFile";
const char ACTION_FORMATSELECTED[] = "ClangFormat.FormatSelectedText"; const char ACTION_FORMATSELECTED[] = "ClangFormat.FormatSelectedText";
const char ACTION_DISABLEFORMATTINGSELECTED[] = "ClangFormat.DisableFormattingSelectedText";
const char MENU_ID[] = "ClangFormat.Menu"; const char MENU_ID[] = "ClangFormat.Menu";
const char OPTION_ID[] = "ClangFormat"; const char OPTION_ID[] = "ClangFormat";
const char SETTINGS_NAME[] = "clangformat"; const char SETTINGS_NAME[] = "clangformat";
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment