浏览代码

ui bettering

Nicolas Winkler 5 年之前
父节点
当前提交
30df306cc3
共有 8 个文件被更改,包括 160 次插入41 次删除
  1. 7 5
      Almond.cpp
  2. 1 0
      Almond.h
  3. 67 18
      choosegenerators.cpp
  4. 17 3
      choosegenerators.h
  5. 53 4
      choosegenerators.ui
  6. 10 10
      libmandel/include/Generators.h
  7. 4 0
      libmandel/src/Generators.cpp
  8. 1 1
      libmandel/src/IterationGenerator.cpp

+ 7 - 5
Almond.cpp

@@ -172,17 +172,19 @@ void Almond::on_displayInfo_stateChanged(int checked)
 void Almond::on_chooseGenerator_clicked()
 {
     if (!generatorsDialog)
-        generatorsDialog = std::make_unique<ChooseGenerators>(mandelContext, mandelContext.getDefaultGenerator(), *this);
+        generatorsDialog = std::make_unique<ChooseGenerators>(mandelContext, *this);
     generatorsDialog->exec();
 
-    if (generatorsDialog->getChosenGenerator()) {
-        mandelGenerator = generatorsDialog->getChosenGenerator();
+    auto gen = generatorsDialog->extractChosenGenerator();
+    if (gen) {
+        currentGenerator = gen.get();
+        adjustedGenerators.push_back(std::move(gen));
     }
     else {
-        mandelGenerator = &mandelContext.getDefaultGenerator();
+        //mandelGenerator = &mandelContext.getDefaultGenerator();
     }
     //this->currentView = MANDELBROT;
-    this->mw->setGenerator(mandelGenerator);
+    this->mw->setGenerator(currentGenerator);
     //this->mw->getMandelInfo().julia = false;
     //printf("dialog executed\n"); fflush(stdout);
 }

+ 1 - 0
Almond.h

@@ -41,6 +41,7 @@ private:
     GradientChooseDialog gcd;
 
     std::vector<std::unique_ptr<mnd::MandelGenerator>> compiledGenerators;
+    std::vector<std::unique_ptr<mnd::AdaptiveGenerator>> adjustedGenerators;
 
     ViewType currentView;
     mnd::MandelViewport mandelViewSave;

+ 67 - 18
choosegenerators.cpp

@@ -124,15 +124,13 @@ void Benchmarker::run(void)
 }
 
 
-ChooseGenerators::ChooseGenerators(mnd::MandelContext& mndCtxt, mnd::AdaptiveGenerator& generator,
-                                   std::vector<mnd::MandelGenerator*> allGenerators, Almond& owner) :
+ChooseGenerators::ChooseGenerators(mnd::MandelContext& mndCtxt, Almond& owner) :
     QDialog{ &owner },
     owner{ owner },
     ui{ std::make_unique<Ui::ChooseGenerators>() },
     mndCtxt{ mndCtxt },
     tableContent{},
