Browse Source

Keyboard focus work

Josh Engebretson 10 years ago
parent
commit
417866d7ce

+ 7 - 0
Source/Atomic/UI/UIEvents.h

@@ -108,6 +108,13 @@ EVENT(E_UIWIDGETFOCUSCHANGED, UIWidgetFocusChanged)
     PARAM(P_WIDGET, Widget);             // UIWidget pointer
     PARAM(P_FOCUSED, Focused);             // bool
 }
+EVENT(E_UIWIDGETFOCUSESCAPED, UIWidgetFocusEscaped)
+{
+}
 
+EVENT(E_UIUNHANDLEDSHORTCUT, UIUnhandledShortcut)
+{
+    PARAM(P_REFID, RefID); // string tbid
+}
 
 }

+ 53 - 37
Source/Atomic/UI/UIInput.cpp

@@ -213,7 +213,7 @@ void UI::HandleTouchEnd(StringHash eventType, VariantMap& eventData)
     rootWidget_->InvokePointerUp(px, py, TB_MODIFIER_NONE, true, touchId);
 }
 
-static bool InvokeShortcut(int key, SPECIAL_KEY special_key, MODIFIER_KEYS modifierkeys, bool down)
+static bool InvokeShortcut(UI* ui, int key, SPECIAL_KEY special_key, MODIFIER_KEYS modifierkeys, bool down)
 {
 #ifdef __APPLE__
     bool shortcut_key = (modifierkeys & TB_SUPER) ? true : false;
@@ -286,15 +286,20 @@ static bool InvokeShortcut(int key, SPECIAL_KEY special_key, MODIFIER_KEYS modif
 
     }
 
-    if (!eventWidget)
+    if (!eventWidget || !eventWidget->InvokeEvent(ev))
+    {
+        VariantMap evData;
+        evData[UIUnhandledShortcut::P_REFID] = id;
+        ui->SendEvent(E_UIUNHANDLEDSHORTCUT, evData);
         return false;
+    }
 
-    return eventWidget->InvokeEvent(ev);
+    return true;
 }
 
