feat(modulo): implement troubleshooting window
This commit is contained in:
parent
aec2425b0b
commit
11edf080de
|
@ -117,6 +117,8 @@ fn build_native() {
|
|||
.file("src/sys/wizard/wizard_gui.cpp")
|
||||
.file("src/sys/welcome/welcome.cpp")
|
||||
.file("src/sys/welcome/welcome_gui.cpp")
|
||||
.file("src/sys/troubleshooting/troubleshooting.cpp")
|
||||
.file("src/sys/troubleshooting/troubleshooting_gui.cpp")
|
||||
.flag("/EHsc")
|
||||
.include(wx_include_dir)
|
||||
.include(wx_include_msvc_dir)
|
||||
|
@ -215,6 +217,8 @@ fn build_native() {
|
|||
.file("src/sys/wizard/wizard_gui.cpp")
|
||||
.file("src/sys/welcome/welcome.cpp")
|
||||
.file("src/sys/welcome/welcome_gui.cpp")
|
||||
.file("src/sys/troubleshooting/troubleshooting.cpp")
|
||||
.file("src/sys/troubleshooting/troubleshooting_gui.cpp")
|
||||
.file("src/sys/common/mac.mm");
|
||||
build.flag("-std=c++17");
|
||||
|
||||
|
@ -353,7 +357,9 @@ fn build_native() {
|
|||
.file("src/sys/wizard/wizard.cpp")
|
||||
.file("src/sys/wizard/wizard_gui.cpp")
|
||||
.file("src/sys/welcome/welcome.cpp")
|
||||
.file("src/sys/welcome/welcome_gui.cpp");
|
||||
.file("src/sys/welcome/welcome_gui.cpp")
|
||||
.file("src/sys/troubleshooting/troubleshooting.cpp")
|
||||
.file("src/sys/troubleshooting/troubleshooting_gui.cpp");
|
||||
build.flag("-std=c++17");
|
||||
|
||||
for flag in cpp_flags {
|
||||
|
|
|
@ -22,6 +22,7 @@ extern crate lazy_static;
|
|||
|
||||
pub mod form;
|
||||
pub mod search;
|
||||
pub mod troubleshooting;
|
||||
pub mod welcome;
|
||||
pub mod wizard;
|
||||
mod sys;
|
|
@ -120,6 +120,8 @@ typedef struct WizardMetadata {
|
|||
void (*on_completed)();
|
||||
} WizardMetadata;
|
||||
|
||||
// WELCOME
|
||||
|
||||
typedef struct WelcomeMetadata {
|
||||
const char *window_icon_path;
|
||||
const char *tray_image_path;
|
||||
|
@ -128,3 +130,30 @@ typedef struct WelcomeMetadata {
|
|||
int (*dont_show_again_changed)(int);
|
||||
} WelcomeMetadata;
|
||||
|
||||
// TROUBLESHOOTING
|
||||
|
||||
const int ERROR_METADATA_LEVEL_ERROR = 1;
|
||||
const int ERROR_METADATA_LEVEL_WARNING = 2;
|
||||
typedef struct ErrorMetadata {
|
||||
const int level;
|
||||
const char *message;
|
||||
} ErrorMetadata;
|
||||
|
||||
typedef struct ErrorSetMetadata {
|
||||
const char *file_path;
|
||||
const ErrorMetadata * errors;
|
||||
const int errors_count;
|
||||
} ErrorSetMetadata;
|
||||
|
||||
typedef struct TroubleshootingMetadata {
|
||||
const char *window_icon_path;
|
||||
|
||||
const int is_fatal_error;
|
||||
|
||||
const ErrorSetMetadata * error_sets;
|
||||
const int error_sets_count;
|
||||
|
||||
// METHODS
|
||||
int (*dont_show_again_changed)(int);
|
||||
int (*open_file)(const char * file_name);
|
||||
} TroubleshootingMetadata;
|
||||
|
|
|
@ -146,6 +146,38 @@ pub struct WelcomeMetadata {
|
|||
pub dont_show_again_changed: extern fn(c_int),
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub struct TroubleshootingMetadata {
|
||||
pub window_icon_path: *const c_char,
|
||||
pub is_fatal_error: c_int,
|
||||
|
||||
pub error_sets: *const ErrorSetMetadata,
|
||||
pub error_sets_count: c_int,
|
||||
|
||||
pub dont_show_again_changed: extern fn(c_int),
|
||||
pub open_file: extern fn(*const c_char),
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub struct ErrorSetMetadata {
|
||||
pub file_path: *const c_char,
|
||||
|
||||
pub errors: *const ErrorMetadata,
|
||||
pub errors_count: c_int,
|
||||
}
|
||||
|
||||
pub const ERROR_METADATA_LEVEL_ERROR: c_int = 1;
|
||||
pub const ERROR_METADATA_LEVEL_WARNING: c_int = 2;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub struct ErrorMetadata {
|
||||
pub level: c_int,
|
||||
pub message: *const c_char,
|
||||
}
|
||||
|
||||
// Native bindings
|
||||
|
||||
#[allow(improper_ctypes)]
|
||||
|
@ -174,4 +206,7 @@ extern "C" {
|
|||
|
||||
// WELCOME
|
||||
pub(crate) fn interop_show_welcome(metadata: *const WelcomeMetadata);
|
||||
|
||||
// TROUBLESHOOTING
|
||||
pub(crate) fn interop_show_troubleshooting(metadata: *const TroubleshootingMetadata);
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
pub mod form;
|
||||
pub mod search;
|
||||
pub mod troubleshooting;
|
||||
pub mod wizard;
|
||||
pub mod welcome;
|
||||
|
||||
|
|
176
espanso-modulo/src/sys/troubleshooting/mod.rs
Normal file
176
espanso-modulo/src/sys/troubleshooting/mod.rs
Normal file
|
@ -0,0 +1,176 @@
|
|||
/*
|
||||
* This file is part of modulo.
|
||||
*
|
||||
* Copyright (C) 2020-2021 Federico Terzi
|
||||
*
|
||||
* modulo is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* modulo is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with modulo. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use std::ffi::CStr;
|
||||
use std::os::raw::{c_char, c_int};
|
||||
use std::path::PathBuf;
|
||||
use std::sync::Mutex;
|
||||
|
||||
use crate::sys::interop::{ErrorSetMetadata, TroubleshootingMetadata};
|
||||
use crate::sys::troubleshooting::interop::{OwnedErrorSet};
|
||||
use crate::sys::util::convert_to_cstring_or_null;
|
||||
use crate::troubleshooting::{TroubleshootingHandlers, TroubleshootingOptions};
|
||||
use anyhow::Result;
|
||||
|
||||
lazy_static! {
|
||||
static ref HANDLERS: Mutex<Option<TroubleshootingHandlers>> = Mutex::new(None);
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
mod interop {
|
||||
use crate::troubleshooting::{ErrorRecord, ErrorSet};
|
||||
|
||||
use super::interop::{ErrorMetadata, ErrorSetMetadata};
|
||||
|
||||
use super::super::interop::*;
|
||||
use std::{
|
||||
ffi::{CString},
|
||||
os::raw::c_int,
|
||||
};
|
||||
|
||||
pub(crate) struct OwnedErrorSet {
|
||||
file_path: Option<CString>,
|
||||
errors: Vec<OwnedErrorMetadata>,
|
||||
pub(crate) _interop_errors: Vec<ErrorMetadata>,
|
||||
}
|
||||
|
||||
impl OwnedErrorSet {
|
||||
pub fn to_error_set_metadata(&self) -> ErrorSetMetadata {
|
||||
let file_path_ptr = if let Some(file_path) = self.file_path.as_ref() {
|
||||
file_path.as_ptr()
|
||||
} else {
|
||||
std::ptr::null()
|
||||
};
|
||||
|
||||
ErrorSetMetadata {
|
||||
file_path: file_path_ptr,
|
||||
errors: self._interop_errors.as_ptr(),
|
||||
errors_count: self._interop_errors.len() as c_int,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&ErrorSet> for OwnedErrorSet {
|
||||
fn from(error_set: &ErrorSet) -> Self {
|
||||
let file_path = if let Some(file_path) = &error_set.file {
|
||||
Some(CString::new(file_path.to_string_lossy().to_string())
|
||||
.expect("unable to convert file_path to CString"))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let errors: Vec<OwnedErrorMetadata> =
|
||||
error_set.errors.iter().map(|item| item.into()).collect();
|
||||
|
||||
let _interop_errors: Vec<ErrorMetadata> =
|
||||
errors.iter().map(|item| item.to_error_metadata()).collect();
|
||||
|
||||
Self {
|
||||
file_path,
|
||||
errors,
|
||||
_interop_errors,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) struct OwnedErrorMetadata {
|
||||
level: c_int,
|
||||
message: CString,
|
||||
}
|
||||
|
||||
impl OwnedErrorMetadata {
|
||||
fn to_error_metadata(&self) -> ErrorMetadata {
|
||||
ErrorMetadata {
|
||||
level: self.level,
|
||||
message: self.message.as_ptr(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&ErrorRecord> for OwnedErrorMetadata {
|
||||
fn from(item: &ErrorRecord) -> Self {
|
||||
let message =
|
||||
CString::new(item.message.clone()).expect("unable to convert item message to CString");
|
||||
|
||||
Self {
|
||||
level: match item.level {
|
||||
crate::troubleshooting::ErrorLevel::Error => ERROR_METADATA_LEVEL_ERROR,
|
||||
crate::troubleshooting::ErrorLevel::Warning => ERROR_METADATA_LEVEL_WARNING,
|
||||
},
|
||||
message,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn show(options: TroubleshootingOptions) -> Result<()> {
|
||||
let (_c_window_icon_path, c_window_icon_path_ptr) =
|
||||
convert_to_cstring_or_null(options.window_icon_path);
|
||||
|
||||
let owned_error_sets: Vec<OwnedErrorSet> =
|
||||
options.error_sets.iter().map(|set| set.into()).collect();
|
||||
let error_sets: Vec<ErrorSetMetadata> = owned_error_sets
|
||||
.iter()
|
||||
.map(|set| set.to_error_set_metadata())
|
||||
.collect();
|
||||
|
||||
extern "C" fn dont_show_again_changed(dont_show: c_int) {
|
||||
let lock = HANDLERS
|
||||
.lock()
|
||||
.expect("unable to acquire lock in dont_show_again_changed method");
|
||||
let handlers_ref = (*lock).as_ref().expect("unable to unwrap handlers");
|
||||
if let Some(handler_ref) = handlers_ref.dont_show_again_changed.as_ref() {
|
||||
let value = if dont_show == 1 { true } else { false };
|
||||
(*handler_ref)(value);
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" fn open_file(file_path: *const c_char) {
|
||||
let lock = HANDLERS
|
||||
.lock()
|
||||
.expect("unable to acquire lock in open_file method");
|
||||
let handlers_ref = (*lock).as_ref().expect("unable to unwrap handlers");
|
||||
if let Some(handler_ref) = handlers_ref.open_file.as_ref() {
|
||||
let c_string = unsafe { CStr::from_ptr(file_path) };
|
||||
let string = c_string.to_string_lossy();
|
||||
let path = PathBuf::from(string.to_string());
|
||||
(*handler_ref)(&path);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
let mut lock = HANDLERS.lock().expect("unable to acquire handlers lock");
|
||||
*lock = Some(options.handlers)
|
||||
}
|
||||
|
||||
let troubleshooting_metadata = TroubleshootingMetadata {
|
||||
window_icon_path: c_window_icon_path_ptr,
|
||||
is_fatal_error: if options.is_fatal_error { 1 } else { 0 },
|
||||
error_sets: error_sets.as_ptr(),
|
||||
error_sets_count: error_sets.len() as c_int,
|
||||
dont_show_again_changed,
|
||||
open_file,
|
||||
};
|
||||
|
||||
unsafe {
|
||||
super::interop::interop_show_troubleshooting(&troubleshooting_metadata);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
188
espanso-modulo/src/sys/troubleshooting/troubleshooting.cpp
Normal file
188
espanso-modulo/src/sys/troubleshooting/troubleshooting.cpp
Normal file
|
@ -0,0 +1,188 @@
|
|||
/*
|
||||
* This file is part of modulo.
|
||||
*
|
||||
* Copyright (C) 2020-2021 Federico Terzi
|
||||
*
|
||||
* modulo is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* modulo is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with modulo. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#define _UNICODE
|
||||
|
||||
#include "../common/common.h"
|
||||
#include "../interop/interop.h"
|
||||
#include "./troubleshooting_gui.h"
|
||||
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <unordered_map>
|
||||
|
||||
TroubleshootingMetadata *troubleshooting_metadata = nullptr;
|
||||
|
||||
// App Code
|
||||
|
||||
class TroubleshootingApp : public wxApp
|
||||
{
|
||||
public:
|
||||
virtual bool OnInit();
|
||||
};
|
||||
|
||||
// Custom controller to display an ErrorSet
|
||||
|
||||
class ErrorSetPanel : public wxPanel
|
||||
{
|
||||
private:
|
||||
protected:
|
||||
wxStaticText *filename_label;
|
||||
wxButton *open_file_btn;
|
||||
wxTextCtrl *error_text_ctrl;
|
||||
const ErrorSetMetadata * error_set_metadata;
|
||||
|
||||
public:
|
||||
ErrorSetPanel(wxWindow *parent, const ErrorSetMetadata * error_set_metadata) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
|
||||
{
|
||||
this->error_set_metadata = error_set_metadata;
|
||||
|
||||
wxBoxSizer *main_file_sizer;
|
||||
main_file_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
main_file_sizer->SetMinSize(0, 150);
|
||||
|
||||
wxBoxSizer *header_sizer;
|
||||
header_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
wxString path = wxString::FromUTF8(error_set_metadata->file_path);
|
||||
wxString filename = wxString::Format(wxT("%s (%i errors)"), path, error_set_metadata->errors_count);
|
||||
filename_label = new wxStaticText(this, wxID_ANY, filename, wxDefaultPosition, wxDefaultSize, 0);
|
||||
filename_label->Wrap(-1);
|
||||
filename_label->SetFont(wxFont(wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString));
|
||||
|
||||
header_sizer->Add(filename_label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
|
||||
|
||||
header_sizer->Add(0, 0, 1, wxEXPAND, 5);
|
||||
|
||||
open_file_btn = new wxButton(this, wxID_ANY, wxT("Open file"), wxDefaultPosition, wxDefaultSize, 0);
|
||||
header_sizer->Add(open_file_btn, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
|
||||
|
||||
main_file_sizer->Add(header_sizer, 0, wxEXPAND, 5);
|
||||
|
||||
wxString errors_text = wxEmptyString;
|
||||
for (int i = 0; i<error_set_metadata->errors_count; i++) {
|
||||
wxString level = wxT("ERROR");
|
||||
if (error_set_metadata->errors[i].level == ERROR_METADATA_LEVEL_WARNING) {
|
||||
level = wxT("WARNING");
|
||||
}
|
||||
wxString error_text = wxString::Format(wxT("[%s] %s\n"), level, error_set_metadata->errors[i].message);
|
||||
errors_text.Append(error_text);
|
||||
}
|
||||
|
||||
error_text_ctrl = new wxTextCtrl(this, wxID_ANY, errors_text, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY);
|
||||
|
||||
main_file_sizer->Add(error_text_ctrl, 1, wxALL | wxEXPAND, 5);
|
||||
|
||||
this->SetSizer(main_file_sizer);
|
||||
this->Layout();
|
||||
main_file_sizer->Fit(this);
|
||||
|
||||
if (!this->error_set_metadata->file_path) {
|
||||
filename_label->Hide();
|
||||
open_file_btn->Hide();
|
||||
}
|
||||
|
||||
open_file_btn->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(ErrorSetPanel::on_open_file), NULL, this);
|
||||
}
|
||||
|
||||
void ErrorSetPanel::on_open_file(wxCommandEvent &event)
|
||||
{
|
||||
if (troubleshooting_metadata->open_file && this->error_set_metadata->file_path) {
|
||||
troubleshooting_metadata->open_file(this->error_set_metadata->file_path);
|
||||
}
|
||||
}
|
||||
|
||||
~ErrorSetPanel()
|
||||
{
|
||||
open_file_btn->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(ErrorSetPanel::on_open_file), NULL, this);
|
||||
}
|
||||
};
|
||||
|
||||
// Frame
|
||||
|
||||
class DerivedTroubleshootingFrame : public TroubleshootingFrame
|
||||
{
|
||||
protected:
|
||||
void on_dont_show_change(wxCommandEvent &event);
|
||||
void on_ignore(wxCommandEvent &event);
|
||||
|
||||
public:
|
||||
DerivedTroubleshootingFrame(wxWindow *parent);
|
||||
};
|
||||
|
||||
DerivedTroubleshootingFrame::DerivedTroubleshootingFrame(wxWindow *parent)
|
||||
: TroubleshootingFrame(parent)
|
||||
{
|
||||
if (troubleshooting_metadata->is_fatal_error) {
|
||||
dont_show_checkbox->Hide();
|
||||
ignore_button->Hide();
|
||||
info_label->SetLabel(wxT("Espanso couldn't load some files due to configuration errors and won't be able to start until you fix them."));
|
||||
title_label->SetLabel(wxT("Errors detected, action needed"));
|
||||
}
|
||||
|
||||
for (int i = 0; i<troubleshooting_metadata->error_sets_count; i++) {
|
||||
const ErrorSetMetadata * metadata = &troubleshooting_metadata->error_sets[i];
|
||||
ErrorSetPanel *panel = new ErrorSetPanel(scrollview, metadata);
|
||||
this->scrollview_sizer->Add(panel, 0, wxEXPAND | wxALL, 5);
|
||||
}
|
||||
}
|
||||
|
||||
void DerivedTroubleshootingFrame::on_dont_show_change(wxCommandEvent &event)
|
||||
{
|
||||
if (troubleshooting_metadata->dont_show_again_changed)
|
||||
{
|
||||
int value = this->dont_show_checkbox->IsChecked() ? 1 : 0;
|
||||
troubleshooting_metadata->dont_show_again_changed(value);
|
||||
}
|
||||
}
|
||||
|
||||
void DerivedTroubleshootingFrame::on_ignore(wxCommandEvent &event)
|
||||
{
|
||||
Close(true);
|
||||
}
|
||||
|
||||
bool TroubleshootingApp::OnInit()
|
||||
{
|
||||
DerivedTroubleshootingFrame *frame = new DerivedTroubleshootingFrame(NULL);
|
||||
|
||||
if (troubleshooting_metadata->window_icon_path)
|
||||
{
|
||||
setFrameIcon(troubleshooting_metadata->window_icon_path, frame);
|
||||
}
|
||||
|
||||
frame->Show(true);
|
||||
|
||||
Activate(frame);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
extern "C" void interop_show_troubleshooting(TroubleshootingMetadata *_metadata)
|
||||
{
|
||||
// Setup high DPI support on Windows
|
||||
#ifdef __WXMSW__
|
||||
SetProcessDPIAware();
|
||||
#endif
|
||||
|
||||
troubleshooting_metadata = _metadata;
|
||||
|
||||
wxApp::SetInstance(new TroubleshootingApp());
|
||||
int argc = 0;
|
||||
wxEntry(argc, (char **)nullptr);
|
||||
}
|
421
espanso-modulo/src/sys/troubleshooting/troubleshooting.fbp
Normal file
421
espanso-modulo/src/sys/troubleshooting/troubleshooting.fbp
Normal file
|
@ -0,0 +1,421 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<wxFormBuilder_Project>
|
||||
<FileVersion major="1" minor="15" />
|
||||
<object class="Project" expanded="1">
|
||||
<property name="class_decoration">; </property>
|
||||
<property name="code_generation">C++</property>
|
||||
<property name="disconnect_events">1</property>
|
||||
<property name="disconnect_mode">source_name</property>
|
||||
<property name="disconnect_php_events">0</property>
|
||||
<property name="disconnect_python_events">0</property>
|
||||
<property name="embedded_files_path">res</property>
|
||||
<property name="encoding">UTF-8</property>
|
||||
<property name="event_generation">connect</property>
|
||||
<property name="file">troubleshooting_gui</property>
|
||||
<property name="first_id">1000</property>
|
||||
<property name="help_provider">none</property>
|
||||
<property name="indent_with_spaces"></property>
|
||||
<property name="internationalize">0</property>
|
||||
<property name="name">Troubleshooting</property>
|
||||
<property name="namespace"></property>
|
||||
<property name="path">.</property>
|
||||
<property name="precompiled_header">#define _UNICODE</property>
|
||||
<property name="relative_path">1</property>
|
||||
<property name="skip_lua_events">1</property>
|
||||
<property name="skip_php_events">1</property>
|
||||
<property name="skip_python_events">1</property>
|
||||
<property name="ui_table">UI</property>
|
||||
<property name="use_enum">0</property>
|
||||
<property name="use_microsoft_bom">0</property>
|
||||
<object class="Frame" expanded="1">
|
||||
<property name="aui_managed">0</property>
|
||||
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
|
||||
<property name="bg">wxSYS_COLOUR_WINDOW</property>
|
||||
<property name="center">wxBOTH</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="event_handler">impl_virtual</property>
|
||||
<property name="extra_style"></property>
|
||||
<property name="fg"></property>
|
||||
<property name="font"></property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">TroubleshootingFrame</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size">841,544</property>
|
||||
<property name="style">wxDEFAULT_FRAME_STYLE</property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="title">Troubleshooting</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style">wxTAB_TRAVERSAL</property>
|
||||
<property name="xrc_skip_sizer">1</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizer1</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="spacer" expanded="0">
|
||||
<property name="height">10</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="width">0</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">10</property>
|
||||
<property name="flag">wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font">,90,92,20,70,0</property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Errors detected</property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">title_label</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">10</property>
|
||||
<property name="flag">wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Espanso couldn't load some files due to configuration errors. Some snippets or settings might not be available until you fix them.</property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size">-1,-1</property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">info_label</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size">-1,-1</property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND | wxALL</property>
|
||||
<property name="proportion">5</property>
|
||||
<object class="wxScrolledWindow" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">scrollview</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="scroll_rate_x">5</property>
|
||||
<property name="scroll_rate_y">5</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style">wxHSCROLL|wxVSCROLL</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">scrollview_sizer</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">protected</property>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">10</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizer2</property>
|
||||
<property name="orient">wxHORIZONTAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">10</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxCheckBox" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="checked">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Don't show again for non-critical errors</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">dont_show_checkbox</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnCheckBox">on_dont_show_change</event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="spacer" expanded="0">
|
||||
<property name="height">0</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="width">0</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
<property name="border">10</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" expanded="0">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="bitmap"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="current"></property>
|
||||
<property name="default">0</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="disabled"></property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="focus"></property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Ignore errors</property>
|
||||
<property name="margins"></property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">ignore_button</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="position"></property>
|
||||
<property name="pressed"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnButtonClick">on_ignore</event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</wxFormBuilder_Project>
|
|
@ -0,0 +1,77 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Oct 26 2018)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define _UNICODE
|
||||
|
||||
#include "troubleshooting_gui.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TroubleshootingFrame::TroubleshootingFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||
this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
|
||||
|
||||
wxBoxSizer* bSizer1;
|
||||
bSizer1 = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
bSizer1->Add( 0, 10, 0, wxEXPAND, 5 );
|
||||
|
||||
title_label = new wxStaticText( this, wxID_ANY, wxT("Errors detected"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
title_label->Wrap( -1 );
|
||||
title_label->SetFont( wxFont( 20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
|
||||
|
||||
bSizer1->Add( title_label, 0, wxALL, 10 );
|
||||
|
||||
info_label = new wxStaticText( this, wxID_ANY, wxT("Espanso couldn't load some files due to configuration errors. Some snippets or settings might not be available until you fix them."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
|
||||
info_label->Wrap( -1 );
|
||||
bSizer1->Add( info_label, 0, wxALL, 10 );
|
||||
|
||||
scrollview = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
|
||||
scrollview->SetScrollRate( 5, 5 );
|
||||
scrollview_sizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
scrollview->SetSizer( scrollview_sizer );
|
||||
scrollview->Layout();
|
||||
scrollview_sizer->Fit( scrollview );
|
||||
bSizer1->Add( scrollview, 5, wxEXPAND | wxALL, 5 );
|
||||
|
||||
wxBoxSizer* bSizer2;
|
||||
bSizer2 = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
dont_show_checkbox = new wxCheckBox( this, wxID_ANY, wxT("Don't show again for non-critical errors"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizer2->Add( dont_show_checkbox, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
|
||||
|
||||
|
||||
bSizer2->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
ignore_button = new wxButton( this, wxID_ANY, wxT("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizer2->Add( ignore_button, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
|
||||
|
||||
|
||||
bSizer1->Add( bSizer2, 0, wxEXPAND, 10 );
|
||||
|
||||
|
||||
this->SetSizer( bSizer1 );
|
||||
this->Layout();
|
||||
|
||||
this->Centre( wxBOTH );
|
||||
|
||||
// Connect Events
|
||||
dont_show_checkbox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( TroubleshootingFrame::on_dont_show_change ), NULL, this );
|
||||
ignore_button->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TroubleshootingFrame::on_ignore ), NULL, this );
|
||||
}
|
||||
|
||||
TroubleshootingFrame::~TroubleshootingFrame()
|
||||
{
|
||||
// Disconnect Events
|
||||
dont_show_checkbox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( TroubleshootingFrame::on_dont_show_change ), NULL, this );
|
||||
ignore_button->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TroubleshootingFrame::on_ignore ), NULL, this );
|
||||
|
||||
}
|
57
espanso-modulo/src/sys/troubleshooting/troubleshooting_gui.h
Normal file
57
espanso-modulo/src/sys/troubleshooting/troubleshooting_gui.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Oct 26 2018)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/string.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
#include <wx/colour.h>
|
||||
#include <wx/settings.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/scrolwin.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/bitmap.h>
|
||||
#include <wx/image.h>
|
||||
#include <wx/icon.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/frame.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class TroubleshootingFrame
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class TroubleshootingFrame : public wxFrame
|
||||
{
|
||||
private:
|
||||
|
||||
protected:
|
||||
wxStaticText* title_label;
|
||||
wxStaticText* info_label;
|
||||
wxScrolledWindow* scrollview;
|
||||
wxBoxSizer* scrollview_sizer;
|
||||
wxCheckBox* dont_show_checkbox;
|
||||
wxButton* ignore_button;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void on_dont_show_change( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void on_ignore( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
TroubleshootingFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("Troubleshooting"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 841,544 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
|
||||
|
||||
~TroubleshootingFrame();
|
||||
|
||||
};
|
||||
|
50
espanso-modulo/src/troubleshooting.rs
Normal file
50
espanso-modulo/src/troubleshooting.rs
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* This file is part of modulo.
|
||||
*
|
||||
* Copyright (C) 2020-2021 Federico Terzi
|
||||
*
|
||||
* modulo is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* modulo is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with modulo. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
pub use crate::sys::troubleshooting::show;
|
||||
|
||||
pub struct TroubleshootingOptions {
|
||||
pub window_icon_path: Option<String>,
|
||||
pub error_sets: Vec<ErrorSet>,
|
||||
pub is_fatal_error: bool,
|
||||
|
||||
pub handlers: TroubleshootingHandlers,
|
||||
}
|
||||
|
||||
pub struct ErrorSet {
|
||||
pub file: Option<PathBuf>,
|
||||
pub errors: Vec<ErrorRecord>,
|
||||
}
|
||||
|
||||
pub struct ErrorRecord {
|
||||
pub level: ErrorLevel,
|
||||
pub message: String,
|
||||
}
|
||||
|
||||
pub enum ErrorLevel {
|
||||
Error,
|
||||
Warning,
|
||||
}
|
||||
|
||||
pub struct TroubleshootingHandlers {
|
||||
pub dont_show_again_changed: Option<Box<dyn Fn(bool) + Send>>,
|
||||
pub open_file: Option<Box<dyn Fn(&Path) + Send>>,
|
||||
}
|
Loading…
Reference in New Issue
Block a user