Salome HOME
Fix for bug 10438: Crash during Explode on Blocks operation (Global selection on...
[modules/gui.git] / src / Qtx / QtxListResourceEdit.cxx
index 2b8435733b41a66ef0f52214f202fc401c971d71..34e73a4711e7f41c8a86855424e135478ca2c671 100644 (file)
@@ -19,6 +19,8 @@
 #include <qtoolbutton.h>
 #include <qfontdialog.h>
 #include <qfontdatabase.h>
+#include <qfileinfo.h>
+#include <qfiledialog.h>
 
 #include "QtxIntSpinBox.h"
 #include "QtxDblSpinBox.h"
@@ -460,6 +462,9 @@ QtxResourceEdit::Item* QtxListResourceEdit::Group::createItem( const QString& ti
   case DirList:
     item = new DirListItem( title, resourceEdit(), this, this );
     break;
+  case File:
+    item = new FileItem( title, resourceEdit(), this, this );
+    break;
   }
 
   return item;
@@ -929,18 +934,23 @@ QtxListResourceEdit::FontItem::FontItem( const QString& title, QtxResourceEdit*
 : PrefItem( Font, edit, pItem, parent )
 {
   new QLabel( title, this );
-  myFamilies = new QtxComboBox( this );
+  myFamilies = new QtxComboBox( false, this );
   mySizes = new QtxComboBox( true, this );
   mySizes->setInsertionPolicy( QComboBox::NoInsertion );
   myBold = new QCheckBox( tr( "Bold" ), this );
   myItalic = new QCheckBox( tr( "Italic" ), this );
   myUnderline = new QCheckBox( tr( "Underline" ), this );
-  ( new QFrame( this ) )->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+  myPreview = new QToolButton( this );
+  myPreview->setText( "..." );
+
+  myFamilies->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
+  mySizes->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
 
   connect( myFamilies, SIGNAL( activated( int ) ), this, SLOT( onActivateFamily( int ) ) );
+  connect( myPreview, SIGNAL( clicked() ), this, SLOT( onPreview() ) );
 
-  setProperty( "widget_flags", ( int )All );
   setProperty( "system", ( bool )true );
+  setProperty( "widget_flags", ( int )All );
 }
 
 QtxListResourceEdit::FontItem::~FontItem()
@@ -1059,6 +1069,7 @@ void QtxListResourceEdit::FontItem::setProperty( const QString& name, const QVar
     }
 
     setFamily( fam );
+    setSize( -1 ); //set default size
   }
   
   else if( name=="widget_flags" )
@@ -1075,6 +1086,8 @@ void QtxListResourceEdit::FontItem::setProperty( const QString& name, const QVar
     myBold     ->setShown( wf & Bold );
     myItalic   ->setShown( wf & Italic );
     myUnderline->setShown( wf & Underline );
+    bool isSystem = property( "system" ).canCast( QVariant::Bool ) ? property( "system" ).toBool() : false;
+    myPreview->setShown( ( wf & Preview ) && isSystem );
 
     internalUpdate();
   }
@@ -1098,8 +1111,17 @@ void QtxListResourceEdit::FontItem::setFamily( const QString& f )
       curtext = deffam.toString();
   }
 
-  if( curtext!=family() )
-    myFamilies->setCurrentText( curtext );
+  int idx = -1;
+  for ( int i = 0; i < (int)myFamilies->count() && idx < 0; i++ )
+  {
+    if ( myFamilies->text( i ) == curtext )
+      idx = i;
+  }
+
+  if ( idx >= 0 )
+    myFamilies->setCurrentItem( idx );
+
+  onActivateFamily( idx );  
 }
 
 QString QtxListResourceEdit::FontItem::family() const
