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 };