summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/createinstancedialog.ui204
-rw-r--r--src/createinstancedialogpages.cpp46
-rw-r--r--src/createinstancedialogpages.h9
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);