diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index afa9275e86..ae32dd5f47 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -73,7 +73,6 @@ set(SOURCES CutterApplication.cpp dialogs/RizinPluginsDialog.cpp widgets/CutterDockWidget.cpp - widgets/CutterTreeWidget.cpp widgets/GraphWidget.cpp widgets/OverviewWidget.cpp common/JsonModel.cpp @@ -169,6 +168,9 @@ set(SOURCES widgets/SearchableDockWidget.cpp common/CutterSearchable.cpp widgets/SearchableTextEdit.cpp + widgets/ItemCountLineEdit.cpp + widgets/AbstractFilterView.cpp + dialogs/preferences/InterfaceOptionsWidget.cpp ) set(HEADER_FILES core/Cutter.h @@ -242,7 +244,6 @@ set(HEADER_FILES widgets/SearchWidget.h dialogs/RizinPluginsDialog.h widgets/CutterDockWidget.h - widgets/CutterTreeWidget.h widgets/GraphWidget.h widgets/OverviewWidget.h common/JsonModel.h @@ -347,6 +348,9 @@ set(HEADER_FILES widgets/SearchableDockWidget.h common/CutterSearchable.h widgets/SearchableTextEdit.h + widgets/ItemCountLineEdit.h + widgets/AbstractFilterView.h + dialogs/preferences/InterfaceOptionsWidget.h ) set(UI_FILES dialogs/AboutDialog.ui @@ -428,6 +432,7 @@ set(UI_FILES dialogs/RegisterProfileDialog.ui dialogs/EditRegProfileDialog.ui widgets/SearchBarWidget.ui + dialogs/preferences/InterfaceOptionsWidget.ui ) set(QRC_FILES resources.qrc diff --git a/src/common/Configuration.cpp b/src/common/Configuration.cpp index d0b8799436..1b2cf2bb6b 100644 --- a/src/common/Configuration.cpp +++ b/src/common/Configuration.cpp @@ -947,3 +947,36 @@ bool Configuration::getNavBarLegendEnabled() { return s.value("navBarLegend").toBool(); } + +void Configuration::setShowQuickFilter(bool show) +{ + s.setValue("showQuickFilter", show); + emit quickFilterToggled(show); +} + +bool Configuration::getShowQuickFilter() const +{ + return s.value("showQuickFilter", true).toBool(); +} + +void Configuration::setItemCountVisible(bool visible) +{ + s.setValue("itemCountVisible", visible); + emit itemCountToggled(visible); +} + +bool Configuration::getItemCountVisible() const +{ + return s.value("itemCountVisible", true).toBool(); +} + +void Configuration::setItemCountAutoHide(bool value) +{ + s.value("autoHideItemCount", value); + emit itemCountAutoHideToggled(value); +} + +bool Configuration::getItemCountAutoHide() const +{ + return s.value("autoHideItemCount", false).toBool(); +} diff --git a/src/common/Configuration.h b/src/common/Configuration.h index f4c5bb55ec..9821060867 100644 --- a/src/common/Configuration.h +++ b/src/common/Configuration.h @@ -300,12 +300,53 @@ class CUTTER_EXPORT Configuration : public QObject */ bool getNavBarLegendEnabled(); + /** + * @brief Enable or disable the display of the Quick Filter by default in views + * @param show Set to true to show the Quick Filter by default + */ + void setShowQuickFilter(bool show); + + /** + * @brief Check if the Quick Filter is set to be shown by default + * @return True if the Quick Filter is shown by default, false otherwise + */ + bool getShowQuickFilter() const; + + /** + * @brief Enable or disable the visibility of the item count label within the Quick Filter + * @param visible Set to true to show the item count, false to hide it + */ + void setItemCountVisible(bool visible); + + /** + * @brief Check if the item count label within the Quick Filter is set to be visible + * @return True if the item count is visible, false otherwise + */ + bool getItemCountVisible() const; + + /** + * @brief Enable or disable the item count label automatically hiding on overflow within the + * Quick Filter + * @param value Set to true to auto hide the item count, false otherwise + */ + void setItemCountAutoHide(bool value); + + /** + * @brief Check if the item count label within the Quick Filter is set to automatically hide on + * overflow + * @return True if the item count is set to auto hide, false otherwise + */ + bool getItemCountAutoHide() const; + public slots: void refreshFont(); signals: void fontsUpdated(); void colorsUpdated(); void interfaceThemeChanged(); + void quickFilterToggled(bool show); + void itemCountToggled(bool visible); + void itemCountAutoHideToggled(bool value); #ifdef CUTTER_ENABLE_KSYNTAXHIGHLIGHTING void kSyntaxHighlightingThemeChanged(); #endif diff --git a/src/common/CutterSearchable.cpp b/src/common/CutterSearchable.cpp index 97a235672d..f90a8a87a2 100644 --- a/src/common/CutterSearchable.cpp +++ b/src/common/CutterSearchable.cpp @@ -36,6 +36,7 @@ void CutterSearchableHelper::setupConnections(QWidget *parent, SearchBarWidget * [searchable]() { searchable->searchBarShown(); }); QShortcut *shortcut = Shortcuts()->makeQShortcut("Search.toggle", parent); + shortcut->setContext(Qt::WidgetWithChildrenShortcut); QObject::connect(shortcut, &QShortcut::activated, parent, [=]() { if (searchBar->isVisible()) { if (searchBar->hasFocus()) { diff --git a/src/dialogs/TypesVariablesDialog.cpp b/src/dialogs/TypesVariablesDialog.cpp index 58fc40f467..4c9599044e 100644 --- a/src/dialogs/TypesVariablesDialog.cpp +++ b/src/dialogs/TypesVariablesDialog.cpp @@ -132,13 +132,11 @@ bool TypesVariablesProxyModel::lessThan(const QModelIndex &left, const QModelInd } TypesVariablesDialog::TypesVariablesDialog(QWidget *parent, const QString &typeName) - : QDialog(parent), ui(new Ui::TypesVariablesDialog), tree(new CutterTreeWidget(this)) + : QDialog(parent), ui(new Ui::TypesVariablesDialog) { ui->setupUi(this); setWindowTitle(tr("Variables: %1").arg(typeName)); - tree->addStatusBar(ui->verticalLayout); - sourceModel = new TypesVariablesModel(this); proxyModel = new TypesVariablesProxyModel(this); proxyModel->setSourceModel(sourceModel); @@ -158,7 +156,7 @@ TypesVariablesDialog::TypesVariablesDialog(QWidget *parent, const QString &typeN scopeCombo->addItem(tr("Globals Only"), GLOBAL); scopeCombo->addItem(tr("Locals Only"), LOCAL); - auto updateCount = [this]() { tree->showItemsNumber(proxyModel->rowCount()); }; + auto updateCount = [this]() { ui->quickFilterView->setItemCount(proxyModel->rowCount()); }; connect(ui->quickFilterView, &ComboQuickFilterView::filterTextChanged, proxyModel, &TypesVariablesProxyModel::setFilterFixedString); @@ -204,6 +202,10 @@ void TypesVariablesDialog::refreshModel(const QString &typeName) } sourceModel->updateVariables(newVariables); + + // set the initial item count + ui->quickFilterView->setItemCount(proxyModel->rowCount()); + qhelpers::adjustColumns(ui->treeView, TypesVariablesModel::Column::COUNT, 0); } diff --git a/src/dialogs/TypesVariablesDialog.h b/src/dialogs/TypesVariablesDialog.h index 190a6ea3dd..5c8ce1431a 100644 --- a/src/dialogs/TypesVariablesDialog.h +++ b/src/dialogs/TypesVariablesDialog.h @@ -4,7 +4,6 @@ #include #include #include -#include "CutterTreeWidget.h" #include "core/Cutter.h" @@ -93,7 +92,6 @@ private slots: std::unique_ptr ui; TypesVariablesModel *sourceModel; TypesVariablesProxyModel *proxyModel; - CutterTreeWidget *tree; }; #endif // TYPESVARIABLESDIALOG_H diff --git a/src/dialogs/preferences/InterfaceOptionsWidget.cpp b/src/dialogs/preferences/InterfaceOptionsWidget.cpp new file mode 100644 index 0000000000..3f12714127 --- /dev/null +++ b/src/dialogs/preferences/InterfaceOptionsWidget.cpp @@ -0,0 +1,33 @@ +#include "InterfaceOptionsWidget.h" +#include "ui_InterfaceOptionsWidget.h" + +#include "PreferencesDialog.h" +#include "Configuration.h" + +InterfaceOptionsWidget::InterfaceOptionsWidget(PreferencesDialog *dialog) + : QDialog(dialog), ui(new Ui::InterfaceOptionsWidget) +{ + ui->setupUi(this); + + setUpQuickFilter(); +} + +InterfaceOptionsWidget::~InterfaceOptionsWidget() {} + +void InterfaceOptionsWidget::setUpQuickFilter() +{ + ui->quickFilterCheckBox->setChecked(Config()->getShowQuickFilter()); + connect(ui->quickFilterCheckBox, &QCheckBox::toggled, this, + [](bool checked) { Config()->setShowQuickFilter(checked); }); + + ui->itemCountCheckBox->setChecked(Config()->getItemCountVisible()); + connect(ui->itemCountCheckBox, &QCheckBox::toggled, this, [this](bool checked) { + Config()->setItemCountVisible(checked); + ui->hideItemCountCheckBox->setEnabled(checked); + }); + + connect(ui->hideItemCountCheckBox, &QCheckBox::toggled, this, + [](bool checked) { Config()->setItemCountAutoHide(checked); }); + ui->hideItemCountCheckBox->setChecked(Config()->getItemCountAutoHide()); + ui->hideItemCountCheckBox->setEnabled(ui->itemCountCheckBox->isChecked()); +} diff --git a/src/dialogs/preferences/InterfaceOptionsWidget.h b/src/dialogs/preferences/InterfaceOptionsWidget.h new file mode 100644 index 0000000000..7bc77bad0b --- /dev/null +++ b/src/dialogs/preferences/InterfaceOptionsWidget.h @@ -0,0 +1,31 @@ +#ifndef INTERFACEOPTIONSWIDGET_H +#define INTERFACEOPTIONSWIDGET_H + +#include +#include + +namespace Ui { +class InterfaceOptionsWidget; +}; + +class PreferencesDialog; + +/** + * @brief Widget containing options for interface related settings + * + * Uses groupboxes to seperate options available for different widgets/views + * Groupboxes must be in alphabetical order according to their titles + */ +class InterfaceOptionsWidget : public QDialog +{ +public: + explicit InterfaceOptionsWidget(PreferencesDialog *dialog); + ~InterfaceOptionsWidget(); + +private: + std::unique_ptr ui; + + void setUpQuickFilter(); +}; + +#endif // INTERFACEOPTIONSWIDGET_H diff --git a/src/dialogs/preferences/InterfaceOptionsWidget.ui b/src/dialogs/preferences/InterfaceOptionsWidget.ui new file mode 100644 index 0000000000..eabcec0a1f --- /dev/null +++ b/src/dialogs/preferences/InterfaceOptionsWidget.ui @@ -0,0 +1,107 @@ + + + InterfaceOptionsWidget + + + + 0 + 0 + 633 + 361 + + + + Interface + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::Shape::NoFrame + + + true + + + + + 0 + 0 + 633 + 361 + + + + + + + Quick FIlter + + + + 24 + + + + + Show Quick Filter by default + + + true + + + + + + + Show Item Count in Quick Filter + + + true + + + + + + + Hide Item Count on overflow + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + + diff --git a/src/dialogs/preferences/PreferencesDialog.cpp b/src/dialogs/preferences/PreferencesDialog.cpp index 0b1571892d..7d318c2400 100644 --- a/src/dialogs/preferences/PreferencesDialog.cpp +++ b/src/dialogs/preferences/PreferencesDialog.cpp @@ -9,6 +9,7 @@ #include "InitializationFileEditor.h" #include "AnalysisOptionsWidget.h" #include "ShortcutOptionsWidget.h" +#include "InterfaceOptionsWidget.h" #include "PreferenceCategory.h" @@ -38,7 +39,8 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) { tr("Initialization Script"), new InitializationFileEditor(this), QIcon(":/img/icons/initialization.svg") }, { tr("Analysis"), new AnalysisOptionsWidget(this), QIcon(":/img/icons/cog_light.svg") }, - { tr("Shortcuts"), new ShortcutOptionsWidget(this), QIcon(":/img/icons/edit_light.svg") } + { tr("Shortcuts"), new ShortcutOptionsWidget(this), QIcon(":/img/icons/edit_light.svg") }, + { tr("Interface"), new InterfaceOptionsWidget(this), QIcon(":/img/icons/layout.svg") } }; for (auto &c : prefs) { @@ -98,6 +100,7 @@ void PreferencesDialog::chooseThemeIcons() { QStringLiteral("Plugins"), QStringLiteral("plugins.svg") }, { QStringLiteral("Initialization Script"), QStringLiteral("initialization.svg") }, { QStringLiteral("Analysis"), QStringLiteral("cog_light.svg") }, + { QStringLiteral("Interface"), QStringLiteral("layout.svg") }, }; QList> supportedIconsNames; diff --git a/src/img/icons/layout.svg b/src/img/icons/layout.svg new file mode 100644 index 0000000000..6790e6a9fb --- /dev/null +++ b/src/img/icons/layout.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/img/icons/layout_white.svg b/src/img/icons/layout_white.svg new file mode 100644 index 0000000000..9b3d3ed8af --- /dev/null +++ b/src/img/icons/layout_white.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/img/icons/light/layout.svg b/src/img/icons/light/layout.svg new file mode 100644 index 0000000000..e97bde20df --- /dev/null +++ b/src/img/icons/light/layout.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/resources.qrc b/src/resources.qrc index 90dd8d8a02..623c29152e 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -126,5 +126,8 @@ img/icons/reset.svg img/icons/down_light.svg img/icons/delete_light.svg + img/icons/layout_white.svg + img/icons/layout.svg + img/icons/light/layout.svg diff --git a/src/themes/lightstyle/light.qss b/src/themes/lightstyle/light.qss index 4b12b9fe3d..697bdb3c3b 100644 --- a/src/themes/lightstyle/light.qss +++ b/src/themes/lightstyle/light.qss @@ -504,6 +504,7 @@ QTableCornerButton::section QHeaderView::section { + min-height: 1em; background-color:#fafcfe; border-radius:0; text-align:center; diff --git a/src/themes/midnight/style.css b/src/themes/midnight/style.css index be55ead557..e7206bfa97 100644 --- a/src/themes/midnight/style.css +++ b/src/themes/midnight/style.css @@ -437,6 +437,7 @@ QPlainTextEdit { } QHeaderView::section { + min-height: 1em; background-color: #2a2b2f; color: #eff0f1; padding: 5px; @@ -1217,4 +1218,4 @@ QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, QDateEdit::down-arrow:focus { image: url(:/qss_icons/rc/down_arrow.png); -} \ No newline at end of file +} diff --git a/src/themes/native/native.qss b/src/themes/native/native.qss index 2ecca0a189..94974defa3 100644 --- a/src/themes/native/native.qss +++ b/src/themes/native/native.qss @@ -1,6 +1,7 @@ /* QMainWindow */ QHeaderView::section { + min-height: 1em; padding: 3px; padding-left: 10px; /* border: 2px solid white;*/ diff --git a/src/themes/qdarkstyle/style.qss b/src/themes/qdarkstyle/style.qss index 2097523ead..fd35b4bb82 100644 --- a/src/themes/qdarkstyle/style.qss +++ b/src/themes/qdarkstyle/style.qss @@ -436,6 +436,7 @@ QPlainTextEdit { } QHeaderView::section { + min-height: 1em; background-color: #76797C; color: #eff0f1; padding: 5px; diff --git a/src/widgets/AbstractFilterView.cpp b/src/widgets/AbstractFilterView.cpp new file mode 100644 index 0000000000..072ada6d62 --- /dev/null +++ b/src/widgets/AbstractFilterView.cpp @@ -0,0 +1,88 @@ +#include "AbstractFilterView.h" +#include +#include + +AbstractFilterView::AbstractFilterView(QWidget *parent) : QWidget(parent) {} + +void AbstractFilterView::setupSharedConnections() +{ + debounceTimer = new QTimer(this); + debounceTimer->setSingleShot(true); + + connect(debounceTimer, &QTimer::timeout, this, + [this]() { emit filterTextChanged(lineEdit()->text()); }); + + connect(lineEdit(), &QLineEdit::textChanged, this, [this]() { debounceTimer->start(150); }); +} + +void AbstractFilterView::setItemCount(int count) +{ + lineEdit()->setItemCount(count); +} + +void AbstractFilterView::showItemCount(bool show) +{ + lineEdit()->showItemCount(show); +} + +void AbstractFilterView::showFilter() +{ + show(); + lineEdit()->setFocus(); +} + +void AbstractFilterView::clearFilter() +{ + lineEdit()->setText(""); +} + +void AbstractFilterView::closeFilter() +{ + lineEdit()->setText(""); + hide(); + emit filterClosed(); +} + +void AbstractFilterView::showCustomContextMenu(const QPoint &pos) +{ + QWidget *child = this->childAt(pos); + + QMenu *menu; + QAction *showItemCountAction; + const QString showItemCountStr(tr("Show item count")); + + QAction *autoHideItemCountAction; + const QString autoHideItemCountStr(tr("Hide item count on overflow")); + + if (child && (child == lineEdit() || child->parentWidget() == lineEdit())) { + menu = lineEdit()->createStandardContextMenu(); + menu->addSeparator(); + + QMenu *optionsMenu = menu->addMenu(tr("Options")); + showItemCountAction = optionsMenu->addAction(showItemCountStr); + autoHideItemCountAction = optionsMenu->addAction(autoHideItemCountStr); + + } else { + menu = new QMenu(this); + showItemCountAction = menu->addAction(showItemCountStr); + autoHideItemCountAction = menu->addAction(autoHideItemCountStr); + } + + showItemCountAction->setCheckable(true); + showItemCountAction->setChecked(lineEdit()->itemCountVisible()); + connect(showItemCountAction, &QAction::triggered, this, + [autoHideItemCountAction, this](bool checked) { + showItemCount(checked); + autoHideItemCountAction->setEnabled(checked); + }); + + autoHideItemCountAction->setCheckable(true); + autoHideItemCountAction->setChecked(lineEdit()->itemCountAutoHide()); + autoHideItemCountAction->setEnabled(showItemCountAction->isChecked()); + connect(autoHideItemCountAction, &QAction::triggered, lineEdit(), + &ItemCountLineEdit::setItemCountAutoHide); + + menu->exec(this->mapToGlobal(pos)); + + delete menu; +} diff --git a/src/widgets/AbstractFilterView.h b/src/widgets/AbstractFilterView.h new file mode 100644 index 0000000000..d863122d84 --- /dev/null +++ b/src/widgets/AbstractFilterView.h @@ -0,0 +1,35 @@ +#ifndef ABSTRACTFILTERVIEW_H +#define ABSTRACTFILTERVIEW_H + +#include +#include +#include "ItemCountLineEdit.h" + +class AbstractFilterView : public QWidget +{ + Q_OBJECT +public: + explicit AbstractFilterView(QWidget *parent = nullptr); + + virtual void setItemCount(int count); + virtual void showItemCount(bool show); + + void showFilter(); + void clearFilter(); + + virtual void closeFilter(); + +signals: + void filterTextChanged(const QString &text); + void filterClosed(); + +protected: + virtual ItemCountLineEdit *lineEdit() const = 0; + + void setupSharedConnections(); + void showCustomContextMenu(const QPoint &pos); + + QTimer *debounceTimer; +}; + +#endif // ABSTRACTFILTERVIEW_H diff --git a/src/widgets/AddressableItemList.h b/src/widgets/AddressableItemList.h index 73df3d623f..5a2b4f0658 100644 --- a/src/widgets/AddressableItemList.h +++ b/src/widgets/AddressableItemList.h @@ -10,7 +10,6 @@ #include "core/Cutter.h" #include "common/AddressableItemModel.h" #include "CutterDockWidget.h" -#include "CutterTreeWidget.h" #include "menus/AddressableItemContextMenu.h" #include "CutterTreeView.h" diff --git a/src/widgets/ClassesWidget.cpp b/src/widgets/ClassesWidget.cpp index 5689bc7ce9..da04744dca 100644 --- a/src/widgets/ClassesWidget.cpp +++ b/src/widgets/ClassesWidget.cpp @@ -693,6 +693,9 @@ void ClassesWidget::refreshClasses() qhelpers::adjustColumns(ui->treeView, 3, 0); + // set the initial item count + ui->quickFilterView->setItemCount(proxy_model->rowCount()); + ui->treeView->setColumnWidth(0, 200); } diff --git a/src/widgets/ComboQuickFilterView.cpp b/src/widgets/ComboQuickFilterView.cpp index ec7574b566..e8112bd7a3 100644 --- a/src/widgets/ComboQuickFilterView.cpp +++ b/src/widgets/ComboQuickFilterView.cpp @@ -2,22 +2,22 @@ #include "ui_ComboQuickFilterView.h" ComboQuickFilterView::ComboQuickFilterView(QWidget *parent) - : QWidget(parent), ui(new Ui::ComboQuickFilterView) + : AbstractFilterView(parent), ui(new Ui::ComboQuickFilterView) { ui->setupUi(this); - debounceTimer = new QTimer(this); - debounceTimer->setSingleShot(true); + setupSharedConnections(); - connect(debounceTimer, &QTimer::timeout, this, - [this]() { emit filterTextChanged(ui->lineEdit->text()); }); - - connect(ui->lineEdit, &QLineEdit::textChanged, this, [this]() { debounceTimer->start(150); }); + setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, &ComboQuickFilterView::customContextMenuRequested, this, + &ComboQuickFilterView::showCustomContextMenu); } -ComboQuickFilterView::~ComboQuickFilterView() +ComboQuickFilterView::~ComboQuickFilterView() {} + +ItemCountLineEdit *ComboQuickFilterView::lineEdit() const { - delete ui; + return ui->lineEdit; } void ComboQuickFilterView::setLabelText(const QString &text) @@ -29,21 +29,3 @@ QComboBox *ComboQuickFilterView::comboBox() { return ui->comboBox; } - -void ComboQuickFilterView::showFilter() -{ - show(); - ui->lineEdit->setFocus(); -} - -void ComboQuickFilterView::clearFilter() -{ - ui->lineEdit->setText(""); -} - -void ComboQuickFilterView::closeFilter() -{ - ui->lineEdit->setText(""); - hide(); - emit filterClosed(); -} diff --git a/src/widgets/ComboQuickFilterView.h b/src/widgets/ComboQuickFilterView.h index 5dc217dcb8..3c69099bc0 100644 --- a/src/widgets/ComboQuickFilterView.h +++ b/src/widgets/ComboQuickFilterView.h @@ -1,17 +1,15 @@ #ifndef COMBOQUICKFILTERVIEW_H #define COMBOQUICKFILTERVIEW_H -#include "core/CutterCommon.h" - -#include +#include "AbstractFilterView.h" #include -#include +#include namespace Ui { class ComboQuickFilterView; } -class CUTTER_EXPORT ComboQuickFilterView : public QWidget +class ComboQuickFilterView : public AbstractFilterView { Q_OBJECT @@ -22,18 +20,11 @@ class CUTTER_EXPORT ComboQuickFilterView : public QWidget void setLabelText(const QString &text); QComboBox *comboBox(); -public slots: - void showFilter(); - void closeFilter(); - void clearFilter(); - -signals: - void filterTextChanged(const QString &text); - void filterClosed(); +protected: + ItemCountLineEdit *lineEdit() const override; private: - Ui::ComboQuickFilterView *ui; - QTimer *debounceTimer; + std::unique_ptr ui; }; #endif // COMBOQUICKFILTERVIEW_H diff --git a/src/widgets/ComboQuickFilterView.ui b/src/widgets/ComboQuickFilterView.ui index 1fe8efe202..9a55a258ae 100644 --- a/src/widgets/ComboQuickFilterView.ui +++ b/src/widgets/ComboQuickFilterView.ui @@ -27,7 +27,7 @@ 0 - + Quick Filter @@ -45,6 +45,13 @@ + + + ItemCountLineEdit + QLineEdit +
ItemCountLineEdit.h
+
+
diff --git a/src/widgets/CommentsWidget.h b/src/widgets/CommentsWidget.h index f896c47502..c83697698c 100644 --- a/src/widgets/CommentsWidget.h +++ b/src/widgets/CommentsWidget.h @@ -8,7 +8,6 @@ #include "core/Cutter.h" #include "common/AddressableItemModel.h" #include "CutterDockWidget.h" -#include "CutterTreeWidget.h" #include "widgets/ListDockWidget.h" class MainWindow; diff --git a/src/widgets/CutterTreeWidget.cpp b/src/widgets/CutterTreeWidget.cpp deleted file mode 100644 index 03d45ccb9a..0000000000 --- a/src/widgets/CutterTreeWidget.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "CutterTreeWidget.h" -#include "core/MainWindow.h" - -CutterTreeWidget::CutterTreeWidget(QObject *parent) : QObject(parent), bar(nullptr) {} - -void CutterTreeWidget::addStatusBar(QVBoxLayout *pos) -{ - if (!bar) { - bar = new QStatusBar; - QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); - bar->setSizePolicy(sizePolicy); - pos->addWidget(bar); - } -} - -void CutterTreeWidget::showItemsNumber(int count) -{ - if (bar) { - bar->showMessage(tr("%1 Items").arg(count)); - } -} - -void CutterTreeWidget::showStatusBar(bool show) -{ - bar->setVisible(show); -} - -CutterTreeWidget::~CutterTreeWidget() {} diff --git a/src/widgets/CutterTreeWidget.h b/src/widgets/CutterTreeWidget.h deleted file mode 100644 index 68664fa5a5..0000000000 --- a/src/widgets/CutterTreeWidget.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef CUTTERTREEWIDGET_H -#define CUTTERTREEWIDGET_H - -#include "core/CutterCommon.h" - -#include -#include - -class MainWindow; - -class CUTTER_EXPORT CutterTreeWidget : public QObject -{ - - Q_OBJECT - -public: - explicit CutterTreeWidget(QObject *parent = nullptr); - ~CutterTreeWidget(); - void addStatusBar(QVBoxLayout *pos); - void showItemsNumber(int count); - void showStatusBar(bool show); - -private: - QStatusBar *bar; -}; -#endif // CUTTERTREEWIDGET_H diff --git a/src/widgets/FlagsWidget.cpp b/src/widgets/FlagsWidget.cpp index 25859a26ad..9685f20185 100644 --- a/src/widgets/FlagsWidget.cpp +++ b/src/widgets/FlagsWidget.cpp @@ -141,13 +141,10 @@ bool FlagsSortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIn } FlagsWidget::FlagsWidget(MainWindow *main) - : CutterDockWidget(main), ui(new Ui::FlagsWidget), main(main), tree(new CutterTreeWidget(this)) + : CutterDockWidget(main), ui(new Ui::FlagsWidget), main(main) { ui->setupUi(this); - // Add Status Bar footer - tree->addStatusBar(ui->verticalLayout); - flags_model = new FlagsModel(this); flags_proxy_model = new FlagsSortFilterProxyModel(flags_model, this); connect(ui->filterLineEdit, &QLineEdit::textChanged, flags_proxy_model, @@ -174,7 +171,7 @@ FlagsWidget::FlagsWidget(MainWindow *main) clearShortcut->setContext(Qt::WidgetWithChildrenShortcut); connect(ui->filterLineEdit, &QLineEdit::textChanged, this, - [this] { tree->showItemsNumber(flags_proxy_model->rowCount()); }); + [this] { ui->filterLineEdit->setItemCount(flags_proxy_model->rowCount()); }); setScrollMode(); @@ -267,7 +264,8 @@ void FlagsWidget::refreshFlags() flags_model->flags = Core()->getAllFlags(flagspace); flags_model->endResetModel(); - tree->showItemsNumber(flags_proxy_model->rowCount()); + // set the initial item count + ui->filterLineEdit->setItemCount(flags_proxy_model->rowCount()); // TODO: this is not a very good place for the following: QStringList flagNames; diff --git a/src/widgets/FlagsWidget.h b/src/widgets/FlagsWidget.h index 81d90a1f80..f5ef90fce3 100644 --- a/src/widgets/FlagsWidget.h +++ b/src/widgets/FlagsWidget.h @@ -9,7 +9,6 @@ #include "core/Cutter.h" #include "CutterDockWidget.h" -#include "CutterTreeWidget.h" #include "AddressableItemList.h" #include "AddressableItemModel.h" @@ -84,7 +83,6 @@ private slots: bool disableFlagRefresh = false; FlagsModel *flags_model; FlagsSortFilterProxyModel *flags_proxy_model; - CutterTreeWidget *tree; void refreshFlags(); void setScrollMode(); diff --git a/src/widgets/FlagsWidget.ui b/src/widgets/FlagsWidget.ui index 3a556e0190..2e20d37b94 100644 --- a/src/widgets/FlagsWidget.ui +++ b/src/widgets/FlagsWidget.ui @@ -71,7 +71,7 @@ 0 - + @@ -118,6 +118,11 @@ + + ItemCountLineEdit + QLineEdit +
ItemCountLineEdit.h
+
AddressableItemList<> QTreeView diff --git a/src/widgets/FunctionsWidget.cpp b/src/widgets/FunctionsWidget.cpp index fc10c3c583..61f1887ac3 100644 --- a/src/widgets/FunctionsWidget.cpp +++ b/src/widgets/FunctionsWidget.cpp @@ -586,6 +586,9 @@ void FunctionsWidget::refreshTree() functionModel->updateCurrentIndex(); functionModel->endResetModel(); + // set the initial item count + ui->quickFilterView->setItemCount(functionProxyModel->rowCount()); + // resize offset and size columns qhelpers::adjustColumns(ui->treeView, 3, 0); }); diff --git a/src/widgets/GlobalsWidget.cpp b/src/widgets/GlobalsWidget.cpp index 85547a05a1..37957db2cb 100644 --- a/src/widgets/GlobalsWidget.cpp +++ b/src/widgets/GlobalsWidget.cpp @@ -144,8 +144,7 @@ void GlobalsWidget::deleteGlobal() Core()->delGlobalVariable(globalVariableAddress); } -GlobalsWidget::GlobalsWidget(MainWindow *main) - : CutterDockWidget(main), ui(new Ui::GlobalsWidget), tree(new CutterTreeWidget(this)) +GlobalsWidget::GlobalsWidget(MainWindow *main) : CutterDockWidget(main), ui(new Ui::GlobalsWidget) { ui->setupUi(this); ui->quickFilterView->setLabelText(tr("Category")); @@ -153,9 +152,6 @@ GlobalsWidget::GlobalsWidget(MainWindow *main) setWindowTitle(tr("Globals")); setObjectName("GlobalsWidget"); - // Add status bar which displays the count - tree->addStatusBar(ui->verticalLayout); - // Set single select mode ui->treeView->setSelectionMode(QAbstractItemView::SingleSelection); @@ -174,7 +170,7 @@ GlobalsWidget::GlobalsWidget(MainWindow *main) &QSortFilterProxyModel::setFilterWildcard); connect(ui->quickFilterView, &ComboQuickFilterView::filterTextChanged, this, - [this] { tree->showItemsNumber(globalsProxyModel->rowCount()); }); + [this] { ui->quickFilterView->setItemCount(globalsProxyModel->rowCount()); }); QShortcut *searchShortcut = Shortcuts()->makeQShortcut("General.showFilter", this); connect(searchShortcut, &QShortcut::activated, ui->quickFilterView, @@ -211,5 +207,8 @@ void GlobalsWidget::refreshGlobals() globalsModel->globals = Core()->getAllGlobals(); globalsModel->endResetModel(); + // set the initial item count + ui->quickFilterView->setItemCount(globalsProxyModel->rowCount()); + qhelpers::adjustColumns(ui->treeView, GlobalsModel::ColumnCount, 0); } diff --git a/src/widgets/GlobalsWidget.h b/src/widgets/GlobalsWidget.h index 922b761972..0e282ab166 100644 --- a/src/widgets/GlobalsWidget.h +++ b/src/widgets/GlobalsWidget.h @@ -77,7 +77,6 @@ private slots: GlobalsModel *globalsModel; GlobalsProxyModel *globalsProxyModel; - CutterTreeWidget *tree; QAction *actionEditGlobal; QAction *actionDeleteGlobal; diff --git a/src/widgets/HeadersWidget.cpp b/src/widgets/HeadersWidget.cpp index e4b568f947..c4462369f1 100644 --- a/src/widgets/HeadersWidget.cpp +++ b/src/widgets/HeadersWidget.cpp @@ -122,13 +122,12 @@ HeadersWidget::HeadersWidget(MainWindow *main) : ListDockWidget(main) setModels(headersProxyModel); ui->treeView->sortByColumn(HeadersModel::OffsetColumn, Qt::AscendingOrder); - ui->quickFilterView->closeFilter(); - showCount(false); - connect(Core(), &CutterCore::codeRebased, this, &HeadersWidget::refreshHeaders); connect(Core(), &CutterCore::refreshAll, this, &HeadersWidget::refreshHeaders); connect(Core(), &CutterCore::commentsChanged, this, [this]() { qhelpers::emitColumnChanged(headersModel, HeadersModel::CommentColumn); }); + connect(ui->quickFilterView, &QuickFilterView::filterTextChanged, this, + [this] { ui->quickFilterView->setItemCount(headersProxyModel->rowCount()); }); } HeadersWidget::~HeadersWidget() {} @@ -141,4 +140,7 @@ void HeadersWidget::refreshHeaders() ui->treeView->resizeColumnToContents(0); ui->treeView->resizeColumnToContents(1); + + // set the initial item count + ui->quickFilterView->setItemCount(headersProxyModel->rowCount()); } diff --git a/src/widgets/ImportsWidget.cpp b/src/widgets/ImportsWidget.cpp index cf36ee23cd..4bde84471d 100644 --- a/src/widgets/ImportsWidget.cpp +++ b/src/widgets/ImportsWidget.cpp @@ -190,4 +190,7 @@ void ImportsWidget::refreshImports() { importsModel->reload(); qhelpers::adjustColumns(ui->treeView, 4, 0); + + // set the initial item count + ui->quickFilterView->setItemCount(importsProxyModel->rowCount()); } diff --git a/src/widgets/ItemCountLineEdit.cpp b/src/widgets/ItemCountLineEdit.cpp new file mode 100644 index 0000000000..4000e7e378 --- /dev/null +++ b/src/widgets/ItemCountLineEdit.cpp @@ -0,0 +1,105 @@ +#include "ItemCountLineEdit.h" +#include "Configuration.h" + +#include +#include + +namespace { +constexpr int PADDING = 5; +} + +ItemCountLineEdit::ItemCountLineEdit(QWidget *parent) + : QLineEdit(parent), m_itemCountLabel(new QLabel(this)) +{ + // parent widget must handle the context menu + this->setContextMenuPolicy(Qt::NoContextMenu); + + m_itemCountLabel->setStyleSheet("QLabel { background: transparent; }"); + + connect(this, &QLineEdit::textChanged, this, &ItemCountLineEdit::updateLabelPosition); + connect(Config(), &Configuration::itemCountToggled, this, &ItemCountLineEdit::showItemCount); + connect(Config(), &Configuration::itemCountAutoHideToggled, this, + &ItemCountLineEdit::setItemCountAutoHide); + + m_itemCountAutoHide = Config()->getItemCountAutoHide(); + m_itemCountVisible = Config()->getItemCountVisible(); + if (!m_itemCountVisible) { + m_itemCountLabel->hide(); + } + updateLabelPosition(); +} + +void ItemCountLineEdit::setItemCount(int count) +{ + m_itemCountLabel->setText(QString("%1 Items").arg(count)); + updateLabelPosition(); +} + +bool ItemCountLineEdit::itemCountVisible() const +{ + return m_itemCountVisible; +} + +void ItemCountLineEdit::setItemCountAutoHide(bool value) +{ + m_itemCountAutoHide = value; + updateLabelPosition(); +} + +bool ItemCountLineEdit::itemCountAutoHide() const +{ + return m_itemCountAutoHide; +} + +void ItemCountLineEdit::showItemCount(bool show) +{ + m_itemCountVisible = show; + m_itemCountLabel->setVisible(show); + if (!show) { + this->setTextMargins(0, 0, 0, 0); + } + updateLabelPosition(); +} + +void ItemCountLineEdit::resizeEvent(QResizeEvent *event) +{ + QLineEdit::resizeEvent(event); + updateLabelPosition(); +} + +void ItemCountLineEdit::updateLabelPosition() +{ + if (!m_itemCountVisible) { + return; + } + + m_itemCountLabel->adjustSize(); + + int labelWidth = m_itemCountLabel->sizeHint().width(); + int x = this->width() - labelWidth - PADDING; + + if (m_itemCountAutoHide) { + QFont font = this->font(); + QFontMetrics fm(font); +#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) + int textWidth = fm.horizontalAdvance(this->text()); +#else + int textWidth = fm.width(this->text()); +#endif + const int BUFFER = Config()->windowColorIsDark() ? 4 : 5; + if (x <= (PADDING * BUFFER) + textWidth) { + m_itemCountLabel->hide(); + this->setTextMargins(0, 0, 0, 0); + return; + } + } + + // required so the label doesn't overlap with placeholder text + auto margins = this->textMargins(); + margins.setRight(labelWidth + PADDING); + this->setTextMargins(margins); + + int y = (this->height() - m_itemCountLabel->height()) / 2; + m_itemCountLabel->move(x, y); + m_itemCountLabel->show(); +} diff --git a/src/widgets/ItemCountLineEdit.h b/src/widgets/ItemCountLineEdit.h new file mode 100644 index 0000000000..c10fc8df7a --- /dev/null +++ b/src/widgets/ItemCountLineEdit.h @@ -0,0 +1,38 @@ +#ifndef ITEMCOUNTLINEEDIT_H +#define ITEMCOUNTLINEEDIT_H + +#include + +class QLabel; + +/** + * @brief A line edit containing an item count label on the right side + */ +class ItemCountLineEdit : public QLineEdit +{ + Q_OBJECT + +public: + explicit ItemCountLineEdit(QWidget *parent = nullptr); + + void setItemCount(int count); + bool itemCountVisible() const; + + void setItemCountAutoHide(bool value); + bool itemCountAutoHide() const; + +public slots: + void showItemCount(bool show); + +protected: + void resizeEvent(QResizeEvent *event) override; + +private: + QLabel *m_itemCountLabel; + bool m_itemCountVisible; + bool m_itemCountAutoHide; + + void updateLabelPosition(); +}; + +#endif // ITEMCOUNTLINEEDIT_H diff --git a/src/widgets/ListDockWidget.cpp b/src/widgets/ListDockWidget.cpp index ffcd05b79e..8963582a81 100644 --- a/src/widgets/ListDockWidget.cpp +++ b/src/widgets/ListDockWidget.cpp @@ -8,49 +8,32 @@ #include #include -ListDockWidget::ListDockWidget(MainWindow *main, SearchBarPolicy searchBarPolicy) - : CutterDockWidget(main), - ui(new Ui::ListDockWidget), - tree(new CutterTreeWidget(this)), - searchBarPolicy(searchBarPolicy) +ListDockWidget::ListDockWidget(MainWindow *main) + : CutterDockWidget(main), ui(new Ui::ListDockWidget) { ui->setupUi(this); - // Add Status Bar footer - tree->addStatusBar(ui->verticalLayout); + // Ctrl-F to show/hide the filter entry + QShortcut *searchShortcut = Shortcuts()->makeQShortcut("General.showFilter", this); + connect(searchShortcut, &QShortcut::activated, ui->quickFilterView, + &QuickFilterView::showFilter); + searchShortcut->setContext(Qt::WidgetWithChildrenShortcut); - if (searchBarPolicy != SearchBarPolicy::Hide) { - // Ctrl-F to show/hide the filter entry - QShortcut *searchShortcut = Shortcuts()->makeQShortcut("General.showFilter", this); - connect(searchShortcut, &QShortcut::activated, ui->quickFilterView, - &QuickFilterView::showFilter); - searchShortcut->setContext(Qt::WidgetWithChildrenShortcut); - - // Esc to clear the filter entry - QShortcut *clearShortcut = Shortcuts()->makeQShortcut("General.clearFilter", this); - connect(clearShortcut, &QShortcut::activated, [this]() { - ui->quickFilterView->clearFilter(); - ui->treeView->setFocus(); - }); - clearShortcut->setContext(Qt::WidgetWithChildrenShortcut); - } + // Esc to clear the filter entry + QShortcut *clearShortcut = Shortcuts()->makeQShortcut("General.clearFilter", this); + connect(clearShortcut, &QShortcut::activated, [this]() { + ui->quickFilterView->clearFilter(); + ui->treeView->setFocus(); + }); + clearShortcut->setContext(Qt::WidgetWithChildrenShortcut); qhelpers::setVerticalScrollMode(ui->treeView); ui->treeView->setMainWindow(mainWindow); - - if (searchBarPolicy != SearchBarPolicy::ShowByDefault) { - ui->quickFilterView->closeFilter(); - } } ListDockWidget::~ListDockWidget() {} -void ListDockWidget::showCount(bool show) -{ - tree->showStatusBar(show); -} - void ListDockWidget::setModels(AddressableFilterProxyModel *objectFilterProxyModel) { this->objectFilterProxyModel = objectFilterProxyModel; @@ -62,6 +45,7 @@ void ListDockWidget::setModels(AddressableFilterProxyModel *objectFilterProxyMod connect(ui->quickFilterView, &QuickFilterView::filterClosed, ui->treeView, static_cast(&QWidget::setFocus)); - connect(ui->quickFilterView, &QuickFilterView::filterTextChanged, this, - [this] { tree->showItemsNumber(this->objectFilterProxyModel->rowCount()); }); + connect(ui->quickFilterView, &QuickFilterView::filterTextChanged, this, [this] { + ui->quickFilterView->setItemCount(this->objectFilterProxyModel->rowCount()); + }); } diff --git a/src/widgets/ListDockWidget.h b/src/widgets/ListDockWidget.h index 662714e8e9..f67c358717 100644 --- a/src/widgets/ListDockWidget.h +++ b/src/widgets/ListDockWidget.h @@ -9,7 +9,6 @@ #include "core/Cutter.h" #include "common/AddressableItemModel.h" #include "CutterDockWidget.h" -#include "CutterTreeWidget.h" #include "menus/AddressableItemContextMenu.h" class MainWindow; @@ -25,18 +24,9 @@ class CUTTER_EXPORT ListDockWidget : public CutterDockWidget Q_OBJECT public: - enum class SearchBarPolicy { - ShowByDefault, - HideByDefault, - Hide, - }; - - explicit ListDockWidget(MainWindow *main, - SearchBarPolicy searchBarPolicy = SearchBarPolicy::ShowByDefault); + explicit ListDockWidget(MainWindow *main); ~ListDockWidget() override; - void showCount(bool show); - protected: void setModels(AddressableFilterProxyModel *objectFilterProxyModel); @@ -44,8 +34,6 @@ class CUTTER_EXPORT ListDockWidget : public CutterDockWidget private: AddressableFilterProxyModel *objectFilterProxyModel = nullptr; - CutterTreeWidget *tree; - SearchBarPolicy searchBarPolicy; }; #endif // LISTDOCKWIDGET_H diff --git a/src/widgets/MemoryMapWidget.cpp b/src/widgets/MemoryMapWidget.cpp index 6548e9b27a..2d4f1f7fbd 100644 --- a/src/widgets/MemoryMapWidget.cpp +++ b/src/widgets/MemoryMapWidget.cpp @@ -116,8 +116,7 @@ bool MemoryProxyModel::lessThan(const QModelIndex &left, const QModelIndex &righ return leftMemMap.addrStart < rightMemMap.addrStart; } -MemoryMapWidget::MemoryMapWidget(MainWindow *main) - : ListDockWidget(main, ListDockWidget::SearchBarPolicy::HideByDefault) +MemoryMapWidget::MemoryMapWidget(MainWindow *main) : ListDockWidget(main) { setWindowTitle(tr("Memory Map")); setObjectName("MemoryMapWidget"); @@ -133,8 +132,8 @@ MemoryMapWidget::MemoryMapWidget(MainWindow *main) connect(Core(), &CutterCore::registersChanged, this, &MemoryMapWidget::refreshMemoryMap); connect(Core(), &CutterCore::commentsChanged, this, [this]() { qhelpers::emitColumnChanged(memoryModel, MemoryMapModel::CommentColumn); }); - - showCount(false); + connect(ui->quickFilterView, &QuickFilterView::filterTextChanged, this, + [this] { ui->quickFilterView->setItemCount(memoryProxyModel->rowCount()); }); } MemoryMapWidget::~MemoryMapWidget() = default; @@ -155,4 +154,7 @@ void MemoryMapWidget::refreshMemoryMap() ui->treeView->resizeColumnToContents(0); ui->treeView->resizeColumnToContents(1); ui->treeView->resizeColumnToContents(2); + + // set the initial item count + ui->quickFilterView->setItemCount(memoryProxyModel->rowCount()); } diff --git a/src/widgets/QuickFilterView.cpp b/src/widgets/QuickFilterView.cpp index bf1303336f..93fdc55475 100644 --- a/src/widgets/QuickFilterView.cpp +++ b/src/widgets/QuickFilterView.cpp @@ -1,34 +1,38 @@ - #include "QuickFilterView.h" #include "ui_QuickFilterView.h" +#include "Configuration.h" -QuickFilterView::QuickFilterView(QWidget *parent, bool defaultOn) - : QWidget(parent), ui(new Ui::QuickFilterView()) +QuickFilterView::QuickFilterView(QWidget *parent) + : AbstractFilterView(parent), ui(new Ui::QuickFilterView()) { ui->setupUi(this); - debounceTimer = new QTimer(this); - debounceTimer->setSingleShot(true); + setupSharedConnections(); connect(ui->closeFilterButton, &QAbstractButton::clicked, this, &QuickFilterView::closeFilter); - connect(debounceTimer, &QTimer::timeout, this, - [this]() { emit filterTextChanged(ui->filterLineEdit->text()); }); + setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, &QuickFilterView::customContextMenuRequested, this, + &QuickFilterView::showCustomContextMenu); - connect(ui->filterLineEdit, &QLineEdit::textChanged, this, - [this]() { debounceTimer->start(150); }); + connect(Config(), &Configuration::quickFilterToggled, this, [this](bool show) { + if (show) { + this->show(); + } else if (ui->filterLineEdit->text().isEmpty()) { + this->hide(); + } + }); - if (!defaultOn) { - closeFilter(); + if (!Config()->getShowQuickFilter()) { + hide(); } } QuickFilterView::~QuickFilterView() {} -void QuickFilterView::showFilter() +ItemCountLineEdit *QuickFilterView::lineEdit() const { - show(); - ui->filterLineEdit->setFocus(); + return ui->filterLineEdit; } void QuickFilterView::clearFilter() @@ -39,10 +43,3 @@ void QuickFilterView::clearFilter() ui->filterLineEdit->setText(""); } } - -void QuickFilterView::closeFilter() -{ - ui->filterLineEdit->setText(""); - hide(); - emit filterClosed(); -} diff --git a/src/widgets/QuickFilterView.h b/src/widgets/QuickFilterView.h index b6cbb15b5c..16a74a2d0a 100644 --- a/src/widgets/QuickFilterView.h +++ b/src/widgets/QuickFilterView.h @@ -1,38 +1,29 @@ - #ifndef QUICKFILTERVIEW_H #define QUICKFILTERVIEW_H -#include "core/CutterCommon.h" +#include "AbstractFilterView.h" #include -#include -#include - namespace Ui { class QuickFilterView; } -class CUTTER_EXPORT QuickFilterView : public QWidget +class QuickFilterView : public AbstractFilterView { Q_OBJECT public: - explicit QuickFilterView(QWidget *parent = nullptr, bool defaultOn = true); + explicit QuickFilterView(QWidget *parent = nullptr); ~QuickFilterView(); -public slots: - void showFilter(); - void closeFilter(); void clearFilter(); -signals: - void filterTextChanged(const QString &text); - void filterClosed(); +protected: + ItemCountLineEdit *lineEdit() const override; private: std::unique_ptr ui; - QTimer *debounceTimer; }; #endif // QUICKFILTERVIEW_H diff --git a/src/widgets/QuickFilterView.ui b/src/widgets/QuickFilterView.ui index 3f5bfeaec4..804a6b051f 100644 --- a/src/widgets/QuickFilterView.ui +++ b/src/widgets/QuickFilterView.ui @@ -13,7 +13,7 @@ Form - + 0 @@ -29,41 +29,47 @@ 0 - - - - - 0 - 0 - - - - Quick Filter - - - true - - - - 75 false true - + X + + + + + 0 + 0 + + + + Quick Filter + + + false + + +
+ + + ItemCountLineEdit + QLineEdit +
ItemCountLineEdit.h
+
+
diff --git a/src/widgets/RegisterRefsWidget.cpp b/src/widgets/RegisterRefsWidget.cpp index 4c90e58a4a..601dd7d6f9 100644 --- a/src/widgets/RegisterRefsWidget.cpp +++ b/src/widgets/RegisterRefsWidget.cpp @@ -116,16 +116,10 @@ bool RegisterRefProxyModel::lessThan(const QModelIndex &left, const QModelIndex } RegisterRefsWidget::RegisterRefsWidget(MainWindow *main) - : CutterDockWidget(main), - ui(new Ui::RegisterRefsWidget), - tree(new CutterTreeWidget(this)), - addressableItemContextMenu(this, main) + : CutterDockWidget(main), ui(new Ui::RegisterRefsWidget), addressableItemContextMenu(this, main) { ui->setupUi(this); - // Add Status Bar footer - tree->addStatusBar(ui->verticalLayout); - registerRefModel = new RegisterRefModel(this); registerRefProxyModel = new RegisterRefProxyModel(registerRefModel, this); ui->registerRefTreeView->setModel(registerRefProxyModel); @@ -169,7 +163,7 @@ RegisterRefsWidget::RegisterRefsWidget(MainWindow *main) &RegisterRefsWidget::customMenuRequested); connect(ui->quickFilterView, &QuickFilterView::filterTextChanged, this, - [this] { tree->showItemsNumber(registerRefProxyModel->rowCount()); }); + [this] { ui->quickFilterView->setItemCount(registerRefProxyModel->rowCount()); }); } RegisterRefsWidget::~RegisterRefsWidget() = default; @@ -199,7 +193,8 @@ void RegisterRefsWidget::refreshRegisterRef() ui->registerRefTreeView->resizeColumnToContents(1); ui->registerRefTreeView->resizeColumnToContents(2); - tree->showItemsNumber(registerRefProxyModel->rowCount()); + // set the initial item count + ui->quickFilterView->setItemCount(registerRefProxyModel->rowCount()); } void RegisterRefsWidget::setScrollMode() diff --git a/src/widgets/RegisterRefsWidget.h b/src/widgets/RegisterRefsWidget.h index 28773d3c57..6bd31b0409 100644 --- a/src/widgets/RegisterRefsWidget.h +++ b/src/widgets/RegisterRefsWidget.h @@ -4,7 +4,6 @@ #include "core/Cutter.h" #include "CutterDockWidget.h" -#include "CutterTreeWidget.h" #include "menus/AddressableItemContextMenu.h" #include @@ -83,7 +82,6 @@ private slots: RegisterRefModel *registerRefModel; RegisterRefProxyModel *registerRefProxyModel; - CutterTreeWidget *tree; void setScrollMode(); RefreshDeferrer *refreshDeferrer; diff --git a/src/widgets/ResourcesWidget.cpp b/src/widgets/ResourcesWidget.cpp index 1ef8138132..1273d52cb6 100644 --- a/src/widgets/ResourcesWidget.cpp +++ b/src/widgets/ResourcesWidget.cpp @@ -99,8 +99,7 @@ RVA ResourcesModel::address(const QModelIndex &index) const return res.vaddr; } -ResourcesWidget::ResourcesWidget(MainWindow *main) - : ListDockWidget(main, ListDockWidget::SearchBarPolicy::HideByDefault) +ResourcesWidget::ResourcesWidget(MainWindow *main) : ListDockWidget(main) { setObjectName("ResourcesWidget"); @@ -111,14 +110,14 @@ ResourcesWidget::ResourcesWidget(MainWindow *main) ui->treeView->sortByColumn(0, Qt::AscendingOrder); - showCount(false); - // Configure widget this->setWindowTitle(tr("Resources")); connect(Core(), &CutterCore::refreshAll, this, &ResourcesWidget::refreshResources); connect(Core(), &CutterCore::commentsChanged, this, [this]() { qhelpers::emitColumnChanged(model, ResourcesModel::COMMENT); }); + connect(ui->quickFilterView, &QuickFilterView::filterTextChanged, this, + [this] { ui->quickFilterView->setItemCount(filterModel->rowCount()); }); } void ResourcesWidget::refreshResources() @@ -126,4 +125,7 @@ void ResourcesWidget::refreshResources() model->beginResetModel(); model->resources = Core()->getAllResources(); model->endResetModel(); + + // set the initial item count + ui->quickFilterView->setItemCount(filterModel->rowCount()); } diff --git a/src/widgets/SectionsWidget.cpp b/src/widgets/SectionsWidget.cpp index 52a1ffb46e..49609c68f4 100644 --- a/src/widgets/SectionsWidget.cpp +++ b/src/widgets/SectionsWidget.cpp @@ -192,7 +192,6 @@ void SectionsWidget::initQuickFilter() void SectionsWidget::initAddrMapDocks() { QVBoxLayout *layout = ui->verticalLayout; - showCount(false); rawAddrDock = new RawAddrDock(sectionsModel, this); virtualAddrDock = new VirtualAddrDock(sectionsModel, this); diff --git a/src/widgets/SegmentsWidget.cpp b/src/widgets/SegmentsWidget.cpp index 7fd6e6e7e2..e3ad5701e0 100644 --- a/src/widgets/SegmentsWidget.cpp +++ b/src/widgets/SegmentsWidget.cpp @@ -140,18 +140,17 @@ SegmentsWidget::SegmentsWidget(MainWindow *main) : ListDockWidget(main) setWindowTitle(tr("Segments")); segmentsModel = new SegmentsModel(this); - auto proxyModel = new SegmentsProxyModel(segmentsModel, this); + proxyModel = new SegmentsProxyModel(segmentsModel, this); setModels(proxyModel); ui->treeView->sortByColumn(SegmentsModel::NameColumn, Qt::AscendingOrder); - ui->quickFilterView->closeFilter(); - showCount(false); - connect(Core(), &CutterCore::refreshAll, this, &SegmentsWidget::refreshSegments); connect(Core(), &CutterCore::codeRebased, this, &SegmentsWidget::refreshSegments); connect(Core(), &CutterCore::commentsChanged, this, [this]() { qhelpers::emitColumnChanged(segmentsModel, SegmentsModel::CommentColumn); }); + connect(ui->quickFilterView, &QuickFilterView::filterTextChanged, this, + [this] { ui->quickFilterView->setItemCount(proxyModel->rowCount()); }); } SegmentsWidget::~SegmentsWidget() {} @@ -163,4 +162,7 @@ void SegmentsWidget::refreshSegments() segmentsModel->endResetModel(); qhelpers::adjustColumns(ui->treeView, SegmentsModel::ColumnCount, 0); + + // set the initial item count + ui->quickFilterView->setItemCount(proxyModel->rowCount()); } diff --git a/src/widgets/SegmentsWidget.h b/src/widgets/SegmentsWidget.h index 3918fea88c..861c05cd7d 100644 --- a/src/widgets/SegmentsWidget.h +++ b/src/widgets/SegmentsWidget.h @@ -70,6 +70,7 @@ private slots: private: SegmentsModel *segmentsModel; + SegmentsProxyModel *proxyModel; }; #endif // SEGMENTSWIDGET_H diff --git a/src/widgets/StringsWidget.cpp b/src/widgets/StringsWidget.cpp index 325d47d127..575364d95d 100644 --- a/src/widgets/StringsWidget.cpp +++ b/src/widgets/StringsWidget.cpp @@ -151,15 +151,11 @@ bool StringsProxyModel::lessThan(const QModelIndex &left, const QModelIndex &rig return leftStr->vaddr < rightStr->vaddr; } -StringsWidget::StringsWidget(MainWindow *main) - : CutterDockWidget(main), ui(new Ui::StringsWidget), tree(new CutterTreeWidget(this)) +StringsWidget::StringsWidget(MainWindow *main) : CutterDockWidget(main), ui(new Ui::StringsWidget) { ui->setupUi(this); ui->quickFilterView->setLabelText(tr("Section:")); - // Add Status Bar footer - tree->addStatusBar(ui->verticalLayout); - qhelpers::setVerticalScrollMode(ui->stringsTreeView); // Shift-F12 to toggle strings window @@ -186,7 +182,7 @@ StringsWidget::StringsWidget(MainWindow *main) &QSortFilterProxyModel::setFilterWildcard); connect(ui->quickFilterView, &ComboQuickFilterView::filterTextChanged, this, - [this] { tree->showItemsNumber(proxyModel->rowCount()); }); + [this] { ui->quickFilterView->setItemCount(proxyModel->rowCount()); }); QShortcut *searchShortcut = Shortcuts()->makeQShortcut("General.showFilter", this); connect(searchShortcut, &QShortcut::activated, ui->quickFilterView, @@ -207,7 +203,7 @@ StringsWidget::StringsWidget(MainWindow *main) connect(ui->quickFilterView->comboBox(), &QComboBox::currentTextChanged, this, [this]() { proxyModel->setSelectedSection(ui->quickFilterView->comboBox()->currentData().toString()); - tree->showItemsNumber(proxyModel->rowCount()); + ui->quickFilterView->setItemCount(proxyModel->rowCount()); }); auto header = ui->stringsTreeView->header(); @@ -253,7 +249,8 @@ void StringsWidget::stringSearchFinished(const QList &strings model->strings = strings; model->endResetModel(); - tree->showItemsNumber(proxyModel->rowCount()); + // set the initial item count + ui->quickFilterView->setItemCount(proxyModel->rowCount()); task.clear(); } diff --git a/src/widgets/StringsWidget.h b/src/widgets/StringsWidget.h index d6615b2447..d5e3d65c7f 100644 --- a/src/widgets/StringsWidget.h +++ b/src/widgets/StringsWidget.h @@ -6,7 +6,6 @@ #include "core/Cutter.h" #include "CutterDockWidget.h" #include "common/StringsTask.h" -#include "CutterTreeWidget.h" #include "AddressableItemModel.h" #include @@ -92,7 +91,6 @@ private slots: StringsModel *model; StringsProxyModel *proxyModel; - CutterTreeWidget *tree; }; #endif // STRINGSWIDGET_H diff --git a/src/widgets/TypesWidget.cpp b/src/widgets/TypesWidget.cpp index df9148b0f0..7763a73e61 100644 --- a/src/widgets/TypesWidget.cpp +++ b/src/widgets/TypesWidget.cpp @@ -146,15 +146,11 @@ bool TypesSortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIn return left_exp.size < right_exp.size; } -TypesWidget::TypesWidget(MainWindow *main) - : CutterDockWidget(main), ui(new Ui::TypesWidget), tree(new CutterTreeWidget(this)) +TypesWidget::TypesWidget(MainWindow *main) : CutterDockWidget(main), ui(new Ui::TypesWidget) { ui->setupUi(this); ui->quickFilterView->setLabelText(tr("Category")); - // Add status bar which displays the count - tree->addStatusBar(ui->verticalLayout); - // Set single select mode ui->typesTreeView->setSelectionMode(QAbstractItemView::SingleSelection); @@ -176,7 +172,7 @@ TypesWidget::TypesWidget(MainWindow *main) &QSortFilterProxyModel::setFilterWildcard); connect(ui->quickFilterView, &ComboQuickFilterView::filterTextChanged, this, - [this] { tree->showItemsNumber(types_proxy_model->rowCount()); }); + [this] { ui->quickFilterView->setItemCount(types_proxy_model->rowCount()); }); QShortcut *searchShortcut = Shortcuts()->makeQShortcut("General.showFilter", this); connect(searchShortcut, &QShortcut::activated, ui->quickFilterView, @@ -192,7 +188,7 @@ TypesWidget::TypesWidget(MainWindow *main) connect(ui->quickFilterView->comboBox(), &QComboBox::currentTextChanged, this, [this]() { types_proxy_model->setCategory(ui->quickFilterView->comboBox()->currentData().toString()); - tree->showItemsNumber(types_proxy_model->rowCount()); + ui->quickFilterView->setItemCount(types_proxy_model->rowCount()); }); actionViewType = new QAction(tr("View Type"), this); @@ -222,6 +218,9 @@ void TypesWidget::refreshTypes() categories.removeDuplicates(); refreshCategoryCombo(categories); + // set the initial count + ui->quickFilterView->setItemCount(types_proxy_model->rowCount()); + qhelpers::adjustColumns(ui->typesTreeView, 4, 0); } diff --git a/src/widgets/TypesWidget.h b/src/widgets/TypesWidget.h index 7c3b267c07..9b02d169a3 100644 --- a/src/widgets/TypesWidget.h +++ b/src/widgets/TypesWidget.h @@ -5,7 +5,6 @@ #include "core/Cutter.h" #include "CutterDockWidget.h" -#include "CutterTreeWidget.h" #include #include @@ -134,7 +133,6 @@ private slots: TypesModel *types_model; TypesSortFilterProxyModel *types_proxy_model; - CutterTreeWidget *tree; QAction *actionViewType; QAction *actionEditType; QAction *actionShowVariables; diff --git a/src/widgets/VTablesWidget.cpp b/src/widgets/VTablesWidget.cpp index b80ccd1400..fa0d93f08b 100644 --- a/src/widgets/VTablesWidget.cpp +++ b/src/widgets/VTablesWidget.cpp @@ -124,14 +124,10 @@ bool VTableSortFilterProxyModel::filterAcceptsRow(int source_row, return false; } -VTablesWidget::VTablesWidget(MainWindow *main) - : CutterDockWidget(main), ui(new Ui::VTablesWidget), tree(new CutterTreeWidget(this)) +VTablesWidget::VTablesWidget(MainWindow *main) : CutterDockWidget(main), ui(new Ui::VTablesWidget) { ui->setupUi(this); - // Add Status Bar footer - tree->addStatusBar(ui->verticalLayout); - model = new VTableModel(this); proxy = new VTableSortFilterProxyModel(model, this); @@ -156,7 +152,7 @@ VTablesWidget::VTablesWidget(MainWindow *main) [this]() { ui->vTableTreeView->setFocus(); }); connect(ui->quickFilterView, &QuickFilterView::filterTextChanged, this, - [this] { tree->showItemsNumber(proxy->rowCount()); }); + [this] { ui->quickFilterView->setItemCount(proxy->rowCount()); }); connect(Core(), &CutterCore::codeRebased, this, &VTablesWidget::refreshVTables); connect(Core(), &CutterCore::refreshAll, this, &VTablesWidget::refreshVTables); @@ -180,7 +176,8 @@ void VTablesWidget::refreshVTables() ui->vTableTreeView->setColumnWidth(0, 200); - tree->showItemsNumber(proxy->rowCount()); + // set the initial item count + ui->quickFilterView->setItemCount(proxy->rowCount()); } void VTablesWidget::on_vTableTreeView_doubleClicked(const QModelIndex &index) diff --git a/src/widgets/VTablesWidget.h b/src/widgets/VTablesWidget.h index 553b276663..19a60688b2 100644 --- a/src/widgets/VTablesWidget.h +++ b/src/widgets/VTablesWidget.h @@ -8,7 +8,6 @@ #include "core/Cutter.h" #include "CutterDockWidget.h" -#include "CutterTreeWidget.h" namespace Ui { class VTablesWidget; @@ -68,7 +67,6 @@ private slots: VTableModel *model; QSortFilterProxyModel *proxy; - CutterTreeWidget *tree; RefreshDeferrer *refreshDeferrer; };