diff --git a/espanso-modulo/src/sys/interop/interop.h b/espanso-modulo/src/sys/interop/interop.h index 1dd63db..9339b4c 100644 --- a/espanso-modulo/src/sys/interop/interop.h +++ b/espanso-modulo/src/sys/interop/interop.h @@ -91,6 +91,11 @@ typedef struct SearchMetadata { // WIZARD +const int MIGRATE_RESULT_SUCCESS = 0; +const int MIGRATE_RESULT_CLEAN_FAILURE = 1; +const int MIGRATE_RESULT_DIRTY_FAILURE = 2; +const int MIGRATE_RESULT_UNKNOWN_FAILURE = 3; + typedef struct WizardMetadata { const char *version; diff --git a/espanso-modulo/src/sys/interop/mod.rs b/espanso-modulo/src/sys/interop/mod.rs index 5d9d85c..20c84d0 100644 --- a/espanso-modulo/src/sys/interop/mod.rs +++ b/espanso-modulo/src/sys/interop/mod.rs @@ -107,6 +107,11 @@ pub struct SearchMetadata { pub iconPath: *const ::std::os::raw::c_char, } +pub const WIZARD_MIGRATE_RESULT_SUCCESS: i32 = 0; +pub const WIZARD_MIGRATE_RESULT_CLEAN_FAILURE: i32 = 1; +pub const WIZARD_MIGRATE_RESULT_DIRTY_FAILURE: i32 = 2; +pub const WIZARD_MIGRATE_RESULT_UNKNOWN_FAILURE: i32 = 3; + #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct WizardMetadata { diff --git a/espanso-modulo/src/sys/wizard/mod.rs b/espanso-modulo/src/sys/wizard/mod.rs index 55c25de..ffa1733 100644 --- a/espanso-modulo/src/sys/wizard/mod.rs +++ b/espanso-modulo/src/sys/wizard/mod.rs @@ -20,10 +20,7 @@ use std::os::raw::{c_char, c_int}; use std::{ffi::CString, sync::Mutex}; -use crate::{ - sys::interop::WizardMetadata, - wizard::{WizardHandlers, WizardOptions}, -}; +use crate::{sys::interop::{WIZARD_MIGRATE_RESULT_CLEAN_FAILURE, WIZARD_MIGRATE_RESULT_DIRTY_FAILURE, WIZARD_MIGRATE_RESULT_SUCCESS, WIZARD_MIGRATE_RESULT_UNKNOWN_FAILURE, WizardMetadata}, wizard::{WizardHandlers, WizardOptions}}; lazy_static! { static ref HANDLERS: Mutex> = Mutex::new(None); @@ -62,17 +59,16 @@ pub fn show(options: WizardOptions) { .lock() .expect("unable to acquire lock in backup_and_migrate method"); let handlers_ref = (*lock).as_ref().expect("unable to unwrap handlers"); - // TODO: - // if let Some(handler_ref) = handlers_ref.backup_and_migrate.as_ref() { - // if (*handler_ref)() { - // 1 - // } else { - // 0 - // } - // } else { - // -1 - // } - 0 + if let Some(handler_ref) = handlers_ref.backup_and_migrate.as_ref() { + match (*handler_ref)() { + crate::wizard::MigrationResult::Success => WIZARD_MIGRATE_RESULT_SUCCESS, + crate::wizard::MigrationResult::CleanFailure => WIZARD_MIGRATE_RESULT_CLEAN_FAILURE, + crate::wizard::MigrationResult::DirtyFailure => WIZARD_MIGRATE_RESULT_DIRTY_FAILURE, + crate::wizard::MigrationResult::UnknownFailure => WIZARD_MIGRATE_RESULT_UNKNOWN_FAILURE, + } + } else { + WIZARD_MIGRATE_RESULT_UNKNOWN_FAILURE + } } extern "C" fn add_to_path() -> c_int { @@ -188,7 +184,9 @@ pub fn show(options: WizardOptions) { fn convert_to_cstring_or_null(str: Option) -> (Option, *const c_char) { let c_string = str.map(|str| CString::new(str).expect("unable to convert Option to CString")); - let c_ptr = c_string.as_ref().map_or(std::ptr::null(), |path| path.as_ptr()); + let c_ptr = c_string + .as_ref() + .map_or(std::ptr::null(), |path| path.as_ptr()); (c_string, c_ptr) } diff --git a/espanso-modulo/src/sys/wizard/wizard.cpp b/espanso-modulo/src/sys/wizard/wizard.cpp index fb9bf3e..21085c2 100644 --- a/espanso-modulo/src/sys/wizard/wizard.cpp +++ b/espanso-modulo/src/sys/wizard/wizard.cpp @@ -35,7 +35,7 @@ const int ADD_PATH_PAGE_INDEX = MIGRATE_PAGE_INDEX + 1; const int ACCESSIBILITY_PAGE_INDEX = ADD_PATH_PAGE_INDEX + 1; const int MAX_PAGE_INDEX = ACCESSIBILITY_PAGE_INDEX + 1; // Update if a new page is added at the end -WizardMetadata *metadata= nullptr; +WizardMetadata *metadata = nullptr; // App Code @@ -45,37 +45,46 @@ public: virtual bool OnInit(); }; -int find_next_page(int current_index) { +int find_next_page(int current_index) +{ int next_index = current_index + 1; - if (next_index >= MAX_PAGE_INDEX) { + if (next_index >= MAX_PAGE_INDEX) + { return -1; } - switch (next_index) { - case WELCOME_PAGE_INDEX: - if (metadata->is_welcome_page_enabled) { - return WELCOME_PAGE_INDEX; - } - case MOVE_BUNDLE_PAGE_INDEX: - if (metadata->is_move_bundle_page_enabled) { - return MOVE_BUNDLE_PAGE_INDEX; - } - case LEGACY_VERSION_PAGE_INDEX: - if (metadata->is_legacy_version_page_enabled) { - return LEGACY_VERSION_PAGE_INDEX; - } - case MIGRATE_PAGE_INDEX: - if (metadata->is_migrate_page_enabled) { - return MIGRATE_PAGE_INDEX; - } - case ADD_PATH_PAGE_INDEX: - if (metadata->is_add_path_page_enabled) { - return ADD_PATH_PAGE_INDEX; - } - case ACCESSIBILITY_PAGE_INDEX: - if (metadata->is_accessibility_page_enabled) { - return ACCESSIBILITY_PAGE_INDEX; - } + switch (next_index) + { + case WELCOME_PAGE_INDEX: + if (metadata->is_welcome_page_enabled) + { + return WELCOME_PAGE_INDEX; + } + case MOVE_BUNDLE_PAGE_INDEX: + if (metadata->is_move_bundle_page_enabled) + { + return MOVE_BUNDLE_PAGE_INDEX; + } + case LEGACY_VERSION_PAGE_INDEX: + if (metadata->is_legacy_version_page_enabled) + { + return LEGACY_VERSION_PAGE_INDEX; + } + case MIGRATE_PAGE_INDEX: + if (metadata->is_migrate_page_enabled) + { + return MIGRATE_PAGE_INDEX; + } + case ADD_PATH_PAGE_INDEX: + if (metadata->is_add_path_page_enabled) + { + return ADD_PATH_PAGE_INDEX; + } + case ACCESSIBILITY_PAGE_INDEX: + if (metadata->is_accessibility_page_enabled) + { + return ACCESSIBILITY_PAGE_INDEX; + } } return find_next_page(next_index); @@ -84,13 +93,15 @@ int find_next_page(int current_index) { class DerivedFrame : public WizardFrame { protected: - void check_timer_tick( wxTimerEvent& event ); - void on_page_changed( wxBookCtrlEvent& event ); + void check_timer_tick(wxTimerEvent &event); + void on_page_changed(wxBookCtrlEvent &event); void welcome_start_clicked(wxCommandEvent &event); - void migrate_compatibility_mode_clicked( wxCommandEvent& event ); + void migrate_button_clicked(wxCommandEvent &event); + void migrate_compatibility_mode_clicked(wxCommandEvent &event); void navigate_to_next_page_or_close(); void change_default_button(int target_page); + public: DerivedFrame(wxWindow *parent); }; @@ -100,7 +111,8 @@ DerivedFrame::DerivedFrame(wxWindow *parent) { // TODO: load images for accessibility page if on macOS - if (metadata->welcome_image_path) { + if (metadata->welcome_image_path) + { wxBitmap welcomeBitmap = wxBitmap(metadata->welcome_image_path, wxBITMAP_TYPE_PNG); this->welcome_image->SetBitmap(welcomeBitmap); } @@ -109,20 +121,27 @@ DerivedFrame::DerivedFrame(wxWindow *parent) // Load the first page int page = find_next_page(-1); - if (page >= 0) { + if (page >= 0) + { this->m_simplebook->SetSelection(page); this->change_default_button(page); - } else { + } + else + { Close(true); } } -void DerivedFrame::navigate_to_next_page_or_close() { +void DerivedFrame::navigate_to_next_page_or_close() +{ int current_page = this->m_simplebook->GetSelection(); int page = find_next_page(current_page); - if (page >= 0) { + if (page >= 0) + { this->m_simplebook->SetSelection(page); - } else { + } + else + { Close(true); } } @@ -132,62 +151,94 @@ void DerivedFrame::welcome_start_clicked(wxCommandEvent &event) this->navigate_to_next_page_or_close(); } -void DerivedFrame::migrate_compatibility_mode_clicked( wxCommandEvent& event ) { +void DerivedFrame::migrate_compatibility_mode_clicked(wxCommandEvent &event) +{ this->navigate_to_next_page_or_close(); } -void DerivedFrame::check_timer_tick( wxTimerEvent& event ) { - if (this->m_simplebook->GetSelection() == LEGACY_VERSION_PAGE_INDEX) { - if (metadata->is_legacy_version_running) { - if (metadata->is_legacy_version_running() == 0) { - this->navigate_to_next_page_or_close(); - } - } +void DerivedFrame::migrate_button_clicked(wxCommandEvent &event) +{ + if (metadata->backup_and_migrate) + { + int result = metadata->backup_and_migrate(); + if (result == MIGRATE_RESULT_SUCCESS) + { + this->navigate_to_next_page_or_close(); + } + else if (result == MIGRATE_RESULT_CLEAN_FAILURE) + { + wxMessageBox(wxT("An error occurred during the migration, but your old files were not modified.\n\nPlease run 'espanso log' in a terminal for more information."), wxT("Migration error"), wxICON_ERROR); + } + else if (result == MIGRATE_RESULT_DIRTY_FAILURE) + { + wxMessageBox(wxT("An error occurred during the migration and espanso couldn't complete the process. Some configuration files might be missing, but you'll find the backup in the Documents folder.\n\nPlease run 'espanso log' in a terminal for more information."), wxT("Migration error"), wxICON_ERROR); + } + else if (result == MIGRATE_RESULT_UNKNOWN_FAILURE) + { + wxMessageBox(wxT("An error occurred during the migration.\n\nPlease run 'espanso log' in a terminal for more information."), wxT("Migration error"), wxICON_ERROR); + } } } -void DerivedFrame::on_page_changed( wxBookCtrlEvent& event ) { +void DerivedFrame::check_timer_tick(wxTimerEvent &event) +{ + if (this->m_simplebook->GetSelection() == LEGACY_VERSION_PAGE_INDEX) + { + if (metadata->is_legacy_version_running) + { + if (metadata->is_legacy_version_running() == 0) + { + this->navigate_to_next_page_or_close(); + } + } + } +} + +void DerivedFrame::on_page_changed(wxBookCtrlEvent &event) +{ int current_page = this->m_simplebook->GetSelection(); this->change_default_button(current_page); } -void DerivedFrame::change_default_button(int target_page) { - switch (target_page) { - case WELCOME_PAGE_INDEX: - { - this->welcome_start_button->SetDefault(); - break; - } - case MOVE_BUNDLE_PAGE_INDEX: - { - this->move_bundle_quit_button->SetDefault(); - break; - } - case MIGRATE_PAGE_INDEX: - { - this->migrate_backup_and_migrate_button->SetDefault(); - break; - } - case ADD_PATH_PAGE_INDEX: - { - this->add_path_continue_button->SetDefault(); - break; - } - case ACCESSIBILITY_PAGE_INDEX: - { - this->accessibility_enable_button->SetDefault(); - break; - } +void DerivedFrame::change_default_button(int target_page) +{ + switch (target_page) + { + case WELCOME_PAGE_INDEX: + { + this->welcome_start_button->SetDefault(); + break; + } + case MOVE_BUNDLE_PAGE_INDEX: + { + this->move_bundle_quit_button->SetDefault(); + break; + } + case MIGRATE_PAGE_INDEX: + { + this->migrate_backup_and_migrate_button->SetDefault(); + break; + } + case ADD_PATH_PAGE_INDEX: + { + this->add_path_continue_button->SetDefault(); + break; + } + case ACCESSIBILITY_PAGE_INDEX: + { + this->accessibility_enable_button->SetDefault(); + break; + } } } - bool WizardApp::OnInit() { wxInitAllImageHandlers(); DerivedFrame *frame = new DerivedFrame(NULL); - - if (metadata->window_icon_path) { + + if (metadata->window_icon_path) + { setFrameIcon(metadata->window_icon_path, frame); } @@ -198,7 +249,7 @@ bool WizardApp::OnInit() return true; } -extern "C" void interop_show_wizard(WizardMetadata * _metadata) +extern "C" void interop_show_wizard(WizardMetadata *_metadata) { // Setup high DPI support on Windows #ifdef __WXMSW__ diff --git a/espanso-modulo/src/wizard/mod.rs b/espanso-modulo/src/wizard/mod.rs index 719637f..3885c82 100644 --- a/espanso-modulo/src/wizard/mod.rs +++ b/espanso-modulo/src/wizard/mod.rs @@ -50,4 +50,5 @@ pub enum MigrationResult { Success, CleanFailure, DirtyFailure, + UnknownFailure, }