2026-01-26 19:08:36 +03:00
|
|
|
#include "ToolConfiguration.hpp"
|
2026-01-29 11:48:08 +03:00
|
|
|
#include "DrawingProgram.hpp"
|
|
|
|
|
#include "../World.hpp"
|
|
|
|
|
#include "../MainProgram.hpp"
|
|
|
|
|
#include "Helpers/FixedPoint.hpp"
|
|
|
|
|
#include <optional>
|
|
|
|
|
#include "Helpers/Logger.hpp"
|
2026-01-29 20:33:22 +03:00
|
|
|
#include "Tools/DrawingProgramToolBase.hpp"
|
2026-01-26 19:08:36 +03:00
|
|
|
|
2026-01-29 20:33:22 +03:00
|
|
|
float& ToolConfiguration::get_stroke_size_relative_width_ref(DrawingProgramToolType toolType) {
|
|
|
|
|
if(globalConf.useGlobalRelativeWidth)
|
|
|
|
|
return globalConf.relativeWidth;
|
|
|
|
|
switch(toolType) {
|
|
|
|
|
case DrawingProgramToolType::LINE:
|
|
|
|
|
return lineDraw.relativeWidth;
|
|
|
|
|
case DrawingProgramToolType::BRUSH:
|
|
|
|
|
return brush.relativeWidth;
|
|
|
|
|
case DrawingProgramToolType::ELLIPSE:
|
|
|
|
|
return ellipseDraw.relativeWidth;
|
|
|
|
|
case DrawingProgramToolType::RECTANGLE:
|
|
|
|
|
return rectDraw.relativeWidth;
|
|
|
|
|
case DrawingProgramToolType::ERASER:
|
|
|
|
|
return eraser.relativeWidth;
|
|
|
|
|
default:
|
|
|
|
|
return globalConf.relativeWidth;
|
|
|
|
|
}
|
|
|
|
|
return globalConf.relativeWidth;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const float& ToolConfiguration::get_stroke_size_relative_width_ref(DrawingProgramToolType toolType) const {
|
|
|
|
|
if(globalConf.useGlobalRelativeWidth)
|
|
|
|
|
return globalConf.relativeWidth;
|
|
|
|
|
switch(toolType) {
|
|
|
|
|
case DrawingProgramToolType::LINE:
|
|
|
|
|
return lineDraw.relativeWidth;
|
|
|
|
|
case DrawingProgramToolType::BRUSH:
|
|
|
|
|
return brush.relativeWidth;
|
|
|
|
|
case DrawingProgramToolType::ELLIPSE:
|
|
|
|
|
return ellipseDraw.relativeWidth;
|
|
|
|
|
case DrawingProgramToolType::RECTANGLE:
|
|
|
|
|
return rectDraw.relativeWidth;
|
|
|
|
|
case DrawingProgramToolType::ERASER:
|
|
|
|
|
return eraser.relativeWidth;
|
|
|
|
|
default:
|
|
|
|
|
return globalConf.relativeWidth;
|
|
|
|
|
}
|
|
|
|
|
return globalConf.relativeWidth;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::pair<std::optional<float>, ToolConfiguration::RelativeWidthFailCode> ToolConfiguration::get_relative_width_from_value(DrawingProgram& drawP, const WorldScalar& camInverseScale, float relativeWidth) const {
|
2026-01-29 11:48:08 +03:00
|
|
|
auto& lockedCameraScale = drawP.controls.lockedCameraScale;
|
|
|
|
|
if(lockedCameraScale.has_value()) {
|
|
|
|
|
float lockMultiplier = static_cast<float>(WorldMultiplier(lockedCameraScale.value()) / WorldMultiplier(camInverseScale));
|
2026-01-29 20:36:42 +03:00
|
|
|
if(lockMultiplier < 0.005f)
|
2026-01-29 20:33:22 +03:00
|
|
|
return {std::nullopt, RelativeWidthFailCode::TOO_ZOOMED_OUT};
|
2026-01-29 20:36:42 +03:00
|
|
|
else if(lockMultiplier > 200.0f)
|
2026-01-29 20:33:22 +03:00
|
|
|
return {std::nullopt, RelativeWidthFailCode::TOO_ZOOMED_IN};
|
|
|
|
|
return {relativeWidth * lockMultiplier, RelativeWidthFailCode::SUCCESS};
|
|
|
|
|
}
|
|
|
|
|
return {relativeWidth, RelativeWidthFailCode::SUCCESS};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::pair<std::optional<float>, ToolConfiguration::RelativeWidthFailCode> ToolConfiguration::get_relative_width_stroke_size(DrawingProgram& drawP, const WorldScalar& camInverseScale) const {
|
|
|
|
|
return get_relative_width_from_value(drawP, camInverseScale, get_stroke_size_relative_width_ref(drawP.drawTool->get_type()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ToolConfiguration::print_relative_width_fail_message(RelativeWidthFailCode failCode) {
|
|
|
|
|
switch(failCode) {
|
|
|
|
|
case RelativeWidthFailCode::SUCCESS:
|
|
|
|
|
break;
|
|
|
|
|
case RelativeWidthFailCode::TOO_ZOOMED_IN:
|
|
|
|
|
Logger::get().log("USERINFO", "Zoomed in too much! Unlock size or zoom out");
|
|
|
|
|
break;
|
|
|
|
|
case RelativeWidthFailCode::TOO_ZOOMED_OUT:
|
|
|
|
|
Logger::get().log("USERINFO", "Zoomed out too much! Unlock size or zoom in");
|
|
|
|
|
break;
|
2026-01-29 11:48:08 +03:00
|
|
|
}
|
2026-01-26 19:08:36 +03:00
|
|
|
}
|
|
|
|
|
|
2026-01-29 20:33:22 +03:00
|
|
|
void ToolConfiguration::relative_width_gui(DrawingProgram& drawP, const char* label) {
|
2026-01-29 11:48:08 +03:00
|
|
|
auto& gui = drawP.world.main.toolbar.gui;
|
|
|
|
|
auto& lockedCameraScale = drawP.controls.lockedCameraScale;
|
2026-01-29 20:33:22 +03:00
|
|
|
gui.slider_scalar_field<float>("relstrokewidth", label, &get_stroke_size_relative_width_ref(drawP.drawTool->get_type()), 3.0f, 40.0f);
|
|
|
|
|
if(gui.text_button_wide("lock brush size", lockedCameraScale.has_value() ? "Unlock Size" : "Lock Size to Zoom")) {
|
2026-01-29 11:48:08 +03:00
|
|
|
if(lockedCameraScale.has_value())
|
|
|
|
|
lockedCameraScale = std::nullopt;
|
|
|
|
|
else
|
|
|
|
|
lockedCameraScale = drawP.world.drawData.cam.c.inverseScale;
|
|
|
|
|
}
|
2026-01-26 19:08:36 +03:00
|
|
|
}
|