diff options
Diffstat (limited to 'attic/muse2-oom/muse2/muse/widgets/filedialog.cpp')
-rw-r--r-- | attic/muse2-oom/muse2/muse/widgets/filedialog.cpp | 546 |
1 files changed, 546 insertions, 0 deletions
diff --git a/attic/muse2-oom/muse2/muse/widgets/filedialog.cpp b/attic/muse2-oom/muse2/muse/widgets/filedialog.cpp new file mode 100644 index 00000000..d2b189b6 --- /dev/null +++ b/attic/muse2-oom/muse2/muse/widgets/filedialog.cpp @@ -0,0 +1,546 @@ +//========================================================= +// MusE +// Linux Music Editor +// $Id: filedialog.cpp,v 1.3.2.3 2005/06/19 06:32:07 lunar_shuttle Exp $ +// (C) Copyright 2000 Werner Schweer (ws@seh.de) +//========================================================= + +#include <errno.h> + +#include <QIcon> +#include <QMessageBox> +#include <QPixmap> +#include <QSplitter> +#include <QStringList> + +#include "icons.h" +#include "filedialog.h" +#include "../globals.h" +#include "gconfig.h" + +MFileDialog::ViewType MFileDialog::lastViewUsed = GLOBAL_VIEW; +QString MFileDialog::lastUserDir = ""; +QString MFileDialog::lastGlobalDir = ""; + +//--------------------------------------------------------- +// createDir +// return true if dir could not created +//--------------------------------------------------------- + +static bool createDir(const QString& s) + { + QString sl("/"); + QStringList l = s.split(sl, QString::SkipEmptyParts); + QString path(sl); + QDir dir; + for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) { + dir.setPath(path); + if (!QDir(path + sl + *it).exists()) { + if (!dir.mkdir(*it)) { + printf("mkdir failed: %s %s\n", + path.toLatin1().constData(), (*it).toLatin1().constData()); + return true; + } + } + path += sl; + path += *it; + } + return false; + } + +//--------------------------------------------------------- +// testDirCreate +// return true if dir does not exist +//--------------------------------------------------------- + +static bool testDirCreate(QWidget* parent, const QString& path) +{ + QDir dir(path); + if (!dir.exists()) + { + if(QMessageBox::information(parent, + QWidget::tr("MusE: get file name"), + QWidget::tr("The directory\n") + path + + QWidget::tr("\ndoes not exist.\nCreate it?"), + QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok) != QMessageBox::Ok) + return true; + + if (createDir(path)) + { + QMessageBox::critical(parent, + QWidget::tr("MusE: create directory"), + QWidget::tr("creating dir failed")); + return true; + } + } + return false; +} + +//--------------------------------------------------------- +// globalToggled +//--------------------------------------------------------- + +void MFileDialog::globalToggled(bool flag) + { + if (flag) { + buttons.userButton->setChecked(!flag); + buttons.projectButton->setChecked(!flag); + if (lastGlobalDir.isEmpty()) + lastGlobalDir = museGlobalShare + QString("/") + baseDir; // Initialize if first time + QString dir = lastGlobalDir; + setDirectory(dir); + lastViewUsed = GLOBAL_VIEW; + } + } + +//--------------------------------------------------------- +// userToggled +//--------------------------------------------------------- + +void MFileDialog::userToggled(bool flag) + { + if (flag) { + buttons.globalButton->setChecked(!flag); + buttons.projectButton->setChecked(!flag); + + + if (lastUserDir.isEmpty()) { + lastUserDir = museUser + QString("/") + baseDir; // Initialize if first time + } + + if (testDirCreate(this, lastUserDir)) + setDirectory(museUser); + else + setDirectory(lastUserDir); + + lastViewUsed = USER_VIEW; + } + } + +//--------------------------------------------------------- +// projectToggled +//--------------------------------------------------------- + +void MFileDialog::projectToggled(bool flag) + { + if (flag) { + buttons.globalButton->setChecked(!flag); + buttons.userButton->setChecked(!flag); + + QString s; + if (museProject == museProjectInitPath ) { + // if project path is uninitialized, meaning it is still set to museProjectInitPath. + // then project path is set to current pwd instead. + //s = QString(getcwd(0,0)) + QString("/"); + s = config.projectBaseFolder; + } + else + s = museProject + QString("/"); // + baseDir; + + if (testDirCreate(this, s)) + setDirectory(museProject); + else + setDirectory(s); + lastViewUsed = PROJECT_VIEW; + } + } + + +//--------------------------------------------------------- +// MFileDialog +//--------------------------------------------------------- + +MFileDialog::MFileDialog(const QString& dir, + const QString& filter, QWidget* parent, bool writeFlag) + : QFileDialog(parent, QString(), QString("."), filter) + { + showButtons = false; + if (dir.length() > 0 && dir[0] == QChar('/')) { + setDirectory(dir); + } + else { + // We replace the original sidebar widget with our 3-button widget + QLayout* mainlayout = this->layout(); + QSplitter* spl = (QSplitter*)mainlayout->itemAt(2)->widget(); + QWidget* original_sidebarwidget = spl->widget(0); + original_sidebarwidget->setVisible(false); + + baseDir = dir; + showButtons = true; + + spl->insertWidget(0,&buttons); + + // Qt >= 4.6 allows us to select icons from the theme +#if QT_VERSION >= 0x040600 + buttons.globalButton->setIcon(*globalIcon); + buttons.userButton->setIcon(*userIcon); + buttons.projectButton->setIcon(*projectIcon); +#else + buttons.globalButton->setIcon(style()->standardIcon(QStyle::SP_DirIcon)); + buttons.userButton->setIcon(style()->standardIcon(QStyle::SP_DirHomeIcon)); + buttons.projectButton->setIcon(style()->standardIcon(QStyle::SP_DirOpenIcon)); +#endif + + connect(buttons.globalButton, SIGNAL(toggled(bool)), this, SLOT(globalToggled(bool))); + connect(buttons.userButton, SIGNAL(toggled(bool)), this, SLOT(userToggled(bool))); + connect(buttons.projectButton, SIGNAL(toggled(bool)), this, SLOT(projectToggled(bool))); + connect(this, SIGNAL(directoryEntered(const QString&)), SLOT(directoryChanged(const QString&))); + + if (writeFlag) { + setAcceptMode(QFileDialog::AcceptSave); + buttons.globalButton->setEnabled(false); + switch (lastViewUsed) { + case GLOBAL_VIEW: + case PROJECT_VIEW: + buttons.projectButton->setChecked(true); + break; + + case USER_VIEW: + buttons.userButton->setChecked(true); + break; + } + } + else { + switch (lastViewUsed) { + case GLOBAL_VIEW: + buttons.globalButton->setChecked(true); + break; + + case PROJECT_VIEW: + buttons.projectButton->setChecked(true); + break; + + case USER_VIEW: + buttons.userButton->setChecked(true); + break; + } + + } + buttons.loadAllGroup->setVisible(false); + } + } + +//--------------------------------------------------------- +// MFileDialog::directoryChanged +//--------------------------------------------------------- +void MFileDialog::directoryChanged(const QString&) + { + ViewType currentView = GLOBAL_VIEW; + QDir ndir = directory(); + ///QString newdir = ndir.absolutePath().toLatin1(); + QString newdir = ndir.absolutePath(); + if (buttons.projectButton->isChecked()) + currentView = PROJECT_VIEW; + else if (buttons.userButton->isChecked()) + currentView = USER_VIEW; + + switch (currentView) { + case GLOBAL_VIEW: + lastGlobalDir = newdir; + break; + + case USER_VIEW: + lastUserDir = newdir; + break; + + case PROJECT_VIEW: // Do nothing + default: + break; + } + } + + +//--------------------------------------------------------- +// getFilterExtension +//--------------------------------------------------------- + +QString getFilterExtension(const QString &filter) +{ + // + // Return the first extension found. Must contain at least one * character. + // + + int pos = filter.indexOf('*'); + if(pos == -1) + return QString(); + + QString filt; + int len = filter.length(); + ++pos; + for( ; pos < len; ++pos) + { + QChar c = filter[pos]; + if((c == ')') || (c == ';') || (c == ',') || (c == ' ')) + break; + filt += filter[pos]; + } + return filt; +} + +//--------------------------------------------------------- +// getOpenFileName +//--------------------------------------------------------- +QString getOpenFileName(const QString &startWith, + const QStringList& filters, QWidget* parent, const QString& name, bool* all, MFileDialog::ViewType viewType) + { + QString initialSelection; // FIXME Tim. + MFileDialog *dlg = new MFileDialog(startWith, QString::null, parent, false); + dlg->setNameFilters(filters); + dlg->setWindowTitle(name); + if (viewType == MFileDialog::GLOBAL_VIEW) + dlg->globalToggled(true); + else if (viewType == MFileDialog::PROJECT_VIEW) + dlg->projectToggled(true); + else if (viewType == MFileDialog::USER_VIEW) + dlg->userToggled(true); + if (all) { + dlg->buttons.loadAllGroup->setVisible(true); + //dlg->buttons.globalButton->setVisible(false); + } + if (!initialSelection.isEmpty()) + dlg->selectFile(initialSelection); + dlg->setFileMode(QFileDialog::ExistingFile); + QStringList files; + QString result; + if (dlg->exec() == QDialog::Accepted) { + files = dlg->selectedFiles(); + if (!files.isEmpty()) + result = files[0]; + if (all) { + *all = dlg->buttons.loadAllButton->isChecked(); + } + } + delete dlg; + return result; + } + +//--------------------------------------------------------- +// getSaveFileName +//--------------------------------------------------------- + +QString getSaveFileName(const QString &startWith, + //const char** filters, QWidget* parent, const QString& name) + const QStringList& filters, QWidget* parent, const QString& name) + { + MFileDialog *dlg = new MFileDialog(startWith, QString::null, parent, true); + dlg->setNameFilters(filters); + dlg->setWindowTitle(name); + dlg->setFileMode(QFileDialog::AnyFile); + QStringList files; + QString result; + if (dlg->exec() == QDialog::Accepted) { + files = dlg->selectedFiles(); + if (!files.isEmpty()) + result = files[0]; + } + + // Added by T356. + if(!result.isEmpty()) + { + QString filt = dlg->selectedNameFilter(); + filt = getFilterExtension(filt); + // Do we have a valid extension? + if(!filt.isEmpty()) + { + // If the rightmost characters of the filename do not already contain + // the extension, add the extension to the filename. + //if(result.right(filt.length()) != filt) + if(!result.endsWith(filt)) + result += filt; + } + else + { + // No valid extension, or just * was given. Although it would be nice to allow no extension + // or any desired extension by commenting this section out, it's probably not a good idea to do so. + // + // NOTE: Most calls to this routine getSaveFileName() are followed by fileOpen(), + // which can tack on its own extension, but only if the *complete* extension is blank. + // So there is some overlap going on. Enabling this actually stops that action, + // but only if there are no errors in the list of filters. fileOpen() will act as a 'catchall'. + // + // Force the filter list to the first one (the preferred one), and then get the filter. + dlg->selectNameFilter(dlg->nameFilters().at(0)); + filt = dlg->selectedNameFilter(); + filt = getFilterExtension(filt); + + // Do we have a valid extension? + if(!filt.isEmpty()) + { + // If the rightmost characters of the filename do not already contain + // the extension, add the extension to the filename. + //if(result.right(filt.length()) != filt) + if(!result.endsWith(filt)) + result += filt; + } + } + } + + delete dlg; + return result; + } + +//--------------------------------------------------------- +// getImageFileName +//--------------------------------------------------------- + +QString getImageFileName(const QString& startWith, + //const char** filters, QWidget* parent, const QString& name) + const QStringList& filters, QWidget* parent, const QString& name) + { + QString initialSelection; + QString* workingDirectory = new QString(QDir::currentPath()); + if (!startWith.isEmpty() ) { + QFileInfo fi(startWith); + if (fi.exists() && fi.isDir()) { + *workingDirectory = startWith; + } + else if (fi.exists() && fi.isFile()) { + *workingDirectory = fi.absolutePath(); + initialSelection = fi.absoluteFilePath(); + } + } + MFileDialog *dlg = new MFileDialog(*workingDirectory, QString::null, + parent); + + /* ORCAN - disable preview for now. It is not available in qt4. We will + need to implement it ourselves. + dlg->setContentsPreviewEnabled(true); + ContentsPreview* preview = new ContentsPreview(dlg); + dlg->setContentsPreview(preview, preview); + dlg->setPreviewMode(QFileDialog::Contents); + */ + dlg->setWindowTitle(name); + dlg->setNameFilters(filters); + dlg->setFileMode(QFileDialog::ExistingFile); + QStringList files; + QString result; + if (!initialSelection.isEmpty()) + dlg->selectFile( initialSelection); + if (dlg->exec() == QDialog::Accepted) { + files = dlg->selectedFiles(); + if (!files.isEmpty()) + result = files[0]; + } + delete dlg; + return result; + } + +//--------------------------------------------------------- +// fileOpen +// opens file "name" with extension "ext" in mode "mode" +// handles "name.ext.bz2" and "name.ext.gz" +// +// mode = "r" or "w" +// popenFlag set to true on return if file was opened +// with popen() (and therefore must be closed +// with pclose()) +// noError show no error if file was not found in "r" +// mode. Has no effect in "w" mode +// overwriteWarning +// warn in "w" mode, if file exists +//--------------------------------------------------------- + +FILE* fileOpen(QWidget* parent, QString name, const QString& ext, + const char* mode, bool& popenFlag, bool noError, + bool overwriteWarning) + { + QFileInfo info(name); + QString zip; + + popenFlag = false; + if (info.completeSuffix() == "") { + name += ext; + info.setFile(name); + } + else if (info.suffix() == "gz") { + popenFlag = true; + zip = QString("gzip"); + } + else if (info.suffix() == "bz2") { + popenFlag = true; + zip = QString("bzip2"); + } + + if (strcmp(mode,"w") == 0 && overwriteWarning && info.exists()) { + QString s(QWidget::tr("File\n") + name + QWidget::tr("\nexists. Overwrite?")); + /* + int rv = QMessageBox::warning(parent, + QWidget::tr("MusE: write"), + s, + QMessageBox::Save | QMessageBox::Cancel, QMessageBox::Save); + switch(rv) { + case 0: // overwrite + break; + case 1: // quit + return 0; + } + */ + if(QMessageBox::warning(parent, + QWidget::tr("MusE: write"), s, + QMessageBox::Save | QMessageBox::Cancel, QMessageBox::Save) + != QMessageBox::Save) + return 0; + + } + FILE* fp = 0; + if (popenFlag) { + if (strcmp(mode, "r") == 0) + zip += QString(" -d < "); + else + zip += QString(" > "); + zip += name; + fp = popen(zip.toAscii().data(), mode); + } + else { + fp = fopen(name.toAscii().data(), mode); + } + if (fp == 0 && !noError) { + QString s(QWidget::tr("Open File\n") + name + QWidget::tr("\nfailed: ") + + QString(strerror(errno))); + QMessageBox::critical(parent, QWidget::tr("MusE: Open File"), s); + return 0; + } + return fp; + } + +//--------------------------------------------------------- +// MFile +//--------------------------------------------------------- + +MFile::MFile(const QString& _path, const QString& _ext) + : path(_path), ext(_ext) + { + f = 0; + isPopen = false; + } + +MFile::~MFile() + { + if (f) { + if (isPopen) + pclose(f); + else + fclose(f); + } + } + +//--------------------------------------------------------- +// open +//--------------------------------------------------------- + +//FILE* MFile::open(const char* mode, const char** pattern, +FILE* MFile::open(const char* mode, const QStringList& pattern, + QWidget* parent, bool noError, bool warnIfOverwrite, const QString& caption) + { + QString name; + if (strcmp(mode, "r") == 0) + name = getOpenFileName(path, pattern, parent, caption, 0); + else + name = getSaveFileName(path, pattern, parent, caption); + if (name.isEmpty()) + return 0; + f = fileOpen(parent, name, ext, mode, isPopen, noError, + warnIfOverwrite); + return f; + } + |