00001 #ifndef SETTINGSDIALOG_H
00002 #define SETTINGSDIALOG_H
00003
00004 #include <QDialog>
00005 #include <QtGui>
00006
00007 enum {
00008 COLORMAP_SIZE = 1000,
00009 PREVIEW_SIZE = 100,
00010 ICON_SIZE = 50,
00011 DEFAULT_WIDTH = 1024,
00012 DEFAULT_HEIGHT = 768,
00013 DEFAULT_SUBSTEP = 4,
00014 DEFAULT_ITERMAX = 1000
00015 };
00016
00017 enum EFractalType{
00018 MANDELBROT,
00019 BUDDHABROT,
00020 JULIA,
00021 CLIFFORD,
00022 NOVA,
00023 CRAB,
00024 NEWTON,
00025 BURNINGSHIP,
00026 TRICORN,
00027 FRACTAL_TYPE_COUNT
00028 };
00029
00030 struct FractalSettings
00031 {
00032 EFractalType fractalType;
00033 int width;
00034 int height;
00035 int subStepX;
00036 int subStepY;
00037 QPointF center;
00038 QRectF range;
00039 double stepBetweenPoints;
00040 int maxIterations;
00041 int repeatAll;
00042 };
00043
00044 const int PRECISION_DIGITS = 9;
00045 const double PRECISION = pow(10, -PRECISION_DIGITS);
00046 const double DEFAULT_RIGHT = 2.0;
00047 const double DEFAULT_LEFT = -DEFAULT_RIGHT;
00048 const double DEFAULT_STEP = (DEFAULT_RIGHT-DEFAULT_LEFT)/DEFAULT_WIDTH;
00049 const double DEFAULT_TOP = DEFAULT_STEP*DEFAULT_HEIGHT/2;
00050 const double DEFAULT_BOTTOM = -DEFAULT_TOP;
00051 const QPointF DEFAULT_CENTER= QPointF(0,0);
00052 const QRectF DEFAULT_RANGE = QRectF(QPointF(DEFAULT_LEFT, DEFAULT_TOP),
00053 QPointF(DEFAULT_RIGHT, DEFAULT_BOTTOM));
00054
00055 const FractalSettings defaultSettings[FRACTAL_TYPE_COUNT]=
00056 {
00057 {MANDELBROT,
00058 DEFAULT_WIDTH,
00059 DEFAULT_HEIGHT,
00060 DEFAULT_SUBSTEP,
00061 DEFAULT_SUBSTEP,
00062 DEFAULT_CENTER,
00063 DEFAULT_RANGE,
00064 DEFAULT_STEP,
00065 DEFAULT_ITERMAX,
00066 1},
00067 {BUDDHABROT,
00068 DEFAULT_WIDTH,
00069 DEFAULT_HEIGHT,
00070 16,
00071 16,
00072 DEFAULT_CENTER,
00073 DEFAULT_RANGE,
00074 DEFAULT_STEP,
00075 500,
00076 10},
00077 {JULIA,
00078 DEFAULT_WIDTH,
00079 DEFAULT_HEIGHT,
00080 DEFAULT_SUBSTEP,
00081 DEFAULT_SUBSTEP,
00082 DEFAULT_CENTER,
00083 DEFAULT_RANGE,
00084 DEFAULT_STEP,
00085 DEFAULT_ITERMAX,
00086 1},
00087 {CLIFFORD,
00088 DEFAULT_WIDTH,
00089 DEFAULT_HEIGHT,
00090 DEFAULT_SUBSTEP,
00091 DEFAULT_SUBSTEP,
00092 DEFAULT_CENTER,
00093 DEFAULT_RANGE,
00094 DEFAULT_STEP,
00095 DEFAULT_ITERMAX,
00096 1},
00097 {NOVA,
00098 DEFAULT_WIDTH,
00099 DEFAULT_HEIGHT,
00100 DEFAULT_SUBSTEP,
00101 DEFAULT_SUBSTEP,
00102 DEFAULT_CENTER,
00103 DEFAULT_RANGE,
00104 DEFAULT_STEP,
00105 DEFAULT_ITERMAX,
00106 1},
00107 {CRAB,
00108 DEFAULT_WIDTH,
00109 DEFAULT_HEIGHT,
00110 DEFAULT_SUBSTEP,
00111 DEFAULT_SUBSTEP,
00112 DEFAULT_CENTER,
00113 DEFAULT_RANGE,
00114 DEFAULT_STEP,
00115 DEFAULT_ITERMAX,
00116 1},
00117 {NEWTON,
00118 DEFAULT_WIDTH,
00119 DEFAULT_HEIGHT,
00120 DEFAULT_SUBSTEP,
00121 DEFAULT_SUBSTEP,
00122 DEFAULT_CENTER,
00123 DEFAULT_RANGE,
00124 DEFAULT_STEP,
00125 DEFAULT_ITERMAX,
00126 1},
00127 {BURNINGSHIP,
00128 DEFAULT_WIDTH,
00129 DEFAULT_HEIGHT,
00130 DEFAULT_SUBSTEP,
00131 DEFAULT_SUBSTEP,
00132 DEFAULT_CENTER,
00133 DEFAULT_RANGE,
00134 DEFAULT_STEP,
00135 DEFAULT_ITERMAX,
00136 1},
00137 {TRICORN,
00138 DEFAULT_WIDTH,
00139 DEFAULT_HEIGHT,
00140 DEFAULT_SUBSTEP,
00141 DEFAULT_SUBSTEP,
00142 DEFAULT_CENTER,
00143 DEFAULT_RANGE,
00144 DEFAULT_STEP,
00145 DEFAULT_ITERMAX,
00146 1},
00147 };
00148
00149
00150 QT_BEGIN_NAMESPACE
00151
00152
00153
00154 class QtGui;
00155 QT_END_NAMESPACE
00156
00157
00158 class CSettings : public QDialog
00159 {
00160 Q_OBJECT
00161
00162 public:
00163 CSettings(FractalSettings settings=defaultSettings[0], QWidget *parent=0);
00164 static const char *typeStrings[FRACTAL_TYPE_COUNT];
00165 static const char *iconFileNames[FRACTAL_TYPE_COUNT];
00166 static const char *bgFileName;
00167 FractalSettings getSettings();
00168
00169 signals:
00170 void launchNewFractal(const FractalSettings settings);
00171
00172 private slots:
00173 void showSettingsForType(int fracType);
00174 void xStartChanged(double value) {xStopSpin ->setMinimum(value+PRECISION);}
00175 void xStopChanged (double value) {xStartSpin->setMaximum(value+PRECISION);}
00176 void yStartChanged(double value) {yStopSpin ->setMinimum(value+PRECISION);}
00177 void yStopChanged (double value) {yStartSpin->setMaximum(value+PRECISION);}
00178 void accept();
00179 void cancel();
00180
00181 private:
00182 FractalSettings dialogSettings, initialSettings;
00183 void setSettings(FractalSettings newSettings);
00184
00185 QComboBox *typeCombo;
00186
00187 QDoubleSpinBox *xStartSpin;
00188 QDoubleSpinBox *xStopSpin;
00189 QDoubleSpinBox *yStartSpin;
00190 QDoubleSpinBox *yStopSpin;
00191
00192 QSpinBox *widthSpin;
00193 QSpinBox *heightSpin;
00194
00195 QSpinBox *iterSpin;
00196
00197 QDialogButtonBox *dialogButtons;
00198 };
00199
00200 #endif // SETTINGSDIALOG_H