You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.6 KiB
C++
139 lines
3.6 KiB
C++
|
|
#include "dialogue.hpp"
|
|
|
|
#include <QApplication>
|
|
#include <QDesktopWidget>
|
|
#include <QSplitter>
|
|
#include <QListWidget>
|
|
#include <QStackedWidget>
|
|
#include <QListWidgetItem>
|
|
|
|
#include <components/debug/debuglog.hpp>
|
|
|
|
#include "../../model/prefs/state.hpp"
|
|
|
|
#include "page.hpp"
|
|
#include "keybindingpage.hpp"
|
|
#include "contextmenulist.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.width (label));
|
|
|
|
list->addItem (label);
|
|
}
|
|
|
|
list->setMaximumWidth (maxWidth + 10);
|
|
|
|
connect (list, SIGNAL (currentItemChanged (QListWidgetItem *, QListWidgetItem *)),
|
|
this, SLOT (selectionChanged (QListWidgetItem *, QListWidgetItem *)));
|
|
}
|
|
|
|
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);
|
|
|
|
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
|
|
{
|
|
// otherwise place at the centre of the screen
|
|
QPoint screenCenter = QApplication::desktop()->screenGeometry().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));
|
|
}
|
|
}
|