From d80db4c389b31ffd9a3ac02d02561d9f6337c11f Mon Sep 17 00:00:00 2001
From: shangxiaoyang <shangxiaoyang@kylinos.cn>
Date: Sat, 20 Apr 2024 13:50:40 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9SDK=E5=90=8C=E6=AD=A5?=
 =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=8E=A5=E5=8F=A3=E8=87=B3=E5=BC=82=E6=AD=A5?=
 =?UTF-8?q?=E8=B0=83=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 widgets/toolbars/kpAiDrawingBar.cpp | 143 ++++++++++++++++++----------
 widgets/toolbars/kpAiDrawingBar.h   |  26 +++--
 2 files changed, 109 insertions(+), 60 deletions(-)

diff --git a/widgets/toolbars/kpAiDrawingBar.cpp b/widgets/toolbars/kpAiDrawingBar.cpp
index 27b8aac..26b36c0 100644
--- a/widgets/toolbars/kpAiDrawingBar.cpp
+++ b/widgets/toolbars/kpAiDrawingBar.cpp
@@ -51,7 +51,25 @@ kpAIDrawingBar::kpAIDrawingBar(QWidget *parent)
         loginConfigurationPage();
     else
     */
-        initUI();
+
+    m_AiMode = new AIModeDataThread();
+
+    initUI();
+
+    const char* json = R"(
+        {
+            "appId": "49080653",
+            "apiKey": "sd6XK461G446AHz43GAKMEme",
+            "secretKey": "dCauacFHm6CyWW5hVT3BGg7lavYxxXxB"
+        }
+        )";
+    capability_settings_set_deploy_policy(CAPABILITY_VISION, PUBLIC_CLOUD);
+
+    capability_settings_set_model(CAPABILITY_VISION,PUBLIC_CLOUD, "baidu");
+
+    capability_settings_set_model_config(Capability::CAPABILITY_VISION,
+                                         DeployPolicy::PUBLIC_CLOUD,
+                                         "baidu", json);
 
     setFixedWidth(250);
 }
@@ -60,6 +78,8 @@ kpAIDrawingBar::~kpAIDrawingBar()
 {
     if (AiSettings)
         delete AiSettings;
+    if (m_AiMode)
+        delete m_AiMode;
 }
 
 /**
@@ -315,6 +335,7 @@ void kpAIDrawingBar::initUI()
     buildButton->setFixedSize(224,36);
     buildButton->setStyleSheet(colorGrayButtonStyle);
     buildButton->setEnabled(false);
+    buildButtonFlag = false;
 
     /* 分页功能 */
     stackedWidget = new QStackedWidget(centralWidget);
@@ -393,7 +414,7 @@ void kpAIDrawingBar::initUI()
     connect(previousButton, &QPushButton::clicked, this, &kpAIDrawingBar::showPreviousPage);
     connect(nextButton, &QPushButton::clicked, this, &kpAIDrawingBar::showNextPage);
     connect(deleteButton, &QPushButton::clicked, this, &kpAIDrawingBar::deleteCurrentPage);
-    connect(&aiThread, &AIModeDataThread::finishedSignal, this, &kpAIDrawingBar::onThreadFinished);
+    connect(m_AiMode, &AIModeDataThread::finishedSignal, this, &kpAIDrawingBar::onThreadFinished);
 
     centralWidget->setFixedWidth(240);
 
@@ -785,6 +806,7 @@ void kpAIDrawingBar::onGenerateButtonClicked()
     buildButton->setEnabled(false);
     buildButton->setText(i18n("In formation..."));
     buildButton->setStyleSheet(colorGrayButtonStyle);
+    buildButtonFlag = true;
     if(!deleteButton->isEnabled())
         deleteButton->setEnabled(true);
 
@@ -804,7 +826,7 @@ void kpAIDrawingBar::handleInputTextChanged()
     //考虑添加生成中判断
     QString userText = static_cast<QTextEdit *>(findChild<QTextEdit *>())->toPlainText().trimmed();
     bool enableButton = !userText.isEmpty();
-    if (enableButton && !buildButton->isEnabled()) {
+    if (enableButton && !buildButton->isEnabled() && !buildButtonFlag) {
         qDebug()<<"buildButton  set  true";
         buildButton->setEnabled(enableButton);
         buildButton->setStyleSheet(colorfulButtonStyle);
@@ -815,29 +837,6 @@ void kpAIDrawingBar::handleInputTextChanged()
     }
 }
 