-static bool InvokeKey(TBWidget* root, unsigned int key, SPECIAL_KEY special_key, MODIFIER_KEYS modifierkeys, bool keydown)
+static bool InvokeKey(UI* ui, TBWidget* root, unsigned int key, SPECIAL_KEY special_key, MODIFIER_KEYS modifierkeys, bool keydown)
 {
-    if (InvokeShortcut(key, special_key, modifierkeys, keydown))
+    if (InvokeShortcut(ui, key, special_key, modifierkeys, keydown))
         return true;
     root->InvokeKey(key, special_key, modifierkeys, keydown);
     return true;
@@ -303,6 +308,10 @@ static bool InvokeKey(TBWidget* root, unsigned int key, SPECIAL_KEY special_key,
 
 void UI::HandleKey(bool keydown, int keycode, int scancode)
 {
+    if (keydown && keycode == KEY_ESC && TBWidget::focused_widget)
+    {
+        SendEvent(E_UIWIDGETFOCUSESCAPED);
+    }
 
 #ifdef ATOMIC_PLATFORM_WINDOWS
     if (keycode == KEY_LCTRL || keycode == KEY_RCTRL)
@@ -322,95 +331,102 @@ void UI::HandleKey(bool keydown, int keycode, int scancode)
 #endif
     MODIFIER_KEYS mod = GetModifierKeys(qualifiers, superdown);
 
+    SPECIAL_KEY specialKey = TB_KEY_UNDEFINED;
+
     switch (keycode)
     {
     case KEY_RETURN:
     case KEY_RETURN2:
     case KEY_KP_ENTER:
-        InvokeKey(rootWidget_, 0, TB_KEY_ENTER, mod, keydown);
+        specialKey =  TB_KEY_ENTER;
         break;
-
     case KEY_F1:
-        InvokeKey(rootWidget_, 0, TB_KEY_F1, mod, keydown);
+        specialKey = TB_KEY_F1;
         break;
     case KEY_F2:
-        InvokeKey(rootWidget_, 0, TB_KEY_F2, mod, keydown);
+        specialKey = TB_KEY_F2;
         break;
     case KEY_F3:
-        InvokeKey(rootWidget_, 0, TB_KEY_F3, mod, keydown);
+        specialKey = TB_KEY_F3;
         break;
     case KEY_F4:
-        InvokeKey(rootWidget_, 0, TB_KEY_F4, mod, keydown);
+        specialKey = TB_KEY_F4;
         break;
     case KEY_F5:
-        InvokeKey(rootWidget_, 0, TB_KEY_F5, mod, keydown);
+        specialKey = TB_KEY_F5;
         break;
     case KEY_F6:
-        InvokeKey(rootWidget_, 0, TB_KEY_F6, mod, keydown);
+        specialKey = TB_KEY_F6;
         break;
     case KEY_F7:
-        InvokeKey(rootWidget_, 0, TB_KEY_F7, mod, keydown);
+        specialKey = TB_KEY_F7;
         break;
     case KEY_F8:
-        InvokeKey(rootWidget_, 0, TB_KEY_F8, mod, keydown);
+        specialKey = TB_KEY_F8;
         break;
     case KEY_F9:
-        InvokeKey(rootWidget_, 0, TB_KEY_F9, mod, keydown);
+        specialKey = TB_KEY_F9;
         break;
     case KEY_F10:
-        InvokeKey(rootWidget_, 0, TB_KEY_F10, mod, keydown);
+        specialKey = TB_KEY_F10;
         break;
     case KEY_F11:
-        InvokeKey(rootWidget_, 0, TB_KEY_F11, mod, keydown);
+        specialKey = TB_KEY_F11;
         break;
     case KEY_F12:
-        InvokeKey(rootWidget_, 0, TB_KEY_F12, mod, keydown);
+        specialKey = TB_KEY_F12;
         break;
     case KEY_LEFT:
-        InvokeKey(rootWidget_, 0, TB_KEY_LEFT, mod, keydown);
+        specialKey = TB_KEY_LEFT;
         break;
     case KEY_UP:
-        InvokeKey(rootWidget_, 0, TB_KEY_UP, mod, keydown);
+        specialKey = TB_KEY_UP;
         break;
     case KEY_RIGHT:
-        InvokeKey(rootWidget_, 0, TB_KEY_RIGHT, mod, keydown);
+        specialKey = TB_KEY_RIGHT;
         break;
     case KEY_DOWN:
-        InvokeKey(rootWidget_, 0, TB_KEY_DOWN, mod, keydown);
+        specialKey = TB_KEY_DOWN;
         break;
     case KEY_PAGEUP:
-        InvokeKey(rootWidget_, 0, TB_KEY_PAGE_UP, mod, keydown);
+        specialKey = TB_KEY_PAGE_UP;
         break;
     case KEY_PAGEDOWN:
-        InvokeKey(rootWidget_, 0, TB_KEY_PAGE_DOWN, mod, keydown);
+        specialKey = TB_KEY_PAGE_DOWN;
         break;
     case KEY_HOME:
-        InvokeKey(rootWidget_, 0, TB_KEY_HOME, mod, keydown);
+        specialKey = TB_KEY_HOME;
         break;
     case KEY_END:
-        InvokeKey(rootWidget_, 0, TB_KEY_END, mod, keydown);
+        specialKey = TB_KEY_END;
         break;
     case KEY_INSERT:
-        InvokeKey(rootWidget_, 0, TB_KEY_INSERT, mod, keydown);
+        specialKey = TB_KEY_INSERT;
         break;
     case KEY_TAB:
-        InvokeKey(rootWidget_, 0, TB_KEY_TAB, mod, keydown);
+        specialKey = TB_KEY_TAB;
         break;
     case KEY_DELETE:
-        InvokeKey(rootWidget_, 0, TB_KEY_DELETE, mod, keydown);
+        specialKey = TB_KEY_DELETE;
         break;
     case KEY_BACKSPACE:
-        InvokeKey(rootWidget_, 0, TB_KEY_BACKSPACE, mod, keydown);
+        specialKey = TB_KEY_BACKSPACE;
         break;
     case KEY_ESC:
-        InvokeKey(rootWidget_, 0, TB_KEY_ESC, mod, keydown);
+        specialKey =  TB_KEY_ESC;
         break;
-    default:
+    }
+
+    if (specialKey == TB_KEY_UNDEFINED)
+    {
         if (mod & TB_SUPER)
         {
-            InvokeKey(rootWidget_, keycode, TB_KEY_UNDEFINED, mod, keydown);
+            InvokeKey(this, rootWidget_, keycode, TB_KEY_UNDEFINED, mod, keydown);
         }
-
+    }
+    else
+    {
+        InvokeKey(this, rootWidget_, 0, specialKey, mod, keydown);
     }
 
 }
@@ -477,8 +493,8 @@ void UI::HandleTextInput(StringHash eventType, VariantMap& eventData)
 
     for (unsigned i = 0; i < text.Length(); i++)
     {
-        InvokeKey(rootWidget_, text[i], TB_KEY_UNDEFINED, TB_MODIFIER_NONE, true);
-        InvokeKey(rootWidget_, text[i], TB_KEY_UNDEFINED, TB_MODIFIER_NONE, false);
+        InvokeKey(this, rootWidget_, text[i], TB_KEY_UNDEFINED, TB_MODIFIER_NONE, true);
+        InvokeKey(this, rootWidget_, text[i], TB_KEY_UNDEFINED, TB_MODIFIER_NONE, false);
     }
 
 }

+ 2 - 2
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditor3D.h

@@ -56,11 +56,11 @@ public:
     void Close(bool navigateToAvailableResource = true);
     bool Save();
 
-private:
-
     void Undo();
     void Redo();
 
+private:
+
     void HandleUpdate(StringHash eventType, VariantMap& eventData);
     void HandleEditorActiveNodeChange(StringHash eventType, VariantMap& eventData);
     void HandlePlayStarted(StringHash eventType, VariantMap& eventData);

+ 26 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneView3D.cpp

@@ -107,6 +107,9 @@ SceneView3D ::SceneView3D(Context* context, SceneEditor3D *sceneEditor) :
     SubscribeToEvent(this, E_DRAGEXITWIDGET, HANDLER(SceneView3D, HandleDragExitWidget));
     SubscribeToEvent(this, E_DRAGENDED, HANDLER(SceneView3D, HandleDragEnded));
 
+    SubscribeToEvent(E_UIUNHANDLEDSHORTCUT, HANDLER(SceneView3D, HandleUIUnhandledShortcut));
+    SubscribeToEvent(E_UIWIDGETFOCUSESCAPED, HANDLER(SceneView3D, HandleUIWidgetFocusEscaped));
+
     SetIsFocusable(true);
 
 }
