Browse Source

switching to scrollable message area

logicp 5 years ago
parent
commit
db7c42485d
7 changed files with 140 additions and 121 deletions
  1. 7 0
      .gitignore
  2. 4 3
      client.cpp
  3. 5 5
      headers/ktextedit.hpp
  4. 88 91
      headers/util.hpp
  5. 1 1
      ky_gui.pro.user
  6. 3 4
      mainwindow.cpp
  7. 32 17
      mainwindow.ui

+ 7 - 0
.gitignore

@@ -0,0 +1,7 @@
+ui_mainwindow.h
+ky_gui
+moc*
+tags
+*.o
+Makefile
+*.stash

+ 4 - 3
client.cpp

@@ -69,14 +69,15 @@ void Client::handleMessages() {
         size_t end_idx = findNullIndex(receive_buffer);
         std::string data_string{receive_buffer, receive_buffer + end_idx};
         StringVec s_v{};
-        if (rapidIsNewSession(data_string.c_str())) {
-            m_commands = rapidGetArgMap(data_string.c_str());
+        if (isNewSession(data_string.c_str())) {
+            m_commands = getArgMap(data_string.c_str());
             for (const auto& [k, v] : m_commands) {
                 s_v.push_back(v.data());
             }
             emit Client::messageReceived(COMMANDS_UPDATE_TYPE, "", s_v);
         }
-        emit Client::messageReceived(MESSAGE_UPDATE_TYPE, QString::fromUtf8(data_string.data(), data_string.size()), {});
+        std::string formatted_json = getJsonString(data_string);
+        emit Client::messageReceived(MESSAGE_UPDATE_TYPE, QString::fromUtf8(formatted_json.data(), formatted_json.size()), {});
     }
     memset(receive_buffer, 0, 2048);
     ::close(m_client_socket_fd);

+ 5 - 5
headers/ktextedit.hpp

@@ -1,10 +1,10 @@
-#include <QPlainTextEdit>
+#include <QTextEdit>
 #include <QDebug>
 #include <QKeyEvent>
 #include <QtUiPlugin/QDesignerCustomWidgetInterface>
 
 
-class KTextEdit : public QPlainTextEdit, public QDesignerCustomWidgetInterface {
+class KTextEdit : public QTextEdit, public QDesignerCustomWidgetInterface {
     Q_PLUGIN_METADATA(IID "kstyleyo.kygui.ktextedit" FILE "ktextedit.json")
     Q_INTERFACES(QDesignerCustomWidgetInterface)
 
@@ -12,11 +12,11 @@ class KTextEdit : public QPlainTextEdit, public QDesignerCustomWidgetInterface {
 public:
 
     QString toPlainText() {
-        return QPlainTextEdit::toPlainText();
+        return QTextEdit::toPlainText();
     }
 
     void clear() {
-        QPlainTextEdit::clear();
+        QTextEdit::clear();
     }
 
 protected:
@@ -25,7 +25,7 @@ protected:
         if (e->key()==Qt::Key_Enter) {
             qDebug() << "Ouch!";
         }
-        QPlainTextEdit::keyPressEvent(e);
+        QTextEdit::keyPressEvent(e);
     }
 
 };

+ 88 - 91
headers/util.hpp

@@ -7,6 +7,7 @@
 #include <vector>
 #include <QDebug>
 #include "rapidjson/writer.h"
+#include "rapidjson/prettywriter.h"
 #include "rapidjson/pointer.h"
 #include "rapidjson/stringbuffer.h"
 #include "rapidjson/document.h"
@@ -23,21 +24,21 @@ typedef std::vector<std::string> StdStringVec;
 typedef std::map<int, std::string> CommandMap;
 
 struct KSession {
-  int id;
-  int fd;
-  int status;
+    int id;
+    int fd;
+    int status;
 };
 
-//std::string createMessage(const char* data, std::string args = "") {
-//  json data_json{};
-//  data_json["type"] = "custom";
-//  data_json["args"] = args;
-//  data_json["message"] = data;
-
-//  return data_json.dump();
-//}
+std::string getJsonString(std::string s) {
+    Document d;
+    d.Parse(s.c_str());
+    StringBuffer buffer;
+    PrettyWriter<StringBuffer> writer(buffer);
+    d.Accept(writer);
+    return buffer.GetString();
+}
 
-std::string rapidCreateMessage(const char* data, std::string args = "") {
+std::string createMessage(const char* data, std::string args = "") {
     StringBuffer s;
     Writer<StringBuffer> w(s);
     w.StartObject();
@@ -51,13 +52,42 @@ std::string rapidCreateMessage(const char* data, std::string args = "") {
     return s.GetString();
 }
 
-bool rapidIsOperation(const char* data) {
+bool isOperation(const char* data) {
+    Document d;
+    d.Parse(data);
+    return strcmp(d["type"].GetString(), "operation") == 0;
+}
+
+std::string createOperation(const char* op, std::vector<std::string> args) {
+    StringBuffer s;
+    Writer<StringBuffer> w(s);
+    w.StartObject();
+    w.Key("type");
+    w.String("operation");
+    w.Key("command");
+    w.String(op);
+    w.Key("args");
+    w.StartArray();
+    if (!args.empty()) {
+        for (const auto& arg : args) {
+            w.String(arg.c_str());
+        }
+    }
+    w.EndArray();
+    w.EndObject();
+    return s.GetString();
+}
+
+std::string getOperation(const char* data) {
     Document d;
     d.Parse(data);
-    return strcmp(d["type"].GetString(), "operation");
+    if (d.HasMember("command")) {
+        return d["command"].GetString();
+    }
+    return "";
 }
 
-CommandMap rapidGetArgMap(const char* data) {
+CommandMap getArgMap(const char* data) {
     Document d;
     d.Parse(data);
     CommandMap cm{};
@@ -69,7 +99,7 @@ CommandMap rapidGetArgMap(const char* data) {
     return cm;
 }
 
-std::string rapidCreateMessage(const char* data,
+std::string createMessage(const char* data,
                           std::map<int, std::string> map = {}) {
     StringBuffer s;
     Writer<StringBuffer> w(s);
@@ -91,19 +121,41 @@ std::string rapidCreateMessage(const char* data,
     return s.GetString();
 }
 
-bool rapidIsStartOperation(const char* data) {
+std::string rapidCreateMessage(const char* data,
+                               std::map<int, std::string> map = {}) {
+    StringBuffer s;
+    Writer<StringBuffer> w(s);
+    w.StartObject();
+    w.Key("type");
+    w.String("custom");
+    w.Key("message");
+    w.String(data);
+    w.Key("args");
+    w.StartObject();
+    if (!map.empty()) {
+        for (const auto& [k, v] : map) {
+            w.Key(std::to_string(k).c_str());
+            w.String(v.c_str());
+        }
+    }
+    w.EndObject();
+    w.EndObject();
+    return s.GetString();
+}
+
+bool isStartOperation(const char* data) {
     Document d;
     d.Parse(data);
-    return strcmp(d["command"].GetString(), "start");
+    return strcmp(d["command"].GetString(), "start") == 0;
 }
 
-bool rapidIsStopOperation(const char* data) {
+bool isStopOperation(const char* data) {
     Document d;
     d.Parse(data);
-    return strcmp(d["command"].GetString(), "stop");
+    return strcmp(d["command"].GetString(), "stop") == 0;
 }
 
-bool rapidIsNewSession(const char* data) {
+bool isNewSession(const char* data) {
     Document d;
     d.Parse(data);
     if (d.HasMember("message")) {
@@ -112,80 +164,25 @@ bool rapidIsNewSession(const char* data) {
     return false;
 }
 
-//std::string createMessageWithDataMap(const char* data,
-//                          std::map<int, std::string> map = {}) {
-//    json data_json{};
-//    data_json["type"] = "custom";
-//    data_json["message"] = data;
-//    data_json["args"] = nullptr;
-//    if (!map.empty()) {
-//        for (const auto& [k, v] : map) {
-//            data_json["args"][k] = v;
-//        }
-//    }
-//    return data_json;
-//}
-
-//std::string createMessage(const char* data, const char* extra = "") {
-//    json data_json{};
-//    data_json["type"] = "custom";
-//    data_json["message"] = data;
-//    data_json["args"] = extra;
-//    return data_json.dump();
-//}
-
-//std::string createMessage(const char* data, TupVec v = {}) {
-//  json data_json{};
-//  data_json["type"] = "custom";
-//  data_json["message"] = data;
-//  data_json["args"] = nullptr;
-//  if (!v.empty()) {
-//    for (const auto& r : v) {
-//      data_json["args"][r.first] = r.second;
-//    }
-//  }
-//  return data_json.dump();
-//}
-
-std::string createOperation(const char* op, std::vector<std::string> args) {
-  json operation_json{};
-  operation_json["type"] = "operation";
-  operation_json["command"] = op;
-  if (!args.empty()) {
-    operation_json["args"] = args;
-  }
-  return operation_json.dump();
+std::string stringTupleVecToJson(
+    std::vector<std::pair<std::string, std::string>> v) {
+    json j{};
+    for (const auto& row : v) {
+        j[row.first] = row.second;
+    }
+    return j;
 }
 
-//std::string stringTupleVecToJson(
-//    std::vector<std::pair<std::string, std::string>> v) {
-//  json j{};
-//  for (const auto& row : v) {
-//    j[row.first] = row.second;
-//  }
-//  return j;
-//}
-
-//bool isOperation(json data) { return *(data.find("type")) == "operation"; }
-
-//bool isNewSession(json data) {
-//  return *(data.find("message")) == "New Session";
-//}
-
-//bool isStartOperation(std::string operation) { return operation == "start"; }
-
-//bool isStopOperation(std::string operation) { return operation == "stop"; }
-
 inline size_t findNullIndex(uint8_t* data) {
-  size_t index = 0;
-  while (data) {
-    if (strcmp(const_cast<const char*>((char*)data), "\0") == 0) {
-      break;
+    size_t index = 0;
+    while (data) {
+        if (strcmp(const_cast<const char*>((char*)data), "\0") == 0) {
+            break;
+        }
+        index++;
+        data++;
     }
-    index++;
-    data++;
-  }
-  return index;
+    return index;
 }
 
 #endif  // __UTIL_HPP__

+ 1 - 1
ky_gui.pro.user

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.9.2, 2019-12-22T16:19:21. -->
+<!-- Written by QtCreator 4.9.2, 2019-12-24T12:11:11. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>

+ 3 - 4
mainwindow.cpp

@@ -2,7 +2,7 @@
 #include "ui_mainwindow.h"
 #include <QCommandLinkButton>
 #include <QDebug>
-#include <QLabel>
+#include <QTextEdit>
 #include <QTextStream>
 #include <QString>
 #include <QLayout>
@@ -50,7 +50,7 @@ void MainWindow::connectClient() {
     // Handle mouse
     QObject::connect(send_message_button, &QPushButton::clicked, this, [q_client, send_message_box]() {
         q_client->sendMessage(send_message_box->toPlainText());
-//        send_message_box->clear();
+        send_message_box->clear();
     });
     // TODO: Handle enter key
 //    QObject::connect(send_message_box, &QTextEdit::keyReleaseEvent, this, [q_client, send_message_box]() {
@@ -69,8 +69,7 @@ void MainWindow::connectClient() {
 void MainWindow::updateMessages(int t, const QString& s, StringVec v) {
     if (t == MESSAGE_UPDATE_TYPE) {
         qDebug() << "Updating message area";
-        QLabel* message_display = this->findChild<QLabel*>("messages");
-        message_display->setText(message_display->text() + "\n" + s);
+        ui->messages->append(s);
     } else if (t == COMMANDS_UPDATE_TYPE) {
         qDebug() << "Updating commands";
         QListWidget* appList = ui->appList;

+ 32 - 17
mainwindow.ui

@@ -105,30 +105,27 @@ color: rgb(16, 16, 16);</string>
      <string>Send</string>
     </property>
    </widget>
-   <widget class="QLabel" name="messages">
+   <widget class="QTextEdit" name="inputText">
     <property name="geometry">
      <rect>
       <x>40</x>
-      <y>90</y>
-      <width>371</width>
-      <height>171</height>
+      <y>360</y>
+      <width>521</width>
+      <height>81</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">background-color: rgb(0, 255, 0);
 color: rgb(16, 16, 16);</string>
     </property>
-    <property name="text">
-     <string/>
-    </property>
    </widget>
-   <widget class="QPlainTextEdit" name="inputText">
+   <widget class="QListWidget" name="appList">
     <property name="geometry">
      <rect>
-      <x>40</x>
-      <y>360</y>
-      <width>521</width>
-      <height>81</height>
+      <x>450</x>
+      <y>40</y>
+      <width>141</width>
+      <height>291</height>
      </rect>
     </property>
     <property name="styleSheet">
@@ -136,19 +133,37 @@ color: rgb(16, 16, 16);</string>
 color: rgb(16, 16, 16);</string>
     </property>
    </widget>
-   <widget class="QListWidget" name="appList">
+   <widget class="QTextEdit" name="messages">
     <property name="geometry">
      <rect>
-      <x>450</x>
-      <y>40</y>
-      <width>141</width>
-      <height>291</height>
+      <x>40</x>
+      <y>60</y>
+      <width>391</width>
+      <height>211</height>
      </rect>
     </property>
+    <property name="toolTip">
+     <string>Messages</string>
+    </property>
+    <property name="toolTipDuration">
+     <number>1</number>
+    </property>
+    <property name="autoFillBackground">
+     <bool>false</bool>
+    </property>
     <property name="styleSheet">
      <string notr="true">background-color: rgb(0, 255, 0);
 color: rgb(16, 16, 16);</string>
     </property>
+    <property name="lineWrapMode">
+     <enum>QTextEdit::WidgetWidth</enum>
+    </property>
+    <property name="readOnly">
+     <bool>true</bool>
+    </property>
+    <property name="placeholderText">
+     <string/>
+    </property>
    </widget>
   </widget>
   <widget class="QMenuBar" name="menuBar">