-/**
- * @brief AIModeDataThread::generateImageCallback
- * AI生成后回调函数
- * @param imageData
- * @param userData
- */
-void AIModeDataThread::generateImageCallback(VisionImageData imageData, void* userData){
-
-    qDebug()<<"AI生成回调函数: length:"<<imageData.data_size
-            <<"imageIndex:"<<imageData.index
-            <<"imageSum"<<imageData.total
-            <<"imageError="<<imageData.error_code
-            <<"Image format:"<< imageData.format;
-
-    AIModeDataThread *AIMode = (AIModeDataThread *)userData;
-    QPixmap map;
-    map.loadFromData(imageData.data, imageData.data_size);
-
-    if(imageData.index == 0)
-        emit AIMode->finishedSignal(false, map, imageData.index, imageData.total, imageData.error_code);
-    emit AIMode->finishedSignal(true, map, imageData.index, imageData.total, imageData.error_code);
-}
-
 /**
  * @brief kpAIDrawingBar::addPageAndStoreImages
  * 添加AI生成后的图片及页
@@ -965,7 +964,6 @@ void kpAIDrawingBar::onThreadFinished(bool flag, QPixmap pixmap, int imageIndex,
     QPixmap map;
     if(!flag){
         deleteImageGridWidget();
-        aiThread.exit();
         deleteButtonFlag = true;
         deleteButton->setEnabled(true);
         return;
@@ -985,9 +983,71 @@ void kpAIDrawingBar::onThreadFinished(bool flag, QPixmap pixmap, int imageIndex,
         buildButton->setEnabled(true);
         buildButton->setText(i18n("Generate now"));
         buildButton->setStyleSheet(colorfulButtonStyle);//设置立即生成按钮为立即生成
+        buildButtonFlag = false;
         addPageAndStoreImages();
     }
-    aiThread.exit();
+}
+
+
+AIModeDataThread::AIModeDataThread()
+{
+
+}
+
+AIModeDataThread::~AIModeDataThread()
+{
+    vision_destory_session(session);
+}
+
+bool AIModeDataThread::setSessionStatus()
+{
+    if (m_sessionFlag)
+        return true;
+
+    session = nullptr;
+    VisionResult ret = vision_create_session(&session);
+    if (ret != VISION_SUCCESS) {
+        qDebug()<<"创建失败VisionResult="<<ret
+                <<"ErrorMessage:"<<vision_get_last_error_message();
+        sendErrorSignal(ret);
+        m_sessionFlag = false;
+        return false;
+    }
+
+    VisionResult initRet = vision_init_session(session);
+    if (initRet != VISION_SUCCESS) {
+        qDebug()<<"初始化失败 VisionResult="<<initRet
+                <<"ErrorMessage:"<<vision_get_last_error_message();
+        sendErrorSignal(initRet);
+        m_sessionFlag = false;
+        return false;
+    }
+    m_sessionFlag = true;
+    return true;
+}
+
+/**
+ * @brief AIModeDataThread::generateImageCallback
+ * AI生成后回调函数
+ * @param imageData
+ * @param userData
+ */
+void AIModeDataThread::generateImageCallback(VisionImageData imageData, void* userData){
+
+    qDebug()<<"AI生成回调函数: length:"<<imageData.data_size
+            <<"imageIndex:"<<imageData.index
+            <<"imageSum"<<imageData.total
+            <<"imageError="<<imageData.error_code
+            <<"Image format:"<< imageData.format;
+
+    AIModeDataThread *AIMode = (AIModeDataThread *)userData;
+    QPixmap map;
+    map.loadFromData(imageData.data, imageData.data_size);
+    qDebug()<<"textBox ===== "<<AIMode->textBox;
+    if(imageData.index == 0)
+        emit AIMode->finishedSignal(false, map, imageData.index, imageData.total, imageData.error_code);
+    emit AIMode->finishedSignal(true, map, imageData.index, imageData.total, imageData.error_code);
+    qDebug()<<"------------------------------ generateImageCallback";
 }
 
 /**
@@ -997,25 +1057,6 @@ void kpAIDrawingBar::onThreadFinished(bool flag, QPixmap pixmap, int imageIndex,
  */
 bool AIModeDataThread::someFunctionInThread()
 {
-    VisionSession session = nullptr;
-    VisionResult ret = vision_create_session(&session);
-
-
-    if (ret != VISION_SUCCESS) {
-        qDebug()<<"创建失败VisionResult="<<ret
-                <<"ErrorMessage:"<<vision_get_last_error_message();
-        sendErrorSignal(ret);
-        return false;
-    }
-
-    VisionResult initRet = vision_init_session(session);
-    if (initRet != VISION_SUCCESS) {
-        qDebug()<<"初始化失败 VisionResult="<<initRet
-                <<"ErrorMessage:"<<vision_get_last_error_message();
-        sendErrorSignal(initRet);
-        return false;
-    }
-
     int width = AIImageSize.width() * multipleNum;
     int height = AIImageSize.height() * multipleNum;
 
@@ -1024,7 +1065,7 @@ bool AIModeDataThread::someFunctionInThread()
     vision_set_prompt2image_callback(session, generateImageCallback, this);
     vision_set_prompt2image_style(session, ImageStyle);
 
-    VisionResult imageRet = vision_prompt2image(session, textBox.toLocal8Bit().data());
+    VisionResult imageRet = vision_prompt2image_async(session, textBox.toLocal8Bit().data());
 
     qDebug()<<"ImageStyle == "<<ImageStyle;
     if (imageRet != VISION_SUCCESS) {
@@ -1033,8 +1074,6 @@ bool AIModeDataThread::someFunctionInThread()
         sendErrorSignal(imageRet);
         return false;
     }
-    vision_destory_session(session);
-
     return true;
 }
 
