diff --git a/src/jngl.hpp b/src/jngl.hpp index 169eecb9..5d8981a8 100644 --- a/src/jngl.hpp +++ b/src/jngl.hpp @@ -7,43 +7,44 @@ #include "jngl/Achievement.hpp" // IWYU pragma: keep #include "jngl/Alpha.hpp" // IWYU pragma: keep #include "jngl/Channel.hpp" -#include "jngl/Color.hpp" // IWYU pragma: keep -#include "jngl/Container.hpp" // IWYU pragma: keep -#include "jngl/Controller.hpp" // IWYU pragma: keep -#include "jngl/Drawable.hpp" // IWYU pragma: keep -#include "jngl/FrameBuffer.hpp" // IWYU pragma: keep -#include "jngl/ImageData.hpp" // IWYU pragma: keep -#include "jngl/Label.hpp" // IWYU pragma: keep -#include "jngl/OutlinedFont.hpp" // IWYU pragma: keep -#include "jngl/Pixels.hpp" // IWYU pragma: keep -#include "jngl/Rect.hpp" // IWYU pragma: keep -#include "jngl/Rgb.hpp" // IWYU pragma: keep -#include "jngl/Rgba.hpp" // IWYU pragma: keep -#include "jngl/ScaleablePixels.hpp" // IWYU pragma: keep -#include "jngl/Shader.hpp" // IWYU pragma: keep -#include "jngl/ShaderProgram.hpp" // IWYU pragma: keep -#include "jngl/Singleton.hpp" // IWYU pragma: keep -#include "jngl/SoundFile.hpp" // IWYU pragma: keep -#include "jngl/Sprite.hpp" // IWYU pragma: keep -#include "jngl/TextLine.hpp" // IWYU pragma: keep -#include "jngl/Vertex.hpp" // IWYU pragma: keep -#include "jngl/Video.hpp" // IWYU pragma: keep -#include "jngl/Widget.hpp" // IWYU pragma: keep -#include "jngl/WorkFactory.hpp" // IWYU pragma: keep -#include "jngl/debug.hpp" // IWYU pragma: keep -#include "jngl/effects.hpp" // IWYU pragma: keep -#include "jngl/font.hpp" // IWYU pragma: keep -#include "jngl/input.hpp" // IWYU pragma: keep -#include "jngl/job.hpp" // IWYU pragma: keep -#include "jngl/log.hpp" // IWYU pragma: keep -#include "jngl/main.hpp" // IWYU pragma: keep -#include "jngl/matrix.hpp" // IWYU pragma: keep -#include "jngl/message.hpp" // IWYU pragma: keep -#include "jngl/other.hpp" // IWYU pragma: keep -#include "jngl/screen.hpp" // IWYU pragma: keep -#include "jngl/shapes.hpp" // IWYU pragma: keep -#include "jngl/sound.hpp" // IWYU pragma: keep -#include "jngl/text.hpp" // IWYU pragma: keep -#include "jngl/time.hpp" // IWYU pragma: keep -#include "jngl/window.hpp" // IWYU pragma: keep -#include "jngl/work.hpp" // IWYU pragma: keep +#include "jngl/Color.hpp" // IWYU pragma: keep +#include "jngl/Container.hpp" // IWYU pragma: keep +#include "jngl/Controller.hpp" // IWYU pragma: keep +#include "jngl/Drawable.hpp" // IWYU pragma: keep +#include "jngl/FrameBuffer.hpp" // IWYU pragma: keep +#include "jngl/ImageData.hpp" // IWYU pragma: keep +#include "jngl/KeyboardShortcut.hpp" // IWYU pragma: keep +#include "jngl/Label.hpp" // IWYU pragma: keep +#include "jngl/OutlinedFont.hpp" // IWYU pragma: keep +#include "jngl/Pixels.hpp" // IWYU pragma: keep +#include "jngl/Rect.hpp" // IWYU pragma: keep +#include "jngl/Rgb.hpp" // IWYU pragma: keep +#include "jngl/Rgba.hpp" // IWYU pragma: keep +#include "jngl/ScaleablePixels.hpp" // IWYU pragma: keep +#include "jngl/Shader.hpp" // IWYU pragma: keep +#include "jngl/ShaderProgram.hpp" // IWYU pragma: keep +#include "jngl/Singleton.hpp" // IWYU pragma: keep +#include "jngl/SoundFile.hpp" // IWYU pragma: keep +#include "jngl/Sprite.hpp" // IWYU pragma: keep +#include "jngl/TextLine.hpp" // IWYU pragma: keep +#include "jngl/Vertex.hpp" // IWYU pragma: keep +#include "jngl/Video.hpp" // IWYU pragma: keep +#include "jngl/Widget.hpp" // IWYU pragma: keep +#include "jngl/WorkFactory.hpp" // IWYU pragma: keep +#include "jngl/debug.hpp" // IWYU pragma: keep +#include "jngl/effects.hpp" // IWYU pragma: keep +#include "jngl/font.hpp" // IWYU pragma: keep +#include "jngl/input.hpp" // IWYU pragma: keep +#include "jngl/job.hpp" // IWYU pragma: keep +#include "jngl/log.hpp" // IWYU pragma: keep +#include "jngl/main.hpp" // IWYU pragma: keep +#include "jngl/matrix.hpp" // IWYU pragma: keep +#include "jngl/message.hpp" // IWYU pragma: keep +#include "jngl/other.hpp" // IWYU pragma: keep +#include "jngl/screen.hpp" // IWYU pragma: keep +#include "jngl/shapes.hpp" // IWYU pragma: keep +#include "jngl/sound.hpp" // IWYU pragma: keep +#include "jngl/text.hpp" // IWYU pragma: keep +#include "jngl/time.hpp" // IWYU pragma: keep +#include "jngl/window.hpp" // IWYU pragma: keep +#include "jngl/work.hpp" // IWYU pragma: keep diff --git a/src/jngl/KeyboardShortcut.cpp b/src/jngl/KeyboardShortcut.cpp new file mode 100644 index 00000000..03120fdb --- /dev/null +++ b/src/jngl/KeyboardShortcut.cpp @@ -0,0 +1,44 @@ +// Copyright 2025 Jan Niklas Hasse +// For conditions of distribution and use, see copyright notice in LICENSE.txt +#include "KeyboardShortcut.hpp" + +namespace jngl { + +KeyboardShortcut::KeyboardShortcut() : key('\0') { +} + +KeyboardShortcut::KeyboardShortcut(key::KeyType modifier, char key) +: modifiers({ + modifier, + }), + key(key) { +} +KeyboardShortcut::KeyboardShortcut(key::KeyType modifier1, key::KeyType modifier2, char key) +: modifiers({ + modifier1, + modifier2, + }), + key(key) { +} + +KeyboardShortcut::KeyboardShortcut(key::KeyType key) : key(key) { +} + +std::string KeyboardShortcut::toString() const { + std::string result; + for (const auto modifier : modifiers) { + result += keyToString(modifier) + "+"; + } + if (std::holds_alternative(key)) { + result += keyToString(std::get(key)); + } else { + char k = std::get(key); + if (k == '\0') { + return result; + } + result += static_cast(std::toupper(k)); + } + return result; +} + +} // namespace jngl diff --git a/src/jngl/KeyboardShortcut.hpp b/src/jngl/KeyboardShortcut.hpp new file mode 100644 index 00000000..cd9344ad --- /dev/null +++ b/src/jngl/KeyboardShortcut.hpp @@ -0,0 +1,32 @@ +// Copyright 2025 Jan Niklas Hasse +// For conditions of distribution and use, see copyright notice in LICENSE.txt +/// Contains jngl::KeyboardShortcut class +/// @file +#pragma once + +#include "input.hpp" + +namespace jngl { + +class KeyboardShortcut { +public: + /// no shortcut, will never trigger + KeyboardShortcut(); + + /// modifier + key, e.g. { jngl::key::Control, 's' } for Ctrl+S + KeyboardShortcut(key::KeyType modifier, char key); + + /// two modifiers + key, e.g. { jngl::key::Control, jngl::key::Shift, 's' } for Ctrl+Shift+S + KeyboardShortcut(key::KeyType modifier1, key::KeyType modifier2, char key); + + // single key, e.g. jngl::key::F1 + KeyboardShortcut(key::KeyType key); // NOLINT + + std::string toString() const; + +private: + std::vector modifiers; + std::variant key; +}; + +} // namespace jngl diff --git a/src/jngl/input.cpp b/src/jngl/input.cpp index 12a48390..cf73cb22 100644 --- a/src/jngl/input.cpp +++ b/src/jngl/input.cpp @@ -1,10 +1,71 @@ -// Copyright 2012-2024 Jan Niklas Hasse +// Copyright 2012-2025 Jan Niklas Hasse // For conditions of distribution and use, see copyright notice in LICENSE.txt #include "../windowptr.hpp" namespace jngl { +std::string keyToString(key::KeyType key) { + switch (key) { + case key::Ctrl: + return "Ctrl"; + case key::Shift: + return "Shift"; + case key::F1: + return "F1"; + case key::F2: + return "F2"; + case key::F3: + return "F3"; + case key::F4: + return "F4"; + case key::F5: + return "F5"; + case key::F6: + return "F6"; + case key::F7: + return "F7"; + case key::F8: + return "F8"; + case key::F9: + return "F9"; + case key::F10: + return "F10"; + case key::F11: + return "F11"; + case key::F12: + return "F12"; + case key::Left: + case key::Up: + case key::Right: + case key::Down: + case key::PageUp: + case key::PageDown: + case key::Home: + case key::End: + case key::BackSpace: + case key::Tab: + case key::Clear: + case key::Return: + case key::Pause: + case key::Escape: + case key::Delete: + case key::ControlL: + case key::ControlR: + case key::CapsLock: + case key::AltL: + case key::AltR: + case key::SuperL: + case key::SuperR: + case key::Space: + case key::ShiftL: + case key::ShiftR: + case key::Any: + break; + } + throw std::runtime_error("Unknown key"); +} + void setKeyPressed(key::KeyType key, bool p) { pWindow->setKeyPressed(key, p); } diff --git a/src/jngl/input.hpp b/src/jngl/input.hpp index 976c02ea..5f66d687 100644 --- a/src/jngl/input.hpp +++ b/src/jngl/input.hpp @@ -57,6 +57,10 @@ enum KeyType : uint8_t { Space, ShiftL, ShiftR, + + /// Shortcut for either ShiftL or ShiftR + Shift, + F1, F2, F3, @@ -73,6 +77,8 @@ enum KeyType : uint8_t { }; } // namespace key +std::string keyToString(key::KeyType); + /// Display onscreen keyboard for touch devices void setKeyboardVisible(bool);