textureProperties.cc 9.31 KB
Newer Older
Jan Möbius's avatar
 
Jan Möbius committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14
//=============================================================================
//
//                               OpenFlipper
//        Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen
//                           www.openflipper.org
//
//-----------------------------------------------------------------------------
//
//                                License
//
//  OpenFlipper is free software: you can redistribute it and/or modify
//  it under the terms of the GNU Lesser General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
Jan Möbius's avatar
Jan Möbius committed
15
//
Jan Möbius's avatar
 
Jan Möbius committed
16 17 18 19
//  OpenFlipper 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 Lesser General Public License for more details.
Jan Möbius's avatar
Jan Möbius committed
20
//
Jan Möbius's avatar
 
Jan Möbius committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
//  You should have received a copy of the GNU Lesser General Public License
//  along with OpenFlipper.  If not, see <http://www.gnu.org/licenses/>.
//
//-----------------------------------------------------------------------------
//
//   $Revision$
//   $Author$
//   $Date$
//
//=============================================================================




#include "textureProperties.hh"
36 37 38

#include <float.h>

Jan Möbius's avatar
 
Jan Möbius committed
39
#include <QtGui>
40
#include <OpenFlipper/common/GlobalOptions.hh>
Jan Möbius's avatar
 
Jan Möbius committed
41 42 43 44 45

texturePropertiesWidget::texturePropertiesWidget(QWidget *parent)
    : QDialog(parent)
{
    setupUi(this);
Jan Möbius's avatar
Jan Möbius committed
46

47
    connect(buttonBox, SIGNAL( clicked(QAbstractButton*) ), this , SLOT ( slotButtonBoxClicked(QAbstractButton*) ) );
Jan Möbius's avatar
Jan Möbius committed
48 49
    connect(textureList, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(textureChanged(QTreeWidgetItem*,int)) );
    connect(textureList, SIGNAL(itemPressed(QTreeWidgetItem*,int)), this, SLOT(textureAboutToChange(QTreeWidgetItem*,int)) );
50 51 52 53 54 55 56 57 58 59 60 61

    //remember changes
    connect(repeatBox, SIGNAL( clicked() ), this , SLOT ( slotPropertiesChanged() ) );
    connect(clampBox, SIGNAL( clicked() ), this , SLOT ( slotPropertiesChanged() ) );
    connect(centerBox, SIGNAL( clicked() ), this , SLOT ( slotPropertiesChanged() ) );
    connect(absBox, SIGNAL( clicked() ), this , SLOT ( slotPropertiesChanged() ) );
    connect(scaleBox, SIGNAL( clicked() ), this , SLOT ( slotPropertiesChanged() ) );

    connect(max_val, SIGNAL( valueChanged(double) ), this , SLOT ( slotPropertiesChanged(double) ) );
    connect(clamp_min, SIGNAL( valueChanged(double) ), this , SLOT ( slotPropertiesChanged(double) ) );
    connect(clamp_max, SIGNAL( valueChanged(double) ), this , SLOT ( slotPropertiesChanged(double) ) );

62 63
    connect(changeImageButton, SIGNAL( clicked() ), this, SLOT( slotChangeImage() ) );

64 65 66

    texData_ = 0;

67
    #ifdef WITH_QWT
Dirk Wilden's avatar
Dirk Wilden committed
68
      QGridLayout* layout = new QGridLayout( originalData);
69

70
      functionPlot_ = new ACG::QwtFunctionPlot(0);
71

72
      layout->addWidget( functionPlot_ , 0,0  );
73

Dirk Wilden's avatar
Dirk Wilden committed
74
    #endif
75 76 77

}

