synczoomwidget.cpp 1.84 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

#include <QVBoxLayout>
#include <QRadioButton>
#include <QLabel>

#include "synczoomwidget.hpp"
#include "../util/util.hpp"

namespace cvv
{
namespace qtutil
{

cvv::qtutil::SyncZoomWidget::SyncZoomWidget(
    std::vector<cvv::qtutil::ZoomableImage *> images, QWidget *parent)
    : QWidget(parent), images_{ images }, currentIdx_{ images_.size() },
      buttonGroup_{ new QButtonGroup }
{
	if (images_.size() >= 2)
	{

		auto layout = util::make_unique<QVBoxLayout>();
		auto label = util::make_unique<QLabel>("choose 'master' image");
		auto none = util::make_unique<QRadioButton>("no sync");

		buttonGroup_->setExclusive(true);
		none->setChecked(true);
		buttonGroup_->addButton(none.get(), images.size());

		layout->addWidget(label.release());
		layout->addWidget(none.release());

		for (size_t i = 0; i < images_.size(); i++)
		{

			auto checkbox = util::make_unique<QRadioButton>(QString
			{ "Image Nr. %1" }.arg(i));

			buttonGroup_->addButton(checkbox.get(), i);

			layout->addWidget(checkbox.release());

			connect(this, SIGNAL(updateArea(QRectF, qreal)),
				images_.at(i), SLOT(setArea(QRectF, qreal)));
		}
		connect(buttonGroup_, SIGNAL(buttonClicked(int)), this,
			SLOT(selectMaster(int)));

		setLayout(layout.release());
	}
}

void SyncZoomWidget::selectMaster(int id)
{
	if (currentIdx_ < images_.size())
	{
		disconnect(images_.at(currentIdx_),
			   SIGNAL(updateArea(QRectF, qreal)), this,
			   SIGNAL(updateArea(QRectF, qreal)));

		connect(this, SIGNAL(updateArea(QRectF, qreal)),
			images_.at(currentIdx_), SLOT(setArea(QRectF, qreal)));
	}
	currentIdx_ = id;
	if (currentIdx_ < images_.size())
	{
		disconnect(this, SIGNAL(updateArea(QRectF, qreal)),
			   images_.at(currentIdx_),
			   SLOT(setArea(QRectF, qreal)));

		connect(images_.at(currentIdx_),
			SIGNAL(updateArea(QRectF, qreal)), this,
			SIGNAL(updateArea(QRectF, qreal)));
	}
}
}
}