| 1962 | } |
| 1963 | |
| 1964 | void ImageViewer::selectReference(const shared_ptr<Image>& image) { |
| 1965 | if (!image) { |
| 1966 | auto& buttons = mImageButtonContainer->children(); |
| 1967 | for (size_t i = 0; i < buttons.size(); ++i) { |
| 1968 | dynamic_cast<ImageButton*>(buttons[i])->setIsReference(false); |
| 1969 | } |
| 1970 | |
| 1971 | auto& metricButtons = mMetricButtonContainer->children(); |
| 1972 | for (size_t i = 0; i < metricButtons.size(); ++i) { |
| 1973 | dynamic_cast<Button*>(metricButtons[i])->set_enabled(false); |
| 1974 | } |
| 1975 | |
| 1976 | mCurrentReference = nullptr; |
| 1977 | mImageCanvas->setReference(nullptr); |
| 1978 | return; |
| 1979 | } |
| 1980 | |
| 1981 | const auto id = imageId(image).value_or(0); |
| 1982 | |
| 1983 | auto& buttons = mImageButtonContainer->children(); |
| 1984 | for (size_t i = 0; i < buttons.size(); ++i) { |
| 1985 | dynamic_cast<ImageButton*>(buttons[i])->setIsReference(i == id); |
| 1986 | } |
| 1987 | |
| 1988 | auto& metricButtons = mMetricButtonContainer->children(); |
| 1989 | for (size_t i = 0; i < metricButtons.size(); ++i) { |
| 1990 | dynamic_cast<Button*>(metricButtons[i])->set_enabled(true); |
| 1991 | } |
| 1992 | |
| 1993 | mCurrentReference = image; |
| 1994 | mImageCanvas->setReference(mCurrentReference); |
| 1995 | |
| 1996 | // Ensure the currently active reference button is always fully on-screen |
| 1997 | Widget* activeReferenceButton = nullptr; |
| 1998 | for (Widget* widget : mImageButtonContainer->children()) { |
| 1999 | if (dynamic_cast<ImageButton*>(widget)->isReference()) { |
| 2000 | activeReferenceButton = widget; |
| 2001 | break; |
| 2002 | } |
| 2003 | } |
| 2004 | |
| 2005 | if (activeReferenceButton) { |
| 2006 | float divisor = mScrollContent->height() - mImageScrollContainer->height(); |
| 2007 | if (divisor > 0) { |
| 2008 | mImageScrollContainer->set_scroll(clamp( |
| 2009 | mImageScrollContainer->scroll(), |
| 2010 | (activeReferenceButton->position().y() + activeReferenceButton->height() - mImageScrollContainer->height()) / divisor, |
| 2011 | activeReferenceButton->position().y() / divisor |
| 2012 | )); |
| 2013 | } |
| 2014 | } |
| 2015 | } |
| 2016 | |
| 2017 | void ImageViewer::setExposure(float value) { |
| 2018 | value = round(value, 1.0f); |
nothing calls this directly
no test coverage detected