From 20fbf5586f0c2a42b0e2c04b51eb50f815264996 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Wed, 27 Nov 2019 01:08:00 +0100 Subject: [PATCH] add brackets brush size --- PanoPainter-OSX/main.cpp | 4 +-- src/event.h | 2 ++ src/keymap.h | 4 +-- src/node_canvas.cpp | 12 +++++++++ src/objc_utils.cpp | 57 ++++++++++++++++++++++++++++++++++++++++ src/objc_utils.h | 3 +++ 6 files changed, 78 insertions(+), 4 deletions(-) diff --git a/PanoPainter-OSX/main.cpp b/PanoPainter-OSX/main.cpp index 2087a67..4e27c76 100644 --- a/PanoPainter-OSX/main.cpp +++ b/PanoPainter-OSX/main.cpp @@ -382,8 +382,8 @@ { auto keyCode = [theEvent keyCode]; auto chars = [theEvent characters]; - const char* c_str = [chars cStringUsingEncoding:NSASCIIStringEncoding]; - std::string s = c_str ? c_str : ""; + NSString* nss = keyCodeToString(keyCode, [theEvent modifierFlags]); + std::string s = [nss cStringUsingEncoding:NSUTF8StringEncoding]; App::I->ui_task_async([keyCode, s] { if (App::I->keys[(int)kKey::KeyCtrl]) { diff --git a/src/event.h b/src/event.h index 3beeb9b..e2f9edd 100644 --- a/src/event.h +++ b/src/event.h @@ -75,6 +75,8 @@ enum class kKey : uint8_t KeyEnter, KeyBackspace, KeyDel, + KeyBracketLeft, + KeyBracketRight, }; enum class kEventResult : uint8_t diff --git a/src/keymap.h b/src/keymap.h index 939925d..e77a59f 100644 --- a/src/keymap.h +++ b/src/keymap.h @@ -152,10 +152,10 @@ kKey convert_key(int key) CASE(kVK_ANSI_Minus, kKey::Unknown); CASE(kVK_ANSI_8, kKey::Key8); CASE(kVK_ANSI_0, kKey::Key0); - CASE(kVK_ANSI_RightBracket, kKey::Unknown); + CASE(kVK_ANSI_RightBracket, kKey::KeyBracketRight); CASE(kVK_ANSI_O, kKey::KeyO); CASE(kVK_ANSI_U, kKey::KeyU); - CASE(kVK_ANSI_LeftBracket, kKey::Unknown); + CASE(kVK_ANSI_LeftBracket, kKey::KeyBracketLeft); CASE(kVK_ANSI_I, kKey::KeyI); CASE(kVK_ANSI_P, kKey::KeyP); CASE(kVK_ANSI_L, kKey::KeyL); diff --git a/src/node_canvas.cpp b/src/node_canvas.cpp index 428f13e..ce40fb9 100644 --- a/src/node_canvas.cpp +++ b/src/node_canvas.cpp @@ -615,6 +615,18 @@ kEventResult NodeCanvas::handle_event(Event* e) App::I->dialog_save_ver(); } } + if (ke->m_key == kKey::KeyBracketLeft) + { + float v = App::I->stroke->m_tip_size->get_value(); + float nv = glm::clamp(v - 0.05, 0, 1); + App::I->stroke->set_size(nv, true, true); + } + if (ke->m_key == kKey::KeyBracketRight) + { + float v = App::I->stroke->m_tip_size->get_value(); + float nv = glm::clamp(v + 0.05, 0, 1); + App::I->stroke->set_size(nv, true, true); + } for (auto& mode : *m_canvas->m_mode) mode->on_KeyEvent(ke); break; diff --git a/src/objc_utils.cpp b/src/objc_utils.cpp index 324a6dc..1196103 100644 --- a/src/objc_utils.cpp +++ b/src/objc_utils.cpp @@ -6,6 +6,7 @@ #include #include #include +#import #ifdef __OBJC__ #import @@ -39,6 +40,62 @@ @end #endif +std::wstring NSStringToStringW ( NSString* Str ) +{ + NSStringEncoding pEncode = CFStringConvertEncodingToNSStringEncoding ( kCFStringEncodingUTF32LE ); + NSData* pSData = [ Str dataUsingEncoding : pEncode ]; + + return std::wstring ( (wchar_t*) [ pSData bytes ], [ pSData length] / sizeof ( wchar_t ) ); +} + +NSString* StringWToNSString ( const std::wstring& Str ) +{ + NSString* pString = [ [ NSString alloc ] + initWithBytes : (char*)Str.data() + length : Str.size() * sizeof(wchar_t) + encoding : CFStringConvertEncodingToNSStringEncoding ( kCFStringEncodingUTF32LE ) ]; + return pString; +} + +NSString* keyCodeToString(CGKeyCode keyCode, NSUInteger mods) +{ + TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); + CFDataRef uchr = + (CFDataRef)TISGetInputSourceProperty(currentKeyboard, + kTISPropertyUnicodeKeyLayoutData); + const UCKeyboardLayout *keyboardLayout = + (const UCKeyboardLayout*)CFDataGetBytePtr(uchr); + + if(keyboardLayout) + { + UInt32 deadKeyState = 0; + UniCharCount maxStringLength = 255; + UniCharCount actualStringLength = 0; + UniChar unicodeString[maxStringLength]; + + OSStatus status = UCKeyTranslate(keyboardLayout, + keyCode, kUCKeyActionDown, mods, + LMGetKbdType(), 0, + &deadKeyState, + maxStringLength, + &actualStringLength, unicodeString); + + if (actualStringLength == 0 && deadKeyState) + { + status = UCKeyTranslate(keyboardLayout, + kVK_Space, kUCKeyActionDown, mods, + LMGetKbdType(), 0, + &deadKeyState, + maxStringLength, + &actualStringLength, unicodeString); + } + if(actualStringLength > 0 && status == noErr) + return [[NSString stringWithCharacters:unicodeString + length:(NSUInteger)actualStringLength] lowercaseString]; + } + + return nil; +} std::string base_address; std::atomic_flag handler_executed; diff --git a/src/objc_utils.h b/src/objc_utils.h index fed89f2..83721c2 100644 --- a/src/objc_utils.h +++ b/src/objc_utils.h @@ -16,3 +16,6 @@ void delete_all_files_in_path(const std::string& source_path); void export_mp4(const std::string& rec_path, int width, int height, int tot, void(^progress_callback)(float)); void save_image_library(const std::string& path); bool apple_create_dir(const std::string& path); +NSString* keyCodeToString(CGKeyCode keyCode, NSUInteger mods); +std::wstring NSStringToStringW(NSString* Str); +NSString* StringWToNSString(const std::wstring& Str);