2#include <KTextEditor/Application>
3#include <KTextEditor/Document>
4#include <KTextEditor/Editor>
5#include <KTextEditor/MainWindow>
6#include <KTextEditor/View>
9#include <KActionCollection>
10#include <KF6/KTextEditor/ktexteditor_version.h>
11#include <KLocalizedString>
13#include <KPluginFactory>
14#include <KXMLGUIFactory>
16#include <QtCore/QDateTime>
18#include <QtCore/QFile>
19#include <QtCore/QJsonDocument>
20#include <QtCore/QProcess>
21#include <QtCore/QTimeZone>
23#include <QtNetwork/QNetworkAccessManager>
24#include <QtNetwork/QNetworkReply>
25#include <QtNetwork/QNetworkRequest>
26#include <QtWidgets/QDialog>
28#include "wakatimeplugin.h"
30Q_LOGGING_CATEGORY(gLogWakaTimePlugin,
"wakatime-plugin")
32K_PLUGIN_FACTORY_WITH_JSON(WakaTimePluginFactory,
33 "ktexteditor_wakatime.json",
37 : KTextEditor::Plugin(parent) {
44void WakaTimeView::viewCreated(KTextEditor::View *view) {
45 connectDocumentSignals(view->document());
48void WakaTimeView::viewDestroyed(QObject *view) {
49 disconnectDocumentSignals(
static_cast<KTextEditor::View *
>(view)->document());
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);
63 connect(m_mainWindow, &KTextEditor::MainWindow::viewCreated,
this, &WakaTimeView::viewCreated);
64 for (
const auto &view : m_mainWindow->views()) {
65 connectDocumentSignals(view->document());
69WakaTimeView::~WakaTimeView() {
70 m_mainWindow->guiFactory()->removeClient(
this);
73QObject *WakaTimePlugin::createView(KTextEditor::MainWindow *mainWindow) {
77void WakaTimeView::slotConfigureWakaTime() {
81void WakaTimeView::sendAction(KTextEditor::Document *doc,
bool isWrite) {
83 for (
const auto &view : m_mainWindow->views()) {
84 if (view->document() == doc) {
85 client.
send(doc->url().toLocalFile(),
87 view->cursorPosition().line() + 1,
88 view->cursorPosition().column() + 1,
89 view->document()->lines(),
96void WakaTimeView::connectDocumentSignals(KTextEditor::Document *document) {
97 if (connectedDocuments.contains(document)) {
102 &KTextEditor::Document::modifiedChanged,
104 &WakaTimeView::slotDocumentModifiedChanged);
107 &KTextEditor::Document::documentSavedOrUploaded,
109 &WakaTimeView::slotDocumentWrittenToDisk);
114 &KTextEditor::Document::textChanged,
116 &WakaTimeView::slotDocumentModifiedChanged);
117 connectedDocuments << document;
120void WakaTimeView::disconnectDocumentSignals(KTextEditor::Document *document) {
121 if (!connectedDocuments.contains(document)) {
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);
131void WakaTimeView::slotDocumentModifiedChanged(KTextEditor::Document *doc) {
132 sendAction(doc,
false);
135void WakaTimeView::slotDocumentWrittenToDisk(KTextEditor::Document *doc) {
136 sendAction(doc,
true);
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)
virtual ~WakaTimePlugin()
WakaTimeView(KTextEditor::MainWindow *)