diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-05-29 09:45:30 -0400 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2019-05-31 11:54:31 -0400 |
| commit | 4d90e502266dfb886e1d089fb26780d19a38e5a7 (patch) | |
| tree | 625a794ba0aafd3e022f097ef0e9841d3c106927 | |
| parent | 64604c966aaade7ceb9f5e547dfad8f51372434c (diff) | |
added new filterwidget, will eventually get the operators functionality from the mod/pluging lists
| -rw-r--r-- | src/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/filterwidget.cpp | 88 | ||||
| -rw-r--r-- | src/filterwidget.h | 27 | ||||
| -rw-r--r-- | src/modinfodialog.cpp | 2 | ||||
| -rw-r--r-- | src/modinfodialog.h | 3 | ||||
| -rw-r--r-- | src/modinfodialog.ui | 7 |
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"/>
|
