mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-02 05:50:37 +08:00
Avoid issue with invisible status indication.
This commit is contained in:
parent
a12950c51a
commit
fb93166c64
@ -173,7 +173,7 @@ set(SLIC3R_GUI_SOURCES
|
|||||||
GUI/Jobs/BoostThreadWorker.hpp
|
GUI/Jobs/BoostThreadWorker.hpp
|
||||||
GUI/Jobs/BoostThreadWorker.cpp
|
GUI/Jobs/BoostThreadWorker.cpp
|
||||||
GUI/Jobs/BusyCursorJob.hpp
|
GUI/Jobs/BusyCursorJob.hpp
|
||||||
GUI/Jobs/PlaterJob.hpp
|
GUI/Jobs/PlaterWorker.hpp
|
||||||
GUI/Jobs/ArrangeJob.hpp
|
GUI/Jobs/ArrangeJob.hpp
|
||||||
GUI/Jobs/ArrangeJob.cpp
|
GUI/Jobs/ArrangeJob.cpp
|
||||||
GUI/Jobs/RotoptimizeJob.hpp
|
GUI/Jobs/RotoptimizeJob.hpp
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
#include "libslic3r/PresetBundle.hpp"
|
#include "libslic3r/PresetBundle.hpp"
|
||||||
|
|
||||||
#include "slic3r/GUI/Jobs/RotoptimizeJob.hpp"
|
#include "slic3r/GUI/Jobs/RotoptimizeJob.hpp"
|
||||||
#include "slic3r/GUI/Jobs/PlaterJob.hpp"
|
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
@ -164,10 +164,11 @@ void ArrangeJob::prepare()
|
|||||||
|
|
||||||
void ArrangeJob::process(Ctl &ctl)
|
void ArrangeJob::process(Ctl &ctl)
|
||||||
{
|
{
|
||||||
ctl.call_on_main_thread([this]{ prepare(); }).wait();
|
|
||||||
|
|
||||||
static const auto arrangestr = _u8L("Arranging");
|
static const auto arrangestr = _u8L("Arranging");
|
||||||
|
|
||||||
|
ctl.update_status(0, arrangestr);
|
||||||
|
ctl.call_on_main_thread([this]{ prepare(); }).wait();;
|
||||||
|
|
||||||
arrangement::ArrangeParams params = get_arrange_params(m_plater);
|
arrangement::ArrangeParams params = get_arrange_params(m_plater);
|
||||||
|
|
||||||
auto count = unsigned(m_selected.size() + m_unprintable.size());
|
auto count = unsigned(m_selected.size() + m_unprintable.size());
|
||||||
@ -196,7 +197,7 @@ void ArrangeJob::process(Ctl &ctl)
|
|||||||
_u8L("Arranging done."));
|
_u8L("Arranging done."));
|
||||||
}
|
}
|
||||||
|
|
||||||
ArrangeJob::ArrangeJob() : m_plater{wxGetApp().plater()} { }
|
ArrangeJob::ArrangeJob() : m_plater{wxGetApp().plater()} {}
|
||||||
|
|
||||||
static std::string concat_strings(const std::set<std::string> &strings,
|
static std::string concat_strings(const std::set<std::string> &strings,
|
||||||
const std::string &delim = "\n")
|
const std::string &delim = "\n")
|
||||||
|
@ -29,7 +29,7 @@ void BoostThreadWorker::WorkerMessage::deliver(BoostThreadWorker &runner)
|
|||||||
case MainThreadCall: {
|
case MainThreadCall: {
|
||||||
MainThreadCallData &calldata = std::get<MainThreadCall>(m_data);
|
MainThreadCallData &calldata = std::get<MainThreadCall>(m_data);
|
||||||
calldata.fn();
|
calldata.fn();
|
||||||
calldata.barrier.set_value();
|
calldata.promise.set_value();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -69,7 +69,7 @@ void BoostThreadWorker::update_status(int st, const std::string &msg)
|
|||||||
std::future<void> BoostThreadWorker::call_on_main_thread(std::function<void ()> fn)
|
std::future<void> BoostThreadWorker::call_on_main_thread(std::function<void ()> fn)
|
||||||
{
|
{
|
||||||
MainThreadCallData cbdata{std::move(fn), {}};
|
MainThreadCallData cbdata{std::move(fn), {}};
|
||||||
std::future<void> future = cbdata.barrier.get_future();
|
std::future<void> future = cbdata.promise.get_future();
|
||||||
|
|
||||||
m_output_queue.push(std::move(cbdata));
|
m_output_queue.push(std::move(cbdata));
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ class BoostThreadWorker : public Worker, private Job::Ctl
|
|||||||
struct MainThreadCallData
|
struct MainThreadCallData
|
||||||
{
|
{
|
||||||
std::function<void()> fn;
|
std::function<void()> fn;
|
||||||
std::promise<void> barrier;
|
std::promise<void> promise;
|
||||||
};
|
};
|
||||||
|
|
||||||
class WorkerMessage
|
class WorkerMessage
|
||||||
@ -55,6 +55,8 @@ class BoostThreadWorker : public Worker, private Job::Ctl
|
|||||||
WorkerMessage(JobEntry &&entry) : m_data{std::move(entry)} {}
|
WorkerMessage(JobEntry &&entry) : m_data{std::move(entry)} {}
|
||||||
WorkerMessage(MainThreadCallData fn) : m_data{std::move(fn)} {}
|
WorkerMessage(MainThreadCallData fn) : m_data{std::move(fn)} {}
|
||||||
|
|
||||||
|
int get_type () const { return m_data.index(); }
|
||||||
|
|
||||||
void deliver(BoostThreadWorker &runner);
|
void deliver(BoostThreadWorker &runner);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -105,7 +105,9 @@ void FillBedJob::prepare()
|
|||||||
|
|
||||||
void FillBedJob::process(Ctl &ctl)
|
void FillBedJob::process(Ctl &ctl)
|
||||||
{
|
{
|
||||||
ctl.call_on_main_thread([this]{ prepare(); }).wait();
|
auto statustxt = _u8L("Filling bed");
|
||||||
|
ctl.call_on_main_thread([this] { prepare(); }).wait();
|
||||||
|
ctl.update_status(0, statustxt);
|
||||||
|
|
||||||
if (m_object_idx == -1 || m_selected.empty()) return;
|
if (m_object_idx == -1 || m_selected.empty()) return;
|
||||||
|
|
||||||
@ -121,10 +123,6 @@ void FillBedJob::process(Ctl &ctl)
|
|||||||
return ctl.was_canceled() || do_stop;
|
return ctl.was_canceled() || do_stop;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto statustxt = _u8L("Filling bed");
|
|
||||||
|
|
||||||
ctl.update_status(0, statustxt);
|
|
||||||
|
|
||||||
params.progressind = [this, &ctl, &statustxt](unsigned st) {
|
params.progressind = [this, &ctl, &statustxt](unsigned st) {
|
||||||
if (st > 0)
|
if (st > 0)
|
||||||
ctl.update_status(int(m_status_range - st) * 100 / status_range(), statustxt);
|
ctl.update_status(int(m_status_range - st) * 100 / status_range(), statustxt);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#ifndef PLATERJOB_HPP
|
#ifndef PLATERWORKER_HPP
|
||||||
#define PLATERJOB_HPP
|
#define PLATERWORKER_HPP
|
||||||
|
|
||||||
#include "BusyCursorJob.hpp"
|
#include "BusyCursorJob.hpp"
|
||||||
|
|
||||||
@ -24,8 +24,32 @@ class PlaterWorker: public Worker {
|
|||||||
public:
|
public:
|
||||||
void process(Ctl &c) override
|
void process(Ctl &c) override
|
||||||
{
|
{
|
||||||
CursorSetterRAII busycursor{c};
|
// Ensure that wxWidgets processing wakes up to handle outgoing
|
||||||
m_job->process(c);
|
// messages in plater's wxIdle handler. Otherwise it might happen
|
||||||
|
// that the message will only be processed when an event like mouse
|
||||||
|
// move comes along which might be too late.
|
||||||
|
struct WakeUpCtl: Ctl {
|
||||||
|
Ctl &ctl;
|
||||||
|
WakeUpCtl(Ctl &c) : ctl{c} {}
|
||||||
|
|
||||||
|
void update_status(int st, const std::string &msg = "") override
|
||||||
|
{
|
||||||
|
wxWakeUpIdle();
|
||||||
|
ctl.update_status(st, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool was_canceled() const override { return ctl.was_canceled(); }
|
||||||
|
|
||||||
|
std::future<void> call_on_main_thread(std::function<void()> fn) override
|
||||||
|
{
|
||||||
|
wxWakeUpIdle();
|
||||||
|
return ctl.call_on_main_thread(std::move(fn));
|
||||||
|
}
|
||||||
|
|
||||||
|
} wctl{c};
|
||||||
|
|
||||||
|
CursorSetterRAII busycursor{wctl};
|
||||||
|
m_job->process(wctl);
|
||||||
}
|
}
|
||||||
|
|
||||||
void finalize(bool canceled, std::exception_ptr &eptr) override
|
void finalize(bool canceled, std::exception_ptr &eptr) override
|
||||||
@ -60,10 +84,18 @@ class PlaterWorker: public Worker {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
template<class ... WorkerArgs>
|
public:
|
||||||
PlaterWorker(WorkerArgs &&...args) : m_w{std::forward<WorkerArgs>(args)...} {}
|
template<class... WorkerArgs>
|
||||||
|
PlaterWorker(Plater *plater, WorkerArgs &&...args)
|
||||||
|
: m_w{std::forward<WorkerArgs>(args)...}
|
||||||
|
{
|
||||||
|
// Ensure that messages from the worker thread to the UI thread are
|
||||||
|
// processed continuously.
|
||||||
|
plater->Bind(wxEVT_IDLE, [this](wxIdleEvent &) {
|
||||||
|
m_w.process_events();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Always package the job argument into a PlaterJob
|
// Always package the job argument into a PlaterJob
|
||||||
bool start_next(std::unique_ptr<Job> job) override
|
bool start_next(std::unique_ptr<Job> job) override
|
||||||
@ -74,7 +106,7 @@ public:
|
|||||||
bool is_idle() const override { return m_w.is_idle(); }
|
bool is_idle() const override { return m_w.is_idle(); }
|
||||||
void cancel() override { m_w.cancel(); }
|
void cancel() override { m_w.cancel(); }
|
||||||
void cancel_all() override { m_w.cancel_all(); }
|
void cancel_all() override { m_w.cancel_all(); }
|
||||||
void process_events() override { m_w.process_events(); }
|
void process_events() override {}
|
||||||
};
|
};
|
||||||
|
|
||||||
}} // namespace Slic3r::GUI
|
}} // namespace Slic3r::GUI
|
@ -75,7 +75,7 @@
|
|||||||
#include "Jobs/SLAImportJob.hpp"
|
#include "Jobs/SLAImportJob.hpp"
|
||||||
#include "Jobs/SLAImportDialog.hpp"
|
#include "Jobs/SLAImportDialog.hpp"
|
||||||
#include "Jobs/NotificationProgressIndicator.hpp"
|
#include "Jobs/NotificationProgressIndicator.hpp"
|
||||||
#include "Jobs/PlaterJob.hpp"
|
#include "Jobs/PlaterWorker.hpp"
|
||||||
#include "Jobs/BoostThreadWorker.hpp"
|
#include "Jobs/BoostThreadWorker.hpp"
|
||||||
#include "BackgroundSlicingProcess.hpp"
|
#include "BackgroundSlicingProcess.hpp"
|
||||||
#include "PrintHostDialogs.hpp"
|
#include "PrintHostDialogs.hpp"
|
||||||
@ -1943,7 +1943,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
|
|||||||
}))
|
}))
|
||||||
, sidebar(new Sidebar(q))
|
, sidebar(new Sidebar(q))
|
||||||
, notification_manager(std::make_unique<NotificationManager>(q))
|
, notification_manager(std::make_unique<NotificationManager>(q))
|
||||||
, m_worker{std::make_unique<NotificationProgressIndicator>(notification_manager.get()), "ui_worker"}
|
, m_worker{q, std::make_unique<NotificationProgressIndicator>(notification_manager.get()), "ui_worker"}
|
||||||
, m_sla_import_dlg{new SLAImportDialog{q}}
|
, m_sla_import_dlg{new SLAImportDialog{q}}
|
||||||
, delayed_scene_refresh(false)
|
, delayed_scene_refresh(false)
|
||||||
, view_toolbar(GLToolbar::Radio, "View")
|
, view_toolbar(GLToolbar::Radio, "View")
|
||||||
@ -2173,12 +2173,6 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
|
|||||||
bool is_collapsed = wxGetApp().app_config->get("collapsed_sidebar") == "1";
|
bool is_collapsed = wxGetApp().app_config->get("collapsed_sidebar") == "1";
|
||||||
sidebar->collapse(is_collapsed);
|
sidebar->collapse(is_collapsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that messages from the worker thread to the UI thread are processed
|
|
||||||
// continuously.
|
|
||||||
main_frame->Bind(wxEVT_IDLE, [this](const wxIdleEvent &) {
|
|
||||||
m_worker.process_events();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Plater::priv::~priv()
|
Plater::priv::~priv()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user