소스 검색

Added doubleclick event to ListView.
Send ListView item selected event even if selection is the same.

Lasse Öörni 15 년 전
부모
커밋
ae7efc8683
4개의 변경된 파일60개의 추가작업 그리고 15개의 파일을 삭제
  1. 2 0
      Engine/Engine/RegisterUI.cpp
  2. 41 15
      Engine/UI/ListView.cpp
  3. 10 0
      Engine/UI/ListView.h
  4. 7 0
      Engine/UI/UIEvents.h

+ 2 - 0
Engine/Engine/RegisterUI.cpp

@@ -201,6 +201,7 @@ static void registerListView(asIScriptEngine* engine)
     engine->RegisterObjectMethod("ListView", "void changeSelection(int)", asMETHOD(ListView, changeSelection), asCALL_THISCALL);
     engine->RegisterObjectMethod("ListView", "void clearSelection()", asMETHOD(ListView, clearSelection), asCALL_THISCALL);
     engine->RegisterObjectMethod("ListView", "void setShowSelectionAlways(bool)", asMETHOD(ListView, setShowSelectionAlways), asCALL_THISCALL);
+    engine->RegisterObjectMethod("ListView", "void setDoubleClickInterval(float)", asMETHOD(ListView, setDoubleClickInterval), asCALL_THISCALL);
     engine->RegisterObjectMethod("ListView", "const IntVector2& getViewPosition() const", asMETHOD(ListView, getViewPosition), asCALL_THISCALL);
     engine->RegisterObjectMethod("ListView", "UIElement@+ getContentElement() const", asMETHOD(ListView, getContentElement), asCALL_THISCALL);
     engine->RegisterObjectMethod("ListView", "ScrollBar@+ getHorizontalScrollBar() const", asMETHOD(ListView, getHorizontalScrollBar), asCALL_THISCALL);
@@ -217,6 +218,7 @@ static void registerListView(asIScriptEngine* engine)
     engine->RegisterObjectMethod("ListView", "uint getSelection() const", asMETHOD(ListView, getSelection), asCALL_THISCALL);
     engine->RegisterObjectMethod("ListView", "UIElement@+ getSelectedItem() const", asMETHOD(ListView, getSelectedItem), asCALL_THISCALL);
     engine->RegisterObjectMethod("ListView", "bool getShowSelectionAlways() const", asMETHOD(ListView, getShowSelectionAlways), asCALL_THISCALL);
+    engine->RegisterObjectMethod("ListView", "float getDoubleClickInterval() const", asMETHOD(ListView, getDoubleClickInterval), asCALL_THISCALL);
     registerRefCasts<UIElement, ListView>(engine, "UIElement", "ListView");
 }
 

+ 41 - 15
Engine/UI/ListView.cpp

@@ -32,7 +32,9 @@
 ListView::ListView(const std::string& name) :
     ScrollView(name),
     mSelection(M_MAX_UNSIGNED),
-    mShowSelectionAlways(false)
+    mShowSelectionAlways(false),
+    mDoubleClickInterval(0.5f),
+    mDoubleClickTimer(0.0f)
 {
     UIElement* container = new UIElement();
     container->setEnabled(true);
@@ -66,6 +68,14 @@ void ListView::setStyle(const XMLElement& element, ResourceCache* cache)
         setSelection(element.getChildElement("selection").getInt("value"));
     if (element.hasChildElement("showselectionalways"))
         setShowSelectionAlways(element.getChildElement("showselectionalways").getBool("enable"));
+    if (element.hasChildElement("doubleclickinterval"))
+        setDoubleClickInterval(element.getChildElement("doubleclickinterval").getFloat("value"));
+}
+
+void ListView::update(float timeStep)
+{
+    if (mDoubleClickTimer > 0.0f)
+        mDoubleClickTimer = max(mDoubleClickTimer - timeStep, 0.0f);
 }
 
 void ListView::onWheel(int delta, int buttons, int qualifiers)
@@ -210,21 +220,16 @@ void ListView::setSelection(unsigned index)
     if (index >= getNumItems())
         index = M_MAX_UNSIGNED;
     
-    bool changed = index != mSelection;
-    
     mSelection = index;
     updateSelectionEffect();
     ensureItemVisibility();
     
