瀏覽代碼

Allow using the operating system clipboard in UI.

Lasse Öörni 12 年之前
父節點
當前提交
b2d356ad5e
共有 4 個文件被更改,包括 38 次插入4 次删除
  1. 2 0
      Source/Engine/Script/UIAPI.cpp
  2. 23 0
      Source/Engine/UI/UI.cpp
  3. 10 4
      Source/Engine/UI/UI.h
  4. 3 0
      Source/Extras/LuaScript/pkgs/UI/UI.pkg

+ 2 - 0
Source/Engine/Script/UIAPI.cpp

@@ -605,6 +605,8 @@ static void RegisterUI(asIScriptEngine* engine)
     engine->RegisterObjectMethod("UI", "float get_doubleClickInterval() const", asMETHOD(UI, GetDoubleClickInterval), asCALL_THISCALL);
     engine->RegisterObjectMethod("UI", "void set_nonFocusedMouseWheel(bool)", asMETHOD(UI, SetNonFocusedMouseWheel), asCALL_THISCALL);
     engine->RegisterObjectMethod("UI", "bool get_nonFocusedMouseWheel() const", asMETHOD(UI, IsNonFocusedMouseWheel), asCALL_THISCALL);
+    engine->RegisterObjectMethod("UI", "void set_useSystemClipBoard(bool)", asMETHOD(UI, SetUseSystemClipBoard), asCALL_THISCALL);
+    engine->RegisterObjectMethod("UI", "bool get_useSystemClipBoard() const", asMETHOD(UI, GetUseSystemClipBoard), asCALL_THISCALL);
     engine->RegisterGlobalFunction("UI@+ get_ui()", asFUNCTION(GetUI), asCALL_CDECL);
 }
 

+ 23 - 0
Source/Engine/UI/UI.cpp

@@ -53,6 +53,8 @@
 #include "Window.h"
 #include "View3D.h"
 
+#include <SDL.h>
+
 #include "DebugNew.h"
 
 namespace Urho3D
@@ -81,6 +83,7 @@ UI::UI(Context* context) :
     #else
     nonFocusedMouseWheel_(true),     // Default Mac OS X and Linux behaviour
     #endif
+    useSystemClipBoard_(false),
     nonModalBatchSize_(0)
 {
     rootElement_->SetTraversalMode(TM_DEPTH_FIRST);
@@ -454,6 +457,8 @@ bool UI::SaveLayout(Serializer& dest, UIElement* element)
 void UI::SetClipBoardText(const String& text)
 {
     clipBoard_ = text;
+    if (useSystemClipBoard_)
+        SDL_SetClipboardText(text.CString());
 }
 
 void UI::SetDoubleClickInterval(float interval)
@@ -466,6 +471,11 @@ void UI::SetNonFocusedMouseWheel(bool nonFocusedMouseWheel)
     nonFocusedMouseWheel_ = nonFocusedMouseWheel;
 }
 
+void UI::SetUseSystemClipBoard(bool enable)
+{
+    useSystemClipBoard_ = enable;
+}
+
 IntVector2 UI::GetCursorPosition() const
 {
     return cursor_ ? cursor_->GetPosition() : GetSubsystem<Input>()->GetMousePosition();
@@ -506,6 +516,19 @@ UIElement* UI::GetFrontElement() const
     return front;
 }
 
+const String& UI::GetClipBoardText() const
+{
+    if (useSystemClipBoard_)
+    {
+        char* text = SDL_GetClipboardText();
+        clipBoard_ = String(text);
+        if (text)
+            SDL_free(text);
+    }
+    
+    return clipBoard_;
+}
+
 bool UI::HasModalElement() const
 {
     return rootModalElement_->GetNumChildren() > 0;

+ 10 - 4
Source/Engine/UI/UI.h

@@ -79,8 +79,10 @@ public:
     void SetClipBoardText(const String& text);
     /// Set UI element double click interval in seconds.
     void SetDoubleClickInterval(float interval);
-    /// Set mouse wheel handling flag.
+    /// Set whether mouse wheel can control also a non-focused element.
     void SetNonFocusedMouseWheel(bool nonFocusedMouseWheel);
+    /// Set whether to use system clipboard. Default false.
+    void SetUseSystemClipBoard(bool enable);
 
     /// Return root UI element.
     UIElement* GetRoot() const { return rootElement_; }
@@ -99,11 +101,13 @@ public:
     /// Return topmost enabled root-level non-modal element.
     UIElement* GetFrontElement() const;
     /// Return clipboard text.
-    const String& GetClipBoardText() const { return clipBoard_; }
+    const String& GetClipBoardText() const;
     /// Return UI element double click interval in seconds.
     float GetDoubleClickInterval() const { return doubleClickInterval_; }
-    /// Return mouse wheel handling flag.
+    /// Return whether mouse wheel can control also a non-focused element.
     bool IsNonFocusedMouseWheel() const { return nonFocusedMouseWheel_; }
+    /// Return whether is using the system clipboard.
+    bool GetUseSystemClipBoard() const { return useSystemClipBoard_; }
     /// Return true when UI has modal element(s).
     bool HasModalElement() const;
 
@@ -202,7 +206,7 @@ private:
     /// UI element query vector.
     PODVector<UIElement*> tempElements_;
     /// Clipboard text.
-    String clipBoard_;
+    mutable String clipBoard_;
     /// Mouse buttons held down.
     int mouseButtons_;
     /// Qualifier keys held down.
@@ -213,6 +217,8 @@ private:
     bool usingTouchInput_;
     /// Flag to switch mouse wheel event to be sent to non-focused element at cursor.
     bool nonFocusedMouseWheel_;
+    /// Flag for using operating system clipboard instead of internal.
+    bool useSystemClipBoard_;
     /// Non-modal batch size (used internally for rendering).
     unsigned nonModalBatchSize_;
     /// Timer used to trigger double click.

+ 3 - 0
Source/Extras/LuaScript/pkgs/UI/UI.pkg

@@ -16,6 +16,7 @@ class UI : public Object
     
     void SetDoubleClickInterval(float interval);
     void SetNonFocusedMouseWheel(bool nonFocusedMouseWheel);
+    void SetUseSystemClipBoard(bool enable);
 
     UIElement* GetRoot() const;
     UIElement* GetRootModalElement() const;
@@ -30,6 +31,7 @@ class UI : public Object
     const String& GetClipBoardText() const;
     float GetDoubleClickInterval() const;
     bool IsNonFocusedMouseWheel() const;
+    bool GetUseSystemClipBoard() const;
     bool HasModalElement() const;
     
     tolua_readonly tolua_property__get_set UIElement* root;
@@ -41,5 +43,6 @@ class UI : public Object
     tolua_property__get_set String& clipBoardText;
     tolua_property__get_set float doubleClickInterval;
     tolua_readonly tolua_property__is_set bool nonFocusedMouseWheel;
+    tolua_readonly tolua_property__get_set bool useSystemClipBoard;
     tolua_readonly tolua_property__has_set bool modalElement;
 };