/* flip - pageflipper for TIFF animations * Copyright (C) 1999 Mark B. Allan (mba@reptilelabour.com) * * "flip" is free software; you can redistribute it and/or use * it and/or modify it under the terms of the "Artistic License" */ #include "FileDialog.h" #include #include #include "Config.h" extern int e_fontM; extern const char* e_fontFace; static char tempString[256]; //============================================================================== FileDialog::FileDialog(QWidget *parent) : QFileDialog (parent, 0, true) { setMode(ExistingFile); maxFrames = 0; numHistory = 0; homeDir = 0; filename = ""; dirList.setAutoDelete(true); QStringList filters; filters.append("tif files (*.tif)"); filters.append("tiff files (*.tiff)"); filters.append("TIF files (*.TIF)"); filters.append("TIFF files (*.TIFF)"); filters.append("All files (*)"); setFilters(filters); setFont ( QFont(e_fontFace, e_fontM) ); readPreviousDirList(); loadOptsWidget = new LoadOptionsWidget(dirList, this); addWidgets(0, loadOptsWidget, 0); setDir(dirList.at(0)); QObject::connect(loadOptsWidget->dirCombo, SIGNAL(activated(const QString&)), SLOT(setDir(const QString&)) ); resize(480, 480); } FileDialog::~FileDialog() { } //-------------------------------------------------------------------- void FileDialog::done(int r) { QString tmp; if(r == QDialog::Accepted) { filename = selectedFile(); tmp = loadOptsWidget->maxFrameInput->text(); maxFrames = tmp.toInt(); writePreviousDirList(); } else { filename = ""; maxFrames = 0; } QDialog::done(r); } //-------------------------------------------------------------------- void FileDialog::readPreviousDirList() { // warning("FileDialog::readPreviousDirList()"); // if there are errors here, just forget it. This feature is // a nicity, not a necessity char buffer[256]; int stringLength; QString tempQString; QDir checkDir; QFile checkFile; bool ok; homeDir = getenv("HOME"); if (!homeDir) return; // no HOME environment? Should I warn about this? checkDir.setPath("."); //put current directory in list sprintf(tempString, "%s/.ReptileLabour/DirHistory/%s.rdh", homeDir, "flip"); checkFile.setName(tempString); if (checkFile.exists()) { if ( ! checkFile.open(IO_ReadOnly) ) // if I can't read it, forget it. return; else { checkFile.readLine(buffer, 255); tempQString = buffer; numHistory = tempQString.toInt(&ok); if (!ok) numHistory = 0; while ( (stringLength = checkFile.readLine(buffer, 255)) > 0 ) { if ( stringLength > 1 ) { buffer[stringLength-1] = 0; //get rid of newline checkDir.setPath(buffer); if ( checkDir.exists() ) { dirList.insert(0, buffer); } } } checkFile.close(); } } else { //If previous history file doesn't exist, create appropriate directories numHistory = 2; sprintf(tempString, "%s/.ReptileLabour", homeDir); if ( ! checkDir.cd(tempString) ) if ( ! checkDir.mkdir(tempString) ) return; //can't cd to it or create it...forget it. sprintf(tempString, "%s/.ReptileLabour/DirHistory", homeDir); if ( ! checkDir.cd(tempString) ) if ( ! checkDir.mkdir(tempString) ) return; //can't cd to it or create it...forget it. //if we made it to this point, the dirs should be in place //so that a directory file can now be written. } } //-------------------------------------------------------------------- void FileDialog::writePreviousDirList() { const QDir *currentDir = dir(); char *pBuffer; QFile dirFile; QString numHistoryString; int stop; int index; // warning("FileDialog::writePreviousDirList()"); if ( (index = dirList.find(currentDir->path())) != 0) { if (index > 0) { dirList.remove((uint)index); dirList.insert(0, currentDir->path()); } else dirList.insert(0, currentDir->path()); } sprintf(tempString, "%s/.ReptileLabour/DirHistory/%s.rdh", homeDir, "flip"); dirFile.setName(tempString); if ( (stop = (int)dirList.count()-1) > numHistory-1 ) stop = numHistory-1; if( dirFile.open(IO_WriteOnly) ) { numHistoryString.setNum(numHistory); dirFile.writeBlock(numHistoryString, numHistoryString.length()); dirFile.writeBlock("\n", 1); for (int i = stop; i >= 0; i--) { pBuffer = dirList.at(i); dirFile.writeBlock(pBuffer, strlen(pBuffer)); dirFile.writeBlock("\n", 1); } dirFile.close(); } else warning ("Couldn't open directory history file for writing."); loadOptsWidget->dirCombo->clear(); loadOptsWidget->dirCombo->insertStrList(dirList); } //-------------------------------------------------------------------- void FileDialog::setNumHistory(int in) { numHistory = in; writePreviousDirList(); } //============================================================================== LoadOptionsWidget::LoadOptionsWidget(QStrList& dirList, FileDialog *parent, const char* name) : QFrame(parent, name) { setFrameStyle(QFrame::Box | QFrame::Sunken); dirCombo = new QComboBox(this); dirCombo->insertStrList(dirList); QToolTip::add(dirCombo, "Previous directories" ); resizeLabel = new QLabel(this); resizeLabel->setAlignment( AlignVCenter | AlignRight ); resizeLabel->setText("resize images : "); QToolTip::add( resizeLabel, "Reduce or enlarge image\nfor playback purposes." ); resizeCombo = new QComboBox(this); resizeCombo->insertItem(" 200% "); resizeCombo->insertItem(" 100% "); resizeCombo->insertItem(" 50% "); resizeCombo->insertItem(" 33% "); resizeCombo->insertItem(" 25% "); resizeCombo->setCurrentItem(1); maxFrameLabel = new QLabel(this); maxFrameLabel->setAlignment( AlignVCenter | AlignRight ); maxFrameLabel->setText("max frames : "); QToolTip::add( maxFrameLabel, "Set the maximum number of images to read." ); Config *cfg = Config::getInstance(); char num[32]; snprintf(num, 32, "%d", cfg->loadFrames); maxFrameInput = new QLineEdit(this); maxFrameInput->setText(num); intValid = new QIntValidator(1, 50000, maxFrameInput); maxFrameInput->setValidator(intValid); resizeCombo->setFixedHeight(maxFrameInput->sizeHint().height()); dirCombo->setFixedHeight(maxFrameInput->sizeHint().height()); topVLayout = new QVBoxLayout(this, 10, 5); hLayout = new QHBoxLayout(5); topVLayout->addWidget(dirCombo, 0); topVLayout->addLayout(hLayout); hLayout->addWidget(resizeLabel, 1); hLayout->addWidget(resizeCombo, 0); hLayout->addWidget(maxFrameLabel, 1); hLayout->addWidget(maxFrameInput, 0); } LoadOptionsWidget::~LoadOptionsWidget() { }