data_controller.cpp 2.01 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
#include "data_controller.hpp"


#include <stdexcept>

namespace cvv
{
namespace impl
{

namespace
{
class CallEquality
{
      public:
	CallEquality(size_t Id) : Id{ Id }
	{
	}

	bool operator()(const std::unique_ptr<Call> &call) const
	{
		return call->getId() == Id;
	}

      private:
	size_t Id;
};
}

void DataController::addCall(std::unique_ptr<Call> call)
{
	auto ref = util::makeRef(*call);
	calls.push_back(std::move(call));
	viewController.addCall(ref);
	callUI();
}

void DataController::removeCall(size_t Id)
{
	auto it = std::find_if(calls.begin(), calls.end(), CallEquality{ Id });
	if (it == calls.end())
	{
		throw std::invalid_argument{ "there is no call with this id" };
	}
	calls.erase(it);
}

const Call &DataController::getCall(size_t Id) const
{
	auto it = std::find_if(calls.begin(), calls.end(), CallEquality{ Id });
	if (it == calls.end())
	{
		throw std::invalid_argument{ "there is no call with this id" };
	}
	return **it;
}

Call &DataController::getCall(size_t Id)
{
	auto it = std::find_if(calls.begin(), calls.end(), CallEquality{ Id });
	if (it == calls.end())
	{
		throw std::invalid_argument{ "there is no call with this id" };
	}
	return **it;
}

bool DataController::hasCall(size_t Id)
{
	auto it = std::find_if(calls.begin(), calls.end(), CallEquality{ Id });
	return it != calls.end();
}

size_t DataController::numCalls() const
{
	return calls.size();
}

void DataController::callUI()
{
	viewController.exec();
}

void DataController::lastCall()
{
	viewController.showExitProgramButton();
	callUI();
}

/**
 * @brief Actual implementation of the global DataController.
 *
 * This is required to be able to delete it.
 */
static std::unique_ptr<DataController> &realSingleton()
{
	static std::unique_ptr<DataController> var = nullptr;
	return var;
}

void deleteDataController()
{
	realSingleton().reset();
}

DataController &dataController()
{
	auto& controller = realSingleton();
	if(!realSingleton().get())
	{
		controller = util::make_unique<DataController>();
	}
	return *controller;
}
}
} // namespaces cvv::impl