1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-01 03:21:41 +00:00
OpenMW/apps/opencs/view/prefs/dialogue.cpp

148 lines
3.7 KiB
C++

#include "dialogue.hpp"
#include <exception>
#include <map>
#include <utility>
#include <QApplication>
#include <QListWidgetItem>
#include <QScreen>
#include <QSplitter>
#include <QStackedWidget>
#include <components/debug/debuglog.hpp>
#include <apps/opencs/model/prefs/category.hpp>
#include <apps/opencs/view/prefs/pagebase.hpp>
#include "../../model/prefs/state.hpp"
#include "contextmenulist.hpp"
#include "keybindingpage.hpp"
#include "page.hpp"
void CSVPrefs::Dialogue::buildCategorySelector(QSplitter* main)
{
CSVPrefs::ContextMenuList* list = new CSVPrefs::ContextMenuList(main);
list->setMinimumWidth(50);
list->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
list->setSelectionBehavior(QAbstractItemView::SelectItems);
main->addWidget(list);
QFontMetrics metrics(QApplication::font(list));
int maxWidth = 1;
for (CSMPrefs::State::Iterator iter = CSMPrefs::get().begin(); iter != CSMPrefs::get().end(); ++iter)
{
QString label = QString::fromUtf8(iter->second.getKey().c_str());
maxWidth = std::max(maxWidth, metrics.horizontalAdvance(label));
list->addItem(label);
}
list->setMaximumWidth(maxWidth + 50);
connect(list, &ContextMenuList::currentItemChanged, this, &Dialogue::selectionChanged);
}
void CSVPrefs::Dialogue::buildContentArea(QSplitter* main)
{
mContent = new QStackedWidget(main);
mContent->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
main->addWidget(mContent);
}
CSVPrefs::PageBase* CSVPrefs::Dialogue::makePage(const std::string& key)
{
// special case page code goes here
if (key == "Key Bindings")
return new KeyBindingPage(CSMPrefs::get()[key], mContent);
else
return new Page(CSMPrefs::get()[key], mContent);
}
CSVPrefs::Dialogue::Dialogue()
{
setWindowTitle("User Settings");
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
setMinimumSize(600, 400);
resize(810, 680);
QSplitter* main = new QSplitter(this);
setCentralWidget(main);
buildCategorySelector(main);
buildContentArea(main);
}
CSVPrefs::Dialogue::~Dialogue()
{
try
{
if (isVisible())
CSMPrefs::State::get().save();
}
catch (const std::exception& e)
{
Log(Debug::Error) << "Error in the destructor: " << e.what();
}
}
void CSVPrefs::Dialogue::closeEvent(QCloseEvent* event)
{
QMainWindow::closeEvent(event);
CSMPrefs::State::get().save();
}
void CSVPrefs::Dialogue::show()
{
if (QWidget* active = QApplication::activeWindow())
{
// place at the centre of the window with focus
QSize size = active->size();
move(active->geometry().x() + (size.width() - frameGeometry().width()) / 2,
active->geometry().y() + (size.height() - frameGeometry().height()) / 2);
}
else
{
QRect scr = QGuiApplication::primaryScreen()->geometry();
// otherwise place at the centre of the screen
QPoint screenCenter = scr.center();
move(screenCenter - QPoint(frameGeometry().width() / 2, frameGeometry().height() / 2));
}
QWidget::show();
}
void CSVPrefs::Dialogue::selectionChanged(QListWidgetItem* current, QListWidgetItem* previous)
{
if (current)
{
std::string key = current->text().toUtf8().data();
for (int i = 0; i < mContent->count(); ++i)
{
PageBase& page = dynamic_cast<PageBase&>(*mContent->widget(i));
if (page.getCategory().getKey() == key)
{
mContent->setCurrentIndex(i);
return;
}
}
PageBase* page = makePage(key);
mContent->setCurrentIndex(mContent->addWidget(page));
}
}