@@ -1110,7 +1132,7 @@ QString QtxListResourceEdit::FontItem::family() const
 void QtxListResourceEdit::FontItem::setSize( const int s )
 {
   int cursize = -1;
-  if( mySizes->isShown() )
+  if( mySizes->isShown() && s>0 )
   {
     if( ( myFlags & UserSize ) || mySizes->listBox()->findItem( QString( "%1" ).arg( s ), Qt::ExactMatch ) )
       cursize = s;
@@ -1202,6 +1224,27 @@ void QtxListResourceEdit::FontItem::onActivateFamily( int )
   setSize( s );
 }
 
+void QtxListResourceEdit::FontItem::onPreview()
+{
+  QFont f( family(), size() );
+  bool bold, italic, underline;
+  params( bold, italic, underline );
+  f.setBold( bold );
+  f.setItalic( italic );
+  f.setUnderline( underline );
+
+  bool ok;
+  f = QFontDialog::getFont( &ok, f );
+
+  if( ok )
+  {
+    setFamily( f.family() );
+    setSize( f.pointSize() );
+    setParams( f.bold(), f.italic(), f.underline() );
+  }
+}
+
+
 
 
 
@@ -1230,3 +1273,126 @@ void QtxListResourceEdit::DirListItem::retrieve()
 {
   myDirListEditor->setPathList(QStringList::split(";", getString()));
 }
+
+
+
+/*
+  Class: QtxListResourceEdit::FileItem
+  Descr: GUI implementation of resources file item.
+*/
+QtxListResourceEdit::FileItem::FileItem( const QString& title, QtxResourceEdit* edit,
+                                         Item* pItem, QWidget* parent )
+: PrefItem( Font, edit, pItem, parent ),
+  myFlags( QFileInfo::ReadUser ),
+  myIsExisting( true ),
+  myFileDlg( 0 )
+{
+  new QLabel( title, this );
+  myFile = new QLineEdit( this );
+  myFile->setValidator( new FileValidator( this, myFile ) );
+  myFile->setReadOnly( true );
+  myOpenFile = new QToolButton( this );
+  myOpenFile->setText( "..." );
+  connect( myOpenFile, SIGNAL( clicked() ), this, SLOT( onOpenFile() ) );
+}
+
+QtxListResourceEdit::FileItem::~FileItem()
+{
+  if( myFileDlg ) 
+    delete myFileDlg;
+}
+
+void QtxListResourceEdit::FileItem::store()
+{
+  setString( myFile->text() );
+}
+
+void QtxListResourceEdit::FileItem::retrieve()
+{
+  myFile->setText( getString() );
+}
+
+QVariant QtxListResourceEdit::FileItem::property( const QString& name ) const
+{
+  if( name=="filter" )
+    return myFilter;
+  else if( name=="existing" )
+    return myIsExisting;
+  else if( name=="flags" )
+    return myFlags;
+
+  return QVariant();
+}
+
+void QtxListResourceEdit::FileItem::setProperty( const QString& name, const QVariant& value )
+{
+  if( name=="filter" )
+  {
+    if( value.canCast( QVariant::String ) )
+    {
+      myFilter.clear();
+      myFilter.append( value.toString() );
+    }
+    else if( value.canCast( QVariant::StringList ) )
+      myFilter = value.toStringList();
+  }
+  else if( name=="existing" && value.canCast( QVariant::Bool ) )
+    myIsExisting = value.toBool();
+
+  else if( name=="flags" && value.canCast( QVariant::UInt ) )
+    myFlags = value.toUInt();
+}
+
+void QtxListResourceEdit::FileItem::onOpenFile()
+{
+  if( !myFileDlg )
+  {
+    myFileDlg = new QFileDialog( "." );
+    connect( myFileDlg, SIGNAL( fileHighlighted( const QString& ) ), this, SLOT( onFileSelected( const QString& ) ) );
+  }
+  
+  myFileDlg->setCaption( title() );
+  myFileDlg->setFilters( myFilter );
+  myFileDlg->setMode( myIsExisting ? QFileDialog::ExistingFile : QFileDialog::AnyFile );
+
+  if( myFileDlg->exec()==QDialog::Accepted )
+  {
+    myFile->setText( myFileDlg->selectedFile() ); 
+  }
+}
+
+bool QtxListResourceEdit::FileItem::isFileCorrect( const QString& f ) const
+{
+  bool res = false;
+  QFileInfo info( f );
+  if( !myIsExisting || info.exists() )
+    res = info.isFile() && info.permission( myFlags );
+
+  return res;
+}
+
+void QtxListResourceEdit::FileItem::onFileSelected( const QString& f )
+{
+  if( myFileDlg && !isFileCorrect( f ) )
+    myFileDlg->setSelection( "" );
+}
+
+
+
+QtxListResourceEdit::FileItem::FileValidator::FileValidator( FileItem* item, QObject* parent )
+: QValidator( parent ),
+  myItem( item )
+{
+}
+
+QtxListResourceEdit::FileItem::FileValidator::~FileValidator()
+{
+}
+
+QValidator::State QtxListResourceEdit::FileItem::FileValidator::validate( QString& f, int& ) const
+{
+  if( myItem && myItem->isFileCorrect( f ) )
+    return QValidator::Acceptable;
+  else
+    return QValidator::Intermediate;
+}