فهرست منبع

add project manager

xuqiang 5 ماه پیش
والد
کامیت
35ed35d362
2فایلهای تغییر یافته به همراه101 افزوده شده و 0 حذف شده
  1. 28 0
      include/projectmanager.h
  2. 73 0
      src/projectmanager.cpp

+ 28 - 0
include/projectmanager.h

@@ -0,0 +1,28 @@
+#ifndef __PROJECTMANAGER_H__
+#define __PROJECTMANAGER_H__
+
+#include <QObject>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+class ProjectManager : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit ProjectManager(QObject *parent = nullptr);
+    ~ProjectManager();
+
+    bool openProject(const QString &fileName);
+    void closeProject();
+
+    xmlNodePtr canvas(const int &index);
+    int canvasCount() const;
+
+private:
+    xmlDocPtr m_xmlDocPtr;
+    QList<xmlNodePtr> m_canvasList;
+
+};
+
+#endif  // PROJECTMANAGER_H

+ 73 - 0
src/projectmanager.cpp

@@ -0,0 +1,73 @@
+#include "projectmanager.h"
+#include "logger.h"
+
+ProjectManager::ProjectManager(QObject *parent)
+    : QObject{parent}
+    , m_xmlDocPtr(nullptr)
+{
+
+}
+
+ProjectManager::~ProjectManager()
+{
+    closeProject();
+}
+
+bool ProjectManager::openProject(const QString &fileName)
+{
+    // 指定编码(如UTF-8)
+    m_xmlDocPtr = xmlReadFile(fileName.toUtf8().data(), "UTF-8", XML_PARSE_RECOVER | XML_PARSE_NOERROR | XML_PARSE_NOWARNING);
+    if (m_xmlDocPtr == NULL) {
+        LOG_ERROR("invalid monitor xml: {}", fileName.toUtf8().data());
+        return false;
+    }
+
+    // 获取根节点
+    xmlNodePtr projectNodePtr = xmlDocGetRootElement(m_xmlDocPtr);
+    if (projectNodePtr == NULL) {
+        LOG_INFO("empty monitor xml: {}", fileName.toUtf8().data());
+        xmlFreeDoc(m_xmlDocPtr);
+        return false;
+    }
+
+    if (xmlStrcmp(projectNodePtr->name, BAD_CAST "project") != 0) {
+        LOG_ERROR("error project node, node name is: {}", (char *)projectNodePtr->name);
+        xmlFreeDoc(m_xmlDocPtr);
+        return false;
+    }
+
+    xmlNodePtr canvasNodePtr = projectNodePtr->children;
+    while(canvasNodePtr)
+    {
+        if (canvasNodePtr->type == XML_ELEMENT_NODE && xmlStrcmp(canvasNodePtr->name, BAD_CAST "canvas") == 0)
+        {
+            m_canvasList.push_back(canvasNodePtr);
+        }
+        canvasNodePtr = canvasNodePtr->next;
+    }
+    return true;
+}
+
+void ProjectManager::closeProject()
+{
+    if(m_xmlDocPtr)
+    {
+        // 释放资源
+        xmlFreeDoc(m_xmlDocPtr);
+        xmlCleanupParser();
+        m_xmlDocPtr = nullptr;
+        m_canvasList.clear();
+    }
+}
+
+xmlNodePtr ProjectManager::canvas(const int &index)
+{
+    if(index < 0 || index >= m_canvasList.count())
+        return nullptr;
+    return m_canvasList[index];
+}
+
+int ProjectManager::canvasCount() const
+{
+    return m_canvasList.count();
+}