mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-06 23:31:19 +00:00
* Escape Project Metadata in the Project Page and Restrict Accessory Opening The Project page rendered the model and profile name, author, description and accessory file names from the 3MF as live HTML. Names, authors and file names are now set as text, and the file list is built from DOM nodes with bound click handlers instead of concatenated markup. Descriptions can legitimately carry rich-text HTML, so they are rebuilt from an inert DOMParser document, keeping only plain formatting tags, http(s) links and http(s) images, with every other attribute dropped. Opening an accessory from the page now only launches regular files that lie inside the project's extracted auxiliary directory. The containment check is a new libslic3r helper, is_absolute_path_within_root, built on is_path_within_root so symlinks leading out of the root are rejected too. * Tighten Project Page Description Rendering and Keep More Formatting Link and image URLs in descriptions must now start with an http or https scheme as written and parse as such with the URL parser. Preview images are built as DOM nodes like the file list, and accessory names show their full text as a tooltip. Descriptions keep more plain formatting: del, ins, figure, figcaption, dl, dt, dd, caption, q, abbr, kbd and wbr, plus alt, title, width and height on images, colspan and rowspan on table cells and start on ordered lists. Numeric attributes must be plain integers. Embedded YouTube players become a link to the video. * Confirm Before Opening Program Attachments and Load Only HTTPS Images Opening a project attachment whose type runs as a program or script (executables, installers, shortcuts, shell and PowerShell scripts, macOS command files and apps, Linux desktop entries) now asks for confirmation first. The check lives in libslic3r as is_executable_file_name and ignores the trailing dots and spaces Windows strips from file names. Images in project descriptions are kept only when they load over https, so opening the Project tab no longer issues plain-http requests. * Open Project Attachments Through One Guarded Helper The Edit Project Info view launched attachments directly, without the checks the project page has. Both now call desktop_open_project_attachment, which checks that the file is inside the auxiliary directory, asks for confirmation where needed and then opens it. The auxiliary root was built through encode_path, which returns code page bytes on Windows, while boost::filesystem reads a narrow string as UTF-8. With a non-ASCII temporary directory the root never matched and no attachment opened. It is now built from the UTF-8 path directly. The list of program extensions could not be kept complete and let unknown types open without a prompt. It is replaced by is_safe_to_open_file_name, a list of plain document, image, model and video types that open directly. Everything else asks first.
96 lines
4.3 KiB
C++
96 lines
4.3 KiB
C++
#ifndef slic3r_GUI_hpp_
|
|
#define slic3r_GUI_hpp_
|
|
|
|
namespace boost { class any; }
|
|
namespace boost::filesystem { class path; }
|
|
|
|
#include <wx/string.h>
|
|
|
|
#include "libslic3r/Config.hpp"
|
|
#include "libslic3r/Preset.hpp"
|
|
|
|
class wxWindow;
|
|
class wxMenuBar;
|
|
class wxComboCtrl;
|
|
class wxFileDialog;
|
|
class wxTopLevelWindow;
|
|
|
|
namespace Slic3r {
|
|
|
|
class AppConfig;
|
|
class DynamicPrintConfig;
|
|
class Print;
|
|
|
|
namespace GUI {
|
|
|
|
void disable_screensaver();
|
|
void enable_screensaver();
|
|
bool debugged();
|
|
void break_to_debugger();
|
|
|
|
// Platform specific Ctrl+/Alt+ (Windows, Linux) vs. ⌘/⌥ (OSX) prefixes
|
|
extern const std::string& shortkey_ctrl_prefix();
|
|
extern const std::string& shortkey_alt_prefix();
|
|
extern const std::string& shortkey_shift_prefix(); // Shift is the same on all platforms, but we provide a function for consistency with Ctrl/Alt prefixes
|
|
|
|
extern AppConfig* get_app_config();
|
|
|
|
extern void add_menus(wxMenuBar *menu, int event_preferences_changed, int event_language_change);
|
|
|
|
// Change option value in config
|
|
void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt_key, const boost::any& value, int opt_index = 0);
|
|
|
|
// If has_code_excerpts is true, code excerpts (a source line and the caret line below it) render
|
|
// monospaced so the caret aligns. Used for placeholder-parser errors.
|
|
void show_error(wxWindow* parent, const wxString& message, bool has_code_excerpts = false);
|
|
void show_error(wxWindow* parent, const char* message, bool has_code_excerpts = false);
|
|
inline void show_error(wxWindow* parent, const std::string& message, bool has_code_excerpts = false) { show_error(parent, message.c_str(), has_code_excerpts); }
|
|
void show_error_id(int id, const std::string& message); // For Perl
|
|
void show_info(wxWindow* parent, const wxString& message, const wxString& title = wxString());
|
|
void show_info(wxWindow* parent, const char* message, const char* title = nullptr);
|
|
inline void show_info(wxWindow* parent, const std::string& message,const std::string& title = std::string()) { show_info(parent, message.c_str(), title.c_str()); }
|
|
void warning_catcher(wxWindow* parent, const wxString& message);
|
|
void show_substitutions_info(const PresetsConfigSubstitutions& presets_config_substitutions);
|
|
void show_substitutions_info(const ConfigSubstitutions& config_substitutions, const std::string& filename);
|
|
|
|
// Creates a wxCheckListBoxComboPopup inside the given wxComboCtrl, filled with the given text and items.
|
|
// Items data must be separated by '|', and contain the item name to be shown followed by its initial value (0 for false, 1 for true).
|
|
// For example "Item1|0|Item2|1|Item3|0", and so on.
|
|
void create_combochecklist(wxComboCtrl* comboCtrl, const std::string& text, const std::string& items);
|
|
|
|
// Returns the current state of the items listed in the wxCheckListBoxComboPopup contained in the given wxComboCtrl,
|
|
// encoded inside an unsigned int.
|
|
unsigned int combochecklist_get_flags(wxComboCtrl* comboCtrl);
|
|
|
|
// Sets the current state of the items listed in the wxCheckListBoxComboPopup contained in the given wxComboCtrl,
|
|
// with the flags encoded in the given unsigned int.
|
|
void combochecklist_set_flags(wxComboCtrl* comboCtrl, unsigned int flags);
|
|
|
|
// wxString conversions:
|
|
|
|
// wxString from std::string in UTF8
|
|
wxString from_u8(const std::string &str);
|
|
// std::string in UTF8 from wxString
|
|
std::string into_u8(const wxString &str);
|
|
// wxString from boost path
|
|
wxString from_path(const boost::filesystem::path &path);
|
|
// boost path from wxString
|
|
boost::filesystem::path into_path(const wxString &str);
|
|
// file:// URL of a local path, percent-encoded so characters such as '#', '%' and '?' stay part of the path.
|
|
// Append any query or fragment to the result.
|
|
wxString file_url_from_path(const boost::filesystem::path &path);
|
|
|
|
// Display an About dialog
|
|
extern void about();
|
|
// Ask the destop to open the datadir using the default file explorer.
|
|
extern void desktop_open_datadir_folder();
|
|
// Ask the destop to open one folder
|
|
extern void desktop_open_any_folder(const std::string& path);
|
|
// Ask the desktop to open a file from the project's auxiliary directory, after a confirmation
|
|
// unless its type is known to be plain content. Returns false if the file was not opened.
|
|
extern bool desktop_open_project_attachment(wxWindow *parent, const boost::filesystem::path &path);
|
|
} // namespace GUI
|
|
} // namespace Slic3r
|
|
|
|
#endif
|