diff options
author | Saturneric <[email protected]> | 2022-05-09 16:33:50 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2022-05-09 16:33:50 +0000 |
commit | 47abca2607c8ec0ee50a67001707cabdf2b6608e (patch) | |
tree | 46a0235ea8bc33794d248e1916060321fb2c3750 | |
parent | fix: modified init order (diff) | |
download | GpgFrontend-47abca2607c8ec0ee50a67001707cabdf2b6608e.tar.gz GpgFrontend-47abca2607c8ec0ee50a67001707cabdf2b6608e.zip |
feat: improve UI library's encapsulation
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | src/init.cpp | 84 | ||||
-rw-r--r-- | src/main.cpp | 62 | ||||
-rw-r--r-- | src/ui/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/ui/GpgFrontendUI.h | 2 | ||||
-rw-r--r-- | src/ui/GpgFrontendUIInit.cpp | 138 | ||||
-rw-r--r-- | src/ui/GpgFrontendUIInit.h | 7 |
7 files changed, 155 insertions, 143 deletions
@@ -3,6 +3,7 @@ src/GpgFrontend.h src/GpgFrontendBuildInfo.h src/GpgFrontendBuildInstallInfo.h src/core/GpgFrontendCoreExport.h +src/core/GpgFrontendUIExport.h docs/ # gettext diff --git a/src/init.cpp b/src/init.cpp index 7aefc00f..2f4955f5 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -47,86 +47,4 @@ std::vector<std::filesystem::path> get_files_of_directory( } } return path_list; -} - -/** - * @brief setup the locale and load the translations - * - */ -void init_locale() { - // get the instance of the GlobalSettingStation - auto& settings = - GpgFrontend::GlobalSettingStation::GetInstance().GetUISettings(); - - // create general settings if not exist - if (!settings.exists("general") || - settings.lookup("general").getType() != libconfig::Setting::TypeGroup) - settings.add("general", libconfig::Setting::TypeGroup); - - // set system default at first - auto& general = settings["general"]; - if (!general.exists("lang")) - general.add("lang", libconfig::Setting::TypeString) = ""; - - // sync the settings to the file - GpgFrontend::GlobalSettingStation::GetInstance().SyncSettings(); - - LOG(INFO) << "current system locale" << setlocale(LC_ALL, nullptr); - - // read from settings file - std::string lang; - if (!general.lookupValue("lang", lang)) { - LOG(ERROR) << _("could not read properly from configure file"); - }; - - LOG(INFO) << "lang from settings" << lang; - LOG(INFO) << "project name" << PROJECT_NAME; - LOG(INFO) << "locales path" - << GpgFrontend::GlobalSettingStation::GetInstance() - .GetLocaleDir() - .c_str(); - -#ifndef WINDOWS - if (!lang.empty()) { - std::string lc = lang.empty() ? "" : lang + ".UTF-8"; - - // set LC_ALL - auto* locale_name = setlocale(LC_ALL, lc.c_str()); - if (locale_name == nullptr) LOG(WARNING) << "set LC_ALL failed" << lc; - auto language = getenv("LANGUAGE"); - // set LANGUAGE - std::string language_env = language == nullptr ? "en" : language; - language_env.insert(0, lang + ":"); - LOG(INFO) << "language env" << language_env; - if (setenv("LANGUAGE", language_env.c_str(), 1)) { - LOG(WARNING) << "set LANGUAGE failed" << language_env; - }; - } -#else - if (!lang.empty()) { - std::string lc = lang.empty() ? "" : lang; - - // set LC_ALL - auto* locale_name = setlocale(LC_ALL, lc.c_str()); - if (locale_name == nullptr) LOG(WARNING) << "set LC_ALL failed" << lc; - - auto language = getenv("LANGUAGE"); - // set LANGUAGE - std::string language_env = language == nullptr ? "en" : language; - language_env.insert(0, lang + ":"); - language_env.insert(0, "LANGUAGE="); - LOG(INFO) << "language env" << language_env; - if (putenv(language_env.c_str())) { - LOG(WARNING) << "set LANGUAGE failed" << language_env; - }; - } -#endif - - bindtextdomain(PROJECT_NAME, - GpgFrontend::GlobalSettingStation::GetInstance() - .GetLocaleDir() - .u8string() - .c_str()); - bind_textdomain_codeset(PROJECT_NAME, "utf-8"); - textdomain(PROJECT_NAME); -} +}
\ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 6a03f5ea..24f2b7fa 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -57,12 +57,6 @@ jmp_buf recover_env; /** * @brief * - */ -extern void init_locale(); - -/** - * @brief - * * @param sig */ extern void handle_signal(int sig); @@ -125,9 +119,6 @@ int main(int argc, char* argv[]) { file.close(); #endif - // init ui library - GpgFrontend::UI::InitGpgFrontendUI(); - /** * internationalisation. loop to restart main window * with changed translation when settings change. @@ -144,56 +135,13 @@ int main(int argc, char* argv[]) { #ifdef RELEASE try { #endif - // init the i18n support - init_locale(); - - // create the thread to load the gpg context - auto* init_ctx_thread = new GpgFrontend::CtxCheckThread(); - QApplication::connect(init_ctx_thread, &QThread::finished, init_ctx_thread, - &QThread::deleteLater); - - // create and show loading window before starting the main window - auto* waiting_dialog = new QProgressDialog(); - waiting_dialog->setMaximum(0); - waiting_dialog->setMinimum(0); - auto waiting_dialog_label = - new QLabel(QString(_("Loading Gnupg Info...")) + "<br /><br />" + - _("If this process is too slow, please set the key " - "server address appropriately in the gnupg configuration " - "file (depending " - "on the network situation in your country or region).")); - waiting_dialog_label->setWordWrap(true); - waiting_dialog->setLabel(waiting_dialog_label); - waiting_dialog->resize(420, 120); - QApplication::connect(init_ctx_thread, &QThread::finished, [=]() { - waiting_dialog->finished(0); - waiting_dialog->deleteLater(); - }); - QApplication::connect(waiting_dialog, &QProgressDialog::canceled, [=]() { - LOG(INFO) << "cancel clicked"; - if (init_ctx_thread->isRunning()) init_ctx_thread->terminate(); - QCoreApplication::quit(); - exit(0); - }); - - // show the loading window - waiting_dialog->show(); - waiting_dialog->setFocus(); - - // start the thread to load the gpg context - init_ctx_thread->start(); - QEventLoop loop; - QApplication::connect(init_ctx_thread, &QThread::finished, &loop, - &QEventLoop::quit); - loop.exec(); - QApplication::setQuitOnLastWindowClosed(true); - // create main window and show it - auto main_window = std::make_unique<GpgFrontend::UI::MainWindow>(); - main_window->Init(); - main_window->show(); - return_from_event_loop_code = QApplication::exec(); + // init ui library + GpgFrontend::UI::InitGpgFrontendUI(); + + // create main window + return_from_event_loop_code = GpgFrontend::UI::RunGpgFrontendUI(); #ifdef RELEASE } catch (...) { // catch all unhandled exceptions and notify the user diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index c23fa8ed..6e3ee4be 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -39,7 +39,11 @@ aux_source_directory(import_export UI_SOURCE) aux_source_directory(dialog UI_SOURCE) # define libgpgfrontend_ui +set(CMAKE_CXX_VISIBILITY_PRESET hidden) +set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) add_library(gpgfrontend_ui SHARED ${UI_SOURCE}) +set(_export_file "${CMAKE_CURRENT_SOURCE_DIR}/GpgFrontendUIExport.h") +generate_export_header(gpgfrontend_ui EXPORT_FILE_NAME "${_export_file}") # link Qt target_link_libraries(gpgfrontend_ui diff --git a/src/ui/GpgFrontendUI.h b/src/ui/GpgFrontendUI.h index df6d891f..b355ec85 100644 --- a/src/ui/GpgFrontendUI.h +++ b/src/ui/GpgFrontendUI.h @@ -45,6 +45,8 @@ #include "core/GpgFrontendCore.h" #include "core/GpgModel.h" +#include "ui/GpgFrontendUIExport.h" + /** * 3rd party dependencies */ diff --git a/src/ui/GpgFrontendUIInit.cpp b/src/ui/GpgFrontendUIInit.cpp index 49f16ec5..2a8ac8b4 100644 --- a/src/ui/GpgFrontendUIInit.cpp +++ b/src/ui/GpgFrontendUIInit.cpp @@ -28,9 +28,11 @@ #include "GpgFrontendUIInit.h" -#include "SignalStation.h" -#include "UserInterfaceUtils.h" #include "core/function/GlobalSettingStation.h" +#include "core/thread/CtxCheckThread.h" +#include "ui/SignalStation.h" +#include "ui/UserInterfaceUtils.h" +#include "ui/main_window/MainWindow.h" // init easyloggingpp library INITIALIZE_EASYLOGGINGPP @@ -38,11 +40,61 @@ INITIALIZE_EASYLOGGINGPP namespace GpgFrontend::UI { extern void init_logging(); +extern void init_locale(); void InitGpgFrontendUI() { + init_locale(); init_logging(); SignalStation::GetInstance(); CommonUtils::GetInstance(); + + // create the thread to load the gpg context + auto* init_ctx_thread = new GpgFrontend::CtxCheckThread(); + QApplication::connect(init_ctx_thread, &QThread::finished, init_ctx_thread, + &QThread::deleteLater); + + // create and show loading window before starting the main window + auto* waiting_dialog = new QProgressDialog(); + waiting_dialog->setMaximum(0); + waiting_dialog->setMinimum(0); + auto waiting_dialog_label = + new QLabel(QString(_("Loading Gnupg Info...")) + "<br /><br />" + + _("If this process is too slow, please set the key " + "server address appropriately in the gnupg configuration " + "file (depending " + "on the network situation in your country or region).")); + waiting_dialog_label->setWordWrap(true); + waiting_dialog->setLabel(waiting_dialog_label); + waiting_dialog->resize(420, 120); + QApplication::connect(init_ctx_thread, &QThread::finished, [=]() { + waiting_dialog->finished(0); + waiting_dialog->deleteLater(); + }); + QApplication::connect(waiting_dialog, &QProgressDialog::canceled, [=]() { + LOG(INFO) << "cancel clicked"; + if (init_ctx_thread->isRunning()) init_ctx_thread->terminate(); + QCoreApplication::quit(); + exit(0); + }); + + // show the loading window + waiting_dialog->show(); + waiting_dialog->setFocus(); + + // start the thread to load the gpg context + init_ctx_thread->start(); + QEventLoop loop; + QApplication::connect(init_ctx_thread, &QThread::finished, &loop, + &QEventLoop::quit); + loop.exec(); +} + +int RunGpgFrontendUI() { + // create main window and show it + auto main_window = std::make_unique<GpgFrontend::UI::MainWindow>(); + main_window->Init(); + main_window->show(); + return QApplication::exec(); } void init_logging() { @@ -71,4 +123,86 @@ void init_logging() { LOG(INFO) << _("log file path") << logfile_path; } + +/** + * @brief setup the locale and load the translations + * + */ +void init_locale() { + // get the instance of the GlobalSettingStation + auto& settings = + GpgFrontend::GlobalSettingStation::GetInstance().GetUISettings(); + + // create general settings if not exist + if (!settings.exists("general") || + settings.lookup("general").getType() != libconfig::Setting::TypeGroup) + settings.add("general", libconfig::Setting::TypeGroup); + + // set system default at first + auto& general = settings["general"]; + if (!general.exists("lang")) + general.add("lang", libconfig::Setting::TypeString) = ""; + + // sync the settings to the file + GpgFrontend::GlobalSettingStation::GetInstance().SyncSettings(); + + LOG(INFO) << "current system locale" << setlocale(LC_ALL, nullptr); + + // read from settings file + std::string lang; + if (!general.lookupValue("lang", lang)) { + LOG(ERROR) << _("could not read properly from configure file"); + }; + + LOG(INFO) << "lang from settings" << lang; + LOG(INFO) << "project name" << PROJECT_NAME; + LOG(INFO) << "locales path" + << GpgFrontend::GlobalSettingStation::GetInstance() + .GetLocaleDir() + .c_str(); + +#ifndef WINDOWS + if (!lang.empty()) { + std::string lc = lang.empty() ? "" : lang + ".UTF-8"; + + // set LC_ALL + auto* locale_name = setlocale(LC_ALL, lc.c_str()); + if (locale_name == nullptr) LOG(WARNING) << "set LC_ALL failed" << lc; + auto language = getenv("LANGUAGE"); + // set LANGUAGE + std::string language_env = language == nullptr ? "en" : language; + language_env.insert(0, lang + ":"); + LOG(INFO) << "language env" << language_env; + if (setenv("LANGUAGE", language_env.c_str(), 1)) { + LOG(WARNING) << "set LANGUAGE failed" << language_env; + }; + } +#else + if (!lang.empty()) { + std::string lc = lang.empty() ? "" : lang; + + // set LC_ALL + auto* locale_name = setlocale(LC_ALL, lc.c_str()); + if (locale_name == nullptr) LOG(WARNING) << "set LC_ALL failed" << lc; + + auto language = getenv("LANGUAGE"); + // set LANGUAGE + std::string language_env = language == nullptr ? "en" : language; + language_env.insert(0, lang + ":"); + language_env.insert(0, "LANGUAGE="); + LOG(INFO) << "language env" << language_env; + if (putenv(language_env.c_str())) { + LOG(WARNING) << "set LANGUAGE failed" << language_env; + }; + } +#endif + + bindtextdomain(PROJECT_NAME, GpgFrontend::GlobalSettingStation::GetInstance() + .GetLocaleDir() + .u8string() + .c_str()); + bind_textdomain_codeset(PROJECT_NAME, "utf-8"); + textdomain(PROJECT_NAME); +} + } // namespace GpgFrontend::UI
\ No newline at end of file diff --git a/src/ui/GpgFrontendUIInit.h b/src/ui/GpgFrontendUIInit.h index 6518256b..d7b6390d 100644 --- a/src/ui/GpgFrontendUIInit.h +++ b/src/ui/GpgFrontendUIInit.h @@ -37,7 +37,12 @@ namespace GpgFrontend::UI { * @brief init the UI library * */ -void InitGpgFrontendUI(); +void GPGFRONTEND_UI_EXPORT InitGpgFrontendUI(); + +/** + * @brief run main window + */ +int GPGFRONTEND_UI_EXPORT RunGpgFrontendUI(); }; // namespace GpgFrontend::UI |