78 79 80 81 82 83 84 85
void texturePropertiesWidget::show(TextureData* _texData, int _id, QString _name){

  texData_ = _texData;
  id_ = _id;

  textureList->clear();

  for (uint i=0; i < texData_->textures().size(); i++)
Jan Möbius's avatar
Bugfix  
Jan Möbius committed
86
    if ( ! texData_->textures()[i].hidden() ) {
Jan Möbius's avatar
Jan Möbius committed
87 88 89 90 91 92 93 94 95
      if (  texData_->textures()[i].type() != MULTITEXTURE ) {
        textureList->addTopLevelItem( new QTreeWidgetItem((QTreeWidget*)0, QStringList( texData_->textures()[i].name() ) ) );
      } else {
        QTreeWidgetItem* parent = new QTreeWidgetItem((QTreeWidget*)0, QStringList( texData_->textures()[i].name() ) );
        textureList->addTopLevelItem( parent ) ;
        for ( int j = 0 ; j < texData_->textures()[i].multiTextureList.size() ; ++j )
          textureList->addTopLevelItem( new QTreeWidgetItem(parent, QStringList(texData_->textures()[i].multiTextureList[j] )) );
      }
    }
96

Jan Möbius's avatar
Jan Möbius committed
97 98 99 100 101 102
    if ( textureList->invisibleRootItem()->childCount() == 0 )  {
      QMessageBox msgBox(this);
      msgBox.setText("Cannot show Properties. No Textures available!");
      msgBox.exec();
      return;
    }
103 104 105 106 107 108

  if (id_ == -1)
    textureLabel->setText("<B>Global Textures</B>");
  else
    textureLabel->setText("<B>Textures for object '" + _name + "'</B>");

Dirk Wilden's avatar
Dirk Wilden committed
109 110
  propChanged_ = false;

Jan Möbius's avatar
Jan Möbius committed
111 112 113
  // TODO
//   textureList->setCurrentItem( textureList->item(0) );
//   textureChanged( textureList->item(0) );
114 115 116 117

  QDialog::show();
}

Jan Möbius's avatar
Jan Möbius committed
118
void texturePropertiesWidget::textureAboutToChange(QTreeWidgetItem* _item, int _column){
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

  if (propChanged_){
    QMessageBox msgBox(this);
    msgBox.setText("The properties of the current texture have been changed.");
    msgBox.setInformativeText("Do you want to apply these changes?");
    msgBox.setStandardButtons(QMessageBox::Apply | QMessageBox::Discard );
    msgBox.setDefaultButton(QMessageBox::Apply);
    int ret = msgBox.exec();

    if (ret == QMessageBox::Apply){
      //just hit the applyButton ;)
      for (int i=0; i < buttonBox->buttons().count(); i++)
        if ( buttonBox->standardButton( buttonBox->buttons()[i] ) == QDialogButtonBox::Apply )
          slotButtonBoxClicked( buttonBox->buttons()[i] );

Jan Möbius's avatar
Jan Möbius committed
134 135 136
      // TODO
//       textureList->setCurrentItem( _item );
      textureChanged( _item,_column );
137 138 139 140

    } else {
      propChanged_ = false;

Jan Möbius's avatar
Jan Möbius committed
141 142 143
      // TODO
//       textureList->setCurrentItem( _item );
      textureChanged( _item,_column );
144 145 146 147
    }
  }
}

