Files
ResInsight/ApplicationLibCode/ProjectDataModel/RimViewWindow.h
T
Magne Sjaastad 9ac6ad3bec #14903: Avoid duplicate dock window ids for copied plots
Copies and plots created from templates kept the source DockWindowId. The dock
manager identifies dock widgets by name, so the earlier dock widget was deleted on
dock state restore, leaving a dangling pointer that crashed in setActiveViewer.

- Do not copy DockWindowId; copies get a new id
- Assign a new id if a dock widget with the same name exists
- Use QPointer for the dock widget
2026-10-12 18:49:08 +02:00

127 lines
3.9 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2016 Statoil ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RiaDefines.h"
#include "cafFontTools.h"
#include "cafPdmChildField.h"
#include "cafPdmField.h"
#include "cafPdmObject.h"
#include <QPointer>
class QImage;
class RimDockWindowController;
namespace ads
{
class CDockWidget;
} // namespace ads
class RimViewWindow : public caf::PdmObject, public caf::FontHolderInterface
{
CAF_PDM_HEADER_INIT;
public:
RimViewWindow();
~RimViewWindow() override;
virtual int id() const = 0;
bool showWindow() const;
void setShowWindow( bool showWindow );
void setAsActiveViewer( bool allowSelectionChange = false );
bool isActiveViewer() const;
bool isMainDockedWindow() const;
bool isDockedIn3DView() const;
bool isDockedInPlotView() const;
void loadDataAndUpdate();
void updateDockWindowVisibility();
void removeWindowFromDock();
void dockAs3DViewWindow();
void dockAsPlotWindow();
virtual QWidget* viewWidget() = 0;
ads::CDockWidget* dockWidget() const;
ads::CDockWidget* createDockWidget();
virtual QImage captureSnapshot( int width, int height );
virtual QImage snapshotWindowContent();
virtual void zoomAll() = 0;
// Zoom all triggered explicitly by the user. This will also release any axis ranges defined by the user.
virtual void zoomAllAndReleaseUserDefinedRanges();
void viewNavigationChanged();
virtual void updateWindowTitle();
void updateWindowTitleIcon( QString title );
void resetDockWindowId();
QString dockWindowName();
protected:
//// Interface for the Window controller
friend class RimDockWindowController;
QString windowTitle();
virtual QWidget* createViewWidget( QWidget* mainWindowParent = nullptr ) = 0;
virtual void updateViewWidgetAfterCreation() {};
virtual void deleteViewWidget() = 0;
virtual void onLoadDataAndUpdate() = 0;
virtual void onViewNavigationChanged();
virtual bool isWindowVisible() const; // Virtual To allow special visibility control
void deleteDockWidget();
void setActive( bool active );
////
// Derived classes are not supposed to override this function. The intention is to always use m_showWindow
// as the objectToggleField for this class. This way the visibility of a widget being part of a composite widget
// can be controlled from the project tree using check box toggles
caf::PdmFieldHandle* objectToggleField() final;
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
void defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override;
static QImage internalCaptureSnapshot( ads::CDockWidget* dockWidget, QWidget* widget, int width, int height );
private:
friend class RimProject;
void dockInWindow( int mainWindowID );
virtual void assignIdIfNecessary() = 0;
protected:
caf::PdmChildField<RimDockWindowController*> m_windowController;
caf::PdmField<bool> m_showWindow;
QPointer<ads::CDockWidget> m_dockWidget;
caf::PdmField<QString> m_dockWindowId;
bool m_isActiveViewer;
};