Files
nethack/win/Qt/qt_set.cpp
2024-02-28 20:15:56 -08:00

345 lines
11 KiB
C++

// Copyright (c) Warwick Allison, 1999.
// Qt4 conversion copyright (c) Ray Chason, 2012-2014.
// NetHack may be freely redistributed. See license for details.
// qt_set.cpp -- Qt-specific settings, saved and restored by Qt so
// persist not just across save/restore but into new games.
extern "C" {
#include "hack.h"
}
#include "qt_pre.h"
#include <QtGui/QtGui>
#if QT_VERSION >= 0x050000
#include <QtWidgets/QtWidgets>
#endif
#include "qt_post.h"
#include "qt_set.h"
#include "qt_set.moc"
#include "qt_glyph.h"
#include "qt_main.h"
#include "qt_bind.h"
#include "qt_xcmd.h"
#include "qt_str.h"
// Dialog box accessed via "Qt Settings..." in the games menu (non-OSX)
// or via "Preferences..." in the application menu (OSX):
//--
// "Qt NetHack Settings"
// "Map:" [ ] Zoomed -- check box
// tilewidth -- number entry spinner
// tileheight -- ditto
// "Invent:" [ ] Shown -- check box
// dollwidth -- number entry spinner
// dollheight -- ditto
// "Font:" fontsize -- Huge:18pt, Large:14, Medium:12, Small:10, Tiny:8
// [dismiss] -- button
//--
// Map remembers 2 size pairs, one for Zoomed unchecked, another for checked.
// (Player controls whether the box is checked, using the dialog to manually
// switch back and forth if desired; nothing forces the Zoomed setting to
// specify larger tile size than not-Zoomed.)
// Paper doll inventory subset is shown or suppressed depending on check box.
// (It only remembers one tile size pair and that only matters when shown.
// The size could be different from both map settings but it is highly
// recommended that it match one of those unless Zoomed is never toggled.)
// Font size is used for message window and for text in the status window.
// (TODO: support separate font sizes for the two windows.)
// There's no way to undo or avoid saving any changes which player makes but
// all of the fields can be manually reversed.
/* Used by tile/font-size patch below and in ../../src/files.c */
char *qt_tilewidth=NULL;
char *qt_tileheight=NULL;
char *qt_fontsize=NULL;
#if defined(QWS)
int qt_compact_mode = 1;
#else
int qt_compact_mode = 0;
#endif
namespace nethack_qt_ {
#define TILEWMIN 6
#define TILEHMIN 6
NetHackQtSettings::NetHackQtSettings() :
settings(),
whichsize("&Zoomed", this),
tilewidth(this),
tileheight(this),
widthlbl("Tile &width:", this),
heightlbl("Tile &height:", this),
#ifdef ENHANCED_PAPERDOLL
dollshown("&Shown", this),
dollwidth(this),
dollheight(this),
dollwidthlbl("&Doll width:", this), // should "Doll tile width"...
dollheightlbl("Doll height:", this), // ...but that's too verbose
#endif
fontsize(this),
normal("times"),
#ifdef WS_WIN
normalfixed("courier new"),
#else
normalfixed("courier"),
#endif
large("times"),
small("times"),
theglyphs(0)
{
int default_fontsize;
widthlbl.setBuddy(&tilewidth);
tilewidth.setRange(TILEWMIN, 128);
heightlbl.setBuddy(&tileheight);
tileheight.setRange(TILEHMIN, 128);
tilewidth.setValue(settings.value("tilewidth", 16).toInt());
tileheight.setValue(settings.value("tileheight", 16).toInt());
#ifdef ENHANCED_PAPERDOLL
dollwidthlbl.setBuddy(&dollwidth);
dollwidth.setRange(TILEWMIN, 48);
dollheightlbl.setBuddy(&dollheight);
dollheight.setRange(TILEHMIN, 48);
dollwidth.setValue(settings.value("dollwidth", 32).toInt());
dollheight.setValue(settings.value("dollheight", 32).toInt());
doll_is_shown = settings.value("dollShown", true).toBool();
// needed the very first time
settings.setValue("dollShown", QVariant(doll_is_shown));
#endif
default_fontsize = settings.value("fontsize", 2).toInt();
// these aren't currently part of the settings dialog; they're managed
// by the extended commands menu ('#' command) and updateXcmd() below
// but are included in qt_settings to be remembered across play sessions
xcmd_by_row = settings.value("xcmdByRow", false).toBool();
xcmd_set = settings.value("xcmdSet", all_cmds).toInt();
// Tile/font sizes read from .nethackrc
if (qt_tilewidth != NULL) {
tilewidth.setValue(atoi(qt_tilewidth));
free(qt_tilewidth);
qt_tilewidth = NULL;
}
if (qt_tileheight != NULL) {
tileheight.setValue(atoi(qt_tileheight));
free(qt_tileheight);
qt_tileheight = NULL;
}
if (qt_fontsize != NULL) {
switch (tolower(qt_fontsize[0])) {
case 'h': default_fontsize = 0; break;
case 'l': default_fontsize = 1; break;
case 'm': default_fontsize = 2; break;
case 's': default_fontsize = 3; break;
case 't': default_fontsize = 4; break;
}
free(qt_fontsize);
qt_fontsize = NULL;
}
theglyphs=new NetHackQtGlyphs();
if (!theglyphs->no_tiles) {
resizeTiles();
connect(&whichsize, SIGNAL(toggled(bool)), this,
SLOT(setGlyphSize(bool)));
connect(&tilewidth, SIGNAL(valueChanged(int)), this,
SLOT(resizeTiles()));
connect(&tileheight, SIGNAL(valueChanged(int)), this,
SLOT(resizeTiles()));
#ifdef ENHANCED_PAPERDOLL
connect(&dollshown, SIGNAL(toggled(bool)), this,
SLOT(setDollShown(bool)));
connect(&dollwidth, SIGNAL(valueChanged(int)), this,
SLOT(resizeDoll()));
connect(&dollheight, SIGNAL(valueChanged(int)), this,
SLOT(resizeDoll()));
#endif
} else {
// paper doll requires map tiles and those just failed to load
doll_is_shown = false;
}
fontsize.setMinimumContentsLength((int) strlen("Medium"));
fontsize.addItem("Huge");
fontsize.addItem("Large");
fontsize.addItem("Medium");
fontsize.addItem("Small");
fontsize.addItem("Tiny");
fontsize.setCurrentIndex(default_fontsize);
connect(&fontsize, SIGNAL(activated(int)), this, SLOT(changedFont()));
int row = 0; // used like X11-style XtSetArg(), ++argc
QGridLayout *grid = new QGridLayout(this);
// dialog box label, spans first two rows and all three columns
QLabel *settings_label = new QLabel("Qt NetHack Settings\n", this);
grid->addWidget(settings_label, row, 0, 2, 3), row += 2; // uses extra row
settings_label->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
QLabel *map_label = new QLabel("&Map:", this);
map_label->setBuddy(&whichsize);
grid->addWidget(map_label, row, 0), // "Map: [ ]Zoomed"
grid->addWidget(&whichsize, row, 1), ++row;
grid->addWidget(&widthlbl, row, 1),
grid->addWidget(&tilewidth, row, 2), ++row;
grid->addWidget(&heightlbl, row, 1),
grid->addWidget(&tileheight, row, 2), ++row;
#ifdef ENHANCED_PAPERDOLL
dollshown.QAbstractButton::setChecked(doll_is_shown);
QLabel *doll_label = new QLabel("&Invent:", this);
doll_label->setBuddy(&dollshown);
grid->addWidget(doll_label, row, 0), // "Invent: [ ]Shown"
grid->addWidget(&dollshown, row, 1), ++row;
grid->addWidget(&dollwidthlbl, row, 1),
grid->addWidget(&dollwidth, row, 2), ++row;
grid->addWidget(&dollheightlbl, row, 1),
grid->addWidget(&dollheight, row, 2), ++row;
#endif
QLabel *flabel = new QLabel("&Font:", this);
flabel->setBuddy(&fontsize);
grid->addWidget(flabel, row, 0),
grid->addWidget(&fontsize, row, 1), ++row;
QPushButton *dismiss = new QPushButton("Dismiss", this);
dismiss->setDefault(true);
grid->addWidget(dismiss, row, 0, 1, 3), ++row;
grid->setRowStretch(row - 1, 0);
grid->setColumnStretch(1, 1);
grid->setColumnStretch(2, 2);
grid->activate();
connect(dismiss, SIGNAL(clicked()), this, SLOT(accept()));
resize(150, 140);
}
NetHackQtGlyphs& NetHackQtSettings::glyphs()
{
// Caveat:
// 'theglyphs' will be Null if the tiles file couldn't be loaded;
// the game can still proceed with an ascii map in that situation.
return *theglyphs;
}
void NetHackQtSettings::changedFont()
{
settings.setValue("fontsize", fontsize.currentIndex());
emit fontChanged();
}
void NetHackQtSettings::resizeTiles()
{
tileWidth = tilewidth.value();
tileHeight = tileheight.value();
settings.setValue("tilewidth", tileWidth);
settings.setValue("tileheight", tileHeight);
if (theglyphs) {
theglyphs->setSize(tileWidth, tileHeight);
emit tilesChanged();
}
}
void NetHackQtSettings::toggleGlyphSize()
{
whichsize.toggle();
}
void NetHackQtSettings::setGlyphSize(bool which UNUSED)
{
QSize n = QSize(tilewidth.value(),tileheight.value());
if ( othersize.isValid() ) {
tilewidth.blockSignals(true);
tileheight.blockSignals(true);
tilewidth.setValue(othersize.width());
tileheight.setValue(othersize.height());
tileheight.blockSignals(false);
tilewidth.blockSignals(false);
resizeTiles();
}
othersize = n;
}
#ifdef ENHANCED_PAPERDOLL
void NetHackQtSettings::resizeDoll()
{
dollWidth = dollwidth.value();
dollHeight = dollheight.value();
settings.setValue("dollwidth", dollWidth);
settings.setValue("dollheight", dollHeight);
settings.setValue("dollShown", doll_is_shown);
//NetHackQtMainWindow::resizePaperDoll(doll_is_shown);
NetHackQtMainWindow *w = static_cast <NetHackQtMainWindow *>
(NetHackQtBind::mainWidget());
w->resizePaperDoll(doll_is_shown);
}
void NetHackQtSettings::toggleDollShown()
{
dollshown.toggle();
}
void NetHackQtSettings::setDollShown(bool on_off)
{
if (on_off != doll_is_shown) {
dollshown.QAbstractButton::setChecked(on_off);
doll_is_shown = on_off;
resizeDoll();
}
}
#endif
// called from NetHackQtExtCmdRequestor::Retry()
void NetHackQtSettings::updateXcmd(bool by_row, int which_set)
{
// update 'settings' to have Qt store the revised values for next session
xcmd_by_row = by_row;
settings.setValue("xcmdByRow", QVariant(xcmd_by_row));
xcmd_set = which_set;
settings.setValue("xcmdSet", xcmd_set);
}
const QFont& NetHackQtSettings::normalFont()
{
static int size[]={ 18, 14, 12, 10, 8 };
normal.setPointSize(size[fontsize.currentIndex()]);
return normal;
}
const QFont& NetHackQtSettings::normalFixedFont()
{
static int size[]={ 18, 14, 13, 10, 8 };
normalfixed.setPointSize(size[fontsize.currentIndex()]);
return normalfixed;
}
const QFont& NetHackQtSettings::largeFont()
{
static int size[]={ 24, 18, 14, 12, 10 };
large.setPointSize(size[fontsize.currentIndex()]);
return large;
}
const QFont& NetHackQtSettings::smallFont()
{
static int size[]={ 14, 12, 10, 8, 8 };
small.setPointSize(size[fontsize.currentIndex()]);
return small;
}
bool NetHackQtSettings::ynInMessages()
{
return !qt_compact_mode && !iflags.wc_popup_dialog;
}
NetHackQtSettings* qt_settings;
} // namespace nethack_qt_