ktexteditor_wakatime v1.5.1
Kate plugin to interface with WakaTime.
Loading...
Searching...
No Matches
wakatimeplugin.cpp
1// SPDX-License-Identifier: MIT
2#include <KTextEditor/Application>
3#include <KTextEditor/Document>
4#include <KTextEditor/Editor>
5#include <KTextEditor/MainWindow>
6#include <KTextEditor/View>
7
8#include <KAboutData>
9#include <KActionCollection>
10#include <KF6/KTextEditor/ktexteditor_version.h>
11#include <KLocalizedString>
12#include <KMessageBox>
13#include <KPluginFactory>
14#include <KXMLGUIFactory>
15
16#include <QtCore/QDateTime>
17#include <QtCore/QDir>
18#include <QtCore/QFile>
19#include <QtCore/QJsonDocument>
20#include <QtCore/QProcess>
21#include <QtCore/QTimeZone>
22#include <QtCore/QUrl>
23#include <QtNetwork/QNetworkAccessManager>
24#include <QtNetwork/QNetworkReply>
25#include <QtNetwork/QNetworkRequest>
26#include <QtWidgets/QDialog>
27
28#include "wakatimeplugin.h"
29
30Q_LOGGING_CATEGORY(gLogWakaTimePlugin, "wakatime-plugin")
31
32K_PLUGIN_FACTORY_WITH_JSON(WakaTimePluginFactory,
33 "ktexteditor_wakatime.json",
34 registerPlugin<WakaTimePlugin>();)
35
36WakaTimePlugin::WakaTimePlugin(QObject *parent, const QVariantList &args)
37 : KTextEditor::Plugin(parent) {
38 Q_UNUSED(args);
39}
40
43
44void WakaTimeView::viewCreated(KTextEditor::View *view) {
45 connectDocumentSignals(view->document());
46}
47
48void WakaTimeView::viewDestroyed(QObject *view) {
49 disconnectDocumentSignals(static_cast<KTextEditor::View *>(view)->document());
50}
51
52WakaTimeView::WakaTimeView(KTextEditor::MainWindow *mainWindow)
53 : QObject(mainWindow), m_mainWindow(mainWindow) {
54 KXMLGUIClient::setComponentName(QStringLiteral("katewakatime"), i18n("WakaTime"));
55 setXMLFile(QStringLiteral("ui.rc"));
56 auto a = actionCollection()->addAction(QStringLiteral("configure_wakatime"));
57 a->setText(i18n("Configure WakaTime..."));
58 a->setIcon(QIcon::fromTheme(QStringLiteral("wakatime")));
59 connect(a, &QAction::triggered, this, &WakaTimeView::slotConfigureWakaTime);
60 mainWindow->guiFactory()->addClient(this);
61 config.configureDialog(m_mainWindow->window());
62 // Connections
63 connect(m_mainWindow, &KTextEditor::MainWindow::viewCreated, this, &WakaTimeView::viewCreated);
64 for (const auto &view : m_mainWindow->views()) {
65 connectDocumentSignals(view->document());
66 }
67}
68
69WakaTimeView::~WakaTimeView() {
70 m_mainWindow->guiFactory()->removeClient(this);
71}
72
73QObject *WakaTimePlugin::createView(KTextEditor::MainWindow *mainWindow) {
74 return new WakaTimeView(mainWindow);
75}
76
77void WakaTimeView::slotConfigureWakaTime() {
78 config.showDialog();
79}
80
81void WakaTimeView::sendAction(KTextEditor::Document *doc, bool isWrite) {
82 // The view is necessary here to get the cursor position and line count.
83 for (const auto &view : m_mainWindow->views()) {
84 if (view->document() == doc) {
85 client.send(doc->url().toLocalFile(),
86 doc->mode(),
87 view->cursorPosition().line() + 1,
88 view->cursorPosition().column() + 1,
89 view->document()->lines(),
90 isWrite);
91 break;
92 }
93 }
94}
95
96void WakaTimeView::connectDocumentSignals(KTextEditor::Document *document) {
97 if (connectedDocuments.contains(document)) {
98 return;
99 }
100 // When document goes from saved state to changed state (not yet saved on disk).
101 connect(document,
102 &KTextEditor::Document::modifiedChanged,
103 this,
104 &WakaTimeView::slotDocumentModifiedChanged);
105 // Written to disk.
106 connect(document,
107 &KTextEditor::Document::documentSavedOrUploaded,
108 this,
109 &WakaTimeView::slotDocumentWrittenToDisk);
110 // Text changes (might be heavy).
111 // This event unfortunately is emitted twice in separate threads for every key stroke (maybe key
112 // up and down is the reason).
113 connect(document,
114 &KTextEditor::Document::textChanged,
115 this,
116 &WakaTimeView::slotDocumentModifiedChanged);
117 connectedDocuments << document;
118}
119
120void WakaTimeView::disconnectDocumentSignals(KTextEditor::Document *document) {
121 if (!connectedDocuments.contains(document)) {
122 return;
123 }
124 disconnect(document, &KTextEditor::Document::modifiedChanged, this, nullptr);
125 disconnect(document, &KTextEditor::Document::documentSavedOrUploaded, this, nullptr);
126 disconnect(document, &KTextEditor::Document::textChanged, this, nullptr);
127 connectedDocuments.removeOne(document);
128}
129
130// Slots
131void WakaTimeView::slotDocumentModifiedChanged(KTextEditor::Document *doc) {
132 sendAction(doc, false);
133}
134
135void WakaTimeView::slotDocumentWrittenToDisk(KTextEditor::Document *doc) {
136 sendAction(doc, true);
137}
138
139#include "wakatimeplugin.moc"
void configureDialog(QWidget *parent=nullptr, Qt::WindowFlags flags=Qt::WindowFlags())
WakaTime::State send(const QString &filePath, const QString &mode, int lineNumber, int cursorPosition, int linesInFile, bool isWrite)
Definition wakatime.cpp:72
virtual ~WakaTimePlugin()
WakaTimeView(KTextEditor::MainWindow *)