jfjoch_viewer: Display rectangle around current grid element

This commit is contained in:
2025-11-21 10:33:18 +01:00
parent 9117056e30
commit 29c2f7d63d
5 changed files with 32 additions and 13 deletions

View File

@@ -87,8 +87,10 @@ void JFJochViewerDatasetInfo::datasetLoaded(std::shared_ptr<const JFJochReaderDa
void JFJochViewerDatasetInfo::imageLoaded(std::shared_ptr<const JFJochReaderImage> image) {
this->image = image;
if (image)
if (image) {
chart_view->setImage(image->ImageData().number);
grid_scan_image->setImage(image->ImageData().number);
}
}
void JFJochViewerDatasetInfo::imageSelectedInChart(int64_t number) {

View File

@@ -8,6 +8,7 @@ JFJochGridScanImage::JFJochGridScanImage(QWidget *parent) : JFJochImage(parent)
void JFJochGridScanImage::clear() {
W = 0;
H = 0;
this->settings = std::nullopt;
if (scene())
scene()->clear();
CalcROI();
@@ -18,6 +19,7 @@ void JFJochGridScanImage::loadData(const std::vector<float> &data, const GridSca
clear();
return;
}
this->settings = settings;
W = settings.GetGridSizeX_step();
H = settings.GetGridSizeY_step();
@@ -112,3 +114,24 @@ void JFJochGridScanImage::mouseDoubleClickEvent(QMouseEvent *event) {
JFJochImage::mouseDoubleClickEvent(event);
}
void JFJochGridScanImage::setImage(int64_t val) {
if (settings) {
current_image_W = settings->GetElementPosX_step(val);
current_image_H = settings->GetElementPosY_step(val);
} else {
current_image_W = -1;
current_image_H = -1;
}
Redraw();
}
void JFJochGridScanImage::addCustomOverlay() {
if (current_image_W < 0 || current_image_H < 0 || current_image_W >= W || current_image_H >= H)
return;
QPen pen(feature_color, 3);
pen.setCosmetic(true);
auto rect = scene()->addRect(current_image_W, current_image_H, 1, 1, pen);
}

View File

@@ -12,11 +12,15 @@ Q_DECLARE_METATYPE(GridScanSettings)
class JFJochGridScanImage : public JFJochImage {
Q_OBJECT
std::optional<GridScanSettings> settings;
std::vector<int64_t> image_index;
int64_t current_image_W = -1;
int64_t current_image_H = -1;
void mouseHover(QMouseEvent *event) override;
void mouseDoubleClickEvent(QMouseEvent *event) override;
void loadImage(QMouseEvent *event);
void addCustomOverlay() override;
signals:
void imageSelected(int64_t number);
void writeStatusBar(QString string, int timeout_ms = 0);
@@ -24,6 +28,7 @@ public:
JFJochGridScanImage(QWidget *parent = nullptr);
public slots:
void loadData(const std::vector<float> &data, const GridScanSettings &settings);
void setImage(int64_t val);
void clear();
};

View File

@@ -459,13 +459,6 @@ void JFJochImage::Redraw() {
setScene(currentScene);
// Reset initial-fit state for a new scene
initial_fit_done_ = false;
last_fit_W_ = 0;
last_fit_H_ = 0;
}
// If image size changed since last fit, allow a new initial fit
if (last_fit_W_ != W || last_fit_H_ != H) {
initial_fit_done_ = false;
}
// Restore the zoom level
@@ -701,8 +694,7 @@ void JFJochImage::CalcROI() {
void JFJochImage::fitToView() {
initial_fit_done_ = false;
fitToViewShorterSideOnce();
Redraw();
updateOverlay();
}
void JFJochImage::fitToViewShorterSideOnce() {
@@ -733,7 +725,5 @@ void JFJochImage::fitToViewShorterSideOnce() {
setTransformationAnchor(oldAnchor);
initial_fit_done_ = true;
last_fit_W_ = W;
last_fit_H_ = H;
last_fit_viewport_ = vp;
}

View File

@@ -38,7 +38,6 @@ protected:
// Track initial fit state and last image size
bool initial_fit_done_ = false;
size_t last_fit_W_ = 0, last_fit_H_ = 0;
QColor feature_color = Qt::magenta;
float foreground = 10.0;