File indexing completed on 2024-04-28 05:49:10
0001 /* 0002 SPDX-FileCopyrightText: 2021 Waqar Ahmed <waqar.17a@gmail.com> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 #pragma once 0007 0008 #include <KColorButton> 0009 #include <KTextEditor/ConfigPage> 0010 #include <KTextEditor/Editor> 0011 #include <KTextEditor/MainWindow> 0012 #include <KTextEditor/MovingRange> 0013 #include <KTextEditor/Plugin> 0014 #include <KXMLGUIClient> 0015 0016 #include <QPointer> 0017 #include <QTimer> 0018 0019 #include <array> 0020 0021 class RainbowParenPlugin final : public KTextEditor::Plugin 0022 { 0023 Q_OBJECT 0024 0025 public: 0026 explicit RainbowParenPlugin(QObject *parent = nullptr, const QVariantList & = QVariantList()); 0027 0028 int configPages() const override 0029 { 0030 return 1; 0031 } 0032 0033 KTextEditor::ConfigPage *configPage(int number = 0, QWidget *parent = nullptr) override; 0034 0035 QObject *createView(KTextEditor::MainWindow *mainWindow) override; 0036 const std::vector<KTextEditor::Attribute::Ptr> &colorsList() const 0037 { 0038 return attrs; 0039 } 0040 0041 void readConfig(); 0042 0043 Q_SIGNALS: 0044 void configUpdated(); 0045 0046 private: 0047 std::vector<KTextEditor::Attribute::Ptr> attrs; 0048 }; 0049 0050 class RainbowParenPluginView final : public QObject, public KXMLGUIClient 0051 { 0052 Q_OBJECT 0053 0054 public: 0055 explicit RainbowParenPluginView(RainbowParenPlugin *plugin, KTextEditor::MainWindow *mainwindow); 0056 0057 void onTextInserted(KTextEditor::Document *doc, KTextEditor::Cursor pos, const QString &text); 0058 void onTextRemoved(KTextEditor::Document *doc, KTextEditor::Range range, const QString &text); 0059 void onScrollChanged(); 0060 void requestRehighlight(int delay = 200); 0061 void rehighlight(KTextEditor::View *view); 0062 void viewChanged(KTextEditor::View *view); 0063 0064 Q_SLOT void clearRanges(KTextEditor::Document *doc); 0065 Q_SLOT void clearSavedRangesForDoc(KTextEditor::Document *doc); 0066 0067 struct SavedRanges { 0068 QPointer<KTextEditor::Document> doc; 0069 std::vector<std::unique_ptr<KTextEditor::MovingRange>> ranges; 0070 }; 0071 std::vector<SavedRanges> savedRanges; 0072 0073 private: 0074 RainbowParenPlugin *const m_plugin; 0075 std::vector<std::unique_ptr<KTextEditor::MovingRange>> ranges; 0076 QPointer<KTextEditor::View> m_activeView; 0077 KTextEditor::MainWindow *m_mainWindow; 0078 QTimer m_rehighlightTimer; 0079 /** 0080 * Helper to ensure we always use m_lastUserColor + 1 0081 * for the next brackets we highlight 0082 */ 0083 size_t m_lastUserColor = 0; 0084 }; 0085 0086 class RainbowParenConfigPage final : public KTextEditor::ConfigPage 0087 { 0088 Q_OBJECT 0089 public: 0090 explicit RainbowParenConfigPage(QWidget *parent, RainbowParenPlugin *plugin); 0091 0092 QString name() const override; 0093 QString fullName() const override; 0094 QIcon icon() const override; 0095 0096 void apply() override; 0097 void reset() override; 0098 void defaults() override; 0099 0100 private: 0101 std::array<KColorButton, 5> m_btns; 0102 RainbowParenPlugin *const m_plugin; 0103 QIcon m_icon; 0104 };