<h1>Spin boxes</h1>
This type of widgets is used for numeric (integer or floating-point)
-data input. Spin boxes are used in standard \b SALOME modules in case
-if an input value has clearly defined input range (and precision in
-case of floating-point value).
+data input. Spin boxes are used in standard \b SALOME modules if the
+input value has a clearly defined input range (and precision in
+case of a floating-point value).
-Input precision has specific semantics in \b SALOME floating-point
+Input precision has a specific semantics in \b SALOME floating-point
spin boxes:
-- Positive value means that a number in a fixed-point format
-(corresponding to "f" format specifier for C printf function) is
+- Positive precision value means that a number in the fixed-point format
+(corresponding to the "f" format specifier for C printf function) is
expected. Positive precision value is the maximum allowed number of
digits after the decimal separator.
-- Negative precision value means that a number either in a fixed-point
-or scientific (exponetial) format is expected. This is similar to
-behavior of "g" format specifier for C printf function. Absolute
+- Negative precision value means that a number either in the fixed-point
+or the scientific (exponetial) format is expected. This is similar to the
+behavior of the "g" format specifier for C printf function. Negative
precision value is the maximum allowed number of significant digits in
mantissa (note that one digit is always before the decimal separator).
To make the user aware of an input value constraints applied by some
-\b SALOME operation, the following basic capabilties are provided by
+\b SALOME operations, the following basic capabilties are provided by
spin boxes:
-- Text entered manually into a spin box by the user is checked to be a
+- The text input manually in a spin box by the user is checked to be a
number of valid type (integer or floating-point).
-- The text is converted to a number and checked against the valid
+- The text is converted to a number and checked to be within the valid
range.
- Additionally, for floating-point data the input text is checked
against the precision rules described above.
-In case if the input text in a spin box does not satisfy the
-constraints, the user is informed about this by a message shown in a
+If the input text in a spin box does not meet the
+constraints, the user is shown a message in a
tooltip near the spin box just as he types in it. The tooltip contains
-information about valid data range. For floating-point input, the
-tooltip also contains information about expected precision.
+information about the valid data range. For a floating-point input, the
+tooltip also contains information about the expected precision.
-In standard \bSALOME modules precision value can be adjusted through
-\ref setting_preferences_page "user preferences" of correspodning modules, and the tooltip contains a
-reference to corresponding parameter in the preferences.
+In standard \bSALOME modules the precision value can be adjusted through
+\ref setting_preferences_page "user preferences" of the correspodning modules, and the tooltip contains a
+reference to the corresponding parameter in the preferences.
On-line documentation for each standard SALOME module contains the
list of user preferences that can be used for tuning floating-point
-precision for different type of input quantities.
+precision for different types of input quantities.
<h2>Spin boxes and SALOME Notebook</h2>
-Apart from numeric input, spin boxes in some \b SALOME modules accept
-names of \b Notebook variables (see \ref using_notebook "Using Notebook"
+Apart from the numeric input, spin boxes in some \b SALOME modules accept
+the names of \b Notebook variables (see \ref using_notebook "Using Notebook"
page for more details about \b Notebook).
-If some spin box accepts variable names, then it is
-additionally checked whether the manual input text represents a variable name. Variable
-names should satisfy common naming rules for \b Python variables.
-In case if the input is neither a valid number nor a variable name,
-the tooltip is shown informing the user that variable names are
-also acceptable in this spin box.
+If a spin box accepts variable names, then it is
+additionally checked whether the manually input text represents a variable name. Variable
+names should comply with the common naming rules for \b Python variables.
+If the input is neither a valid number nor a variable name,
+the tooltip informs the user that variable names are also acceptable in this spin box.
*/
if( !IsEXTInitialized ||
strstr( ext, "GL_EXT_framebuffer_object" ) == NULL )
{
- INFOS( "Initializing OpenGL FrameBuffer extension failed" );
+ MESSAGE( "Initializing OpenGL FrameBuffer extension failed" );
return false;
}
#include <limits>
+const double PSEUDO_ZERO = 1.e-20;
+
/*!
\class QtxDoubleSpinBox
\brief Enhanced version of the Qt's double spin box.
myCleared = false;
QDoubleSpinBox::stepBy( steps );
+ double tmpval = value();
+ if ( qAbs( tmpval ) < PSEUDO_ZERO ) tmpval = 0.;
+ if ( tmpval < minimum() ) tmpval = minimum();
+ else if ( tmpval > maximum() ) tmpval = maximum();
+ setValue( tmpval );
}
/*!
emit( selectionChanged() );
}
+/*!
+ \brief Called when rows are about to be removed.
+ \param parent model index
+ \param start first row to remove
+ \param end last row to remove
+*/
+void QtxTreeView::rowsAboutToBeRemoved( const QModelIndex& parent, int start, int end )
+{
+ QModelIndex curIndex = currentIndex();
+ while ( curIndex.isValid() && curIndex.parent() != parent )
+ curIndex = curIndex.parent();
+ if ( curIndex.isValid() && curIndex.row() >= start && curIndex.row() <= end )
+ setCurrentIndex( QModelIndex() );
+ QTreeView::rowsAboutToBeRemoved( parent, start, end );
+}
+
/*!
\brief Expand/collapse the specified item (recursively).
\param index model index
protected slots:
void onHeaderClicked( int );
+ void rowsAboutToBeRemoved( const QModelIndex&, int, int );
void selectionChanged( const QItemSelection&, const QItemSelection& );
void onAppropriate( Qt::Orientation, int, int );
virtual int id() const;
SUIT_DataObject* root() const;
- QString studyName() const;
+ virtual QString studyName() const;
SUIT_Application* application() const;
virtual bool isSaved() const;
int SalomeApp_Study::id() const
{
int id = -1;
- if ( myStudyDS )
+ if ( studyDS() )
id = studyDS()->StudyId();
return id;
}
+/*!
+ Get study name.
+*/
+QString SalomeApp_Study::studyName() const
+{
+ // redefined from SUIT_Study to update study name properly since
+ // it can be changed outside of GUI
+ // TEMPORARILY SOLUTION: better to be implemented with help of SALOMEDS observers
+ if ( studyDS() ) {
+ QString newName = studyDS()->Name().c_str();
+ if ( LightApp_Study::studyName() != newName ) {
+ SalomeApp_Study* that = const_cast<SalomeApp_Study*>( this );
+ that->setStudyName( newName );
+ ((SalomeApp_Application*)application())->updateDesktopTitle();
+ }
+ }
+ return LightApp_Study::studyName();
+}
+
/*!
Gets studyDS pointer.
*/
virtual ~SalomeApp_Study();
virtual int id() const;
+ virtual QString studyName() const;
virtual bool createDocument( const QString& );
virtual bool openDocument( const QString& );
#include "VTKViewer_MarkerDlg.h"
#include "VTKViewer_MarkerWidget.h"
+#include <SUIT_Application.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_Session.h>
+
#include <QFrame>
#include <QHBoxLayout>
+#include <QKeyEvent>
/*!
* Class : VTKViewer_MarkerDlg
aTopLayout->setSpacing( 0 );
aTopLayout->setMargin( 0 );
aTopLayout->addWidget( myMarkerWidget );
+
+ connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
}
/*!
{
}
+void VTKViewer_MarkerDlg::setHelpData( const QString& theModuleName,
+ const QString& theHelpFileName )
+{
+ myModuleName = theModuleName;
+ myHelpFileName = theHelpFileName;
+}
+
+void VTKViewer_MarkerDlg::keyPressEvent( QKeyEvent* e )
+{
+ QtxDialog::keyPressEvent( e );
+ if ( e->isAccepted() )
+ return;
+
+ if ( e->key() == Qt::Key_F1 ) {
+ e->accept();
+ onHelp();
+ }
+}
+
+void VTKViewer_MarkerDlg::onHelp()
+{
+ if( myModuleName.isNull() || myHelpFileName.isNull() )
+ return;
+
+ SUIT_Application* app = SUIT_Session::session()->activeApplication();
+ if (app)
+ app->onHelpContextModule(myModuleName, myHelpFileName);
+ else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
+ SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
+ tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
+ arg(app->resourceMgr()->stringValue("ExternalBrowser",
+ platform)).
+ arg(myHelpFileName));
+ }
+}
+
void VTKViewer_MarkerDlg::setCustomMarkerMap( VTK::MarkerMap theMarkerMap )
{
myMarkerWidget->setCustomMarkerMap( theMarkerMap );
VTKViewer_MarkerDlg( QWidget* = 0 );
virtual ~VTKViewer_MarkerDlg();
+ void setHelpData( const QString& theModuleName,
+ const QString& theHelpFileName );
+
void setCustomMarkerMap( VTK::MarkerMap );
VTK::MarkerMap getCustomMarkerMap();
VTK::MarkerScale getStandardMarkerScale() const;
int getCustomMarkerID() const;
+protected:
+ void keyPressEvent( QKeyEvent* );
+
+private slots:
+ void onHelp();
+
private:
VTKViewer_MarkerWidget* myMarkerWidget;
+
+ QString myModuleName;
+ QString myHelpFileName;
};
#endif
{
Q_INIT_RESOURCE( VTKViewer );
- this->ExtensionsInitialized = 0;
+ this->ExtensionsInitialized = ES_None;
this->PointSpriteTexture = 0;
}
//-----------------------------------------------------------------------------
-bool VTKViewer_PolyDataMapper::InitExtensions()
+int VTKViewer_PolyDataMapper::InitExtensions()
{
- if( this->ExtensionsInitialized )
- return true;
-
- InitializeBufferExtensions();
-
char* ext = (char*)glGetString( GL_EXTENSIONS );
if( !IsBufferExtensionsInitialized ||
strstr( ext, "GL_ARB_point_sprite" ) == NULL ||
strstr( ext, "GL_ARB_vertex_buffer_object" ) == NULL )
{
- INFOS("Initializing ARB extensions failed");
- return false;
+ MESSAGE("Initializing ARB extensions failed");
+ return ES_Error;
}
- this->ExtensionsInitialized = 1;
- return true;
+ return ES_Ok;
}
//-----------------------------------------------------------------------------
bool isUsePointSprites = this->MarkerEnabled && this->MarkerType != VTK::MT_NONE;
if( isUsePointSprites )
{
- this->InitExtensions();
+ if( this->ExtensionsInitialized == ES_None )
+ this->ExtensionsInitialized = this->InitExtensions();
this->InitPointSprites();
this->InitTextures();
}
delete aColorFunctor;
}
- if( this->ExtensionsInitialized ) {
+ if( this->ExtensionsInitialized == ES_Ok ) {
GLuint aBufferObjectID = 0;
vglGenBuffersARB( 1, &aBufferObjectID );
vglBindBufferARB( GL_ARRAY_BUFFER_ARB, aBufferObjectID );
*/
class VTKVIEWER_EXPORT VTKViewer_PolyDataMapper : public MAPPER_SUPERCLASS
{
+public:
+ enum ExtensionsState { ES_None = 0, ES_Error, ES_Ok };
+
public:
static VTKViewer_PolyDataMapper* New();
vtkTypeRevisionMacro( VTKViewer_PolyDataMapper, MAPPER_SUPERCLASS );
~VTKViewer_PolyDataMapper();
//! Initializing OpenGL extensions.
- bool InitExtensions();
+ int InitExtensions();
//! Activate Point Sprites.
void InitPointSprites();