QTfrontend/ui/widget/themeprompt.cpp
changeset 8475 f605bc59c603
parent 8434 4821897a0f10
child 8488 e72f3398a28b
--- a/QTfrontend/ui/widget/themeprompt.cpp	Fri Feb 08 21:22:11 2013 -0500
+++ b/QTfrontend/ui/widget/themeprompt.cpp	Sat Feb 09 15:26:10 2013 -0500
@@ -17,20 +17,26 @@
  */
 
 #include <QDialog>
-#include <QVBoxLayout>
+#include <QGridLayout>
+#include <QHBoxLayout>
 #include <QScrollArea>
 #include <QPushButton>
 #include <QToolButton>
 #include <QWidgetItem>
 #include <QModelIndex>
+#include <QListView>
+#include <QLineEdit>
 #include <QLabel>
+#include <QSortFilterProxyModel>
+#include <QFontMetrics>
+#include <QDebug>
 
-#include "flowlayout.h"
 #include "DataManager.h"
+#include "lineeditcursor.h"
 #include "ThemeModel.h"
 #include "themeprompt.h"
 
-ThemePrompt::ThemePrompt(QWidget* parent) : QDialog(parent)
+ThemePrompt::ThemePrompt(int currentIndex, QWidget* parent) : QDialog(parent)
 {
     setModal(true);
     setWindowFlags(Qt::Sheet);
@@ -39,63 +45,128 @@
     resize(550, 430);
     setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
 
+    setStyleSheet("QPushButton { padding: 5px; margin-top: 10px; }");
+
+    // Theme model, and a model for setting a filter
+    ThemeModel * themeModel = DataManager::instance().themeModel();
+    filterModel = new QSortFilterProxyModel();
+    filterModel->setSourceModel(themeModel);
+    filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
+
     // Grid
-    QVBoxLayout * dialogLayout = new QVBoxLayout(this);
+    QGridLayout * dialogLayout = new QGridLayout(this);
     dialogLayout->setSpacing(0);
+    dialogLayout->setColumnStretch(1, 1);
+
+    QHBoxLayout * topLayout = new QHBoxLayout();
 
     // Help/prompt message at top
-    QLabel * lblDesc = new QLabel(tr("Select a theme for this map"));
-    lblDesc->setStyleSheet("color: #130F2A; background: #F6CB1C; border: solid 4px #F6CB1C; border-top-left-radius: 10px; border-top-right-radius: 10px; padding: auto 20px;");
+    QLabel * lblDesc = new QLabel(tr("Select a theme"));
+    lblDesc->setObjectName("lblDesc");
+    lblDesc->setStyleSheet("#lblDesc { color: #130F2A; background: #F6CB1C; border: solid 4px #F6CB1C; border-top-left-radius: 10px; padding: 4px 10px;}");
     lblDesc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
     lblDesc->setFixedHeight(24);
     lblDesc->setMinimumWidth(0);
 
-    // Scroll area and container for theme icons
-    QWidget * themesContainer = new QWidget();
-    FlowLayout * themesGrid = new FlowLayout();
-    themesContainer->setLayout(themesGrid);
-    QScrollArea * scrollArea = new QScrollArea();
-    scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
-    scrollArea->setObjectName("scrollArea");
-    scrollArea->setStyleSheet("QScrollBar, #scrollArea { background-color: #130F2A; } #scrollArea { border-color: #F6CB1C; border-width: 3px; border-top-width: 0; border-style: solid; border-bottom-left-radius: 10px; border-bottom-right-radius: 10px; }");
-    scrollArea->setWidgetResizable(true);
-    scrollArea->setFrameShape(QFrame::NoFrame);
-    scrollArea->setWidget(themesContainer);
+    // Filter text box
+    QWidget * filterContainer = new QWidget();
+    filterContainer->setFixedHeight(24);
+    filterContainer->setObjectName("filterContainer");
+    filterContainer->setStyleSheet("#filterContainer { background: #F6CB1C; border-top-right-radius: 10px; padding: 3px; }");
+    filterContainer->setFixedWidth(250);
+    txtFilter = new LineEditCursor(filterContainer);
+    txtFilter->setFixedWidth(250);
+    txtFilter->setFocus();
+    txtFilter->setFixedHeight(22);
+    connect(txtFilter, SIGNAL(textChanged(const QString &)), this, SLOT(filterChanged(const QString &)));
+    connect(txtFilter, SIGNAL(moveUp()), this, SLOT(moveUp()));
+    connect(txtFilter, SIGNAL(moveDown()), this, SLOT(moveDown()));
+    connect(txtFilter, SIGNAL(moveLeft()), this, SLOT(moveLeft()));
+    connect(txtFilter, SIGNAL(moveRight()), this, SLOT(moveRight()));
+
+    // Filter label
+    QLabel * lblFilter = new QLabel(tr("Filter: "), txtFilter);
+    QFontMetrics lblMetrics(lblFilter->font());
+    int lblFilterWidth = lblMetrics.width(lblFilter->text());
+    lblFilter->setStyleSheet(QString("background: none; margin-left: -%1px; margin-top: 4px;").arg(lblFilterWidth + 5));
+    txtFilter->setStyleSheet(QString("LineEditCursor, QLabel { border-width: 0px; border-radius: 6px; margin-top: 3px; margin-right: 3px; padding-left: %1px; padding-bottom: 2px; background-color: rgb(23, 11, 54); } LineEditCursor:hover, LineEditCursor:focus { background-color: rgb(13, 5, 68); }").arg(lblFilterWidth + 5));
+
+    // Corner widget
+    QLabel * corner = new QLabel();
+    corner->setPixmap(QPixmap(QString::fromUtf8(":/res/inverse-corner-bl.png")));
+    corner->setFixedSize(10, 10);
+
+    // Add widgets to top layout
+    topLayout->addWidget(lblDesc);
+    topLayout->addWidget(filterContainer);
+    topLayout->addWidget(corner, 0, Qt::AlignBottom);
+    topLayout->addStretch(1);
 
     // Cancel button (closes dialog)
     QPushButton * btnCancel = new QPushButton(tr("Cancel"));
-    btnCancel->setStyleSheet("padding: 5px; margin-top: 10px;");
     connect(btnCancel, SIGNAL(clicked()), this, SLOT(reject()));
 
+    // Select button
+    QPushButton * btnSelect = new QPushButton(tr("Use selected theme"));
+    btnSelect->setDefault(true);
+    connect(btnSelect, SIGNAL(clicked()), this, SLOT(onAccepted()));
+
+    // Add themes
+    list = new ThemeListView();
+    list->setModel(filterModel);
+    list->setViewMode(QListView::IconMode);
+    list->setResizeMode(QListView::Adjust);
+    list->setMovement(QListView::Static);
+    list->setEditTriggers(QAbstractItemView::NoEditTriggers);
+    list->setSpacing(8);
+    list->setWordWrap(true);
+    list->setSelectionMode(QAbstractItemView::SingleSelection);
+    list->setObjectName("themeList");
+    list->setCurrentIndex(filterModel->index(currentIndex, 0));
+    connect(list, SIGNAL(activated(const QModelIndex &)), this, SLOT(themeChosen(const QModelIndex &)));
+    connect(list, SIGNAL(clicked(const QModelIndex &)), this, SLOT(themeChosen(const QModelIndex &)));
+
     // Add elements to layouts
-    dialogLayout->addWidget(lblDesc, 0);
-    dialogLayout->addWidget(scrollArea, 1);
-    dialogLayout->addWidget(btnCancel, 0, Qt::AlignLeft);
+    dialogLayout->addLayout(topLayout, 0, 0, 1, 3);
+    dialogLayout->addWidget(list, 1, 0, 1, 3);
+    dialogLayout->addWidget(btnCancel, 2, 0, 1, 1, Qt::AlignLeft);
+    dialogLayout->addWidget(btnSelect, 2, 2, 1, 1, Qt::AlignRight);
+}
 
