From 36c59e9e30029be953d34bab72c376fcdbe47126 Mon Sep 17 00:00:00 2001 From: falbru Date: Fri, 29 Mar 2024 00:29:47 +0100 Subject: [PATCH] Implement set_ui_options method and add gui_set_font option --- src/drawoptions.cpp | 2 ++ src/drawoptions.hpp | 8 +++++++- src/kakouneclient.cpp | 5 +++++ src/kakouneclient.hpp | 2 ++ src/kakounewidget.cpp | 29 +++++++++++++++++++++++++++++ src/kakounewidget.hpp | 1 + src/rpc/rpc.cpp | 12 ++++++++++++ src/rpc/rpc.hpp | 6 ++++++ src/statusbar.cpp | 8 +++++++- src/statusbar.hpp | 3 +++ 10 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/drawoptions.cpp b/src/drawoptions.cpp index 7417c22..945eef0 100644 --- a/src/drawoptions.cpp +++ b/src/drawoptions.cpp @@ -26,4 +26,6 @@ void DrawOptions::setFont(const QString &font_name, int font_size) QRect boundingBoxSingleChar = font_metrics.boundingRect("A"); m_cell_size = QSize(boundingBoxSingleChar.width(), boundingBoxSingleChar.height()); // FIXME only works for monospaced fonts + + emit updated(); } diff --git a/src/drawoptions.hpp b/src/drawoptions.hpp index 5612c2a..f8d7c3f 100644 --- a/src/drawoptions.hpp +++ b/src/drawoptions.hpp @@ -1,11 +1,14 @@ #ifndef DRAWOPTIONS_HPP #define DRAWOPTIONS_HPP +#include #include #include -class DrawOptions +class DrawOptions : public QObject { + Q_OBJECT + public: DrawOptions(); ~DrawOptions(); @@ -15,6 +18,9 @@ class DrawOptions void setFont(const QString &font_name, int font_size); + signals: + void updated(); + private: QFont m_font; QSize m_cell_size; diff --git a/src/kakouneclient.cpp b/src/kakouneclient.cpp index 19db227..290e7a7 100644 --- a/src/kakouneclient.cpp +++ b/src/kakouneclient.cpp @@ -59,6 +59,11 @@ void KakouneClient::handleRequest(QJsonObject request) { emit hideInfoBox(); } + else if (method == "set_ui_options") + { + RPC::SetUIOptionsRequest request = RPC::deserializeSetUIOptionsRequest(request_params); + emit setUIOptions(request.options); + } else { qDebug() << "Unkown method: " << method; diff --git a/src/kakouneclient.hpp b/src/kakouneclient.hpp index b309b87..16306be 100644 --- a/src/kakouneclient.hpp +++ b/src/kakouneclient.hpp @@ -48,6 +48,8 @@ class KakouneClient : public QObject void showInfoBox(); void hideInfoBox(); + void setUIOptions(QMap options); + private: void sendRequest(const QString &method_name, QJsonArray params); void handleRequest(QJsonObject request); diff --git a/src/kakounewidget.cpp b/src/kakounewidget.cpp index 20c1b05..4a02959 100644 --- a/src/kakounewidget.cpp +++ b/src/kakounewidget.cpp @@ -16,6 +16,7 @@ KakouneWidget::KakouneWidget(const QString &session_id, DrawOptions *draw_option m_client = new KakouneClient(session_id, client_arguments, {{"KAKQT_WINDOW_ID", m_id.toString()}}); connect(m_client, &KakouneClient::refresh, this, &KakouneWidget::clientRefreshed); connect(m_client, &KakouneClient::finished, this, &KakouneWidget::finished); + connect(m_client, &KakouneClient::setUIOptions, this, &KakouneWidget::setUIOptions); m_textedit = new KakouneTextEdit(m_client, draw_options, this); m_menu = new KakouneMenu(m_client, draw_options, m_textedit); @@ -65,3 +66,31 @@ void KakouneWidget::installEventFilter(QObject *filter) { m_textedit->installEventFilter(filter); } + +void KakouneWidget::setUIOptions(QMap options) +{ + for (auto option = options.begin(); option != options.end(); option++) + { + if (option.key() == "gui_set_font") + { + int lastSpaceIndex = option.value().lastIndexOf(' '); + + QString font_name = option.value().left(lastSpaceIndex); + QString font_size_str = option.value().mid(lastSpaceIndex + 1); + + bool ok; + int font_size = font_size_str.toInt(&ok); + if (!ok) + { + qDebug() << "Error converting font size to integer."; + continue; + } + + m_draw_options->setFont(font_name, font_size); + } + else + { + qDebug() << "Unknown ui option: " << option.key(); + } + } +} diff --git a/src/kakounewidget.hpp b/src/kakounewidget.hpp index 84a8635..3ece65f 100644 --- a/src/kakounewidget.hpp +++ b/src/kakounewidget.hpp @@ -26,6 +26,7 @@ class KakouneWidget : public QWidget private slots: void clientRefreshed(); + void setUIOptions(QMap options); signals: void finished(); void refresh(); diff --git a/src/rpc/rpc.cpp b/src/rpc/rpc.cpp index 91e9fb8..3eb2cd3 100644 --- a/src/rpc/rpc.cpp +++ b/src/rpc/rpc.cpp @@ -129,6 +129,18 @@ RefreshRequest deserializeRefreshRequest(QJsonArray request_params) return RefreshRequest{request_params.at(0).toBool()}; } +SetUIOptionsRequest deserializeSetUIOptionsRequest(QJsonArray request_params) +{ + QMap options; + QJsonObject root = request_params.at(0).toObject(); + for (auto it = root.begin(); it != root.end(); ++it) + { + options.insert(it.key(), it.value().toString()); + } + + return SetUIOptionsRequest{options}; +} + QByteArray serializeRequest(const QString &method_name, QJsonArray params) { QJsonObject req{{{"jsonrpc", "2.0"}, {"method", method_name}, {"params", params}}}; diff --git a/src/rpc/rpc.hpp b/src/rpc/rpc.hpp index 2314a6e..21111ee 100644 --- a/src/rpc/rpc.hpp +++ b/src/rpc/rpc.hpp @@ -75,6 +75,11 @@ struct RefreshRequest bool force; }; +struct SetUIOptionsRequest +{ + QMap options; +}; + Coord deserializeCoord(QJsonObject coord_serialized); Face deserializeFace(QJsonObject face_serialized); Atom deserializeAtom(QJsonObject atom_serialized); @@ -90,6 +95,7 @@ MenuShowRequest deserializeMenuShowRequest(QJsonArray request_params); MenuSelectRequest deserializeMenuSelectRequest(QJsonArray request_params); InfoShowRequest deserializeInfoShowRequest(QJsonArray request_params); RefreshRequest deserializeRefreshRequest(QJsonArray request_params); +SetUIOptionsRequest deserializeSetUIOptionsRequest(QJsonArray request_params); QByteArray serializeRequest(const QString &method_name, QJsonArray params); } // namespace RPC diff --git a/src/statusbar.cpp b/src/statusbar.cpp index c497873..2bd2203 100644 --- a/src/statusbar.cpp +++ b/src/statusbar.cpp @@ -3,7 +3,8 @@ StatusBar::StatusBar(DrawOptions *draw_options, QWidget *parent) { m_draw_options = draw_options; - setFixedHeight(m_draw_options->getCellSize().height()); + connect(draw_options, &DrawOptions::updated, this, &StatusBar::drawOptionsUpdated); + drawOptionsUpdated(); } StatusBar::~StatusBar() @@ -36,3 +37,8 @@ void StatusBar::paintEvent(QPaintEvent *ev) m_client->getStatusLine().draw(context, QPoint(), status_default_face); } + +void StatusBar::drawOptionsUpdated() +{ + setFixedHeight(m_draw_options->getCellSize().height()); +} diff --git a/src/statusbar.hpp b/src/statusbar.hpp index 8608e0d..2b51db5 100644 --- a/src/statusbar.hpp +++ b/src/statusbar.hpp @@ -17,6 +17,9 @@ class StatusBar : public QWidget protected: void paintEvent(QPaintEvent *ev) override; + protected slots: + void drawOptionsUpdated(); + private: KakouneClient *m_client; DrawOptions *m_draw_options;