From 8baf8cd49b878aebf99d414bbd50ced86ca9e04c Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Fri, 3 Nov 2017 14:44:07 +0100 Subject: [PATCH] ui: Fixes for search bar * fixed clicking on search element did not focus search bar * fixed moving cursor between elements * no smart pointers for search elements to fix deletion issues --- bin/app/data/gui/search_view/search_view.css | 1 - src/lib_gui/qt/element/QtSearchBar.cpp | 2 +- src/lib_gui/qt/element/QtSmartSearchBox.cpp | 35 +++++++++++++------- src/lib_gui/qt/element/QtSmartSearchBox.h | 3 +- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/bin/app/data/gui/search_view/search_view.css b/bin/app/data/gui/search_view/search_view.css index 45823a01..1eb59843 100644 --- a/bin/app/data/gui/search_view/search_view.css +++ b/bin/app/data/gui/search_view/search_view.css @@ -24,7 +24,6 @@ QLineEdit#search_box { background-color: transparent; border: none; color: ; - margin-left: 5px; selection-background-color: ; } diff --git a/src/lib_gui/qt/element/QtSearchBar.cpp b/src/lib_gui/qt/element/QtSearchBar.cpp index 234aebfc..70b92578 100644 --- a/src/lib_gui/qt/element/QtSearchBar.cpp +++ b/src/lib_gui/qt/element/QtSearchBar.cpp @@ -34,7 +34,7 @@ QtSearchBar::QtSearchBar() layout->addWidget(m_searchBoxContainer); QBoxLayout* innerLayout = new QHBoxLayout(); - innerLayout->setContentsMargins(7, 3, 5, 2); + innerLayout->setContentsMargins(12, 3, 5, 2); m_searchBoxContainer->setLayout(innerLayout); m_searchBox = new QtSmartSearchBox(m_searchBoxContainer); diff --git a/src/lib_gui/qt/element/QtSmartSearchBox.cpp b/src/lib_gui/qt/element/QtSmartSearchBox.cpp index f2fa53a0..035b09b0 100644 --- a/src/lib_gui/qt/element/QtSmartSearchBox.cpp +++ b/src/lib_gui/qt/element/QtSmartSearchBox.cpp @@ -241,7 +241,7 @@ void QtSmartSearchBox::focusInEvent(QFocusEvent* event) if (m_elements.size() == 1) { - SearchMatch match = editElement(m_elements[0].get()); + SearchMatch match = editElement(m_elements[0]); if (match.searchType != SearchMatch::SEARCH_NONE) { m_oldMatch = match; @@ -368,6 +368,11 @@ void QtSmartSearchBox::keyPressEvent(QKeyEvent* event) addMatchAndUpdate(m_highlightedMatch); return; } + else if (m_cursorIndex < m_elements.size()) + { + editTextToElement(); + moveCursor(1); + } } } else if (event->matches(QKeySequence::SelectPreviousChar)) @@ -615,6 +620,12 @@ void QtSmartSearchBox::onElementSelected(QtSearchElement* element) return; } + if (!hasFocus()) + { + setFocus(); + return; + } + if (!hasSelectedElements() && !m_shiftKeyDown) { editElement(element); @@ -625,7 +636,7 @@ void QtSmartSearchBox::onElementSelected(QtSearchElement* element) bool checked = element->isChecked(); for (size_t i = 0; i < m_elements.size(); i++) { - if (m_elements[i].get() == element) + if (m_elements[i] == element) { idx = i; break; @@ -641,7 +652,7 @@ void QtSmartSearchBox::onElementSelected(QtSearchElement* element) editTextToElement(); - element = m_elements[idx].get(); + element = m_elements[idx]; element->setChecked(checked); } @@ -744,7 +755,7 @@ SearchMatch QtSmartSearchBox::editElement(QtSearchElement* element) { for (int i = m_elements.size() - 1; i >= 0; i--) { - if (m_elements[i].get() == element) + if (m_elements[i] == element) { m_cursorIndex = i; break; @@ -762,10 +773,10 @@ SearchMatch QtSmartSearchBox::editElement(QtSearchElement* element) void QtSmartSearchBox::updateElements() { - m_oldElements = m_elements; - for (auto e : m_oldElements) + for (auto e : m_elements) { e->hide(); + e->deleteLater(); } m_elements.clear(); @@ -781,7 +792,7 @@ void QtSmartSearchBox::updateElements() name += ':'; } - std::shared_ptr element = std::make_shared(QString::fromStdString(name), this); + QtSearchElement* element = new QtSearchElement(QString::fromStdString(name), this); m_elements.push_back(element); std::string color; @@ -812,7 +823,7 @@ void QtSmartSearchBox::updateElements() element->setStyleSheet(css.str().c_str()); - connect(element.get(), &QtSearchElement::wasChecked, this, &QtSmartSearchBox::onElementSelected); + connect(element, &QtSearchElement::wasChecked, this, &QtSmartSearchBox::onElementSelected); } updatePlaceholder(); @@ -853,7 +864,7 @@ void QtSmartSearchBox::layoutElements() if (i < m_elements.size()) { - QtSearchElement* button = m_elements[i].get(); + QtSearchElement* button = m_elements[i]; if (button->isChecked() && !highlightBegin) { @@ -878,7 +889,7 @@ void QtSmartSearchBox::layoutElements() for (size_t i = 0; i < elementX.size(); i++) { - QtSearchElement* button = m_elements[i].get(); + QtSearchElement* button = m_elements[i]; QSize size = button->minimumSizeHint(); int y = (rect().height() - size.height()) / 2.0; button->setGeometry(elementX[i] + offsetX, y, size.width(), size.height()); @@ -899,7 +910,7 @@ void QtSmartSearchBox::layoutElements() bool QtSmartSearchBox::hasSelectedElements() const { - for (const std::shared_ptr& element : m_elements) + for (const QtSearchElement* element : m_elements) { if (element->isChecked()) { @@ -924,7 +935,7 @@ std::string QtSmartSearchBox::getSelectedString() const void QtSmartSearchBox::selectAllElementsWith(bool selected) { - for (const std::shared_ptr& element : m_elements) + for (QtSearchElement* element : m_elements) { element->setChecked(selected); } diff --git a/src/lib_gui/qt/element/QtSmartSearchBox.h b/src/lib_gui/qt/element/QtSmartSearchBox.h index 7b659c7c..2d08692d 100644 --- a/src/lib_gui/qt/element/QtSmartSearchBox.h +++ b/src/lib_gui/qt/element/QtSmartSearchBox.h @@ -108,8 +108,7 @@ private: std::deque m_matches; SearchMatch m_oldMatch; - std::vector> m_elements; - std::vector> m_oldElements; + std::vector m_elements; size_t m_cursorIndex;