1770 lines
44 KiB
C++
1770 lines
44 KiB
C++
/* FCE Ultra - NES/Famicom Emulator
|
|
*
|
|
* Copyright notice for this file:
|
|
* Copyright (C) 2020 mjbudd77
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
// PaletteConf.cpp
|
|
//
|
|
#include <QTextEdit>
|
|
#include <QApplication>
|
|
#include <QStyleFactory>
|
|
#include <QFileDialog>
|
|
#include <QMenuBar>
|
|
#include <QMenu>
|
|
#include <QAction>
|
|
#include <QScrollArea>
|
|
#include <QSpinBox>
|
|
#include <QSlider>
|
|
#include <QDial>
|
|
|
|
#include "Qt/GuiConf.h"
|
|
#include "Qt/main.h"
|
|
#include "Qt/input.h"
|
|
#include "Qt/config.h"
|
|
#include "Qt/keyscan.h"
|
|
#include "Qt/fceuWrapper.h"
|
|
#include "Qt/ConsoleWindow.h"
|
|
#include "Qt/ConsoleUtilities.h"
|
|
|
|
static int writeQPaletteToFile( const char *path, QPalette *pal );
|
|
static int readQPaletteFromFile( const char *path, QPalette *pal );
|
|
|
|
static GuiPaletteEditDialog_t *editDialog = NULL;
|
|
//----------------------------------------------------
|
|
GuiConfDialog_t::GuiConfDialog_t(QWidget *parent)
|
|
: QDialog(parent)
|
|
{
|
|
int useNativeFileDialogVal;
|
|
int useNativeMenuBarVal, pauseOnMenuAccessVal;
|
|
int useCustomQssVal, useCustomQPalVal, contextMenuEnable;
|
|
QVBoxLayout *mainLayout, *vbox1, *vbox2;
|
|
QHBoxLayout *hbox, *hbox1;
|
|
QPushButton *closeButton, *button;
|
|
QMenuBar *menuBar;
|
|
QMenu *fileMenu, *colorMenu;
|
|
QAction *act;
|
|
QLabel *lbl;
|
|
QStringList styleKeys;
|
|
QString selStyle;
|
|
QGroupBox *frame, *qssFrame;
|
|
QFrame *hline;
|
|
std::string qssFile, qpalFile;
|
|
QSettings settings;
|
|
|
|
//resize( 512, 600 );
|
|
//printf("Style: %s \n", style()->objectName().toStdString().c_str() );
|
|
|
|
selStyle = style()->objectName();
|
|
|
|
// sync with config
|
|
g_config->getOption("SDL.UseNativeFileDialog", &useNativeFileDialogVal);
|
|
g_config->getOption("SDL.UseNativeMenuBar", &useNativeMenuBarVal);
|
|
g_config->getOption("SDL.UseCustomQss", &useCustomQssVal);
|
|
g_config->getOption("SDL.UseCustomQPal", &useCustomQPalVal);
|
|
g_config->getOption("SDL.PauseOnMainMenuAccess", &pauseOnMenuAccessVal);
|
|
g_config->getOption("SDL.ContextMenuEnable", &contextMenuEnable);
|
|
|
|
setWindowTitle(tr("GUI Config"));
|
|
|
|
menuBar = new QMenuBar(this);
|
|
|
|
menuBar->setNativeMenuBar( useNativeMenuBarVal ? true : false );
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Menu Start
|
|
//-----------------------------------------------------------------------
|
|
// File
|
|
fileMenu = menuBar->addMenu(tr("&File"));
|
|
|
|
// File -> Test Style
|
|
act = new QAction(tr("&Test"), this);
|
|
//act->setShortcut(QKeySequence::Close);
|
|
act->setStatusTip(tr("Test"));
|
|
connect(act, SIGNAL(triggered()), this, SLOT(openTestWindow(void)) );
|
|
|
|
fileMenu->addAction(act);
|
|
|
|
// File -> Close
|
|
act = new QAction(tr("&Close"), this);
|
|
act->setShortcut(QKeySequence::Close);
|
|
act->setStatusTip(tr("Close Window"));
|
|
connect(act, SIGNAL(triggered()), this, SLOT(closeWindow(void)) );
|
|
|
|
fileMenu->addAction(act);
|
|
|
|
// Color
|
|
colorMenu = menuBar->addMenu(tr("&Color"));
|
|
|
|
// Color -> View QPalette
|
|
act = new QAction(tr("&View QPalette"), this);
|
|
//act->setShortcut(QKeySequence::Close);
|
|
act->setStatusTip(tr("&View QPalette"));
|
|
connect(act, SIGNAL(triggered()), this, SLOT(openQPalette(void)) );
|
|
|
|
colorMenu->addAction(act);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Menu End
|
|
//-----------------------------------------------------------------------
|
|
|
|
mainLayout = new QVBoxLayout();
|
|
|
|
mainLayout->setMenuBar( menuBar );
|
|
|
|
useNativeFileDialog = new QCheckBox(tr("Use Native OS File Dialog"));
|
|
useNativeMenuBar = new QCheckBox(tr("Use Native OS Menu Bar"));
|
|
pauseOnMenuAccess = new QCheckBox(tr("Pause On Main Menu Access"));
|
|
ctxMenuEnable = new QCheckBox(tr("Context Menu Enable"));
|
|
showSplashScreen = new QCheckBox(tr("Show Splash Screen at Startup"));
|
|
|
|
useNativeFileDialog->setChecked(useNativeFileDialogVal);
|
|
useNativeMenuBar->setChecked(useNativeMenuBarVal);
|
|
pauseOnMenuAccess->setChecked(pauseOnMenuAccessVal);
|
|
ctxMenuEnable->setChecked(contextMenuEnable);
|
|
showSplashScreen->setChecked( settings.value("mainWindow/showSplashScreen", false).toBool() );
|
|
|
|
connect(useNativeFileDialog, SIGNAL(stateChanged(int)), this, SLOT(useNativeFileDialogChanged(int)));
|
|
connect(useNativeMenuBar , SIGNAL(stateChanged(int)), this, SLOT(useNativeMenuBarChanged(int)));
|
|
connect(pauseOnMenuAccess , SIGNAL(stateChanged(int)), this, SLOT(pauseOnMenuAccessChanged(int)));
|
|
connect(ctxMenuEnable , SIGNAL(stateChanged(int)), this, SLOT(contextMenuEnableChanged(int)));
|
|
connect(showSplashScreen , SIGNAL(stateChanged(int)), this, SLOT(showSplashScreenChanged(int)));
|
|
|
|
styleComboBox = new QComboBox();
|
|
|
|
styleKeys = QStyleFactory::keys();
|
|
|
|
for (int i=0; i<styleKeys.size(); i++)
|
|
{
|
|
styleComboBox->addItem( styleKeys[i], i );
|
|
|
|
if ( selStyle.compare( styleKeys[i], Qt::CaseInsensitive ) == 0 )
|
|
{
|
|
//printf("Style Match: %s \n", selStyle.toStdString().c_str() );
|
|
styleComboBox->setCurrentIndex(i);
|
|
}
|
|
}
|
|
connect(styleComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(styleChanged(int)));
|
|
|
|
frame = new QGroupBox( tr("Style:") );
|
|
vbox1 = new QVBoxLayout();
|
|
vbox2 = new QVBoxLayout();
|
|
hbox = new QHBoxLayout();
|
|
|
|
frame->setLayout( vbox1 );
|
|
vbox1->addLayout( hbox );
|
|
|
|
lbl = new QLabel( tr("Base:") );
|
|
|
|
hbox->addWidget( lbl, 1 );
|
|
hbox->addWidget( styleComboBox, 10 );
|
|
|
|
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)));
|
|
|
|
vbox2->addWidget( useCustomStyle );
|
|
|
|
hbox = new QHBoxLayout();
|
|
button = new QPushButton(tr("Open"));
|
|
button->setIcon(style()->standardIcon(QStyle::SP_FileDialogStart));
|
|
connect(button, SIGNAL(clicked(void)), this, SLOT(openQss(void)));
|
|
hbox->addWidget(button);
|
|
|
|
button = new QPushButton(tr("Clear"));
|
|
button->setIcon(style()->standardIcon(QStyle::SP_LineEditClearButton));
|
|
connect(button, SIGNAL(clicked(void)), this, SLOT(clearQss(void)));
|
|
hbox->addWidget(button);
|
|
vbox2->addLayout( hbox );
|
|
|
|
g_config->getOption("SDL.QtStyleSheet", &qssFile);
|
|
|
|
custom_qss_path = new QLineEdit();
|
|
custom_qss_path->setReadOnly(true);
|
|
custom_qss_path->setText(qssFile.c_str());
|
|
vbox2->addWidget( custom_qss_path );
|
|
|
|
hbox1 = new QHBoxLayout();
|
|
vbox1 = new QVBoxLayout();
|
|
|
|
mainLayout->addLayout(hbox1);
|
|
hbox1->addLayout(vbox1);
|
|
hbox1->addWidget(frame);
|
|
|
|
vbox1->addWidget(useNativeFileDialog, 1);
|
|
vbox1->addWidget(useNativeMenuBar, 1);
|
|
vbox1->addWidget(pauseOnMenuAccess, 1);
|
|
vbox1->addWidget(ctxMenuEnable, 1);
|
|
vbox1->addWidget(showSplashScreen, 1);
|
|
vbox1->addStretch(10);
|
|
|
|
closeButton = new QPushButton( tr("Close") );
|
|
closeButton->setIcon(style()->standardIcon(QStyle::SP_DialogCloseButton));
|
|
connect(closeButton, SIGNAL(clicked(void)), this, SLOT(closeWindow(void)));
|
|
|
|
|
|
hbox = new QHBoxLayout();
|
|
hbox->addStretch(3);
|
|
hbox->addWidget( closeButton, 3 );
|
|
hbox->addStretch(3);
|
|
mainLayout->addLayout( hbox );
|
|
|
|
setLayout(mainLayout);
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
GuiConfDialog_t::~GuiConfDialog_t(void)
|
|
{
|
|
//printf("Destroy GUI Config Close Window\n");
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
void GuiConfDialog_t::closeEvent(QCloseEvent *event)
|
|
{
|
|
//printf("GUI Config Close Window Event\n");
|
|
done(0);
|
|
deleteLater();
|
|
event->accept();
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiConfDialog_t::closeWindow(void)
|
|
{
|
|
//printf("Close Window\n");
|
|
done(0);
|
|
deleteLater();
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiConfDialog_t::useNativeFileDialogChanged(int state)
|
|
{
|
|
int value = (state == Qt::Unchecked) ? 0 : 1;
|
|
|
|
g_config->setOption("SDL.UseNativeFileDialog", value);
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiConfDialog_t::useNativeMenuBarChanged(int state)
|
|
{
|
|
int value = (state == Qt::Unchecked) ? 0 : 1;
|
|
|
|
g_config->setOption("SDL.UseNativeMenuBar", value);
|
|
|
|
consoleWindow->menuBar()->setNativeMenuBar(value);
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiConfDialog_t::pauseOnMenuAccessChanged(int state)
|
|
{
|
|
int value = (state == Qt::Unchecked) ? 0 : 1;
|
|
|
|
g_config->setOption("SDL.PauseOnMainMenuAccess", value);
|
|
|
|
consoleWindow->setMenuAccessPauseEnable( value );
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiConfDialog_t::contextMenuEnableChanged(int state)
|
|
{
|
|
int value = (state == Qt::Unchecked) ? 0 : 1;
|
|
|
|
g_config->setOption("SDL.ContextMenuEnable", value);
|
|
|
|
consoleWindow->setContextMenuEnable( value );
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiConfDialog_t::showSplashScreenChanged(int state)
|
|
{
|
|
QSettings settings;
|
|
bool value = (state == Qt::Unchecked) ? 0 : 1;
|
|
|
|
settings.setValue("mainWindow/showSplashScreen", value );
|
|
settings.sync();
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiConfDialog_t::useCustomStyleChanged(int state)
|
|
{
|
|
int value = (state == Qt::Unchecked) ? 0 : 1;
|
|
|
|
g_config->setOption("SDL.UseCustomQss", value);
|
|
|
|
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;
|
|
|
|
s = styleComboBox->currentText();
|
|
|
|
g_config->setOption("SDL.GuiStyle", s.toStdString().c_str() );
|
|
g_config->save();
|
|
|
|
QApplication::setStyle( new fceuStyle() );
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiConfDialog_t::clearQss(void)
|
|
{
|
|
custom_qss_path->setText("");
|
|
|
|
g_config->setOption("SDL.QtStyleSheet", "");
|
|
g_config->save();
|
|
|
|
QApplication::setStyle( new fceuStyle() );
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiConfDialog_t::openQss(void)
|
|
{
|
|
int ret, useNativeFileDialogVal; //, useCustom;
|
|
QString filename;
|
|
std::string last, iniPath;
|
|
char dir[512];
|
|
char exePath[512];
|
|
QFileDialog dialog(this, tr("Open Qt Stylesheet (QSS)"));
|
|
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 (*.qss *.QSS) ;; All files (*)"));
|
|
|
|
dialog.setViewMode(QFileDialog::List);
|
|
dialog.setFilter(QDir::AllEntries | QDir::AllDirs | QDir::Hidden);
|
|
dialog.setLabelText(QFileDialog::Accept, tr("Load"));
|
|
|
|
g_config->getOption("SDL.QtStyleSheet", &last);
|
|
|
|
if (last.size() == 0)
|
|
{
|
|
last.assign(iniPath);
|
|
}
|
|
|
|
getDirFromFile(last.c_str(), dir, sizeof(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_qss_path->setText(filename.toStdString().c_str());
|
|
|
|
g_config->setOption("SDL.QtStyleSheet", filename.toStdString().c_str() );
|
|
g_config->save();
|
|
|
|
QApplication::setStyle( new fceuStyle() );
|
|
|
|
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, sizeof(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)
|
|
{
|
|
if ( editDialog )
|
|
{
|
|
return;
|
|
}
|
|
editDialog = new GuiPaletteEditDialog_t(this);
|
|
|
|
editDialog->show();
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiConfDialog_t::openTestWindow(void)
|
|
{
|
|
guiStyleTestDialog *dialog = new guiStyleTestDialog(this);
|
|
|
|
dialog->show();
|
|
}
|
|
//----------------------------------------------------
|
|
//----------------------------------------------------
|
|
// Custom Style Wrapper Class
|
|
//----------------------------------------------------
|
|
//----------------------------------------------------
|
|
fceuStyle::fceuStyle(void) : fceuStyle(styleBase()){}
|
|
|
|
fceuStyle::fceuStyle(QStyle *style) : QProxyStyle(style)
|
|
{
|
|
//printf("New Style!!!\n");
|
|
|
|
setObjectName( style->objectName() );
|
|
}
|
|
|
|
fceuStyle::~fceuStyle(void)
|
|
{
|
|
//printf("Style Deleted: %s\n", objectName().toStdString().c_str() );
|
|
|
|
if ( rccFilePath.size() > 0 )
|
|
{
|
|
if ( QResource::unregisterResource( QString::fromStdString(rccFilePath) ) )
|
|
{
|
|
//printf("Removed Resource: '%s'\n", rccFilePath.c_str() );
|
|
rccFilePath.clear();
|
|
}
|
|
}
|
|
}
|
|
|
|
QStyle *fceuStyle::styleBase(QStyle *style) const
|
|
{
|
|
std::string s;
|
|
static QStyle *base;
|
|
|
|
if ( g_config != NULL )
|
|
{
|
|
g_config->getOption("SDL.GuiStyle", &s );
|
|
}
|
|
|
|
if ( s.size() == 0 )
|
|
{
|
|
int i, idx = -1;
|
|
#ifdef WIN32
|
|
//QString defaultStyle("windows"); // fusion is much more stable and consistent.
|
|
QString defaultStyle("fusion");
|
|
#elif __APPLE__
|
|
QString defaultStyle("fusion");
|
|
#else
|
|
QString defaultStyle("fusion");
|
|
#endif
|
|
|
|
QStringList styleKeys = QStyleFactory::keys();
|
|
|
|
for (i=0; i<styleKeys.size(); i++)
|
|
{
|
|
//printf("Style: '%s'\n", styleKeys[i].toStdString().c_str() );
|
|
|
|
if ( defaultStyle.compare( styleKeys[i], Qt::CaseInsensitive ) == 0 )
|
|
{
|
|
//printf("Style Match: %s\n", styleKeys[i].toStdString().c_str() );
|
|
idx = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( (idx >= 0) && (idx < styleKeys.size()) )
|
|
{
|
|
s = styleKeys[idx].toStdString();
|
|
}
|
|
else
|
|
{
|
|
s.assign("fusion");
|
|
}
|
|
}
|
|
|
|
if ( style == NULL )
|
|
{
|
|
base = QStyleFactory::create(QString::fromStdString(s));
|
|
}
|
|
else
|
|
{
|
|
base = style;
|
|
}
|
|
|
|
return base;
|
|
}
|
|
|
|
void fceuStyle::polish(QPalette &palette)
|
|
{
|
|
int useCustom;
|
|
|
|
g_config->getOption("SDL.UseCustomQPal", &useCustom);
|
|
//basePtr->polish(palette);
|
|
//QStyle::polish(palette);
|
|
|
|
// If the edit dialog is open, don't over write the palette
|
|
if ( editDialog )
|
|
{
|
|
return;
|
|
}
|
|
|
|
palette = standardPalette();
|
|
|
|
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));
|
|
}
|
|
|
|
void fceuStyle::polish(QApplication *app)
|
|
{
|
|
int useCustom;
|
|
std::string s;
|
|
|
|
if (!app) return;
|
|
|
|
//printf("Load Style Sheet!!!\n");
|
|
// increase font size for better reading,
|
|
// setPointSize was reduced from +2 because when applied this way in Qt5, the
|
|
// font is larger than intended for some reason
|
|
//QFont defaultFont = QApplication::font();
|
|
//defaultFont.setPointSize(defaultFont.pointSize() + 1);
|
|
//app->setFont(defaultFont);
|
|
|
|
g_config->getOption("SDL.UseCustomQss", &useCustom);
|
|
g_config->getOption("SDL.QtStyleSheet", &s);
|
|
|
|
if ( useCustom && (s.size() > 0) )
|
|
{
|
|
// loadstylesheet
|
|
QFile file( s.c_str() );
|
|
|
|
if ( file.open(QIODevice::ReadOnly | QIODevice::Text) )
|
|
{
|
|
// set stylesheet
|
|
QString qsStylesheet = QString::fromLatin1( file.readAll() );
|
|
app->setStyleSheet(qsStylesheet);
|
|
file.close();
|
|
}
|
|
|
|
if ( rccFilePath.size() == 0 )
|
|
{
|
|
char dir[1024], rccBase[256], tmpFile[2048];
|
|
|
|
parseFilepath( s.c_str(), dir, rccBase, NULL );
|
|
|
|
sprintf( tmpFile, "%s%s.rcc", dir, rccBase );
|
|
|
|
//printf("RCC: '%s%s'\n", dir, rccBase );
|
|
|
|
if ( QResource::registerResource( tmpFile ) )
|
|
{
|
|
//printf("Loaded RCC File: '%s'\n", tmpFile );
|
|
rccFilePath.assign( tmpFile );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
app->setStyleSheet(NULL);
|
|
}
|
|
}
|
|
//----------------------------------------------------
|
|
//----------------------------------------------------
|
|
// QPalette Edit Dialog Window
|
|
//----------------------------------------------------
|
|
//----------------------------------------------------
|
|
static const char *getRoleText( QPalette::ColorRole role )
|
|
{
|
|
const char *rTxt;
|
|
|
|
switch ( role )
|
|
{
|
|
case QPalette::Window:
|
|
rTxt = "Window";
|
|
break;
|
|
case QPalette::WindowText:
|
|
rTxt = "WindowText";
|
|
break;
|
|
case QPalette::Base:
|
|
rTxt = "Base";
|
|
break;
|
|
case QPalette::AlternateBase:
|
|
rTxt = "AlternateBase";
|
|
break;
|
|
case QPalette::ToolTipBase:
|
|
rTxt = "ToolTipBase";
|
|
break;
|
|
case QPalette::ToolTipText:
|
|
rTxt = "ToolTipText";
|
|
break;
|
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)
|
|
case QPalette::PlaceholderText:
|
|
rTxt = "PlaceholderText";
|
|
break;
|
|
#endif
|
|
case QPalette::Text:
|
|
rTxt = "Text";
|
|
break;
|
|
case QPalette::Button:
|
|
rTxt = "Button";
|
|
break;
|
|
case QPalette::ButtonText:
|
|
rTxt = "ButtonText";
|
|
break;
|
|
case QPalette::BrightText:
|
|
rTxt = "BrightText";
|
|
break;
|
|
case QPalette::Light:
|
|
rTxt = "Light";
|
|
break;
|
|
case QPalette::Midlight:
|
|
rTxt = "Midlight";
|
|
break;
|
|
case QPalette::Mid:
|
|
rTxt = "Mid";
|
|
break;
|
|
case QPalette::Dark:
|
|
rTxt = "Dark";
|
|
break;
|
|
case QPalette::Shadow:
|
|
rTxt = "Shadow";
|
|
break;
|
|
case QPalette::Highlight:
|
|
rTxt = "Highlight";
|
|
break;
|
|
case QPalette::HighlightedText:
|
|
rTxt = "HighlightedText";
|
|
break;
|
|
case QPalette::Link:
|
|
rTxt = "Link";
|
|
break;
|
|
case QPalette::LinkVisited:
|
|
rTxt = "LinkVisited";
|
|
break;
|
|
case QPalette::NoRole:
|
|
rTxt = "NoRole";
|
|
break;
|
|
default:
|
|
rTxt = NULL;
|
|
break;
|
|
}
|
|
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 )
|
|
{
|
|
QScrollArea *scrollArea;
|
|
QVBoxLayout *mainLayout;
|
|
QVBoxLayout *vbox;
|
|
QHBoxLayout *hbox1;
|
|
QMenuBar *menuBar;
|
|
QMenu *fileMenu;
|
|
QAction *act;
|
|
GuiPaletteColorSelect *pcs;
|
|
QPalette::ColorGroup g;
|
|
QWidget *viewport;
|
|
QFrame *line;
|
|
QLabel *lbl;
|
|
int useNativeMenuBarVal;
|
|
|
|
setWindowTitle(tr("GUI Color Palette Edit"));
|
|
|
|
g_config->getOption("SDL.UseNativeMenuBar", &useNativeMenuBarVal);
|
|
|
|
menuBar = new QMenuBar(this);
|
|
|
|
menuBar->setNativeMenuBar( useNativeMenuBarVal ? true : false );
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Menu Start
|
|
//-----------------------------------------------------------------------
|
|
// 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);
|
|
act->setStatusTip(tr("Close Window"));
|
|
connect(act, SIGNAL(triggered()), this, SLOT(closeWindow(void)) );
|
|
|
|
fileMenu->addAction(act);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Menu End
|
|
//-----------------------------------------------------------------------
|
|
|
|
scrollArea = new QScrollArea(this);
|
|
viewport = new QWidget(this);
|
|
scrollArea->setWidget( viewport );
|
|
scrollArea->setWidgetResizable(true);
|
|
scrollArea->setSizeAdjustPolicy( QAbstractScrollArea::AdjustToContents );
|
|
scrollArea->setHorizontalScrollBarPolicy( Qt::ScrollBarAsNeeded );
|
|
scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAsNeeded );
|
|
|
|
mainLayout = new QVBoxLayout(this);
|
|
|
|
mainLayout->setMenuBar( menuBar );
|
|
|
|
hbox1 = new QHBoxLayout(viewport);
|
|
|
|
//viewport->setLayout( hbox1 );
|
|
|
|
mainLayout->addWidget( scrollArea );
|
|
|
|
for (int j=0; j<3; j++)
|
|
{
|
|
lbl = new QLabel();
|
|
lbl->setAlignment( Qt::AlignCenter );
|
|
|
|
if ( j == 1 )
|
|
{
|
|
g = QPalette::Disabled;
|
|
lbl->setText( tr("Disabled") );
|
|
}
|
|
else if ( j == 2 )
|
|
{
|
|
g = QPalette::Inactive;
|
|
lbl->setText( tr("Inactive") );
|
|
}
|
|
else
|
|
{
|
|
g = QPalette::Active;
|
|
lbl->setText( tr("Active") );
|
|
}
|
|
line = new QFrame(this);
|
|
line->setFrameShape(QFrame::VLine); // Vertical line
|
|
line->setFrameShadow(QFrame::Sunken);
|
|
line->setLineWidth(2);
|
|
|
|
vbox = new QVBoxLayout();
|
|
|
|
hbox1->addWidget( line );
|
|
hbox1->addLayout( vbox );
|
|
|
|
vbox->addWidget( lbl );
|
|
|
|
for (int i=0; i<30; i++)
|
|
{
|
|
const char *rTxt = getRoleText( (QPalette::ColorRole)i );
|
|
|
|
if ( rTxt )
|
|
{
|
|
pcs = new GuiPaletteColorSelect( g, (QPalette::ColorRole)i, this );
|
|
|
|
vbox->addWidget( pcs );
|
|
}
|
|
}
|
|
}
|
|
|
|
setLayout( mainLayout );
|
|
|
|
}
|
|
//----------------------------------------------------
|
|
GuiPaletteEditDialog_t::~GuiPaletteEditDialog_t(void)
|
|
{
|
|
if ( editDialog == this )
|
|
{
|
|
editDialog = NULL;
|
|
}
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiPaletteEditDialog_t::closeEvent(QCloseEvent *event)
|
|
{
|
|
printf("GUI Palette Edit Close Window Event\n");
|
|
done(0);
|
|
deleteLater();
|
|
event->accept();
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiPaletteEditDialog_t::closeWindow(void)
|
|
{
|
|
//printf("Close Window\n");
|
|
done(0);
|
|
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, sizeof(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)
|
|
{
|
|
QHBoxLayout *hbox;
|
|
QPushButton *editBox;
|
|
|
|
hbox = new QHBoxLayout();
|
|
|
|
setLayout(hbox);
|
|
|
|
editBox = new QPushButton( tr("Edit") );
|
|
|
|
lbl = new QLabel();
|
|
cb = new QCheckBox();
|
|
|
|
lbl->setAlignment( Qt::AlignCenter );
|
|
|
|
hbox->addWidget(editBox, 1);
|
|
hbox->addWidget( cb, 1);
|
|
hbox->addWidget(lbl, 10);
|
|
|
|
this->group = group;
|
|
this->role = role;
|
|
|
|
color = this->palette().color( group, role );
|
|
|
|
setText();
|
|
updateColor();
|
|
|
|
connect( editBox, SIGNAL(clicked(void)), this, SLOT(colorEditClicked(void)) );
|
|
|
|
}
|
|
//----------------------------------------------------
|
|
GuiPaletteColorSelect::~GuiPaletteColorSelect(void)
|
|
{
|
|
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiPaletteColorSelect::setText(void)
|
|
{
|
|
const char *gTxt, *rTxt;
|
|
char stmp[256];
|
|
|
|
switch ( group )
|
|
{
|
|
case QPalette::Active:
|
|
gTxt = "Active";
|
|
break;
|
|
case QPalette::Disabled:
|
|
gTxt = "Disabled";
|
|
break;
|
|
case QPalette::Inactive:
|
|
gTxt = "Inactive";
|
|
break;
|
|
default:
|
|
gTxt = NULL;
|
|
break;
|
|
}
|
|
|
|
rTxt = getRoleText( role );
|
|
|
|
if ( (gTxt == NULL) || (rTxt == NULL) )
|
|
{
|
|
return;
|
|
}
|
|
sprintf( stmp, "%s :: %s", gTxt, rTxt );
|
|
|
|
lbl->setText( tr(stmp) );
|
|
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiPaletteColorSelect::updateColor(void)
|
|
{
|
|
char stmp[256];
|
|
QColor txtColor;
|
|
|
|
if ( qGray( color.red(), color.green(), color.blue() ) > 128 )
|
|
{
|
|
txtColor.setRgb( 0, 0, 0 );
|
|
}
|
|
else
|
|
{
|
|
txtColor.setRgb( 255, 255, 255 );
|
|
}
|
|
sprintf( stmp, "QLabel { background-color : %s; color : %s; border-color : black; }",
|
|
color.name().toStdString().c_str(), txtColor.name().toStdString().c_str() );
|
|
|
|
lbl->setStyleSheet( stmp );
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiPaletteColorSelect::colorEditClicked(void)
|
|
{
|
|
QString title;
|
|
|
|
guiColorPickerDialog_t *editor = new guiColorPickerDialog_t( &color, this );
|
|
|
|
title = QStringLiteral("Pick Palette Color for ") + lbl->text();
|
|
|
|
editor->setWindowTitle( title );
|
|
|
|
editor->show();
|
|
}
|
|
//----------------------------------------------------
|
|
void GuiPaletteColorSelect::updatePalette(void)
|
|
{
|
|
QPalette pal;
|
|
|
|
pal = this->palette();
|
|
|
|
pal.setColor( group, role, color );
|
|
|
|
QApplication::setPalette( pal );
|
|
}
|
|
//----------------------------------------------------
|
|
//----------------------------------------------------
|
|
// Color Picker
|
|
//----------------------------------------------------
|
|
//----------------------------------------------------
|
|
guiColorPickerDialog_t::guiColorPickerDialog_t( QColor *c, QWidget *parent )
|
|
: QDialog( parent )
|
|
{
|
|
QVBoxLayout *mainLayout;
|
|
QHBoxLayout *hbox;
|
|
QPushButton *okButton;
|
|
QPushButton *cancelButton;
|
|
QPushButton *resetButton;
|
|
QStyle *style;
|
|
|
|
style = this->style();
|
|
|
|
setWindowTitle( "Pick Palette Color" );
|
|
|
|
colorPtr = c;
|
|
origColor = *c;
|
|
|
|
mainLayout = new QVBoxLayout();
|
|
|
|
setLayout( mainLayout );
|
|
|
|
colorDialog = new QColorDialog(this);
|
|
|
|
mainLayout->addWidget( colorDialog );
|
|
|
|
colorDialog->setWindowFlags(Qt::Widget);
|
|
colorDialog->setOption( QColorDialog::DontUseNativeDialog, true );
|
|
colorDialog->setOption( QColorDialog::NoButtons, true );
|
|
colorDialog->setCurrentColor( *c );
|
|
|
|
connect( colorDialog, SIGNAL(colorSelected(const QColor &)) , this, SLOT(colorChanged( const QColor &)) );
|
|
connect( colorDialog, SIGNAL(currentColorChanged(const QColor &)), this, SLOT(colorChanged( const QColor &)) );
|
|
|
|
connect( colorDialog, SIGNAL(accepted(void)), this, SLOT(colorAccepted(void)) );
|
|
connect( colorDialog, SIGNAL(rejected(void)), this, SLOT(colorRejected(void)) );
|
|
|
|
hbox = new QHBoxLayout();
|
|
mainLayout->addLayout( hbox );
|
|
|
|
okButton = new QPushButton( tr("OK") );
|
|
cancelButton = new QPushButton( tr("Cancel") );
|
|
resetButton = new QPushButton( tr("Reset") );
|
|
|
|
okButton->setIcon( style->standardIcon( QStyle::SP_DialogApplyButton ) );
|
|
cancelButton->setIcon( style->standardIcon( QStyle::SP_DialogCancelButton ) );
|
|
resetButton->setIcon( style->standardIcon( QStyle::SP_DialogResetButton ) );
|
|
|
|
hbox->addWidget( resetButton, 1 );
|
|
hbox->addStretch( 10 );
|
|
hbox->addWidget( okButton, 1 );
|
|
hbox->addWidget( cancelButton, 1 );
|
|
|
|
connect( okButton , SIGNAL(clicked(void)), this, SLOT(colorAccepted(void)) );
|
|
connect( cancelButton, SIGNAL(clicked(void)), this, SLOT(colorRejected(void)) );
|
|
connect( resetButton , SIGNAL(clicked(void)), this, SLOT(resetColor(void)) );
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
guiColorPickerDialog_t::~guiColorPickerDialog_t(void)
|
|
{
|
|
//printf("guiColorPicker Destroyed\n");
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
void guiColorPickerDialog_t::closeEvent(QCloseEvent *event)
|
|
{
|
|
//printf("guiColorPicker Close Window Event\n");
|
|
done(0);
|
|
deleteLater();
|
|
event->accept();
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
void guiColorPickerDialog_t::closeWindow(void)
|
|
{
|
|
//printf("Close Window\n");
|
|
done(0);
|
|
deleteLater();
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
void guiColorPickerDialog_t::colorChanged( const QColor &color )
|
|
{
|
|
//printf("Color Changed: R:%i G%i B%i \n", color.red(), color.green(), color.blue() );
|
|
|
|
*colorPtr = color;
|
|
|
|
( (GuiPaletteColorSelect*)parent())->updateColor();
|
|
( (GuiPaletteColorSelect*)parent())->updatePalette();
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
void guiColorPickerDialog_t::colorAccepted(void)
|
|
{
|
|
//printf("guiColorPicker Accepted\n");
|
|
deleteLater();
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
void guiColorPickerDialog_t::colorRejected(void)
|
|
{
|
|
//printf("guiColorPicker Rejected\n");
|
|
|
|
// Reset to original color
|
|
*colorPtr = origColor;
|
|
|
|
( (GuiPaletteColorSelect*)parent())->updateColor();
|
|
( (GuiPaletteColorSelect*)parent())->updatePalette();
|
|
|
|
deleteLater();
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
void guiColorPickerDialog_t::resetColor(void)
|
|
{
|
|
// Reset to original color
|
|
*colorPtr = origColor;
|
|
|
|
colorDialog->setCurrentColor( origColor );
|
|
|
|
( (GuiPaletteColorSelect*)parent())->updateColor();
|
|
( (GuiPaletteColorSelect*)parent())->updatePalette();
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
//----------------------------------------------------------------------------
|
|
// GUI Style Test Window
|
|
//----------------------------------------------------------------------------
|
|
//----------------------------------------------------------------------------
|
|
guiStyleTestDialog::guiStyleTestDialog(QWidget *parent)
|
|
: QDialog( parent )
|
|
{
|
|
QScrollArea *scrollArea;
|
|
QVBoxLayout *mainLayout;
|
|
QVBoxLayout *vbox, *vbox1, *vbox2;
|
|
QHBoxLayout *hbox, *hbox1, *hbox2;
|
|
QGridLayout *grid;
|
|
QMenuBar *menuBar;
|
|
QMenu *fileMenu;
|
|
QAction *act;
|
|
QWidget *viewport;
|
|
//QFrame *line;
|
|
QLabel *lbl;
|
|
QGroupBox *gbox;
|
|
QPushButton *pushButton;
|
|
QRadioButton *radioButton;
|
|
QCheckBox *checkButton;
|
|
QSlider *slider;
|
|
QDial *dial;
|
|
QLineEdit *lineEdit;
|
|
QComboBox *comboBox;
|
|
QSpinBox *spinBox;
|
|
QTextEdit *textEdit;
|
|
int useNativeMenuBarVal;
|
|
|
|
setWindowTitle(tr("GUI Style Test Window"));
|
|
|
|
g_config->getOption("SDL.UseNativeMenuBar", &useNativeMenuBarVal);
|
|
|
|
menuBar = new QMenuBar(this);
|
|
|
|
menuBar->setNativeMenuBar( useNativeMenuBarVal ? true : false );
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Menu Start
|
|
//-----------------------------------------------------------------------
|
|
// File
|
|
fileMenu = menuBar->addMenu(tr("&File"));
|
|
|
|
// File -> Close
|
|
act = new QAction(tr("&Close"), this);
|
|
act->setShortcut(QKeySequence::Close);
|
|
act->setStatusTip(tr("Close Window"));
|
|
connect(act, SIGNAL(triggered()), this, SLOT(closeWindow(void)) );
|
|
|
|
fileMenu->addAction(act);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Menu End
|
|
//-----------------------------------------------------------------------
|
|
|
|
scrollArea = new QScrollArea(this);
|
|
viewport = new QWidget(this);
|
|
scrollArea->setWidget( viewport );
|
|
scrollArea->setWidgetResizable(true);
|
|
scrollArea->setSizeAdjustPolicy( QAbstractScrollArea::AdjustToContents );
|
|
scrollArea->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
|
|
scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
|
|
|
|
mainLayout = new QVBoxLayout(this);
|
|
vbox1 = new QVBoxLayout(viewport);
|
|
hbox1 = new QHBoxLayout();
|
|
|
|
vbox1->addLayout( hbox1 );
|
|
|
|
mainLayout->setMenuBar( menuBar );
|
|
|
|
mainLayout->addWidget( scrollArea );
|
|
|
|
setLayout( mainLayout );
|
|
|
|
vbox2 = new QVBoxLayout();
|
|
hbox1->addLayout( vbox2 );
|
|
|
|
gbox = new QGroupBox( tr("Text") );
|
|
grid = new QGridLayout();
|
|
vbox2->addWidget( gbox );
|
|
gbox->setLayout( grid );
|
|
|
|
lbl = new QLabel( tr("Label Enabled") );
|
|
lbl->setEnabled(true);
|
|
grid->addWidget( lbl, 0, 0 );
|
|
|
|
lineEdit = new QLineEdit();
|
|
lineEdit->setText( tr("Line Edit Enabled") );
|
|
lineEdit->setEnabled(true);
|
|
grid->addWidget( lineEdit, 0, 1 );
|
|
|
|
lbl = new QLabel( tr("Label Disabled") );
|
|
lbl->setEnabled(false);
|
|
grid->addWidget( lbl, 1, 0 );
|
|
|
|
lineEdit = new QLineEdit();
|
|
lineEdit->setText( tr("Line Edit Disabled") );
|
|
lineEdit->setEnabled(false);
|
|
grid->addWidget( lineEdit, 1, 1 );
|
|
|
|
lbl = new QLabel( tr("Label Link") );
|
|
lbl->setEnabled(true);
|
|
grid->addWidget( lbl, 2, 0 );
|
|
|
|
lbl = new QLabel();
|
|
lbl->setText("<a href=\"http://fceux.com\">Website Link</a>");
|
|
lbl->setTextInteractionFlags(Qt::TextBrowserInteraction);
|
|
lbl->setOpenExternalLinks(false);
|
|
grid->addWidget( lbl, 2, 1 );
|
|
|
|
lbl = new QLabel( tr("Label Sunken") );
|
|
lbl->setEnabled(true);
|
|
lbl->setFrameStyle(QFrame::Panel | QFrame::Sunken);
|
|
grid->addWidget( lbl, 3, 0 );
|
|
|
|
lbl = new QLabel( tr("Label Raised") );
|
|
lbl->setEnabled(true);
|
|
lbl->setFrameStyle(QFrame::Panel | QFrame::Raised);
|
|
grid->addWidget( lbl, 3, 1 );
|
|
|
|
gbox = new QGroupBox( tr("Button") );
|
|
hbox2 = new QHBoxLayout();
|
|
|
|
vbox2->addWidget( gbox );
|
|
gbox->setLayout( hbox2 );
|
|
|
|
pushButton = new QPushButton( tr("Normal") );
|
|
pushButton->setEnabled(true);
|
|
hbox2->addWidget( pushButton );
|
|
|
|
pushButton = new QPushButton( tr("Disabled") );
|
|
pushButton->setEnabled(false);
|
|
hbox2->addWidget( pushButton );
|
|
|
|
pushButton = new QPushButton( tr("Default") );
|
|
pushButton->setEnabled(true);
|
|
pushButton->setDefault(true);
|
|
hbox2->addWidget( pushButton );
|
|
|
|
gbox = new QGroupBox( tr("Checkable") );
|
|
gbox->setCheckable(true);
|
|
grid = new QGridLayout();
|
|
|
|
vbox2->addWidget( gbox );
|
|
gbox->setLayout( grid );
|
|
|
|
radioButton = new QRadioButton( tr("Radio1") );
|
|
radioButton->setEnabled(true);
|
|
radioButton->setChecked(true);
|
|
grid->addWidget( radioButton, 0, 0 );
|
|
|
|
radioButton = new QRadioButton( tr("Radio2") );
|
|
radioButton->setEnabled(true);
|
|
radioButton->setChecked(false);
|
|
grid->addWidget( radioButton, 0, 1 );
|
|
|
|
radioButton = new QRadioButton( tr("Disabled") );
|
|
radioButton->setEnabled(false);
|
|
radioButton->setChecked(false);
|
|
grid->addWidget( radioButton, 0, 2 );
|
|
|
|
checkButton = new QCheckBox( tr("Checkbox") );
|
|
checkButton->setEnabled(true);
|
|
checkButton->setChecked(true);
|
|
grid->addWidget( checkButton, 1, 0 );
|
|
|
|
checkButton = new QCheckBox( tr("TriState") );
|
|
checkButton->setEnabled(true);
|
|
checkButton->setTristate(true);
|
|
checkButton->setCheckState(Qt::PartiallyChecked);
|
|
grid->addWidget( checkButton, 1, 1 );
|
|
|
|
checkButton = new QCheckBox( tr("Disabled") );
|
|
checkButton->setEnabled(false);
|
|
checkButton->setChecked(true);
|
|
grid->addWidget( checkButton, 1, 2 );
|
|
|
|
vbox = new QVBoxLayout();
|
|
hbox = new QHBoxLayout();
|
|
hbox1->addLayout( vbox );
|
|
|
|
slider = new QSlider(Qt::Horizontal);
|
|
slider->setMinimum(-20);
|
|
slider->setMaximum( 20);
|
|
vbox->addWidget( slider );
|
|
|
|
slider = new QSlider(Qt::Horizontal);
|
|
slider->setEnabled(false);
|
|
slider->setMinimum(-20);
|
|
slider->setMaximum( 20);
|
|
vbox->addWidget( slider );
|
|
|
|
vbox->addLayout( hbox );
|
|
slider = new QSlider(Qt::Vertical);
|
|
slider->setMinimum(-20);
|
|
slider->setMaximum( 20);
|
|
hbox->addWidget( slider );
|
|
|
|
slider = new QSlider(Qt::Vertical);
|
|
slider->setEnabled(false);
|
|
slider->setMinimum(-20);
|
|
slider->setMaximum( 20);
|
|
hbox->addWidget( slider );
|
|
|
|
dial = new QDial();
|
|
dial->setNotchesVisible(true);
|
|
hbox->addWidget( dial );
|
|
|
|
textEdit = new QTextEdit();
|
|
textEdit->setText( tr("This is a text edit") );
|
|
hbox->addWidget( textEdit );
|
|
|
|
gbox = new QGroupBox( tr("Selectable") );
|
|
hbox2 = new QHBoxLayout();
|
|
gbox->setLayout( hbox2 );
|
|
|
|
vbox1->addWidget( gbox );
|
|
comboBox = new QComboBox();
|
|
comboBox->addItem( tr("AAA"), 0 );
|
|
comboBox->addItem( tr("BBB"), 1 );
|
|
comboBox->addItem( tr("CCC"), 2 );
|
|
comboBox->setEnabled(true);
|
|
hbox2->addWidget( comboBox );
|
|
|
|
comboBox = new QComboBox();
|
|
comboBox->addItem( tr("AAA"), 0 );
|
|
comboBox->addItem( tr("BBB"), 1 );
|
|
comboBox->addItem( tr("CCC"), 2 );
|
|
comboBox->setEnabled(false);
|
|
hbox2->addWidget( comboBox );
|
|
|
|
spinBox = new QSpinBox();
|
|
spinBox->setEnabled(true);
|
|
hbox2->addWidget( spinBox );
|
|
|
|
spinBox = new QSpinBox();
|
|
spinBox->setEnabled(false);
|
|
hbox2->addWidget( spinBox );
|
|
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
guiStyleTestDialog::~guiStyleTestDialog(void)
|
|
{
|
|
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
void guiStyleTestDialog::closeEvent(QCloseEvent *event)
|
|
{
|
|
//printf("GUI Config Close Window Event\n");
|
|
done(0);
|
|
deleteLater();
|
|
event->accept();
|
|
}
|
|
//----------------------------------------------------
|
|
void guiStyleTestDialog::closeWindow(void)
|
|
{
|
|
//printf("Close Window\n");
|
|
done(0);
|
|
deleteLater();
|
|
}
|
|
//----------------------------------------------------
|