diff --git a/apps/opencs/CMakeLists.txt b/apps/opencs/CMakeLists.txt index 02a6c25a0..0ee7c1aea 100644 --- a/apps/opencs/CMakeLists.txt +++ b/apps/opencs/CMakeLists.txt @@ -109,6 +109,8 @@ opencs_units (view/settings rangeview resizeablestackedwidget spinbox + clickspinbox + clickcombobox ) opencs_units_noqt (view/settings @@ -166,7 +168,7 @@ qt4_wrap_ui(OPENCS_UI_HDR ${OPENCS_UI}) qt4_wrap_cpp(OPENCS_MOC_SRC ${OPENCS_HDR_QT}) qt4_add_resources(OPENCS_RES_SRC ${OPENCS_RES}) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) +include_directories(${CMAKE_CURRENT_BINARY_DIR} view/settings) if(APPLE) set (OPENCS_MAC_ICON ${CMAKE_SOURCE_DIR}/files/mac/opencs.icns) diff --git a/apps/opencs/editor.cpp b/apps/opencs/editor.cpp index 5fc2562ed..8590657ad 100644 --- a/apps/opencs/editor.cpp +++ b/apps/opencs/editor.cpp @@ -297,7 +297,7 @@ std::auto_ptr CS::Editor::setupGraphics() std::auto_ptr factory (new sh::Factory (platform)); - std::string shLang = mUserSettings.settingValue("Shiny/language").toStdString(); + std::string shLang = mUserSettings.settingValue("Shader/language").toStdString(); enum sh::Language lang; if(shLang == "CG") lang = sh::Language_CG; else if(shLang == "HLSL") lang = sh::Language_HLSL; diff --git a/apps/opencs/model/settings/usersettings.cpp b/apps/opencs/model/settings/usersettings.cpp index cd9bf6a33..e8ee98277 100644 --- a/apps/opencs/model/settings/usersettings.cpp +++ b/apps/opencs/model/settings/usersettings.cpp @@ -5,9 +5,12 @@ #include #include +#include #include +#include + #include "setting.hpp" #include "support.hpp" #include @@ -344,17 +347,76 @@ void CSMSettings::UserSettings::loadSettings (const QString &fileName) #endif } mSettingCfgDefinitions->setValue("Video/render system", renderSystem.c_str()); - // force shiny language based on render system + // force shader language based on render system if(renderSystem == "Direct3D9 Rendering Subsystem") - mSettingDefinitions->setValue("Shiny/language", "CG"); + mSettingDefinitions->setValue("Shader/language", "CG"); else - mSettingDefinitions->setValue("Shiny/language", "GLSL"); + mSettingDefinitions->setValue("Shader/language", "GLSL"); // check if override entry exists (default: override) if(!mSettingDefinitions->childGroups().contains("Video", Qt::CaseInsensitive)) mSettingDefinitions->setValue("Video/use settings.cfg", "true"); } +QStringList CSMSettings::UserSettings::getOgreOptions(const QString &key, const QString &renderer) +{ + QStringList result; + + Ogre::ConfigOptionMap& renderOpt = + //Ogre::Root::getSingleton().getRenderSystem()->getConfigOptions(); + Ogre::Root::getSingleton().getRenderSystemByName(renderer.toStdString())->getConfigOptions(); + Ogre::ConfigOptionMap::iterator it = renderOpt.begin(); + + uint row = 0; + for(; it != renderOpt.end(); ++it, ++row) + { + Ogre::StringVector::iterator opt_it = it->second.possibleValues.begin(); + uint idx = 0; + + for(; opt_it != it->second.possibleValues.end(); ++opt_it, ++idx) + { + if(strcmp (key.toStdString().c_str(), it->first.c_str()) == 0) + { + result << ((key == "FSAA") ? QString("MSAA ") : QString("")) + + QString::fromStdString((*opt_it).c_str()).simplified(); + } + } + } + + // Sort ascending + qSort(result.begin(), result.end(), naturalSortLessThanCI); + + // Replace the zero option with Off + int index = result.indexOf("MSAA 0"); + + if(index != -1) + result.replace(index, QObject::tr("Off")); + + return result; +} + +QStringList CSMSettings::UserSettings::getShaderLanguageByRenderer(const QString &renderer) +{ + QStringList result; + + if(renderer == "Direct3D9 Rendering Subsystem") + { + result.append("CG"); + result.append("HLSL"); + result.append("None"); + } + else if(renderer == "OpenGL Rendering Subsystem") + { + result.append("GLSL"); + result.append("GLSLES"); + result.append("None"); + } + else + result.append("None"); + + return result; +} + bool CSMSettings::UserSettings::hasSettingDefinitions (const QString &viewKey) const { diff --git a/apps/opencs/model/settings/usersettings.hpp b/apps/opencs/model/settings/usersettings.hpp index 9d9b5c9b0..b45fa3d83 100644 --- a/apps/opencs/model/settings/usersettings.hpp +++ b/apps/opencs/model/settings/usersettings.hpp @@ -76,6 +76,9 @@ namespace CSMSettings { ///Save any unsaved changes in the QSettings object void saveDefinitions() const; + QStringList getShaderLanguageByRenderer(const QString &renderer); + QStringList getOgreOptions(const QString &key, const QString &renderer); + private: void buildSettingModelDefaults(); diff --git a/apps/opencs/view/doc/view.cpp b/apps/opencs/view/doc/view.cpp index 349b1e037..2ac5d7236 100644 --- a/apps/opencs/view/doc/view.cpp +++ b/apps/opencs/view/doc/view.cpp @@ -32,6 +32,14 @@ void CSVDoc::View::closeEvent (QCloseEvent *event) event->ignore(); else { + // save window size first + CSMSettings::UserSettings::instance().setDefinitions( + "Window Size/Width", + QStringList(QString::number(frameGeometry().width()))); + CSMSettings::UserSettings::instance().setDefinitions( + "Window Size/Height", + QStringList(QString::number(frameGeometry().height()))); + CSMSettings::UserSettings::instance().saveDefinitions(); // closeRequest() returns true if last document mViewManager.removeDocAndView(mDocument); } diff --git a/apps/opencs/view/settings/clickcombobox.cpp b/apps/opencs/view/settings/clickcombobox.cpp new file mode 100644 index 000000000..f313ffe84 --- /dev/null +++ b/apps/opencs/view/settings/clickcombobox.cpp @@ -0,0 +1,9 @@ +#include "clickcombobox.hpp" + +#include + +void ClickComboBox::mouseReleaseEvent(QMouseEvent *e) +{ + emit mouseReleased(); +} + diff --git a/apps/opencs/view/settings/clickcombobox.hpp b/apps/opencs/view/settings/clickcombobox.hpp new file mode 100644 index 000000000..f3385f407 --- /dev/null +++ b/apps/opencs/view/settings/clickcombobox.hpp @@ -0,0 +1,20 @@ +#ifndef CSVSETTINGS_CLICKCOMBOBOX_H +#define CSVSETTINGS_CLICKCOMBOBOX_H + +#include +#include + +class ClickComboBox : public QComboBox +{ + Q_OBJECT + + public: + explicit ClickComboBox(QWidget *parent = 0) { } + void mouseReleaseEvent(QMouseEvent *e); + + signals: + void mouseReleased(); + +}; + +#endif /* CSVSETTINGS_CLICKCOMBOBOX_H */ diff --git a/apps/opencs/view/settings/clickspinbox.cpp b/apps/opencs/view/settings/clickspinbox.cpp new file mode 100644 index 000000000..e94b9b3d0 --- /dev/null +++ b/apps/opencs/view/settings/clickspinbox.cpp @@ -0,0 +1,11 @@ +#include "clickspinbox.hpp" + +#include +#include + +void ClickSpinBox::mouseReleaseEvent(QMouseEvent *e) +{ + std::cout << "emit" << std::endl; + emit mouseReleased(); +} + diff --git a/apps/opencs/view/settings/clickspinbox.hpp b/apps/opencs/view/settings/clickspinbox.hpp new file mode 100644 index 000000000..0db534e51 --- /dev/null +++ b/apps/opencs/view/settings/clickspinbox.hpp @@ -0,0 +1,20 @@ +#ifndef CSVSETTINGS_CLICKSPINBOX_H +#define CSVSETTINGS_CLICKSPINBOX_H + +#include +#include + +class ClickSpinBox : public QSpinBox +{ + Q_OBJECT + + public: + explicit ClickSpinBox(QWidget *parent = 0) { } + void mouseReleaseEvent(QMouseEvent *e); + + signals: + void mouseReleased(); + +}; + +#endif /* CSVSETTINGS_CLICKSPINBOX_H */ diff --git a/apps/opencs/view/settings/settingsdialog.cpp b/apps/opencs/view/settings/settingsdialog.cpp index b49ab2c34..34a6c5527 100644 --- a/apps/opencs/view/settings/settingsdialog.cpp +++ b/apps/opencs/view/settings/settingsdialog.cpp @@ -5,7 +5,6 @@ #include -#include #include "../../model/settings/usersettings.hpp" namespace @@ -49,14 +48,35 @@ QString getCurrentOgreResolution() if(it->first == "Video Mode" ) { QRegExp re("^(\\d+ x \\d+)"); - int pos = re.indexIn(it->second.currentValue.c_str(), 0); - if (pos > -1) + if (re.indexIn(it->second.currentValue.c_str(), 0) > -1) return re.cap(1); } } return QString(); // found nothing } +bool customCompare(const QString &s1, const QString &s2) +{ + int x1, x2, y1, y2; + QRegExp re("^(\\d+) x (\\d+)"); + + if(re.indexIn(s1) > -1) + { + x1 = re.cap(1).toInt(); + y1 = re.cap(2).toInt(); + } + if(re.indexIn(s2) > -1) + { + x2 = re.cap(1).toInt(); + y2 = re.cap(2).toInt(); + } + + if(x1 == x2) + return y1 > y2; + else + return x1 > x2; +} + QStringList getAvailableResolutions() { // store available rendering devices and available resolutions @@ -93,8 +113,7 @@ QStringList getAvailableResolutions() { // extract x and y values QRegExp re("^(\\d+) x (\\d+)"); - int pos = re.indexIn((*iter).c_str(), 0); - if (pos > -1) + if(re.indexIn((*iter).c_str(), 0) > -1) { QString aspect = getAspect(re.cap(1).toInt(), re.cap(2).toInt()); QString resolution = re.cap(1) + QString(" x ") + re.cap(2); @@ -110,42 +129,7 @@ QStringList getAvailableResolutions() } } result.removeDuplicates(); - return result; -} - -QStringList getAvailableOptions(const QString &key) -{ - QStringList result; - - Ogre::ConfigOptionMap& renderOpt = - Ogre::Root::getSingleton().getRenderSystem()->getConfigOptions(); - Ogre::ConfigOptionMap::iterator it = renderOpt.begin(); - - uint row = 0; - for(; it != renderOpt.end(); ++it, ++row) - { - Ogre::StringVector::iterator opt_it = it->second.possibleValues.begin(); - uint idx = 0; - - for(; opt_it != it->second.possibleValues.end(); ++opt_it, ++idx) - { - if(strcmp (key.toStdString().c_str(), it->first.c_str()) == 0) - { - result << ((key == "FSAA") ? QString("MSAA ") : QString("")) - + QString::fromStdString((*opt_it).c_str()).simplified(); - } - } - } - - // Sort ascending - qSort(result.begin(), result.end(), naturalSortLessThanCI); - - // Replace the zero option with Off - int index = result.indexOf("MSAA 0"); - - if(index != -1) - result.replace(index, QObject::tr("Off")); - + qStableSort(result.begin(), result.end(), customCompare); return result; } @@ -163,17 +147,75 @@ CSVSettings::SettingsDialog::SettingsDialog(QTabWidget *parent) spinBox_x->setMaximum(res.width()); spinBox_y->setMaximum(res.height()); - connect(comboBox_rendersystem, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(rendererChanged())); + connect(checkBox_override, SIGNAL(toggled(bool)), this, SLOT(slotOverrideToggled(bool))); + connect(comboBox_rendersystem, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotRendererChanged(const QString&))); connect(radioButton_standard_res, SIGNAL(toggled(bool)), this, SLOT(slotStandardToggled(bool))); + + connect(comboBox_std_window_size, SIGNAL(mouseReleased()), this, SLOT(slotStandardClicked())); + connect(spinBox_x, SIGNAL(mouseReleased()), this, SLOT(slotCustomClicked())); + connect(spinBox_y, SIGNAL(mouseReleased()), this, SLOT(slotCustomClicked())); } -void CSVSettings::SettingsDialog::rendererChanged() +void CSVSettings::SettingsDialog::slotStandardClicked() +{ + std::cout << "click" << std::endl; + if(!radioButton_standard_res->isChecked()) + radioButton_standard_res->toggle(); +} + +void CSVSettings::SettingsDialog::slotCustomClicked() +{ + std::cout << "click" << std::endl; + if(radioButton_standard_res->isChecked()) + radioButton_standard_res->toggle(); +} + +void CSVSettings::SettingsDialog::slotRendererChanged(const QString &renderer) { comboBox_antialiasing->clear(); - comboBox_antialiasing->addItems(getAvailableOptions(QString("FSAA"))); + comboBox_antialiasing->addItems(mModel->getOgreOptions(QString("FSAA"), renderer)); + + comboBox_shaderlanguage->clear(); + comboBox_shaderlanguage->addItems(mModel->getShaderLanguageByRenderer(renderer)); + + if(mModel->settingValue("Video/use settings.cfg") == "true") + { + label_RenderingSubsystem->setEnabled(false); + comboBox_rendersystem->setEnabled(false); + label_Antialiasing->setEnabled(false); + comboBox_antialiasing->setEnabled(false); + checkBox_vsync->setEnabled(false); + label_ShaderLanguage->setEnabled(false); + comboBox_shaderlanguage->setEnabled(false); + } + else + checkBox_override->setChecked(false); +} + +void CSVSettings::SettingsDialog::slotOverrideToggled(bool checked) +{ + if(checked) + { + label_RenderingSubsystem->setEnabled(false); + comboBox_rendersystem->setEnabled(false); + label_Antialiasing->setEnabled(false); + comboBox_antialiasing->setEnabled(false); + checkBox_vsync->setEnabled(false); + label_ShaderLanguage->setEnabled(false); + comboBox_shaderlanguage->setEnabled(false); + } + else + { + label_RenderingSubsystem->setEnabled(true); + comboBox_rendersystem->setEnabled(true); + label_Antialiasing->setEnabled(true); + comboBox_antialiasing->setEnabled(true); + checkBox_vsync->setEnabled(true); + label_ShaderLanguage->setEnabled(true); + comboBox_shaderlanguage->setEnabled(true); + } } -// FIXME: what to do with updating window size void CSVSettings::SettingsDialog::slotStandardToggled(bool checked) { if (checked) @@ -192,22 +234,28 @@ void CSVSettings::SettingsDialog::slotStandardToggled(bool checked) void CSVSettings::SettingsDialog::setViewValues() { - //rendererChanged(Ogre::Root::getSingleton().getRenderSystemByName(renderer.toStdString())); - rendererChanged(); // setup antialiasing options + int index = -1; - if(mModel->settingValue("Video/use settings.cfg") == "true") - { - label_RenderingSubsystem->setEnabled(false); - comboBox_rendersystem->setEnabled(false); - label_Antialiasing->setEnabled(false); - comboBox_antialiasing->setEnabled(false); - checkBox_vsync->setEnabled(false); - label_ShaderLanguage->setEnabled(false); - comboBox_shaderlanguage->setEnabled(false); + // initialised in the constructor + slotOverrideToggled(checkBox_override->isChecked()); - } - else - checkBox_override->setChecked(false); + // Ogre initialised earlier + slotRendererChanged(Ogre::Root::getSingleton().getRenderSystem()->getName().c_str()); + + // antialiasing + QString antialiasing = mModel->settingValue("Video/antialiasing"); + index = comboBox_antialiasing->findData(antialiasing, Qt::DisplayRole); + if(index != -1) + comboBox_antialiasing->setCurrentIndex(index); + + // vsync + checkBox_vsync->setChecked(mModel->settingValue("Video/vsync") == "true"); + + // shader lang + QString shaderlang = mModel->settingValue("Shader/language"); + index = comboBox_shaderlanguage->findData(shaderlang, Qt::DisplayRole); + if(index != -1) + comboBox_shaderlanguage->setCurrentIndex(index); if(mModel->settingValue("Window Size/Width") != "") spinBox_x->setValue(mModel->settingValue("Window Size/Width").toInt()); @@ -222,9 +270,7 @@ void CSVSettings::SettingsDialog::setViewValues() QString currRes = mModel->settingValue("Window Size/Width") + " x " + mModel->settingValue("Window Size/Height"); - int index = comboBox_std_window_size->findData(currRes, - Qt::DisplayRole, - Qt::MatchStartsWith); + index = comboBox_std_window_size->findData(currRes, Qt::DisplayRole, Qt::MatchStartsWith); if(index != -1) { // show the values in ini file @@ -234,9 +280,7 @@ void CSVSettings::SettingsDialog::setViewValues() else { // show what's in Ogre instead - index = comboBox_std_window_size->findData(getCurrentOgreResolution(), - Qt::DisplayRole, - Qt::MatchStartsWith); + index = comboBox_std_window_size->findData(getCurrentOgreResolution(), Qt::DisplayRole, Qt::MatchStartsWith); if(index != -1) comboBox_std_window_size->setCurrentIndex(index); @@ -260,6 +304,55 @@ void CSVSettings::SettingsDialog::saveSettings() } } #endif + std::cout << "closeEvent" << std::endl; + + // override + if(checkBox_override->isChecked()) + mModel->setDefinitions("Video/use settings.cfg", QStringList("true")); + else + mModel->setDefinitions("Video/use settings.cfg", QStringList("false")); + + // render system + mModel->setDefinitions("Video/render system", + QStringList(comboBox_rendersystem->currentText())); + + // vsync + if(checkBox_vsync->isChecked()) + mModel->setDefinitions("Video/vsync", QStringList("true")); + else + mModel->setDefinitions("Video/vsync", QStringList("false")); + + // antialiasing + mModel->setDefinitions("Video/antialiasing", + QStringList(comboBox_antialiasing->currentText())); +#if 0 + QRegExp reAA("^\\D*(\\d+)\\D*"); + if(reAA.indexIn(comboBox_antialiasing->currentText()) > -1) + mModel->setDefinitions("Video/antialiasing", QStringList(reAA.cap(1))); +#endif + + // shader lang + mModel->setDefinitions("Shader/language", + QStringList(comboBox_shaderlanguage->currentText())); + + // window size + if(radioButton_standard_res->isChecked()) + { + QRegExp re("^(\\d+) x (\\d+)"); + if(re.indexIn(comboBox_std_window_size->currentText()) > -1) + { + mModel->setDefinitions("Window Size/Width", QStringList(re.cap(1))); + mModel->setDefinitions("Window Size/Height", QStringList(re.cap(2))); + } + } + else + { + mModel->setDefinitions("Window Size/Width", + QStringList(QString::number(spinBox_x->value()))); + mModel->setDefinitions("Window Size/Height", + QStringList(QString::number(spinBox_y->value()))); + } + mModel->saveDefinitions(); } diff --git a/apps/opencs/view/settings/settingsdialog.hpp b/apps/opencs/view/settings/settingsdialog.hpp index c5c848b59..737ebdb07 100644 --- a/apps/opencs/view/settings/settingsdialog.hpp +++ b/apps/opencs/view/settings/settingsdialog.hpp @@ -48,7 +48,10 @@ namespace CSVSettings { void show(); - void rendererChanged(); + void slotStandardClicked(); + void slotCustomClicked(); + void slotRendererChanged(const QString &renderer); + void slotOverrideToggled(bool checked); void slotStandardToggled(bool checked); }; } diff --git a/files/ui/settingstab.ui b/files/ui/settingstab.ui index 2b1b561da..51566869a 100644 --- a/files/ui/settingstab.ui +++ b/files/ui/settingstab.ui @@ -31,19 +31,53 @@ - + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + - + 186 16777215 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + - + + + + + 180 + 0 + + + + + + + + Custom: + + + buttonGroup + + + + + + + + + + + Standard: @@ -56,33 +90,6 @@ - - - - Custom; - - - buttonGroup - - - - - - - Window Size - - - - - - - - 180 - 0 - - - - @@ -108,10 +115,10 @@ - Display + Window Size - + 20 @@ -180,7 +187,7 @@ - HLSL + GLSL @@ -212,7 +219,7 @@ renderGroup - layoutWidget + layoutWidget_Render displayGroup layoutWidget_Screen @@ -220,34 +227,46 @@ Display Settings - + - 20 - 30 - 351 - 116 + 10 + 10 + 371 + 71 - - - + + + + + + + + 9 + 110 + 371 + 111 + + + + Subviews + + + + + + 21 + 20 + 351 + 45 + + + + + - Max Number of Subviews - - - - - - - Min Subview Width - - - - - - - Reuse Subviews + Display Format: @@ -265,11 +284,51 @@ - - + + + + Show Status Bar + + - + + + + + + 21 + 130 + 351 + 71 + + + + + + + Max Number of Subviews: + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Min Subview Width: + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + 325 @@ -281,29 +340,18 @@ - - + + - Show Icon + Reuse Subviews - - - - 10 - 10 - 371 - 151 - - - - GroupBox - - + groupBox_2 groupBox + layoutWidget layoutWidget2 @@ -312,6 +360,18 @@ + + + ClickSpinBox + QSpinBox +
clickspinbox.hpp
+
+ + ClickComboBox + QComboBox +
clickcombobox.hpp
+
+