-    if (changed)
-    {
-        using namespace ItemSelected;
-        
-        VariantMap eventData;
-        eventData[P_ELEMENT] = (void*)this;
-        eventData[P_SELECTION] = mSelection;
-        sendEvent(EVENT_ITEMSELECTED, eventData);
-    }
+    using namespace ItemSelected;
+    
+    VariantMap eventData;
+    eventData[P_ELEMENT] = (void*)this;
+    eventData[P_SELECTION] = mSelection;
+    sendEvent(EVENT_ITEMSELECTED, eventData);
 }
 
 void ListView::changeSelection(int delta)
@@ -246,6 +251,11 @@ void ListView::setShowSelectionAlways(bool enable)
     mShowSelectionAlways = enable;
 }
 
+void ListView::setDoubleClickInterval(float interval)
+{
+    mDoubleClickInterval = interval;
+}
+
 unsigned ListView::getNumItems() const
 {
     return mContentElement->getNumChildren();
@@ -299,16 +309,32 @@ void ListView::ensureItemVisibility()
 
 void ListView::handleTryFocus(StringHash eventType, VariantMap& eventData)
 {
-    using namespace TryFocus;
-    
-    UIElement* focusElement = static_cast<UIElement*>(eventData[P_ELEMENT].getPtr());
+    UIElement* focusElement = static_cast<UIElement*>(eventData[TryFocus::P_ELEMENT].getPtr());
     
     unsigned numItems = getNumItems();
     for (unsigned i = 0; i < numItems; ++i)
     {
         if (focusElement == getItem(i))
         {
+            bool isDoubleClick = false;
+            if ((mDoubleClickTimer > 0.0f) && (mSelection == i))
+            {
+                isDoubleClick = true;
+                mDoubleClickTimer = 0.0f;
+            }
+            else
+                mDoubleClickTimer = mDoubleClickInterval;
+            
             setSelection(i);
+            
+            if (isDoubleClick)
+            {
+                VariantMap eventData;
+                eventData[ItemDoubleClicked::P_ELEMENT] = (void*)this;
+                eventData[ItemDoubleClicked::P_SELECTION] = mSelection;
+                sendEvent(EVENT_ITEMDOUBLECLICKED, eventData);
+            }
+            
             return;
         }
     }

+ 10 - 0
Engine/UI/ListView.h

@@ -39,6 +39,8 @@ public:
     
     //! Set UI element style from XML data
     virtual void setStyle(const XMLElement& element, ResourceCache* cache);
+    //! Perform UI element update
+    virtual void update(float timeStep);
     //! React to mouse wheel
     virtual void onWheel(int delta, int buttons, int qualifiers);
     //! React to a key press
@@ -66,6 +68,8 @@ public:
     void clearSelection();
     //! Set whether to show selection even when defocused, default false
     void setShowSelectionAlways(bool enable);
+    //! Set item doubleclick interval in seconds
+    void setDoubleClickInterval(float interval);
     
     //! Return number of items
     unsigned getNumItems() const;
@@ -79,6 +83,8 @@ public:
     UIElement* getSelectedItem() const;
     //! Return whether to show selection even when defocused
     bool getShowSelectionAlways() const { return mShowSelectionAlways; }
+    //! Return item doubleclick interval in seconds
+    float getDoubleClickInterval() const { return mDoubleClickInterval; }
     
 protected:
     //! Update selection effect when selection or focus changes
@@ -90,6 +96,10 @@ protected:
     unsigned mSelection;
     //! Show selection even when defocused flag
     bool mShowSelectionAlways;
+    //! Doubleclick interval
+    float mDoubleClickInterval;
+    //! Doubleclick timer
+    float mDoubleClickTimer;
     
 private:
     //! Handle focus change to check for selection change

+ 7 - 0
Engine/UI/UIEvents.h

@@ -121,4 +121,11 @@ DEFINE_EVENT(EVENT_ITEMSELECTED, ItemSelected)
     EVENT_PARAM(P_SELECTION, Selection);        // int
 }
 
+//! Listview item doubleclicked
+DEFINE_EVENT(EVENT_ITEMDOUBLECLICKED, ItemDoubleClicked)
+{
+    EVENT_PARAM(P_ELEMENT, Element);            // UIElement pointer
+    EVENT_PARAM(P_SELECTION, Selection);        // int
+}
+
 #endif // UI_UIEVENTS_H