blob: 72b5a283681faa8747f5dfa457e1c38c3af17bac [file] [log] [blame]
/**************************************************************************
* 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);
}
});
}