/************************************************************************** | |
* Copyright (C) 2016 by Savoir-faire Linux * | |
* Author: Traczyk Andreas <traczyk.andreas@savoirfairelinux.com> * | |
* * | |
* This program is free software; you can redistribute it and/or modify * | |
* it under the terms of the GNU General Public License as published by * | |
* the Free Software Foundation; either version 3 of the License, or * | |
* (at your option) any later version. * | |
* * | |
* This program is distributed in the hope that it will be useful, * | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of * | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |
* GNU General Public License for more details. * | |
* * | |
* You should have received a copy of the GNU General Public License * | |
* along with this program. If not, see <http://www.gnu.org/licenses/>. * | |
**************************************************************************/ | |
#include "pch.h" | |
#include "ContactRequestItemsViewModel.h" | |
using namespace Windows::ApplicationModel::Core; | |
using namespace Windows::Data::Json; | |
using namespace Windows::Storage; | |
using namespace Windows::Storage::Streams; | |
using namespace Windows::UI::Core; | |
using namespace Windows::Globalization::DateTimeFormatting; | |
using namespace RingClientUWP; | |
using namespace ViewModel; | |
ContactRequestItemsViewModel::ContactRequestItemsViewModel() | |
{ | |
itemsList_ = ref new Vector<ContactRequestItem^>(); | |
itemsListFiltered_ = ref new Vector<ContactRequestItem^>(); | |
} | |
ContactRequestItem^ | |
ContactRequestItemsViewModel::findItem(Contact^ contact) | |
{ | |
for each (ContactRequestItem^ item in itemsList) | |
if (item->_contact == contact) | |
return item; | |
return nullptr; | |
} | |
unsigned int | |
ContactRequestItemsViewModel::getIndex(Contact^ contact) | |
{ | |
unsigned int i; | |
for (i = 0; i < itemsList_->Size; i++) { | |
if (itemsList_->GetAt(i)->_contact == contact) | |
break; | |
} | |
return i; | |
} | |
void | |
ContactRequestItemsViewModel::removeItem(ContactRequestItem ^ item) | |
{ | |
unsigned int index; | |
if (itemsList->IndexOf(item, &index)) { | |
itemsList->RemoveAt(index); | |
// If the same item exists in the filtered list, remove it as well. | |
// Maintaining both lists in tandem, reduces flickering caused by a complete | |
// refresh of the filtered list. This is a pretty alternative to the more | |
// elegant solution of XAML visibility filtration through IValueConverter object | |
// bindings, which causes a buggy scrollbar to appear when the collapsed list items | |
// are before the visible ones. | |
if (itemsListFiltered->IndexOf(item, &index)) { | |
itemsListFiltered->RemoveAt(index); | |
} | |
} | |
} | |
String^ | |
ContactRequestItemsViewModel::getAssociatedAccountId(ContactRequestItem^ item) | |
{ | |
if (item->_contact->_accountIdAssociated->IsEmpty()) | |
return AccountListItemsViewModel::instance->_selectedItem->_account->accountID_; | |
else | |
return item->_contact->_accountIdAssociated; | |
} | |
void | |
ContactRequestItemsViewModel::update(const std::vector<std::string>& properties) | |
{ | |
for each (ContactRequestItem^ item in itemsList) | |
for each (std::string prop in properties) | |
item->raiseNotifyPropertyChanged(Utils::toPlatformString(prop)); | |
} | |
void | |
ContactRequestItemsViewModel::refreshFilteredItemsList() | |
{ | |
auto selectedAccountId = AccountListItemsViewModel::instance->getSelectedAccountId(); | |
std::for_each(begin(itemsList), end(itemsList), | |
[selectedAccountId, this](ContactRequestItem^ item) { | |
static unsigned spi_index; | |
auto isInList = itemsListFiltered->IndexOf(item, &spi_index); | |
if ((item->_contact->_accountIdAssociated == selectedAccountId) && | |
item->_contact->_trustStatus == TrustStatus::INCOMING_CONTACT_REQUEST) { | |
if (!isInList) { | |
itemsListFiltered->InsertAt(0, item); | |
} | |
} | |
else if (isInList) { | |
itemsListFiltered->RemoveAt(spi_index); | |
} | |
}); | |
} |