diff --git a/src/drivers/Qt/GuiConf.cpp b/src/drivers/Qt/GuiConf.cpp index 1e858096..09778170 100644 --- a/src/drivers/Qt/GuiConf.cpp +++ b/src/drivers/Qt/GuiConf.cpp @@ -40,13 +40,16 @@ #include "Qt/ConsoleWindow.h" #include "Qt/ConsoleUtilities.h" +static int writeQPaletteToFile( const char *path, QPalette *pal ); +static int readQPaletteFromFile( const char *path, QPalette *pal ); + //---------------------------------------------------- GuiConfDialog_t::GuiConfDialog_t(QWidget *parent) : QDialog(parent) { int useNativeFileDialogVal; int useNativeMenuBarVal; - int useCustomQssVal; + int useCustomQssVal, useCustomQPalVal; QVBoxLayout *mainLayout, *vbox1, *vbox2; QHBoxLayout *hbox; QPushButton *closeButton, *button; @@ -57,10 +60,11 @@ GuiConfDialog_t::GuiConfDialog_t(QWidget *parent) QStringList styleKeys; QString selStyle; QGroupBox *frame, *qssFrame; - std::string qssFile; + QFrame *hline; + std::string qssFile, qpalFile; //resize( 512, 600 ); - printf("Style: %s \n", style()->objectName().toStdString().c_str() ); + //printf("Style: %s \n", style()->objectName().toStdString().c_str() ); selStyle = style()->objectName(); @@ -68,6 +72,7 @@ GuiConfDialog_t::GuiConfDialog_t(QWidget *parent) g_config->getOption("SDL.UseNativeFileDialog", &useNativeFileDialogVal); g_config->getOption("SDL.UseNativeMenuBar", &useNativeMenuBarVal); g_config->getOption("SDL.UseCustomQss", &useCustomQssVal); + g_config->getOption("SDL.UseCustomQPal", &useCustomQPalVal); setWindowTitle(tr("GUI Config")); @@ -135,7 +140,7 @@ GuiConfDialog_t::GuiConfDialog_t(QWidget *parent) if ( selStyle.compare( styleKeys[i], Qt::CaseInsensitive ) == 0 ) { - printf("Style Match: %s \n", selStyle.toStdString().c_str() ); + //printf("Style Match: %s \n", selStyle.toStdString().c_str() ); styleComboBox->setCurrentIndex(i); } } @@ -156,12 +161,43 @@ GuiConfDialog_t::GuiConfDialog_t(QWidget *parent) qssFrame = new QGroupBox( tr("QSS") ); qssFrame->setLayout( vbox2 ); + vbox1->addWidget( qssFrame ); + + useCustomPalette = new QCheckBox( tr("Use Custom QPalette") ); + useCustomPalette->setChecked(useCustomQPalVal); + connect(useCustomPalette, SIGNAL(stateChanged(int)), this, SLOT(useCustomQPaletteChanged(int))); + + vbox2->addWidget( useCustomPalette ); + + hbox = new QHBoxLayout(); + button = new QPushButton(tr("Open")); + button->setIcon(style()->standardIcon(QStyle::SP_FileDialogStart)); + connect(button, SIGNAL(clicked(void)), this, SLOT(openQPal(void))); + hbox->addWidget(button); + + button = new QPushButton(tr("Clear")); + button->setIcon(style()->standardIcon(QStyle::SP_LineEditClearButton)); + connect(button, SIGNAL(clicked(void)), this, SLOT(clearQPal(void))); + hbox->addWidget(button); + vbox2->addLayout( hbox ); + + g_config->getOption("SDL.QPaletteFile", &qpalFile); + + custom_qpal_path = new QLineEdit(); + custom_qpal_path->setReadOnly(true); + custom_qpal_path->setText(qpalFile.c_str()); + vbox2->addWidget( custom_qpal_path ); + + hline = new QFrame(this); + hline->setFrameShape(QFrame::HLine); + hline->setFrameShadow(QFrame::Sunken); + hline->setLineWidth(2); + vbox2->addWidget( hline ); useCustomStyle = new QCheckBox( tr("Use Custom Stylesheet") ); useCustomStyle->setChecked(useCustomQssVal); connect(useCustomStyle, SIGNAL(stateChanged(int)), this, SLOT(useCustomStyleChanged(int))); - vbox1->addWidget( qssFrame ); vbox2->addWidget( useCustomStyle ); hbox = new QHBoxLayout(); @@ -247,6 +283,15 @@ void GuiConfDialog_t::useCustomStyleChanged(int state) QApplication::setStyle( new fceuStyle() ); } //---------------------------------------------------- +void GuiConfDialog_t::useCustomQPaletteChanged(int state) +{ + int value = (state == Qt::Unchecked) ? 0 : 1; + + g_config->setOption("SDL.UseCustomQPal", value); + + QApplication::setStyle( new fceuStyle() ); +} +//---------------------------------------------------- void GuiConfDialog_t::styleChanged(int index) { QString s; @@ -355,13 +400,6 @@ void GuiConfDialog_t::openQss(void) custom_qss_path->setText(filename.toStdString().c_str()); - //g_config->getOption("SDL.UseCustomQss", &useCustom); - - //if ( useCustom ) - //{ - //loadQss( filename.toStdString().c_str() ); - //} - g_config->setOption("SDL.QtStyleSheet", filename.toStdString().c_str() ); g_config->save(); @@ -370,6 +408,110 @@ void GuiConfDialog_t::openQss(void) return; } //---------------------------------------------------- +void GuiConfDialog_t::clearQPal(void) +{ + custom_qpal_path->setText(""); + + g_config->setOption("SDL.QPaletteFile", ""); + g_config->save(); + + QApplication::setStyle( new fceuStyle() ); +} +//---------------------------------------------------- +void GuiConfDialog_t::openQPal(void) +{ + int ret, useNativeFileDialogVal; //, useCustom; + QString filename; + std::string last, iniPath; + char dir[512]; + char exePath[512]; + QFileDialog dialog(this, tr("Open Qt QPalette File (QPAL)")); + QList urls; + QDir d; + + fceuExecutablePath(exePath, sizeof(exePath)); + + //urls = dialog.sidebarUrls(); + urls << QUrl::fromLocalFile(QDir::rootPath()); + urls << QUrl::fromLocalFile(QStandardPaths::standardLocations(QStandardPaths::HomeLocation).first()); + urls << QUrl::fromLocalFile(QDir(FCEUI_GetBaseDirectory()).absolutePath()); + + if (exePath[0] != 0) + { + d.setPath(QString(exePath) + "/../qss"); + + if (d.exists()) + { + urls << QUrl::fromLocalFile(d.absolutePath()); + iniPath = d.absolutePath().toStdString(); + } + } +#ifdef WIN32 + +#else + d.setPath("/usr/share/fceux/qss"); + + if (d.exists()) + { + urls << QUrl::fromLocalFile(d.absolutePath()); + iniPath = d.absolutePath().toStdString(); + } +#endif + + dialog.setFileMode(QFileDialog::ExistingFile); + + dialog.setNameFilter(tr("Qt Stylesheets (*.qpal *.QPAL) ;; All files (*)")); + + dialog.setViewMode(QFileDialog::List); + dialog.setFilter(QDir::AllEntries | QDir::AllDirs | QDir::Hidden); + dialog.setLabelText(QFileDialog::Accept, tr("Load")); + + g_config->getOption("SDL.QPaletteFile", &last); + + if (last.size() == 0) + { + last.assign(iniPath); + } + + getDirFromFile(last.c_str(), dir); + + dialog.setDirectory(tr(dir)); + + // Check config option to use native file dialog or not + g_config->getOption("SDL.UseNativeFileDialog", &useNativeFileDialogVal); + + dialog.setOption(QFileDialog::DontUseNativeDialog, !useNativeFileDialogVal); + dialog.setSidebarUrls(urls); + + ret = dialog.exec(); + + if (ret) + { + QStringList fileList; + fileList = dialog.selectedFiles(); + + if (fileList.size() > 0) + { + filename = fileList[0]; + } + } + + if (filename.isNull()) + { + return; + } + qDebug() << "selected file path : " << filename.toUtf8(); + + custom_qpal_path->setText(filename.toStdString().c_str()); + + g_config->setOption("SDL.QPaletteFile", filename.toStdString().c_str() ); + g_config->save(); + + QApplication::setStyle( new fceuStyle() ); + + return; +} +//---------------------------------------------------- void GuiConfDialog_t::openQPalette(void) { GuiPaletteEditDialog_t *dialog = new GuiPaletteEditDialog_t(this); @@ -445,35 +587,49 @@ QStyle *fceuStyle::styleBase(QStyle *style) const void fceuStyle::polish(QPalette &palette) { + int useCustom; + + g_config->getOption("SDL.UseCustomQPal", &useCustom); //basePtr->polish(palette); //QStyle::polish(palette); - //printf("Polish Palette Style!!!\n"); - return; + if ( !useCustom ) + { + return; + } + std::string qPalFilePath; + + g_config->getOption("SDL.QPaletteFile", &qPalFilePath ); + + if ( qPalFilePath.size() > 0 ) + { + readQPaletteFromFile( qPalFilePath.c_str(), &palette ); + } + // modify palette to dark - palette.setColor(QPalette::Window, QColor(53, 53, 53)); - palette.setColor(QPalette::WindowText, Qt::white); - palette.setColor(QPalette::Disabled, QPalette::WindowText, - QColor(127, 127, 127)); - palette.setColor(QPalette::Base, QColor(42, 42, 42)); - palette.setColor(QPalette::AlternateBase, QColor(66, 66, 66)); - palette.setColor(QPalette::ToolTipBase, Qt::white); - palette.setColor(QPalette::ToolTipText, QColor(53, 53, 53)); - palette.setColor(QPalette::Text, Qt::white); - palette.setColor(QPalette::Disabled, QPalette::Text, QColor(127, 127, 127)); - palette.setColor(QPalette::Dark, QColor(35, 35, 35)); - palette.setColor(QPalette::Shadow, QColor(20, 20, 20)); - palette.setColor(QPalette::Button, QColor(53, 53, 53)); - palette.setColor(QPalette::ButtonText, Qt::white); - palette.setColor(QPalette::Disabled, QPalette::ButtonText, - QColor(127, 127, 127)); - palette.setColor(QPalette::BrightText, Qt::red); - palette.setColor(QPalette::Link, QColor(42, 130, 218)); - palette.setColor(QPalette::Highlight, QColor(42, 130, 218)); - palette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(80, 80, 80)); - palette.setColor(QPalette::HighlightedText, Qt::white); - palette.setColor(QPalette::Disabled, QPalette::HighlightedText, - QColor(127, 127, 127)); + //palette.setColor(QPalette::Window, QColor(53, 53, 53)); + //palette.setColor(QPalette::WindowText, Qt::white); + //palette.setColor(QPalette::Disabled, QPalette::WindowText, + // QColor(127, 127, 127)); + //palette.setColor(QPalette::Base, QColor(42, 42, 42)); + //palette.setColor(QPalette::AlternateBase, QColor(66, 66, 66)); + //palette.setColor(QPalette::ToolTipBase, Qt::white); + //palette.setColor(QPalette::ToolTipText, QColor(53, 53, 53)); + //palette.setColor(QPalette::Text, Qt::white); + //palette.setColor(QPalette::Disabled, QPalette::Text, QColor(127, 127, 127)); + //palette.setColor(QPalette::Dark, QColor(35, 35, 35)); + //palette.setColor(QPalette::Shadow, QColor(20, 20, 20)); + //palette.setColor(QPalette::Button, QColor(53, 53, 53)); + //palette.setColor(QPalette::ButtonText, Qt::white); + //palette.setColor(QPalette::Disabled, QPalette::ButtonText, + // QColor(127, 127, 127)); + //palette.setColor(QPalette::BrightText, Qt::red); + //palette.setColor(QPalette::Link, QColor(42, 130, 218)); + //palette.setColor(QPalette::Highlight, QColor(42, 130, 218)); + //palette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(80, 80, 80)); + //palette.setColor(QPalette::HighlightedText, Qt::white); + //palette.setColor(QPalette::Disabled, QPalette::HighlightedText, + // QColor(127, 127, 127)); } void fceuStyle::polish(QApplication *app) @@ -610,6 +766,180 @@ static const char *getRoleText( QPalette::ColorRole role ) return rTxt; } //---------------------------------------------------- +static int writeQPaletteToFile( const char *path, QPalette *pal ) +{ + int i, j; + QColor c; + QPalette::ColorGroup g; + QPalette::ColorRole r; + const char *gTxt, *rTxt; + FILE *fp; + + fp = fopen( path, "w"); + + if ( fp == NULL ) + { + printf("Error: Failed to Open File for writing: '%s'\n", path ); + return -1; + } + + for (j=0; j<3; j++) + { + + if ( j == 1 ) + { + g = QPalette::Disabled; + gTxt = "Disabled"; + } + else if ( j == 2 ) + { + g = QPalette::Inactive; + gTxt = "Inactive"; + } + else + { + g = QPalette::Active; + gTxt = "Active"; + } + + for (i=0; i<30; i++) + { + r = (QPalette::ColorRole)i; + + rTxt = getRoleText( r ); + + if ( rTxt ) + { + c = pal->color( g, r ); + + fprintf( fp, "%s::%s = %s \n", gTxt, rTxt, c.name().toStdString().c_str() ); + } + } + } + + fclose(fp); + + return 0; +} +//---------------------------------------------------- +static int readQPaletteFromFile( const char *path, QPalette *pal ) +{ + FILE *fp; + char line[512]; + char gTxt[128], rTxt[256]; + char colorTxt[128]; + const char *rTxtMatch; + int i,j,k; + QColor color; + QPalette::ColorGroup g; + QPalette::ColorRole r; + + fp = fopen( path, "r"); + + if ( fp == NULL ) + { + printf("Error: Failed to Open File for writing: '%s'\n", path ); + return -1; + } + while ( fgets( line, sizeof(line), fp ) != 0 ) + { + printf("%s", line ); + + i=0; + + while ( isspace(line[i]) ) i++; + + j=0; + while ( isalnum(line[i]) || (line[i] == '_') ) + { + gTxt[j] = line[i]; j++; i++; + } + gTxt[j] = 0; + + if ( j == 0 ) continue; + + if (line[i] == ':') + { + while (line[i] == ':') i++; + } + + j=0; + while ( isalnum(line[i]) || (line[i] == '_')) + { + rTxt[j] = line[i]; j++; i++; + } + rTxt[j] = 0; + + if ( j == 0 ) continue; + + while ( isspace(line[i]) ) i++; + + if (line[i] == '=') i++; + + while ( isspace(line[i]) ) i++; + + if ( strcmp( gTxt, "Active") == 0 ) + { + g = QPalette::Active; + } + else if ( strcmp( gTxt, "Inactive") == 0 ) + { + g = QPalette::Inactive; + } + else if ( strcmp( gTxt, "Disabled") == 0 ) + { + g = QPalette::Disabled; + } + else + { + continue; + } + + rTxtMatch = NULL; + + for (k=0; k<30; k++) + { + + rTxtMatch = getRoleText( (QPalette::ColorRole)k ); + + if ( rTxtMatch ) + { + if ( strcmp( rTxt, rTxtMatch ) == 0 ) + { + r = (QPalette::ColorRole)k; + break; + } + } + } + + if ( rTxtMatch == NULL ) continue; + + color = pal->color( g, r ); + + j=0; + if (line[i] == '#') + { + colorTxt[j] = line[i]; j++; i++; + + while ( isxdigit( line[i] ) ) + { + colorTxt[j] = line[i]; j++; i++; + } + colorTxt[j] = 0; + + color.setNamedColor( colorTxt ); + } + + //printf("Setting Color %s::%s = %s \n", gTxt, rTxt, colorTxt ); + pal->setColor( g, r, color ); + } + + + fclose(fp); + + return 0; +} +//---------------------------------------------------- GuiPaletteEditDialog_t::GuiPaletteEditDialog_t(QWidget *parent) : QDialog( parent ) { @@ -641,6 +971,14 @@ GuiPaletteEditDialog_t::GuiPaletteEditDialog_t(QWidget *parent) // File fileMenu = menuBar->addMenu(tr("&File")); + // File -> Save As + act = new QAction(tr("Save &As"), this); + act->setShortcut(QKeySequence::SaveAs); + act->setStatusTip(tr("Save As")); + connect(act, SIGNAL(triggered()), this, SLOT(paletteSaveAs(void)) ); + + fileMenu->addAction(act); + // File -> Close act = new QAction(tr("&Close"), this); act->setShortcut(QKeySequence::Close); @@ -740,6 +1078,103 @@ void GuiPaletteEditDialog_t::closeWindow(void) deleteLater(); } //---------------------------------------------------- +void GuiPaletteEditDialog_t::paletteSaveAs(void) +{ + int ret, useNativeFileDialogVal; //, useCustom; + QString filename; + std::string last, iniPath; + char dir[512]; + char exePath[512]; + QFileDialog dialog(this, tr("Save QPalette (qpal)")); + QList urls; + QDir d; + QPalette pal = this->palette(); + + fceuExecutablePath(exePath, sizeof(exePath)); + + //urls = dialog.sidebarUrls(); + urls << QUrl::fromLocalFile(QDir::rootPath()); + urls << QUrl::fromLocalFile(QStandardPaths::standardLocations(QStandardPaths::HomeLocation).first()); + urls << QUrl::fromLocalFile(QDir(FCEUI_GetBaseDirectory()).absolutePath()); + + if (exePath[0] != 0) + { + d.setPath(QString(exePath) + "/../qss"); + + if (d.exists()) + { + urls << QUrl::fromLocalFile(d.absolutePath()); + iniPath = d.absolutePath().toStdString(); + } + } +#ifdef WIN32 + +#else + d.setPath("/usr/share/fceux/qss"); + + if (d.exists()) + { + urls << QUrl::fromLocalFile(d.absolutePath()); + iniPath = d.absolutePath().toStdString(); + } +#endif + + dialog.setFileMode(QFileDialog::AnyFile); + + dialog.setNameFilter(tr("Qt QPalette Files (*.qpal *.QPAL) ;; All files (*)")); + + dialog.setViewMode(QFileDialog::List); + dialog.setFilter(QDir::AllEntries | QDir::AllDirs | QDir::Hidden); + dialog.setLabelText(QFileDialog::Accept, tr("Save")); + dialog.setDefaultSuffix( tr(".qpal") ); + + g_config->getOption("SDL.QPaletteFile", &last); + + if (last.size() == 0) + { + last.assign(iniPath); + } + + getDirFromFile(last.c_str(), dir); + + dialog.setDirectory(tr(dir)); + + // Check config option to use native file dialog or not + g_config->getOption("SDL.UseNativeFileDialog", &useNativeFileDialogVal); + + dialog.setOption(QFileDialog::DontUseNativeDialog, !useNativeFileDialogVal); + dialog.setSidebarUrls(urls); + + ret = dialog.exec(); + + if (ret) + { + QStringList fileList; + fileList = dialog.selectedFiles(); + + if (fileList.size() > 0) + { + filename = fileList[0]; + } + } + + if (filename.isNull()) + { + return; + } + qDebug() << "selected file path : " << filename.toUtf8(); + + writeQPaletteToFile( filename.toStdString().c_str(), &pal ); + + //g_config->setOption("SDL.QPaletteFile", filename.toStdString().c_str() ); + //g_config->save(); + + //QApplication::setStyle( new fceuStyle() ); + + return; + +} +//---------------------------------------------------- //---------------------------------------------------- GuiPaletteColorSelect::GuiPaletteColorSelect( QPalette::ColorGroup group, QPalette::ColorRole role, QWidget *parent) : QWidget(parent) diff --git a/src/drivers/Qt/GuiConf.h b/src/drivers/Qt/GuiConf.h index d48c8a28..7fb06324 100644 --- a/src/drivers/Qt/GuiConf.h +++ b/src/drivers/Qt/GuiConf.h @@ -123,6 +123,7 @@ protected: void closeEvent(QCloseEvent *event); public slots: void closeWindow(void); + void paletteSaveAs(void); }; @@ -142,8 +143,10 @@ protected: QCheckBox *useNativeFileDialog; QCheckBox *useNativeMenuBar; QCheckBox *useCustomStyle; + QCheckBox *useCustomPalette; QComboBox *styleComboBox; QLineEdit *custom_qss_path; + QLineEdit *custom_qpal_path; private: public slots: @@ -151,10 +154,13 @@ public slots: private slots: void useNativeFileDialogChanged(int v); void useNativeMenuBarChanged(int v); + void useCustomQPaletteChanged(int v); void useCustomStyleChanged(int v); void styleChanged(int index); void openQss(void); void clearQss(void); + void openQPal(void); + void clearQPal(void); void openQPalette(void); void openTestWindow(void); }; diff --git a/src/drivers/Qt/config.cpp b/src/drivers/Qt/config.cpp index 9296d9e4..884dc514 100644 --- a/src/drivers/Qt/config.cpp +++ b/src/drivers/Qt/config.cpp @@ -375,7 +375,9 @@ InitConfig() config->addOption("_useNativeMenuBar" , "SDL.UseNativeMenuBar", false); config->addOption("SDL.GuiStyle", ""); config->addOption("SDL.QtStyleSheet", ""); + config->addOption("SDL.QPaletteFile", ""); config->addOption("SDL.UseCustomQss", 0); + config->addOption("SDL.UseCustomQPal", 0); config->addOption("_setSchedParam" , "SDL.SetSchedParam" , 0); config->addOption("_emuSchedPolicy" , "SDL.EmuSchedPolicy", 0);