@@ -1196,12 +1235,14 @@ void kpAIDrawingBar::deleteCurrentPage()
         else
             setEnabledDeleteButton();
     }
-    else
+    else {
         setEnabledDeleteButton();
+    }
 }
 
 void kpAIDrawingBar::setEnabledDeleteButton()
 {
+    qDebug()<<"currentPageIndx == "<<currentPageIndx;
     if(!deleteButtonFlag && currentPageIndx == stackedWidget->count() - 1){
         deleteButton->setEnabled(false);
     }
diff --git a/widgets/toolbars/kpAiDrawingBar.h b/widgets/toolbars/kpAiDrawingBar.h
index 42e5636..4f89118 100644
--- a/widgets/toolbars/kpAiDrawingBar.h
+++ b/widgets/toolbars/kpAiDrawingBar.h
@@ -53,6 +53,7 @@
 #include <QGSettings>
 #include <ai-base/modelconfig.h>
 #include <ai-base/vision.h>
+#include <kylin-ai/config.h>
 
 #define LOADING_IMAGE   "/usr/share/kolourpaint/pics/loading.gif"
 #define BG_IMAGE        "/usr/share/kolourpaint/pics/bg@2x.png"
@@ -68,13 +69,17 @@
  * @brief The AIModeDataThread class
  * 线程类,用于跑AI的服务
  */
-class AIModeDataThread : public QThread {
+class AIModeDataThread : public QObject
+{
     Q_OBJECT
 
 public:
-    void run() override {
-        someFunctionInThread();
-    }
+    AIModeDataThread();
+    ~AIModeDataThread();
+
+    bool setSessionStatus();
+    bool someFunctionInThread();
+
     void setAIData (QString str, QSize size, int multiple, int quantity, VisionImageStyle Style){
         textBox = str;
         AIImageSize = size;
@@ -87,7 +92,6 @@ signals:
     void finishedSignal(bool flag, QPixmap pixmap, int imageIndex, int imageSum, int errorCode);
 
 private:
-    bool someFunctionInThread();
     void sendErrorSignal(int ret){
         emit finishedSignal(false, QPixmap(), 0, 1, ret);
         for(int i = 0; i < quantityNum; i++)
@@ -102,6 +106,8 @@ private:
     QSize       AIImageSize;
     QString     textBox;
     VisionImageStyle ImageStyle;
+    bool          m_sessionFlag = false;
+    VisionSession session;
 };
 
 /**
@@ -173,9 +179,10 @@ private slots:
     void onStyleMoreButtonClick();
 
     void startThread() {
-        // 启动线程
-        aiThread.setAIData(textBox, AIImageSize, multipleNum, quantityNum, ImageStyle);
-        aiThread.start();
+        if (m_AiMode->setSessionStatus()){
+            m_AiMode->setAIData(textBox, AIImageSize, multipleNum, quantityNum, ImageStyle);
+            m_AiMode->someFunctionInThread();
+        }
     }
     void onThreadFinished(bool flag, QPixmap pixmap, int imageIndex, int imageSum, int errorCode);
 
@@ -205,6 +212,7 @@ private:
 
     bool        styleFlag;   //风格标志位,用于判断按下哪一个风格
     bool        deleteButtonFlag = true;
+    bool        buildButtonFlag;
 
     QGSettings  *AiSettings;    //监听配置信息
     QSize       AIImageSize;    //图片大小
@@ -240,7 +248,7 @@ private:
     QVector<QVector<QPixmap>> imagesVector; //生成图像数据集成
 
     VisionImageStyle  ImageStyle; //风格样式
-    AIModeDataThread  aiThread;  //线程类
+    AIModeDataThread  *m_AiMode;  //AI生成程序
 
 };
 #endif