Added functions to save QPalette color settings to a file and load then on request.

This commit is contained in:
mjbudd77 2021-03-06 22:30:56 -05:00
parent 7eb8ea9608
commit 9642be0db1
3 changed files with 480 additions and 37 deletions

View File

@ -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<QUrl> 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<QUrl> 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)

View File

@ -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);
};

View File

@ -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);