diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/createinstancedialog.ui | 204 | ||||
| -rw-r--r-- | src/createinstancedialogpages.cpp | 46 | ||||
| -rw-r--r-- | src/createinstancedialogpages.h | 9 |
3 files changed, 161 insertions, 98 deletions
diff --git a/src/createinstancedialog.ui b/src/createinstancedialog.ui index cafccb36..a8f21c51 100644 --- a/src/createinstancedialog.ui +++ b/src/createinstancedialog.ui @@ -127,7 +127,7 @@ </item> <item> <widget class="QWidget" name="widget_3" native="true"> - <layout class="QVBoxLayout" name="verticalLayout_2" stretch="1"> + <layout class="QVBoxLayout" name="verticalLayout_2"> <property name="leftMargin"> <number>0</number> </property> @@ -141,11 +141,8 @@ <number>0</number> </property> <item> - <widget class="QWidget" name="widget_4" native="true"> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <property name="leftMargin"> - <number>0</number> - </property> + <widget class="QWidget" name="widget_15" native="true"> + <layout class="QVBoxLayout" name="verticalLayout_16"> <property name="topMargin"> <number>0</number> </property> @@ -184,22 +181,22 @@ </layout> </widget> </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> </layout> </widget> </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> </layout> </widget> <widget class="QWidget" name="page_2"> @@ -226,32 +223,12 @@ </property> </widget> </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QCheckBox" name="showAllGames"> - <property name="text"> - <string>Show all supported games</string> - </property> - </widget> - </item> </layout> </widget> </item> <item> <widget class="QWidget" name="widget_6" native="true"> - <layout class="QVBoxLayout" name="verticalLayout_5"> + <layout class="QVBoxLayout" name="verticalLayout_25"> <property name="leftMargin"> <number>0</number> </property> @@ -265,59 +242,104 @@ <number>0</number> </property> <item> - <widget class="QScrollArea" name="scrollArea"> - <property name="horizontalScrollBarPolicy"> - <enum>Qt::ScrollBarAlwaysOff</enum> - </property> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <widget class="QWidget" name="widget_15"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>455</width> - <height>308</height> - </rect> + <widget class="QWidget" name="widget_23" native="true"> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <property name="leftMargin"> + <number>0</number> </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <property name="topMargin"> + <number>0</number> </property> - <layout class="QVBoxLayout" name="verticalLayout_16" stretch="0"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <widget class="QDialogButtonBox" name="games"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::NoButton</set> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QScrollArea" name="scrollArea_3"> + <property name="widgetResizable"> + <bool>true</bool> + </property> + <widget class="QWidget" name="games"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>98</width> + <height>28</height> + </rect> </property> + <layout class="QVBoxLayout" name="verticalLayout_26"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QPushButton" name="pushButton"> + <property name="text"> + <string>PushButton</string> + </property> + </widget> + </item> + </layout> </widget> - </item> - </layout> - </widget> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QWidget" name="widget_21" native="true"> + <layout class="QHBoxLayout" name="horizontalLayout_6" stretch="0,0,0"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="showAllGames"> + <property name="text"> + <string>Show all supported games</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_5"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>175</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLineEdit" name="gamesFilter"> + <property name="placeholderText"> + <string>Filter</string> + </property> + </widget> + </item> + </layout> </widget> </item> </layout> @@ -387,8 +409,8 @@ <rect> <x>0</x> <y>0</y> - <width>455</width> - <height>278</height> + <width>98</width> + <height>28</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_17"> diff --git a/src/createinstancedialogpages.cpp b/src/createinstancedialogpages.cpp index 3f35b4fe..2aac93a0 100644 --- a/src/createinstancedialogpages.cpp +++ b/src/createinstancedialogpages.cpp @@ -12,6 +12,7 @@ namespace cid using MOBase::IPluginGame; using MOBase::TaskDialog; +using MOBase::FilterWidget; QString makeDefaultPath(const std::wstring& dir) { @@ -228,6 +229,9 @@ GamePage::GamePage(CreateInstanceDialog& dlg) createGames(); fillList(); + m_filter.setEdit(ui->gamesFilter); + + QObject::connect(&m_filter, &FilterWidget::changed, [&]{ fillList(); }); QObject::connect(ui->showAllGames, &QCheckBox::clicked, [&]{ fillList(); }); } @@ -362,6 +366,7 @@ void GamePage::updateButton(Game* g) } g->button->setText(g->game->gameName()); + g->button->setIcon(g->game->gameIcon()); if (g->installed) { g->button->setDescription(g->dir); @@ -394,7 +399,7 @@ void GamePage::selectButton(Game* g) // was not installed; create it and show it // and it has a button, just check it createGameButton(gg.get()); - ui->games->addButton(gg->button, QDialogButtonBox::AcceptRole); + addButton(gg->button); } gg->button->setChecked(true); @@ -439,9 +444,8 @@ void GamePage::fillList() { const bool showAll = ui->showAllGames->isChecked(); - ui->games->clear(); - - ui->games->addButton(createCustomButton(), QDialogButtonBox::AcceptRole); + clearButtons(); + addButton(createCustomButton()); for (auto& g : m_games) { g->button = nullptr; @@ -451,11 +455,43 @@ void GamePage::fillList() continue; } + if (!m_filter.matches(g->game->gameName())) { + continue; + } + createGameButton(g.get()); - ui->games->addButton(g->button, QDialogButtonBox::AcceptRole); + addButton(g->button); } } +void GamePage::clearButtons() +{ + auto* ly = static_cast<QVBoxLayout*>(ui->games->layout()); + + ui->games->setUpdatesEnabled(false); + + // delete all children + qDeleteAll(ui->games->findChildren<QWidget*>("", Qt::FindDirectChildrenOnly)); + + // stretch widgets added with addStretch() are not in the parent widget, + // they have to be deleted from the layout itself + while (auto* child=ly->takeAt(0)) + delete child; + + // add a stretch, buttons will be added before + ly->addStretch(); + + ui->games->setUpdatesEnabled(true); +} + +void GamePage::addButton(QAbstractButton* b) +{ + auto* ly = static_cast<QVBoxLayout*>(ui->games->layout()); + + // insert before the stretch + ly->insertWidget(ly->count() - 1, b); +} + GamePage::Game* GamePage::checkInstallation(const QString& path, Game* g) { if (g->game->looksValid(path)) { diff --git a/src/createinstancedialogpages.h b/src/createinstancedialogpages.h index b8366234..f2f4216d 100644 --- a/src/createinstancedialogpages.h +++ b/src/createinstancedialogpages.h @@ -1,10 +1,12 @@ #ifndef MODORGANIZER_CREATEINSTANCEDIALOGPAGES_INCLUDED #define MODORGANIZER_CREATEINSTANCEDIALOGPAGES_INCLUDED +#include "createinstancedialog.h" +#include <filterwidget.h> + #include <QLabel> #include <QLineEdit> #include <QCommandLinkButton> -#include "createinstancedialog.h" namespace MOBase { class IPluginGame; } @@ -107,16 +109,19 @@ private: std::vector<std::unique_ptr<Game>> m_games; Game* m_selection; - + MOBase::FilterWidget m_filter; std::vector<MOBase::IPluginGame*> sortedGamePlugins() const; Game* findGame(MOBase::IPluginGame* game); void createGames(); void updateButton(Game* g); void selectButton(Game* g); + void clearButtons(); + void addButton(QAbstractButton* b); QCommandLinkButton* createCustomButton(); void createGameButton(Game* g); void fillList(); + void onFilter(); Game* checkInstallation(const QString& path, Game* g); MOBase::IPluginGame* findAnotherGame(const QString& path); bool confirmUnknown(const QString& path, MOBase::IPluginGame* game); |
