You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
3.8 KiB

#ifndef __qwt3d_io_2003_07_04_23_27__
#define __qwt3d_io_2003_07_04_23_27__
#include <vector>
#include <algorithm>
#include <qstring.h>
#include <qstringlist.h>
#include "qwt3d_global.h"
namespace Qwt3D
{
class Plot3D;
/**
IO provides a generic interface for standard and user written I/O handlers.
It also provides functionality for the registering of such handlers in the
framework.\n
The interface mimics roughly Qt's QImageIO functions for defining
image input/output functions.
*/
class QWT3D_EXPORT IO
{
public:
/*!
The function type that can be processed by the define... members.
An extension is the IO::Functor.
*/
typedef bool (*Function)(Plot3D*, QString const& fname);
/*!
This class gives more flexibility in implementing
userdefined IO handlers than the simple IO::Function type.
*/
class Functor
{
public:
virtual ~Functor() {}
/*! Must clone the content of *this for an object of a derived class with
\c new and return the pointer. Like operator() the predefined Functors
hide this function from the user, still allowing IO access
(friend declaration)
*/
virtual Functor* clone() const = 0;
/*! The workhorse of the user-defined implementation. Eventually, the
framework will call this operator.
*/
virtual bool operator()(Plot3D* plot, QString const& fname) = 0;
};
static bool defineInputHandler( QString const& format, Function func);
static bool defineOutputHandler( QString const& format, Function func);
static bool defineInputHandler( QString const& format, Functor const& func);
static bool defineOutputHandler( QString const& format, Functor const& func);
static bool save(Plot3D*, QString const& fname, QString const& format);
static bool load(Plot3D*, QString const& fname, QString const& format);
static QStringList inputFormatList();
static QStringList outputFormatList();
static Functor* outputHandler(QString const& format);
static Functor* inputHandler(QString const& format);
private:
IO(){}
//! Lightweight Functor encapsulating an IO::Function
class Wrapper : public Functor
{
public:
//! Performs actual input
Functor* clone() const { return new Wrapper(*this); }
//! Creates a Wrapper object from a function pointer
explicit Wrapper(Function h) : hdl(h) {}
//! Returns a pointer to the wrapped function
bool operator()(Plot3D* plot, QString const& fname)
{
return (hdl) ? (*hdl)(plot, fname) : false;
}
private:
Function hdl;
};
struct Entry
{
Entry();
~Entry();
Entry(Entry const& e);
void operator=(Entry const& e);
Entry(QString const& s, Functor const& f);
Entry(QString const& s, Function f);
QString fmt;
Functor* iofunc;
};
struct FormatCompare
{
explicit FormatCompare(Entry const& e);
bool operator() (Entry const& e);
Entry e_;
};
struct FormatCompare2
{
explicit FormatCompare2(QString s);
bool operator() (Entry const& e);
QString s_;
};
typedef std::vector<Entry> Container;
typedef Container::iterator IT;
static bool add_unique(Container& l, Entry const& e);
static IT find(Container& l, QString const& fmt);
static Container& rlist();
static Container& wlist();
static void setupHandler();
};
//! Provides Qt's Pixmap output facilities
class QWT3D_EXPORT PixmapWriter : public IO::Functor
{
friend class IO;
public:
PixmapWriter() : quality_(-1) {}
void setQuality(int val);
private:
IO::Functor* clone() const {return new PixmapWriter(*this);}
bool operator()(Plot3D* plot, QString const& fname);
QString fmt_;
int quality_;
};
} //ns
#endif