Files
OrcaSlicer/src/slic3r/GUI/MediaFilePanel.h
T
Lam Wei Lun ccbb73baaf ## Summary
Follow-up to the feature/OrcaSonar review. Scopes the new behavior to the
OrcaSonar agent, fixes several AMS-sync and lifecycle bugs, and makes the
MQTT tests run in CI. Non-OrcaSonar agents keep their existing behavior.

## Changes

Discovery
- Gate the background SSDP scan to a configured OrcaSonar machine instead of
  running for every non-BBL profile; drive discovery on demand from the
  machine-select popup and back off idle rounds from 5s to 60s.
- Add NSLocalNetworkUsageDescription and NSBonjourServices to both macOS
  Info.plist templates.

AMS sync
- Resolve id-less printer-set trays by material type in get_ams_cobox_infos
  and the sidebar badge loop, matching sync_ams_list, so combo arrays and
  badges stay aligned.
- Keep a printer-set tray that resolved by type out of the "unknown or
  incompatible filaments" dialog.

AMS device UI
- Gate the "Empty" tray classification, and the editable temperature fields,
  to the OrcaSonar agent; Bambu keeps "?" and read-only presets.
- Validate AMS material temps on confirm: reject out-of-range values and
  min > max before the command is sent.

Storage tab
- Bind the show/hide handler on the panel's ancestors (StoragePanel and
  MonitorPanel) and unbind on destruction, so the Bambu file system stops
  when the tab is left.

Transport
- Load /etc/ssl/cert.pem on macOS in add_platform_root_certificates, after
  set_default_verify_paths.
- Release lifecycle_mutex before start()'s connect wait so stop() can cancel
  the attempt and signal completion instead of stalling the UI thread.

Localization
- Add OrcaFilesPanel.cpp to list.txt and regenerate the catalogs.

## Tests
- Un-hide the loopback MockBroker integration tests (ephemeral port, no
  network) so ctest registers and runs them.
- Mock broker tracks SUBSCRIBE/UNSUBSCRIBE and delivers push_report only to a
  subscribed topic; the reconnect test asserts the re-SUBSCRIBE.
- Add bbl empty-tray cases, an AMS combo-alignment case, and unknowns
  assertions to the AMS sync tests.
2026-10-06 12:09:23 +08:00

125 lines
2.6 KiB
C++

//
// MediaFilePanel.h
// libslic3r_gui
//
// Created by cmguo on 2021/12/7.
//
#ifndef MediaFilePanel_h
#define MediaFilePanel_h
#include <boost/smart_ptr/shared_ptr.hpp>
#include <cstddef>
#include <set>
#include <vector>
#include "GUI_Utils.hpp"
#include "wxExtensions.hpp"
#include <wx/event.h>
#include <string>
#include <wx/frame.h>
#include <wx/panel.h>
class Button;
class SwitchButton;
class Label;
class StaticBox;
class PrinterFileSystem;
namespace Slic3r {
class MachineObject;
namespace GUI {
class ImageGrid;
class MediaFilePanel : public wxPanel
{
public:
MediaFilePanel(wxWindow * parent);
~MediaFilePanel();
void UpdateByObj(MachineObject * obj);
void SwitchStorage(bool external);
public:
void Rescale();
void SetSelecting(bool selecting);
private:
void modeChanged(wxCommandEvent & e);
void on_show_hide(wxShowEvent & e);
void fetchUrl(boost::weak_ptr<PrinterFileSystem> fs);
void doAction(size_t index, int action);
private:
ScalableBitmap m_bmp_loading;
ScalableBitmap m_bmp_failed;
ScalableBitmap m_bmp_empty;
::StaticBox *m_time_panel = nullptr;
::Button *m_button_year = nullptr;
::Button *m_button_month = nullptr;
::Button *m_button_all = nullptr;
::StaticBox * m_type_panel = nullptr;
::Button * m_button_video = nullptr;
::Button * m_button_timelapse = nullptr;
::Button * m_button_model = nullptr;
::StaticBox *m_manage_panel = nullptr;
::Button * m_button_delete = nullptr;
::Button *m_button_download = nullptr;
::Button *m_button_refresh = nullptr;
::Button *m_button_management = nullptr;
ImageGrid * m_image_grid = nullptr;
bool m_external = true;
std::string m_machine;
std::string m_lan_ip;
std::string m_lan_user;
std::string m_lan_passwd;
std::string m_dev_ver;
bool m_lan_mode = false;
bool m_sdcard_exist = false;
int m_local_proto = false;
int m_remote_proto = false;
bool m_model_download_support = false;
bool m_device_busy = false;
bool m_waiting_enable = false;
bool m_waiting_support = false;
int m_last_mode = 0;
int m_last_type = 0;
std::set<int> m_last_errors;
std::vector<wxWindow*> m_show_hosts;
};
class MediaFileFrame : public DPIFrame
{
public:
MediaFileFrame(wxWindow * parent);
MediaFilePanel * filePanel() { return m_panel; }
virtual void on_dpi_changed(const wxRect& suggested_rect);
private:
MediaFilePanel* m_panel;
};
}}
#endif /* MediaFilePanel_h */