mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-24 17:26:47 +00:00
orca.host.ui.create_dock_panel(html, title, width, height, on_message, on_close, dock) hosts plugin HTML in a pane of the Plater's dock manager, next to the sidebar, and returns a UiDockPanel handle (post/show/hide/close/is_open). The arguments follow create_window(). The panel uses the window.orca bridge of plugin windows, restores its position and size from the saved window layout, hides with the Plater off the Prepare and Preview tabs when floating, and is closed with its plugin; plugin panes are removed in MainFrame::shutdown(). The web view hosting moves out of PluginPage into a shared WebPanel base: bootstrap page and swap to the plugin HTML, theme, element-default and bridge scripts, window.orca message parsing, delivery to the page, and live re-theming, also re-applied on every load after the swap. Pages tabs and docked panels both derive from it. Pages tabs now re-theme in place on a theme change instead of being reloaded, and a window.orca call a host does not support is logged. What the hosts share no longer lives in one of them: the bootstrap page, the base URL and the plugin-window bridge move to Widgets/WebHosting, used by WebDialog and WebPanel alike. The Plater restores plugin panes with a new saved-layout parser, GUI/AuiPaneLayout, kept in its own small header so slic3rutils can test it without pulling in the Plater. The web hosting classes carry no plugin name, so other hosts can reuse them: PluginWebDialog becomes WebDialog (its bootstrap page moves to resources/web/dialog/WebDialog), and destroy_for_plugin(), load_plugin_content() and plugin_defaults_user_script() become destroy_silently(), load_page_html() and element_defaults_user_script(). Includes a sample plugin (sandboxes/orca_dock_panel_plugin_any.py) and binding and layout-helper tests in slic3rutils.
55 lines
1.8 KiB
C++
55 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include "WebPanel.hpp"
|
|
|
|
#include <functional>
|
|
#include <string>
|
|
|
|
namespace Slic3r { namespace GUI {
|
|
|
|
// Stable across sessions so the saved layout finds the pane; free of wxAuiManager layout delimiters.
|
|
std::string plugin_pane_name(const std::string& plugin_key, const std::string& title);
|
|
|
|
// A WebPanel docked in the Plater, on the plugin-window bridge minus submit. It can be destroyed
|
|
// without the GIL, so its hooks must not capture pybind11 objects.
|
|
class DockPanel : public WebPanel
|
|
{
|
|
public:
|
|
using MessageHandler = std::function<void(const nlohmann::json& data)>;
|
|
using CloseHandler = std::function<void()>;
|
|
|
|
// on_close fires once, on a user or page close. on_destroyed runs on every destruction and must
|
|
// touch host-side state only.
|
|
DockPanel(wxWindow* parent,
|
|
const std::string& html,
|
|
MessageHandler on_message,
|
|
CloseHandler on_close,
|
|
CloseHandler on_destroyed);
|
|
~DockPanel() override;
|
|
|
|
// Main thread only.
|
|
void push_message(const nlohmann::json& data);
|
|
// Fires on_close, then removes the pane.
|
|
void request_close();
|
|
// Removes the pane without on_close, for plugin unload. Destroys at once: unload always comes from
|
|
// the host, never from this panel's own callbacks.
|
|
void destroy_silently();
|
|
// Fires on_close at most once; also run by the pane's own close button.
|
|
void fire_close();
|
|
|
|
protected:
|
|
std::optional<std::string> page_html() override { return m_html; }
|
|
bool on_page_message(const std::string& kind, const nlohmann::json& data) override;
|
|
|
|
private:
|
|
void remove_pane();
|
|
|
|
std::string m_html;
|
|
bool m_closing{false};
|
|
MessageHandler m_on_message;
|
|
CloseHandler m_on_close;
|
|
CloseHandler m_on_destroyed;
|
|
};
|
|
|
|
}} // namespace Slic3r::GUI
|