void TodoTab::handleImport () { const QString& filename = QFileDialog::getOpenFileName (this, tr ("Import tasks"), QDir::homePath (), tr ("iCalendar files (*.ics)")); QFile file (filename); if (!file.open (QIODevice::ReadOnly)) { QMessageBox::critical (this, tr ("Tasks import"), tr ("Unable to open %1: %2.") .arg ("<em>" + filename + "</em>") .arg (file.errorString ())); return; } const auto& items = ICalParser ().Parse (file.readAll ()); if (items.isEmpty ()) return; ItemsMergeDialog dia (items.size (), this); if (dia.exec () != QDialog::Accepted) return; auto storage = Core::Instance ().GetTodoManager ()->GetTodoStorage (); auto ourItems = storage->GetAllItems (); for (const auto& item : items) { const auto& itemId = item->GetID (); auto pos = std::find_if (ourItems.begin (), ourItems.end (), [&itemId] (const auto& ourItem) { return ourItem->GetID () == itemId; }); if (pos != ourItems.end ()) { if (dia.GetPriority () == ItemsMergeDialog::Priority::Imported) { (*pos)->CopyFrom (item); storage->HandleUpdated (*pos); } continue; } const auto& itemTitle = item->GetTitle (); pos = std::find_if (ourItems.begin (), ourItems.end (), [itemTitle] (const auto& ourItem) { return ourItem->GetTitle () == itemTitle; }); if (pos != ourItems.end ()) { if (dia.GetPriority () == ItemsMergeDialog::Priority::Imported && dia.GetSameTitle () == ItemsMergeDialog::SameTitle::Merge) { (*pos)->CopyFrom (item); storage->HandleUpdated (*pos); } continue; } storage->AddItem (item); } }
void TodoTab::handleImport () { const QString& filename = QFileDialog::getOpenFileName (this, tr ("Import tasks"), QDir::homePath (), tr ("iCalendar files (*.ics)")); QFile file (filename); file.open (QIODevice::ReadOnly); auto items = ICalParser ().Parse (file.readAll ()); if (items.isEmpty ()) return; ItemsMergeDialog dia (items.size (), this); if (dia.exec () != QDialog::Accepted) return; auto storage = Core::Instance ().GetTodoManager ()->GetTodoStorage (); auto ourItems = storage->GetAllItems (); Q_FOREACH (auto item, items) { const auto& itemId = item->GetID (); auto pos = std::find_if (ourItems.begin (), ourItems.end (), [&itemId] (decltype (ourItems.front ()) ourItem) { return ourItem->GetID () == itemId; }); if (pos != ourItems.end ()) { if (dia.GetPriority () == ItemsMergeDialog::Priority::Imported) { (*pos)->CopyFrom (item); storage->HandleUpdated (*pos); } continue; } const auto& itemTitle = item->GetTitle (); pos = std::find_if (ourItems.begin (), ourItems.end (), [itemTitle] (decltype (ourItems.front ()) ourItem) { return ourItem->GetTitle () == itemTitle; }); if (pos != ourItems.end ()) { if (dia.GetPriority () == ItemsMergeDialog::Priority::Imported && dia.GetSameTitle () == ItemsMergeDialog::SameTitle::Merge) { (*pos)->CopyFrom (item); storage->HandleUpdated (*pos); } continue; } storage->AddItem (item); } }
void SyncProxy::Merge (QList<Laretz::Operation>&, const QList<Laretz::Operation>& theirs) { auto guard = Core::Instance ().GetStager ()->EnterMergeMode (); auto storage = Core::Instance ().GetTodoManager ()->GetTodoStorage (); for (const auto& op : theirs) { const auto& items = op.getItems (); switch (op.getType ()) { case Laretz::OpType::Fetch: for (const auto& item : items) { const auto pos = storage->FindItem (QString::fromUtf8 (item.getId ().c_str ())); if (pos == -1) { TodoItem_ptr todo (new TodoItem (QString::fromUtf8 (item.getId ().c_str ()))); todo->ApplyDiff (Util::Sync::ItemToMap (item)); storage->AddItem (todo); } else { auto todo = storage->GetItemAt (pos); todo->ApplyDiff (Util::Sync::ItemToMap (item)); storage->HandleUpdated (todo); } } break; case Laretz::OpType::Delete: for (const auto& item : items) storage->RemoveItem (QString::fromUtf8 (item.getId ().c_str ())); break; default: qWarning () << Q_FUNC_INFO << "unknown operation type" << static_cast<int> (op.getType ()); break; } } }