Skip to content

Commit

Permalink
Ensure parent Widget ptr is propagated via ModelViewerPanel
Browse files Browse the repository at this point in the history
  • Loading branch information
adamkewley committed Feb 12, 2025
1 parent 980177f commit 19aad16
Show file tree
Hide file tree
Showing 12 changed files with 101 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1018,7 +1018,7 @@ class osc::FrameDefinitionTab::Impl final : public TabPrivate {
};
SetupDefault3DViewportRenderingParams(panelParams.updRenderParams());

return std::make_shared<ModelViewerPanel>(panelName, panelParams);
return std::make_shared<ModelViewerPanel>(&this->owner(), panelName, panelParams);
},
1
);
Expand Down
2 changes: 1 addition & 1 deletion libopensimcreator/UI/ModelEditor/ModelEditorTab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ class osc::ModelEditorTab::Impl final : public TabPrivate {
};
const ModelViewerPanelParameters panelParams{m_Model, onRightClick};

return std::make_shared<ModelViewerPanel>(panelName, panelParams);
return std::make_shared<ModelViewerPanel>(&this->owner(), panelName, panelParams);
},
1 // have one viewer open at the start
);
Expand Down
8 changes: 4 additions & 4 deletions libopensimcreator/UI/ModelWarper/ModelWarperTab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,17 @@ class osc::mow::ModelWarperTab::Impl final : public TabPrivate {

m_PanelManager->register_toggleable_panel(
"Source Model",
[state = m_State](std::string_view panelName)
[this, state = m_State](std::string_view panelName)
{
return std::make_shared<SourceModelViewerPanel>(panelName, state);
return std::make_shared<SourceModelViewerPanel>(&this->owner(), panelName, state);
}
);

m_PanelManager->register_toggleable_panel(
"Result Model",
[state = m_State](std::string_view panelName)
[this, state = m_State](std::string_view panelName)
{
return std::make_shared<ResultModelViewerPanel>(panelName, state);
return std::make_shared<ResultModelViewerPanel>(&this->owner(), panelName, state);
}
);

Expand Down
3 changes: 2 additions & 1 deletion libopensimcreator/UI/ModelWarper/ResultModelViewerPanel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ using namespace osc;
using namespace osc::mow;

osc::mow::ResultModelViewerPanel::ResultModelViewerPanel(
Widget* parent_,
std::string_view panelName_,
std::shared_ptr<UIState> state_) :

ModelViewerPanel{panelName_, ModelViewerPanelParameters{state_->modelstatePtr()}, ModelViewerPanelFlag::NoHittest},
ModelViewerPanel{parent_, panelName_, ModelViewerPanelParameters{state_->modelstatePtr()}, ModelViewerPanelFlag::NoHittest},
m_State{std::move(state_)}
{}

Expand Down
6 changes: 5 additions & 1 deletion libopensimcreator/UI/ModelWarper/ResultModelViewerPanel.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ namespace osc::mow
{
class ResultModelViewerPanel final : public ModelViewerPanel {
public:
ResultModelViewerPanel(std::string_view panelName_, std::shared_ptr<UIState> state_);
explicit ResultModelViewerPanel(
Widget* parent_,
std::string_view panelName_,
std::shared_ptr<UIState> state_
);

private:
void impl_draw_content() final;
Expand Down
3 changes: 2 additions & 1 deletion libopensimcreator/UI/ModelWarper/SourceModelViewerPanel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@
using namespace osc;

osc::mow::SourceModelViewerPanel::SourceModelViewerPanel(
Widget* parent_,
std::string_view panelName_,
std::shared_ptr<UIState> state_) :

ModelViewerPanel{panelName_, ModelViewerPanelParameters{state_->modelstatePtr()}, ModelViewerPanelFlag::NoHittest},
ModelViewerPanel{parent_, panelName_, ModelViewerPanelParameters{state_->modelstatePtr()}, ModelViewerPanelFlag::NoHittest},
m_State{std::move(state_)}
{}

Expand Down
6 changes: 5 additions & 1 deletion libopensimcreator/UI/ModelWarper/SourceModelViewerPanel.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ namespace osc::mow
{
class SourceModelViewerPanel final : public ModelViewerPanel {
public:
SourceModelViewerPanel(std::string_view panelName_, std::shared_ptr<UIState> state_);
explicit SourceModelViewerPanel(
Widget* parent_,
std::string_view panelName_,
std::shared_ptr<UIState> state_
);

private:
void impl_draw_content() final;
Expand Down
93 changes: 74 additions & 19 deletions libopensimcreator/UI/ModelWarperV3/ModelWarperV3Tab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1499,6 +1499,11 @@ namespace
}
}

bool canScaleModel() const
{
return not m_ScalingErrorMessage.has_value();
}


// camera stuff
bool isCameraLinked() const { return m_LinkCameras; }
Expand Down Expand Up @@ -1641,8 +1646,12 @@ namespace
// source model 3D viewer
class ModelWarperV3SourceModelViewerPanel final : public ModelViewerPanel {
public:
ModelWarperV3SourceModelViewerPanel(std::string_view label, std::shared_ptr<ModelWarperV3UIState> state) :
ModelViewerPanel{label, ModelViewerPanelParameters{state->sourceModel()}, ModelViewerPanelFlag::NoHittest},
explicit ModelWarperV3SourceModelViewerPanel(
Widget* parent,
std::string_view label,
std::shared_ptr<ModelWarperV3UIState> state) :

ModelViewerPanel{parent, label, ModelViewerPanelParameters{state->sourceModel()}, ModelViewerPanelFlag::NoHittest},
m_State{std::move(state)}
{}

Expand Down Expand Up @@ -1684,8 +1693,12 @@ namespace
// result model 3D viewer
class ModelWarperV3ResultModelViewerPanel final : public ModelViewerPanel {
public:
ModelWarperV3ResultModelViewerPanel(std::string_view label, std::shared_ptr<ModelWarperV3UIState> state) :
ModelViewerPanel{label, ModelViewerPanelParameters{state->sourceModel()}, ModelViewerPanelFlag::NoHittest},
ModelWarperV3ResultModelViewerPanel(
Widget* parent,
std::string_view label,
std::shared_ptr<ModelWarperV3UIState> state) :

ModelViewerPanel{parent, label, ModelViewerPanelParameters{state->sourceModel()}, ModelViewerPanelFlag::NoHittest},
m_State{std::move(state)}
{}

Expand Down Expand Up @@ -1784,22 +1797,39 @@ namespace
std::shared_ptr<ModelWarperV3UIState> m_State;
};

class WarpedModelExporterPopup final : public StandardPopup {
public:
explicit WarpedModelExporterPopup() :
StandardPopup{"hello, popup world!"}
{}

private:
void impl_draw_content() final
{
ui::draw_text("hello, popup content!");
}
};

// main toolbar
class ModelWarperV3Toolbar final {
class ModelWarperV3Toolbar final : public Widget {
public:
ModelWarperV3Toolbar(std::string_view label, std::shared_ptr<ModelWarperV3UIState> state) :
explicit ModelWarperV3Toolbar(
Widget* parent,
std::string_view label,
std::shared_ptr<ModelWarperV3UIState> state) :
Widget{parent},
m_Label{label},
m_State{std::move(state)}
{}

void on_draw()
private:
void impl_on_draw() final
{
if (BeginToolbar(m_Label)) {
draw_content();
}
ui::end_panel();
}
private:

void draw_content()
{
int id = 0;
Expand Down Expand Up @@ -1853,6 +1883,27 @@ namespace
ui::draw_vertical_separator();
ui::pop_id();

// Draw green "Warp Model" button
{
ui::push_id(id++);
ui::same_line();
bool disabled = false;
if (not m_State->canScaleModel()) {
ui::begin_disabled();
disabled = true;
}
ui::push_style_color(ui::ColorVar::Button, Color::dark_green());
if (ui::draw_button(OSC_ICON_PLAY " Export Warped Model")) {
log_info("Model exporting TODO (#1003)");
}
ui::pop_style_color();
if (disabled) {
ui::end_disabled();
}
ui::same_line();
ui::draw_vertical_separator();
ui::pop_id();
}

ui::push_id(id++);
ui::same_line();
Expand All @@ -1876,8 +1927,12 @@ namespace
// control panel (design, set parameters, etc.)
class ModelWarperV3ControlPanel final : public Panel {
public:
ModelWarperV3ControlPanel(std::string_view panelName, std::shared_ptr<ModelWarperV3UIState> state) :
Panel{nullptr, panelName},
explicit ModelWarperV3ControlPanel(
Widget* parent,
std::string_view panelName,
std::shared_ptr<ModelWarperV3UIState> state) :

Panel{parent, panelName},
m_State{std::move(state)}
{}

Expand Down Expand Up @@ -2045,7 +2100,7 @@ class osc::ModelWarperV3Tab::Impl final : public TabPrivate {
public:
static CStringView static_label() { return "OpenSim/ModelWarperV3"; }

Impl(Tab& owner, Widget* parent) :
explicit Impl(Tab& owner, Widget* parent) :
TabPrivate{owner, parent, static_label()}
{
// Ensure `ModelWarperV3Document` can be loaded from the filesystem via OpenSim.
Expand All @@ -2057,17 +2112,17 @@ class osc::ModelWarperV3Tab::Impl final : public TabPrivate {
return true;
}(AllScalingStepTypes{});

m_PanelManager->register_toggleable_panel("Control Panel", [state = m_State](std::string_view panelName)
m_PanelManager->register_toggleable_panel("Control Panel", [this, state = m_State](std::string_view panelName)
{
return std::make_shared<ModelWarperV3ControlPanel>(panelName, state);
return std::make_shared<ModelWarperV3ControlPanel>(&this->owner(), panelName, state);
});
m_PanelManager->register_toggleable_panel("Source Model", [state = m_State](std::string_view panelName)
m_PanelManager->register_toggleable_panel("Source Model", [this, state = m_State](std::string_view panelName)
{
return std::make_shared<ModelWarperV3SourceModelViewerPanel>(panelName, state);
return std::make_shared<ModelWarperV3SourceModelViewerPanel>(&this->owner(), panelName, state);
});
m_PanelManager->register_toggleable_panel("Result Model", [state = m_State](std::string_view panelName)
m_PanelManager->register_toggleable_panel("Result Model", [this, state = m_State](std::string_view panelName)
{
return std::make_shared<ModelWarperV3ResultModelViewerPanel>(panelName, state);
return std::make_shared<ModelWarperV3ResultModelViewerPanel>(&this->owner(), panelName, state);
});
m_PanelManager->register_toggleable_panel("Log", [](std::string_view panelName)
{
Expand Down Expand Up @@ -2145,7 +2200,7 @@ class osc::ModelWarperV3Tab::Impl final : public TabPrivate {
std::shared_ptr<PanelManager> m_PanelManager = std::make_shared<PanelManager>();
WindowMenu m_WindowMenu{m_PanelManager};
MainMenuAboutTab m_AboutTab;
ModelWarperV3Toolbar m_Toolbar{"##ModelWarperV3Toolbar", m_State};
ModelWarperV3Toolbar m_Toolbar{&this->owner(), "##ModelWarperV3Toolbar", m_State};

bool m_ExceptionThrownLastFrame = false;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@ class osc::PreviewExperimentalDataTab::Impl final : public TabPrivate {
};
ModelViewerPanelParameters panelParams{m_UiState->updSharedModelPtr(), onRightClick};

return std::make_shared<ModelViewerPanel>(panelName, panelParams);
return std::make_shared<ModelViewerPanel>(&this->owner(), panelName, panelParams);
},
1 // have one viewer open at the start
);
Expand Down
6 changes: 4 additions & 2 deletions libopensimcreator/UI/Shared/ModelViewerPanel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,11 +316,12 @@ class osc::ModelViewerPanel::Impl final : public PanelPrivate {

explicit Impl(
ModelViewerPanel& owner_,
Widget* parent_,
std::string_view panelName_,
ModelViewerPanelParameters parameters_,
ModelViewerPanelFlags flags_) :

PanelPrivate{owner_, nullptr, panelName_},
PanelPrivate{owner_, parent_, panelName_},
m_Parameters{std::move(parameters_)},
m_State{name(), flags_}
{
Expand Down Expand Up @@ -571,11 +572,12 @@ class osc::ModelViewerPanel::Impl final : public PanelPrivate {


osc::ModelViewerPanel::ModelViewerPanel(
Widget* parent_,
std::string_view panelName_,
const ModelViewerPanelParameters& parameters_,
ModelViewerPanelFlags flags_) :

Panel{std::make_unique<Impl>(*this, panelName_, parameters_, flags_)}
Panel{std::make_unique<Impl>(*this, parent_, panelName_, parameters_, flags_)}
{}
bool osc::ModelViewerPanel::isMousedOver() const { return private_data().isMousedOver(); }
bool osc::ModelViewerPanel::isLeftClicked() const { return private_data().isLeftClicked(); }
Expand Down
1 change: 1 addition & 0 deletions libopensimcreator/UI/Shared/ModelViewerPanel.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ namespace osc
class ModelViewerPanel : public Panel {
public:
explicit ModelViewerPanel(
Widget* parent_,
std::string_view panelName_,
const ModelViewerPanelParameters&,
ModelViewerPanelFlags = {}
Expand Down
2 changes: 1 addition & 1 deletion libopensimcreator/UI/Simulation/SimulationTab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ class osc::SimulationTab::Impl final :
},
};

return std::make_shared<ModelViewerPanel>(panelName, std::move(params));
return std::make_shared<ModelViewerPanel>(&this->owner(), panelName, std::move(params));
},
1 // by default, open one viewer
);
Expand Down

0 comments on commit 19aad16

Please sign in to comment.