diff options
author | saturneric <[email protected]> | 2024-11-27 20:23:51 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2024-11-27 20:23:51 +0000 |
commit | a83c6e28a16f998d89b956688f07ce5352a2864f (patch) | |
tree | 796ad69eee3add96df38e3e4f1dc78a82745a9db /src/sdk/GFSDKUI.cpp | |
parent | fix: solve devops build issues (diff) | |
download | GpgFrontend-a83c6e28a16f998d89b956688f07ce5352a2864f.tar.gz GpgFrontend-a83c6e28a16f998d89b956688f07ce5352a2864f.zip |
feat: improve ui logic and support more email operations
Diffstat (limited to 'src/sdk/GFSDKUI.cpp')
-rw-r--r-- | src/sdk/GFSDKUI.cpp | 78 |
1 files changed, 76 insertions, 2 deletions
diff --git a/src/sdk/GFSDKUI.cpp b/src/sdk/GFSDKUI.cpp index 54716209..cc08705c 100644 --- a/src/sdk/GFSDKUI.cpp +++ b/src/sdk/GFSDKUI.cpp @@ -31,9 +31,10 @@ #include <core/utils/CommonUtils.h> #include <QMap> +#include <QObject> #include <QString> -#include "sdk/private/CommonUtils.h" +#include "private/GFSDKPrivat.h" #include "ui/UIModuleManager.h" auto MetaDataArrayToQMap(MetaData** meta_data_array, @@ -53,7 +54,7 @@ auto MetaDataArrayToQMap(MetaData** meta_data_array, } auto GFUIMountEntry(const char* id, MetaData** meta_data_array, - int meta_data_array_size, EntryFactory factory) -> int { + int meta_data_array_size, QObjectFactory factory) -> int { if (id == nullptr || factory == nullptr) return -1; auto meta_data = MetaDataArrayToQMap(meta_data_array, meta_data_array_size); @@ -69,3 +70,76 @@ auto GFUIMountEntry(const char* id, MetaData** meta_data_array, return 0; } + +auto GPGFRONTEND_MODULE_SDK_EXPORT GFUIMainWindowPtr() -> void* { + return GpgFrontend::UI::UIModuleManager::GetInstance().GetQObject( + "main_window"); +} + +auto GPGFRONTEND_MODULE_SDK_EXPORT +GFUIShowDialog(void* dialog_raw_ptr, void* parent_raw_ptr) -> bool { + if (dialog_raw_ptr == nullptr) { + LOG_E() << "dialog raw ptr is nullptr"; + return false; + } + + auto* q_obj = static_cast<QObject*>(dialog_raw_ptr); + QPointer<QDialog> dialog = qobject_cast<QDialog*>(q_obj); + + if (dialog == nullptr) { + LOG_E() << "convert dialog raw ptr to qdialog failed"; + return false; + } + + QPointer<QWidget> parent = nullptr; + if (parent_raw_ptr != nullptr) { + auto* qp_obj = static_cast<QObject*>(parent_raw_ptr); + parent = qobject_cast<QWidget*>(qp_obj); + + if (parent == nullptr) { + LOG_E() << "convert parent raw ptr to qwidget failed"; + return false; + } + } + + auto* main_thread = QApplication::instance()->thread(); + + LOG_D() << "before entering into main thread, current thread id:" + << QThread::currentThreadId() + << ", dialog thread: " << dialog->thread() + << "main thread: " << main_thread; + + if (dialog->thread() != main_thread) { + LOG_E() << "dialog must be created on main thread"; + return false; + } + + QMetaObject::invokeMethod( + parent == nullptr ? QPointer<QObject>(QApplication::instance()) : parent, + [dialog, parent]() -> int { + LOG_D() << "show qdialog, current thread id:" + << QThread::currentThreadId(); + dialog->setParent(parent); + dialog->show(); + return 0; + }); + + return true; +} + +auto GPGFRONTEND_MODULE_SDK_EXPORT GFUICreateGUIObject(QObjectFactory factory, + void* data) -> void* { + QEventLoop loop; + void* object = nullptr; + + QMetaObject::invokeMethod(QApplication::instance(), [&]() -> int { + LOG_D() << "create gui object, current thread id:" + << QThread::currentThreadId(); + object = factory(data); + loop.quit(); + return 0; + }); + + loop.exec(); + return object; +} |