-    generator{ generator },
-    allGenerators{ allGenerators }
+    generator{ mndCtxt.getDefaultGenerator() }
 {
     ui->setupUi(this);
     ui->progressBar->setRange(0, 1000);
@@ -177,15 +175,7 @@ ChooseGenerators::ChooseGenerators(mnd::MandelContext& mndCtxt, mnd::AdaptiveGen
     }
     ui->table->resizeColumnsToContents();
 
-    std::vector<mnd::GeneratorType> generatorTypes;
-
-    for (auto* gen : allGenerators) {
-        if(gen->getPrecision()) {
-
-        }
-    }
-
-    //std::vector<mnd::GeneratorType> generatorTypes = mndCtxt.getSupportedTypes();
+    std::vector<mnd::GeneratorType> generatorTypes = mndCtxt.getSupportedTypes();
     for (size_t i = 0; i < generatorTypes.size(); i++) {
         int rowCount = ui->generatorTable->rowCount();
         ui->generatorTable->insertRow(rowCount);
@@ -219,6 +209,17 @@ ChooseGenerators::ChooseGenerators(mnd::MandelContext& mndCtxt, mnd::AdaptiveGen
 }
 
 
+ChooseGenerators::ChooseGenerators(mnd::MandelContext& mndCtxt, mnd::GeneratorCollection& gc, Almond& owner) :
+    QDialog{ &owner },
+    owner{ owner },
+    ui{ std::make_unique<Ui::ChooseGenerators>() },
+    mndCtxt{ mndCtxt },
+    tableContent{},
+    generator{ mndCtxt.getDefaultGenerator() }
+{
+}
+
+
 ChooseGenerators::~ChooseGenerators()
 {
 }
@@ -244,6 +245,23 @@ QLineEdit* ChooseGenerators::createFloatText(void)
 }
 
 
+void ChooseGenerators::addRowAt(int index)
+{
+    ui->table->insertRow(index);
+    QLineEdit* le = createFloatText();
+    QComboBox* comboBox = createComboBox();
+    le->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Expanding);
+    comboBox->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Expanding);
+    ui->table->setCellWidget(index, 0, le);
+    ui->table->setCellWidget(index, 1, comboBox);
+    tableContent.push_back({ le, comboBox });
+    comboBox->setCurrentIndex(0);
+    le->setText("0.0");
+    comboBox->adjustSize();
+    le->adjustSize();
+}
+
+
 void ChooseGenerators::setBenchmarkResult(int row, float percentage, double result)
 {
     this->ui->generatorTable->setItem(row, 2, new QTableWidgetItem);
@@ -255,24 +273,39 @@ void ChooseGenerators::setBenchmarkResult(int row, float percentage, double resu
 void ChooseGenerators::on_buttonBox_accepted()
 {
     //if (!chosenGenerator)
-    static auto adGen = std::make_unique<mnd::AdaptiveGenerator>();
+    chosenGenerator = std::make_unique<mnd::AdaptiveGenerator>();
     //createdGenerator->clear();
     try {
-        for (size_t i = 0; i < tableContent.size(); i++) {
+        /*for (size_t i = 0; i < tableContent.size(); i++) {
             QString precString = tableContent.at(i).first->text();
             QString genString = tableContent.at(i).second->currentText();
 
             mnd::Real precision = mnd::Real(precString.toStdString().c_str());
             mnd::MandelGenerator* generator = generators.at(genString);
             if (generator)
-                adGen->addGenerator(precision, *generator);
+                chosenGenerator->addGenerator(precision, *generator);
+        }*/
+        for (size_t i = 0; i < ui->table->rowCount(); i++) {
+            QLineEdit* precItem = dynamic_cast<QLineEdit*>(ui->table->cellWidget(0, i));
+            QWidget* genWidget = ui->table->cellWidget(1, i);
+            QComboBox* genItem = dynamic_cast<QComboBox*>(genWidget);
+            if (precItem && genItem) {
+                QString precString = precItem->text();
+                QString genString = genItem->currentText();
+
+                printf("%s, %s\n", precString.toStdString().c_str(), genString.toStdString().c_str()); fflush(stdout);
+
+                mnd::Real precision = mnd::Real(precString.toStdString().c_str());
+                mnd::MandelGenerator* generator = generators.at(genString);
+                if (generator)
+                    chosenGenerator->addGenerator(precision, *generator);
+            }
         }
     }
     catch(...) {
         // TODO
-        adGen = nullptr;
+        chosenGenerator = nullptr;
     }
-    chosenGenerator = adGen.get();
 }
 
 
@@ -320,3 +353,19 @@ void ChooseGenerators::on_benchmark_clicked()
 }
 
 
+
+void ChooseGenerators::on_addRow_clicked()
+{
+    int index = ui->table->rowCount();
+    auto selected = ui->table->selectedRanges();
+    if (!selected.empty())
+        index = selected.last().bottomRow() + 1;
+    addRowAt(index);
+}
+
+void ChooseGenerators::on_removeRow_clicked()
+{
+    auto selected = ui->table->selectedRanges();
+    if (!selected.empty())
+        ui->table->removeRow(selected.last().bottomRow());
+}

+ 17 - 3
choosegenerators.h

@@ -67,7 +67,9 @@ private:
     mnd::MandelContext& mndCtxt;
     std::map<QString, mnd::MandelGenerator*> generators;
     std::vector<std::pair<QLineEdit*, QComboBox*>> tableContent;
-    mnd::MandelGenerator* chosenGenerator;
+
+    std::unique_ptr<mnd::AdaptiveGenerator> chosenGenerator;
+
     std::vector<mnd::MandelGenerator*> actualGenerators;
 
     mnd::AdaptiveGenerator& generator;
@@ -76,14 +78,24 @@ private:
     std::unique_ptr<QValidator> floatValidator;
     QThreadPool benchmarker;
 public:
-    ChooseGenerators(mnd::MandelContext& mndCtxt, mnd::AdaptiveGenerator& generator, std::vector<mnd::MandelGenerator*> allGenerators, Almond& owner);
+    /*!
+     * \brief create a dialog that lets choose from the default mandelbrot generators
+     */
+    ChooseGenerators(mnd::MandelContext& mndCtxt, Almond& owner);
+
+    /*!
+     * \brief create a dialog that lets choose from the default mandelbrot generators
+     */
+    ChooseGenerators(mnd::MandelContext& mndCtxt, mnd::GeneratorCollection& gc, Almond& owner);
     ~ChooseGenerators();
 
-    inline mnd::MandelGenerator* getChosenGenerator(void) { return chosenGenerator; }
+    inline std::unique_ptr<mnd::AdaptiveGenerator> extractChosenGenerator(void) { return std::move(chosenGenerator); }
 
 private:
     QComboBox* createComboBox(void);
     QLineEdit* createFloatText(void);
+
+    void addRowAt(int index);
 public slots:
 
 private slots:
@@ -93,6 +105,8 @@ private slots:
     void on_generatorTable_cellDoubleClicked(int row, int column);
     void on_compile_clicked();
     void on_benchmark_clicked();
+    void on_addRow_clicked();
+    void on_removeRow_clicked();
 };
 
 #endif // CHOOSEGENERATORS_H

+ 53 - 4
choosegenerators.ui

@@ -21,7 +21,7 @@
        <item>
         <widget class="QTabWidget" name="tabWidget">
          <property name="currentIndex">
-          <number>0</number>
+          <number>1</number>
          </property>
          <widget class="QWidget" name="tab">
           <attribute name="title">
@@ -39,12 +39,12 @@
              <attribute name="horizontalHeaderVisible">
               <bool>false</bool>
              </attribute>
-             <attribute name="horizontalHeaderMinimumSectionSize">
-              <number>100</number>
-             </attribute>
              <attribute name="horizontalHeaderDefaultSectionSize">
               <number>180</number>
              </attribute>
+             <attribute name="horizontalHeaderMinimumSectionSize">
+              <number>100</number>
+             </attribute>
              <attribute name="verticalHeaderVisible">
               <bool>false</bool>
              </attribute>
@@ -143,6 +143,49 @@
           </attribute>
           <layout class="QVBoxLayout" name="verticalLayout_4">
            <item>
+            <layout class="QHBoxLayout" name="horizontalLayout_4">
+             <item>
+              <widget class="QPushButton" name="addRow">
+               <property name="sizePolicy">
+                <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                 <horstretch>0</horstretch>
+                 <verstretch>0</verstretch>
+                </sizepolicy>
+               </property>
+               <property name="text">
+                <string>+</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QPushButton" name="removeRow">
+               <property name="sizePolicy">
+                <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                 <horstretch>0</horstretch>
+                 <verstretch>0</verstretch>
+                </sizepolicy>
+               </property>
+               <property name="text">
+                <string>-</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <spacer name="horizontalSpacer">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+            </layout>
+           </item>
+           <item>
             <widget class="QTableWidget" name="table">
              <property name="sizePolicy">
               <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
@@ -150,6 +193,12 @@
                <verstretch>0</verstretch>
               </sizepolicy>
              </property>
+             <property name="selectionMode">
+              <enum>QAbstractItemView::SingleSelection</enum>
+             </property>
+             <property name="selectionBehavior">
+              <enum>QAbstractItemView::SelectRows</enum>
+             </property>
              <property name="columnCount">
               <number>2</number>
              </property>

+ 10 - 10
libmandel/include/Generators.h

@@ -62,16 +62,16 @@ namespace mnd
 
     template<typename T>
     Precision getType(void);
-    template<> Precision getType<float>() { return Precision::FLOAT; }
-    template<> Precision getType<double>() { return Precision::DOUBLE; }
-    template<> Precision getType<DoubleDouble>() { return Precision::DOUBLE_DOUBLE; }
-    template<> Precision getType<QuadDouble>() { return Precision::QUAD_DOUBLE; }
-    template<> Precision getType<Fixed64>() { return Precision::FIXED64; }
-    template<> Precision getType<Fixed128>() { return Precision::FIXED128; }
-    template<> Precision getType<Fixed512>() { return Precision::FIXED512; }
-    template<> Precision getType<Float128>() { return Precision::FLOAT128; }
-    template<> Precision getType<Float256>() { return Precision::FLOAT256; }
-    template<> Precision getType<Float512>() { return Precision::FLOAT512; }
+    template<> inline Precision getType<float>() { return Precision::FLOAT; }
+    template<> inline Precision getType<double>() { return Precision::DOUBLE; }
+    template<> inline Precision getType<DoubleDouble>() { return Precision::DOUBLE_DOUBLE; }
+    template<> inline Precision getType<QuadDouble>() { return Precision::QUAD_DOUBLE; }
+    template<> inline Precision getType<Fixed64>() { return Precision::FIXED64; }
+    template<> inline Precision getType<Fixed128>() { return Precision::FIXED128; }
+    template<> inline Precision getType<Fixed512>() { return Precision::FIXED512; }
+    template<> inline Precision getType<Float128>() { return Precision::FLOAT128; }
+    template<> inline Precision getType<Float256>() { return Precision::FLOAT256; }
+    template<> inline Precision getType<Float512>() { return Precision::FLOAT512; }
 }
 
 

+ 4 - 0
libmandel/src/Generators.cpp

@@ -101,8 +101,12 @@ namespace mnd
             { Precision::DOUBLE, getPrecision<double>() },
             { Precision::DOUBLE_DOUBLE, Real("1.0e-29") },
             { Precision::QUAD_DOUBLE, Real("1.0e-56") },
+            { Precision::FIXED64, Real("3.5e-15") },
             { Precision::FIXED128, Real("1.317e-29") },
+            { Precision::FIXED512, Real("1.5e-130") },
+            { Precision::FLOAT128, Real("1.5e-29") },
             { Precision::FLOAT256, Real("1.0e-58") },
+            { Precision::FLOAT512, Real("1.0e-145") },
             { Precision::INF_PREC, Real(0.0) },
         };
 

+ 1 - 1
libmandel/src/IterationGenerator.cpp

@@ -330,7 +330,7 @@ std::string CompiledGenerator::dump(void) const
 
 #ifdef WITH_OPENCL
 CompiledClGenerator::CompiledClGenerator(mnd::MandelDevice& device, const std::string& code) :
-    ClGeneratorFloat{ device, code, mnd::Precision::FLOAT }
+    ClGeneratorFloat{ device, code }
 {
 }