Jan Möbius's avatar
Jan Möbius committed
148
void texturePropertiesWidget::textureChanged(QTreeWidgetItem* _item, int _column){
149 150 151

  //open changes for the last texture so switch back
  if ( propChanged_ ){
Jan Möbius's avatar
Jan Möbius committed
152 153
    // TODO
//     textureList->setCurrentRow( curRow_ );
154 155 156
    return;
  }

Jan Möbius's avatar
Jan Möbius committed
157
  if ( !texData_->textureExists( _item->text(_column) ) )
158 159
    return; //should not happen

Jan Möbius's avatar
Jan Möbius committed
160
  textureName_ = _item->text(_column);
161 162 163 164 165 166 167 168 169 170 171 172 173

  //update the dialog
  Texture& texture = texData_->texture(textureName_);

  repeatBox->setChecked(texture.parameters.repeat);
  clampBox->setChecked(texture.parameters.clamp);
  centerBox->setChecked(texture.parameters.center);
  absBox->setChecked(texture.parameters.abs);

  max_val->setValue( texture.parameters.max_val );
  clamp_min->setValue( texture.parameters.clamp_min );
  clamp_max->setValue( texture.parameters.clamp_max );

174 175 176 177
  // Show the texture Image
  imageLabel->setPixmap(QPixmap::fromImage(texture.textureImage));
  imageLabel->setScaledContents(true);

178
  if ( texture.filename().startsWith("/") )
179
    fileLabel->setText( "File: " + texture.filename() );
180
  else
181
    fileLabel->setText( "File: " + OpenFlipper::Options::textureDirStr() + QDir::separator() + texture.filename() );
182

183 184
  currentImage_ = texture.filename();

185
  // update plot only when dimension is 1
186
  if ( texture.dimension() == 1 && id_ != -1) {
187

188
    #ifdef WITH_QWT
189

190
      std::vector< double > x;
191

192
      emit getCoordinates1D(textureName_, id_, x);
193

194
      if ( x.size() > 0 ){
195

196
        std::vector< double > y( x.size(), 1.0);
197

198
        functionPlot_->clear();
199

200
        functionPlot_->add_function( x, y, "Histogram" );
201

202 203
        functionPlot_->histogram_mode();
      }
204

205 206 207 208
    #endif
  }

  propChanged_ = false;
Jan Möbius's avatar
Jan Möbius committed
209 210
  // TODO
//   curRow_ = textureList->currentRow();
211
}
212 213 214

void texturePropertiesWidget::slotChangeImage() {

215
  QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"),
216 217 218
                                                  OpenFlipper::Options::currentDirStr(),
                                                  tr("Images (*.png *.xpm *.jpg)"));

219
  if ( QFile(fileName).exists() ){
220

221 222
    imageLabel->setPixmap( QPixmap(fileName) );
    imageLabel->setScaledContents(true);
223

224 225 226 227 228 229
    fileLabel->setText( "File: " + fileName );

    currentImage_ = fileName;

    propChanged_ = true;
  }
230 231 232

}

233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
void texturePropertiesWidget::slotButtonBoxClicked(QAbstractButton* _button){

  QDialogButtonBox::StandardButton btn = buttonBox->standardButton(_button);

  if ( btn == QDialogButtonBox::Apply || btn == QDialogButtonBox::Ok){

    //applySettings
    bool changed = false;

    Texture& texture = texData_->texture(textureName_);

    if ( texture.parameters.repeat != repeatBox->isChecked() ){
      texture.parameters.repeat=repeatBox->isChecked();
      changed = true;
    }
    if ( texture.parameters.clamp != clampBox->isChecked() ){
      texture.parameters.clamp=clampBox->isChecked();
      changed = true;
    }
    if ( texture.parameters.center != centerBox->isChecked() ){
      texture.parameters.center=centerBox->isChecked();
      changed = true;
    }
    if ( texture.parameters.abs != absBox->isChecked() ){
      texture.parameters.abs=absBox->isChecked();
      changed = true;
    }
    if ( texture.parameters.scale != scaleBox->isChecked() ){
      texture.parameters.scale=scaleBox->isChecked();
      changed = true;
    }

    if ( texture.parameters.max_val != max_val->value() ){
      texture.parameters.max_val = max_val->value();
      changed = true;
    }

    if ( texture.parameters.clamp_min != clamp_min->value() ){
      texture.parameters.clamp_min = clamp_min->value();
      changed = true;
    }

    if ( texture.parameters.clamp_max != clamp_max->value() ){
      texture.parameters.clamp_max = clamp_max->value();
      changed = true;
    }

280 281 282 283 284 285
    if ( texture.filename() != currentImage_ ){
      texture.filename( currentImage_ );
      texture.textureImage = QImage( currentImage_ );
      changed = true;
    }

286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
    //inform the plugin about the update
    if (changed)
      emit applyProperties(texData_, textureName_, id_ );

    propChanged_ = false;
  }

  if ( btn == QDialogButtonBox::Apply )
    return;
  else
    hide();
}

void texturePropertiesWidget::slotPropertiesChanged(double /*_value*/){
  propChanged_ = true;
}