Browse Source

Multiselect WIP

Josh Engebretson 10 years ago
parent
commit
fd78e8eb8f

+ 57 - 13
Source/Atomic/UI/UIListView.cpp

@@ -606,21 +606,10 @@ void UIListView::SelectItemByID(const String& id, bool selected)
 
 void UIListView::UpdateItemVisibility()
 {
-    UI* ui = GetSubsystem<UI>();
-    VariantMap eventData;
-
     for (int i = 0; i < source_->GetNumItems(); i++)
     {
         ListViewItem* item = source_->GetItem(i);
 
-        String refid;
-        ui->GetTBIDString(item->id, refid);
-
-        eventData[UIListViewSelectionChanged::P_REFID] = refid;
-        eventData[UIListViewSelectionChanged::P_SELECTED] = item->GetSelected();
-
-        this->SendEvent(E_UILISTVIEWSELECTIONCHANGED, eventData);
-
         if (!item->widget_)
             continue;
 
@@ -682,14 +671,49 @@ void UIListView::SetValueFirstSelected()
 
 void UIListView::SelectSingleItem(ListViewItem* item, bool expand)
 {
-    SelectAllItems(false);
+
+    bool dirty = !item->GetSelected();
+
+    if (!dirty)
+    {
+        for (unsigned i = 0; i < source_->GetNumItems(); i++)
+        {
+            ListViewItem* sitem = source_->GetItem(i);
+
+            if (sitem != item && sitem->GetSelected())
+            {
+                dirty = true;
+                break;
+            }
+        }
+    }
+
+    if (!dirty)
+        return;
+
+    for (unsigned i = 0; i < source_->GetNumItems(); i++)
+    {
+        ListViewItem* sitem = source_->GetItem(i);
+
+        if (sitem->GetSelected())
+        {
+            sitem->SetSelected(false);
+            SendItemSelectedChanged(sitem);
+        }
+
+    }
+
     if (expand)
         item->SetExpanded(true);
+
     item->SetSelected(true);
     UpdateItemVisibility();
 
     SetValueFirstSelected();
     ScrollToSelectedItem();
+
+    SendItemSelectedChanged(item);
+
 }
 
 void UIListView::Move(tb::SPECIAL_KEY key)
@@ -780,6 +804,21 @@ void UIListView::Move(tb::SPECIAL_KEY key)
 
 }
 
+void UIListView::SendItemSelectedChanged(ListViewItem* item)
+{
+    UI* ui = GetSubsystem<UI>();
+
+    VariantMap eventData;
+    String refid;
+
+    ui->GetTBIDString(item->id, refid);
+
+    eventData[UIListViewSelectionChanged::P_REFID] = refid;
+    eventData[UIListViewSelectionChanged::P_SELECTED] = item->GetSelected();
+    this->SendEvent(E_UILISTVIEWSELECTIONCHANGED, eventData);
+
+}
+
 bool UIListView::OnEvent(const tb::TBWidgetEvent &ev)
 {
 
@@ -816,11 +855,16 @@ bool UIListView::OnEvent(const tb::TBWidgetEvent &ev)
                     {
                         item->SetSelected(false);
                         UpdateItemVisibility();
+
+                        SendItemSelectedChanged(item);
                     }
-                    else                   {
+                    else
+                    {
 
                         item->SetSelected(true);
                         UpdateItemVisibility();
+
+                        SendItemSelectedChanged(item);
                     }
 
                     SetValueFirstSelected();

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

@@ -79,6 +79,8 @@ protected:
 
 private:
 
+    void SendItemSelectedChanged(ListViewItem* item);
+
     void SelectSingleItem(ListViewItem* item, bool expand = true);
     void SetValueFirstSelected();
     void Move(tb::SPECIAL_KEY key);

+ 3 - 1
Source/ThirdParty/TurboBadger/tb_scroll_container.cpp

@@ -226,6 +226,8 @@ bool TBScrollContainer::OnEvent(const TBWidgetEvent &ev)
 	}
     else if (ev.type == EVENT_TYPE_KEY_DOWN && !m_ignore_scroll_events)
 	{
+        // ATOMIC: Disabling arrow key scroll
+        /*
 		if (ev.special_key == TB_KEY_LEFT && m_scrollbar_x.CanScrollNegative())
 			ScrollBySmooth(-TBSystem::GetPixelsPerLine(), 0);
 		else if (ev.special_key == TB_KEY_RIGHT && m_scrollbar_x.CanScrollPositive())
@@ -234,7 +236,7 @@ bool TBScrollContainer::OnEvent(const TBWidgetEvent &ev)
 			ScrollBySmooth(0, -TBSystem::GetPixelsPerLine());
 		else if (ev.special_key == TB_KEY_DOWN && m_scrollbar_y.CanScrollPositive())
 			ScrollBySmooth(0, TBSystem::GetPixelsPerLine());
-		else if (ev.special_key == TB_KEY_PAGE_UP && m_scrollbar_y.CanScrollNegative())
+        else*/ if (ev.special_key == TB_KEY_PAGE_UP && m_scrollbar_y.CanScrollNegative())
 			ScrollBySmooth(0, -GetPaddingRect().h);
 		else if (ev.special_key == TB_KEY_PAGE_DOWN && m_scrollbar_y.CanScrollPositive())
 			ScrollBySmooth(0, GetPaddingRect().h);