-    // Tooltip label for theme name
-    lblToolTip = new QLabel(this);
+void ThemePrompt::moveUp()
+{
+    list->setCurrentIndex(list->moveCursor(QAbstractItemView::MoveUp, Qt::NoModifier));
+}
 
-    // Add theme buttons
-    ThemeModel * themes = DataManager::instance().themeModel();
-    for (int i = 0; i < themes->rowCount(); i++)
-    {
-        QModelIndex index = themes->index(i, 0);
-        QToolButton * btn = new QToolButton();
-        bool dlc = themes->data(index, Qt::UserRole + 2).toBool();
-        btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
-        btn->setIcon(qVariantValue<QIcon>(themes->data(index, Qt::UserRole)));
-        btn->setText((dlc ? "*" : "") + themes->data(index, Qt::DisplayRole).toString());
-        btn->setIconSize(QSize(60, 60));
-        btn->setProperty("themeID", QVariant(i));
-        btn->setStyleSheet("padding: 2px;");
-        connect(btn, SIGNAL(clicked()), this, SLOT(themeClicked()));
-        themesGrid->addWidget(btn);
-    }
+void ThemePrompt::moveDown()
+{
+    list->setCurrentIndex(list->moveCursor(QAbstractItemView::MoveDown, Qt::NoModifier));
+}
+
+void ThemePrompt::moveLeft()
+{
+    list->setCurrentIndex(list->moveCursor(QAbstractItemView::MoveLeft, Qt::NoModifier));
+}
+
+void ThemePrompt::moveRight()
+{
+    list->setCurrentIndex(list->moveCursor(QAbstractItemView::MoveRight, Qt::NoModifier));
+}
+
+void ThemePrompt::onAccepted()
+{
+    themeChosen(list->currentIndex());
 }
 
 // When a theme is selected
-void ThemePrompt::themeClicked()
+void ThemePrompt::themeChosen(const QModelIndex & index)
 {
-    QWidget * btn = (QWidget*)sender();
-    done(btn->property("themeID").toInt() + 1); // Since returning 0 means canceled
+    done(filterModel->mapToSource(index).row() + 1); // Since returning 0 means canceled
 }
+
+// When the text in the filter text box is changed
+void ThemePrompt::filterChanged(const QString & text)
+{
+    filterModel->setFilterFixedString(text);
+    list->setCurrentIndex(filterModel->index(0, 0));
+}
\ No newline at end of file