summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/CMakeLists.txt3
-rw-r--r--src/filterwidget.cpp88
-rw-r--r--src/filterwidget.h27
-rw-r--r--src/modinfodialog.cpp2
-rw-r--r--src/modinfodialog.h3
-rw-r--r--src/modinfodialog.ui7
6 files changed, 124 insertions, 6 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index cae26334..93597d62 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -115,6 +115,7 @@ SET(organizer_SRCS
lcdnumber.cpp
forcedloaddialog.cpp
forcedloaddialogwidget.cpp
+ filterwidget.cpp
shared/windows_error.cpp
shared/error_report.cpp
@@ -211,6 +212,7 @@ SET(organizer_HDRS
lcdnumber.h
forcedloaddialog.h
forcedloaddialogwidget.h
+ filterwidget.h
shared/windows_error.h
shared/error_report.h
@@ -391,6 +393,7 @@ set(utilities
set(widgets
descriptionpage
genericicondelegate
+ filterwidget
icondelegate
lcdnumber
logbuffer
diff --git a/src/filterwidget.cpp b/src/filterwidget.cpp
new file mode 100644
index 00000000..39324bc6
--- /dev/null
+++ b/src/filterwidget.cpp
@@ -0,0 +1,88 @@
+#include "filterwidget.h"
+#include "eventfilter.h"
+
+FilterWidget::FilterWidget()
+ : m_edit(nullptr), m_clear(nullptr), m_buddy(nullptr)
+{
+}
+
+void FilterWidget::set(QLineEdit* edit)
+{
+ if (m_clear) {
+ delete m_clear;
+ m_clear = nullptr;
+ }
+
+ m_edit = edit;
+ if (!m_edit) {
+ return;
+ }
+
+ createClear();
+ hookEvents();
+}
+
+void FilterWidget::clear()
+{
+ if (!m_edit) {
+ return;
+ }
+
+ m_edit->clear();
+}
+
+void FilterWidget::createClear()
+{
+ m_clear = new QToolButton(m_edit);
+
+ QPixmap pixmap(":/MO/gui/edit_clear");
+ m_clear->setIcon(QIcon(pixmap));
+ m_clear->setIconSize(pixmap.size());
+ m_clear->setCursor(Qt::ArrowCursor);
+ m_clear->setStyleSheet("QToolButton { border: none; padding: 0px; }");
+ m_clear->hide();
+
+ QObject::connect(m_clear, &QToolButton::clicked, [&]{ clear(); });
+ QObject::connect(m_edit, &QLineEdit::textChanged, [&]{ onTextChanged(); });
+
+ repositionClearButton();
+}
+
+void FilterWidget::hookEvents()
+{
+ auto* f = new EventFilter(m_edit, [&](auto* w, auto* e) {
+ if (e->type() == QEvent::Resize) {
+ onResized();
+ }
+
+ return false;
+ });
+
+ m_edit->installEventFilter(f);
+}
+
+void FilterWidget::onTextChanged()
+{
+ m_clear->setVisible(!m_edit->text().isEmpty());
+}
+
+void FilterWidget::onResized()
+{
+ repositionClearButton();
+}
+
+void FilterWidget::repositionClearButton()
+{
+ if (!m_clear) {
+ return;
+ }
+
+ const QSize sz = m_clear->sizeHint();
+ const int frame = m_edit->style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
+ const auto r = m_edit->rect();
+
+ const auto x = r.right() - frame - sz.width();
+ const auto y = (r.bottom() + 1 - sz.height()) / 2;
+
+ m_clear->move(x, y);
+}
diff --git a/src/filterwidget.h b/src/filterwidget.h
new file mode 100644
index 00000000..07e216f1
--- /dev/null
+++ b/src/filterwidget.h
@@ -0,0 +1,27 @@
+#ifndef FILTERWIDGET_H
+#define FILTERWIDGET_H
+
+class FilterWidget
+{
+public:
+ FilterWidget();
+
+ void set(QLineEdit* edit);
+ void buddy(QWidget* w);
+
+ void clear();
+
+private:
+ QLineEdit* m_edit;
+ QToolButton* m_clear;
+ QWidget* m_buddy;
+
+ void createClear();
+ void hookEvents();
+ void repositionClearButton();
+
+ void onTextChanged();
+ void onResized();
+};
+
+#endif // FILTERWIDGET_H
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index 9db31da3..1e933a74 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -453,6 +453,8 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
m_nonconflictExpander.set(ui->noConflictExpander, ui->noConflictTree);
+ m_advancedConflictFilter.set(ui->conflictsAdvancedFilter);
+
// left-elide the overwrites column so that the nearest are visible
ui->conflictsAdvancedList->setItemDelegateForColumn(
0, new ElideLeftDelegate(ui->conflictsAdvancedList));
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 69b0069e..5169a993 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -25,6 +25,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "tutorabledialog.h"
#include "plugincontainer.h"
#include "organizercore.h"
+#include "filterwidget.h"
#include <QDialog>
#include <QSignalMapper>
@@ -427,6 +428,7 @@ private:
std::map<int, int> m_RealTabPos;
ExpanderWidget m_overwriteExpander, m_overwrittenExpander, m_nonconflictExpander;
+ FilterWidget m_advancedConflictFilter;
void refreshConflictLists(bool refreshGeneral, bool refreshAdvanced);
@@ -448,6 +450,7 @@ private:
const QString& fileName, const QString& relativeName,
const MOShared::FileEntry::AlternativesVector& alternatives);
+
void restoreTabState(const QByteArray &state);
void restoreConflictExpandersState(const QByteArray &state);
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui
index e391da46..b55c0f07 100644
--- a/src/modinfodialog.ui
+++ b/src/modinfodialog.ui
@@ -782,7 +782,7 @@ text-align: left;</string>
<number>0</number>
</property>
<item>
- <widget class="MOBase::LineEditClear" name="conflictsAdvancedFilter">
+ <widget class="QLineEdit" name="conflictsAdvancedFilter">
<property name="placeholderText">
<string>Filter</string>
</property>
@@ -1201,11 +1201,6 @@ p, li { white-space: pre-wrap; }
<extends>QLineEdit</extends>
<header>modidlineedit.h</header>
</customwidget>
- <customwidget>
- <class>MOBase::LineEditClear</class>
- <extends>QLineEdit</extends>
- <header>lineeditclear.h</header>
- </customwidget>
</customwidgets>
<resources>
<include location="resources.qrc"/>