diff --git a/data/gui.xml b/data/gui.xml index 46559b52b..b49e7b034 100644 --- a/data/gui.xml +++ b/data/gui.xml @@ -473,6 +473,12 @@ + + + + + + diff --git a/data/strings/en.ini b/data/strings/en.ini index 831ef037b..94f3567f4 100644 --- a/data/strings/en.ini +++ b/data/strings/en.ini @@ -1342,3 +1342,8 @@ image_preset_photo = Photo image_preset_drawing = Drawing image_preset_icon = Icon image_preset_text = Text + +[symmetry] +toggle = Toggle Symmetry +toggle_horizontal = Toggle Horizontal Symmetry +toggle_vertical = Toggle Vertical Symmetry diff --git a/src/app/commands/cmd_symmetry_mode.cpp b/src/app/commands/cmd_symmetry_mode.cpp index b5da17966..de085a2ac 100644 --- a/src/app/commands/cmd_symmetry_mode.cpp +++ b/src/app/commands/cmd_symmetry_mode.cpp @@ -12,7 +12,12 @@ #include "app/commands/command.h" #include "app/commands/params.h" #include "app/context.h" +#include "app/doc.h" +#include "app/i18n/strings.h" #include "app/pref/preferences.h" +#include "app/ui_context.h" +#include "app/ui/context_bar.h" +#include "app/modules/gui.h" namespace app { @@ -22,9 +27,14 @@ public: Command* clone() const override { return new SymmetryModeCommand(*this); } protected: + void onLoadParams(const Params& params) override; bool onEnabled(Context* context) override; bool onChecked(Context* context) override; void onExecute(Context* context) override; + std::string onGetFriendlyName() const override; + +private: + app::gen::SymmetryMode m_mode = app::gen::SymmetryMode::NONE; }; SymmetryModeCommand::SymmetryModeCommand() @@ -32,6 +42,26 @@ SymmetryModeCommand::SymmetryModeCommand() { } +std::string SymmetryModeCommand::onGetFriendlyName() const +{ + switch (m_mode) { + case app::gen::SymmetryMode::HORIZONTAL: + return Strings::symmetry_toggle_horizontal(); + case app::gen::SymmetryMode::VERTICAL: + return Strings::symmetry_toggle_vertical(); + default: + return Strings::symmetry_toggle(); + } +} + +void SymmetryModeCommand::onLoadParams(const Params& params) +{ + std::string mode = params.get("orientation"); + if (mode == "vertical") m_mode = app::gen::SymmetryMode::VERTICAL; + else if (mode == "horizontal") m_mode = app::gen::SymmetryMode::HORIZONTAL; + else m_mode = app::gen::SymmetryMode::NONE; +} + bool SymmetryModeCommand::onEnabled(Context* ctx) { return ctx->checkFlags(ContextFlags::ActiveDocumentIsWritable | @@ -46,7 +76,18 @@ bool SymmetryModeCommand::onChecked(Context* ctx) void SymmetryModeCommand::onExecute(Context* ctx) { auto& enabled = Preferences::instance().symmetryMode.enabled; - enabled(!enabled()); + if (m_mode == app::gen::SymmetryMode::NONE) { + enabled(!enabled()); + } + else { + Doc* document = ctx->activeDocument(); + DocumentPreferences& docPref = Preferences::instance().document(ctx->activeDocument()); + app::gen::SymmetryMode actual = docPref.symmetry.mode(); + docPref.symmetry.mode(app::gen::SymmetryMode(int(m_mode) ^ int(actual))); + enabled(true); + document->notifyGeneralUpdate(); + App::instance()->contextBar()->updateForActiveTool(); + } } Command* CommandFactory::createSymmetryModeCommand()