@@ -260,6 +263,29 @@ bool SceneView3D::MouseInView()
 
 }
 
+void SceneView3D::HandleUIUnhandledShortcut(StringHash eventType, VariantMap& eventData)
+{
+    if (!enabled_)
+        return;
+
+    unsigned id = eventData[UIUnhandledShortcut::P_REFID].GetUInt();
+
+    if (id == TBIDC("undo"))
+        sceneEditor_->Undo();
+    else if (id == TBIDC("redo"))
+        sceneEditor_->Redo();
+
+    return;
+
+}
+
+void SceneView3D::HandleUIWidgetFocusEscaped(StringHash eventType, VariantMap& eventData)
+{
+    if (!enabled_)
+        return;
+
+    SetFocus();
+}
 
 void SceneView3D::HandlePostRenderUpdate(StringHash eventType, VariantMap& eventData)
 {

+ 3 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneView3D.h

@@ -67,6 +67,9 @@ private:
     void HandleEditorActiveNodeChange(StringHash eventType, VariantMap& eventData);
     void HandleNodeRemoved(StringHash eventType, VariantMap& eventData);
 
+    void HandleUIWidgetFocusEscaped(StringHash eventType, VariantMap& eventData);
+    void HandleUIUnhandledShortcut(StringHash eventType, VariantMap& eventData);
+
     void DrawNodeDebug(Node* node, DebugRenderer* debug, bool drawNode = true);
 
     void MoveCamera(float timeStep);