Browse Source

Issue #376

Supports multiple selection using the Shift Key
JohnnyWahib 9 years ago
parent
commit
d801a548a1
2 changed files with 46 additions and 11 deletions
  1. 44 11
      Source/Atomic/UI/UIListView.cpp
  2. 2 0
      Source/Atomic/UI/UIListView.h

+ 44 - 11
Source/Atomic/UI/UIListView.cpp

@@ -852,6 +852,13 @@ void UIListView::SendItemSelectedChanged(ListViewItem* item)
 
 }
 
+void UIListView::selectItem(ListViewItem* item, bool select)
+{
+    item->SetSelected(select);
+    UpdateItemVisibility();
+    SendItemSelectedChanged(item);
+}
+
 bool UIListView::OnEvent(const tb::TBWidgetEvent &ev)
 {
     if (ev.type == EVENT_TYPE_KEY_UP )
@@ -883,25 +890,51 @@ bool UIListView::OnEvent(const tb::TBWidgetEvent &ev)
             if (item->id == ev.target->GetID())
             {
                 bool multi = false;
-                if (multiSelect_ && (ev.modifierkeys & TB_SHIFT || ev.modifierkeys & TB_CTRL || ev.modifierkeys & TB_SUPER))
+                if (multiSelect_ && (ev.modifierkeys & TB_CTRL || ev.modifierkeys & TB_SUPER))
                     multi = true;
 
-                if (multi)
+                bool shiftMulti = false;
+                if (multiSelect_ && (ev.modifierkeys & TB_SHIFT))
+                    shiftMulti = true;
+
+                if (shiftMulti)
+                {
+                    int first = rootList_->GetValue();
+
+                    if (i > first)
+                    {
+                        for (int j = first + 1; j < i; j++)
+                        {
+                            ListViewItem* itemSelect = source_->GetItem(j);
+                            selectItem(itemSelect, true);
+                            SetValueFirstSelected();
+                        }
+
+                        selectItem(item, true);
+                        SetValueFirstSelected();
+                    }
+                    else if (i < first)
+                    {
+                        for (int j = first - 1; j > i; j--)
+                        {
+                            ListViewItem* itemSelect = source_->GetItem(j);
+                            selectItem(itemSelect, true);
+                            SetValueFirstSelected();
+                        }
+
+                        selectItem(item, true);
+                        SetValueFirstSelected();
+                    }
+                }
+                else if (multi)
                 {
                     if (item->GetSelected())
                     {
-                        item->SetSelected(false);
-                        UpdateItemVisibility();
-
-                        SendItemSelectedChanged(item);
+                        selectItem(item, false);
                     }
                     else
                     {
-
-                        item->SetSelected(true);
-                        UpdateItemVisibility();
-
-                        SendItemSelectedChanged(item);
+                        selectItem(item, true);
                     }
 
                     SetValueFirstSelected();

+ 2 - 0
Source/Atomic/UI/UIListView.h

@@ -96,6 +96,8 @@ private:
 
     unsigned itemLookupId_;
 
+    void selectItem(ListViewItem* item, bool select);
+
 };
 
 }