# HG changeset patch # User Torsten # Date 1420650988 -3600 # Node ID e4b25475ef3d3116973496331ef0d6bb7bdc82c3 # Parent 9da61e3ecbe7aa72f5972b83d38a7e89906d749c provide a filter for the workspace view (bug #41222) * workspace_view.cc (constructor): new combo-box for filter expressions, new check box for enable/disable filter, connect related signals, get last state of filter and check box from settings file; (destructor): write state of filter and check box into settings file; (setModel): use a filter proxy model between model and table view; (filter_update): new slot for updating the filter expression; (filter_activate): new slot enabling or disabling the filter; (update_filter_history): new slot for saving the filter expression when its edtitign has finished; (handle_model_changed): actual row count is now taken from the filter model * workspace_view.h: new slots filter_activate, filter_update, and update_filter_history; new class variables for check box, filter combo box, and filter model diff -r 9da61e3ecbe7 -r e4b25475ef3d libgui/src/workspace-view.cc --- a/libgui/src/workspace-view.cc Mon Jan 05 06:52:49 2015 +0100 +++ b/libgui/src/workspace-view.cc Wed Jan 07 18:16:28 2015 +0100 @@ -35,6 +35,8 @@ #include #include #include +#include +#include #include "workspace-view.h" #include "resource-manager.h" @@ -48,9 +50,25 @@ set_title (tr ("Workspace")); setStatusTip (tr ("View the variables in the active workspace.")); + _filter = new QComboBox (this); + _filter->setToolTip (tr ("Enter the path or filename")); + _filter->setEditable (true); + _filter->setMaxCount (MaxFilterHistory); + _filter->setInsertPolicy (QComboBox::NoInsert); + _filter->setSizeAdjustPolicy ( + QComboBox::AdjustToMinimumContentsLengthWithIcon); + QSizePolicy sizePol (QSizePolicy::Expanding, QSizePolicy::Maximum); + _filter->setSizePolicy (sizePol); + _filter->completer ()->setCaseSensitivity (Qt::CaseSensitive); + + QLabel *filter_label = new QLabel (tr ("Filter")); + + _filter_checkbox = new QCheckBox (); + view->setWordWrap (false); view->setContextMenuPolicy (Qt::CustomContextMenu); view->setShowGrid (false); + (view->verticalHeader) ()->hide (); view->setAlternatingRowColors (true); view_previous_row_count = 0; @@ -59,23 +77,46 @@ // Create a new layout and add widgets to it. QVBoxLayout *vbox_layout = new QVBoxLayout (); + QHBoxLayout *hbox_layout = new QHBoxLayout (); + hbox_layout->addWidget (filter_label); + hbox_layout->addWidget (_filter_checkbox); + hbox_layout->addWidget (_filter); + vbox_layout->addLayout (hbox_layout); vbox_layout->addWidget (view); vbox_layout->setMargin (2); // Set the empty widget to have our layout. widget ()->setLayout (vbox_layout); + // Filter model + _filter_model = new QSortFilterProxyModel (); + _filter_model->setFilterKeyColumn(0); + // Initialize collapse/expand state of the workspace subcategories. QSettings *settings = resource_manager::get_settings (); // Initialize column order and width of the workspace - view->horizontalHeader ()->restoreState ( settings->value ("workspaceview/column_state").toByteArray ()); + // Init state of the filter + _filter->addItems (settings->value ("workspaceview/mru_list").toStringList ()); + + bool filter_state = + settings->value ("workspaceview/filter_active", false).toBool (); + _filter_checkbox->setChecked (filter_state); + filter_activate (filter_state); + // Connect signals and slots. + connect (_filter, SIGNAL (editTextChanged (const QString&)), + this, SLOT (filter_update (const QString&))); + connect (_filter_checkbox, SIGNAL (toggled (bool)), + this, SLOT (filter_activate (bool))); + connect (_filter->lineEdit (), SIGNAL (editingFinished ()), + this, SLOT (update_filter_history ())); + connect (view, SIGNAL (customContextMenuRequested (const QPoint&)), this, SLOT (contextmenu_requested (const QPoint&))); @@ -90,13 +131,21 @@ settings->setValue ("workspaceview/column_state", view->horizontalHeader ()->saveState ()); + settings->setValue ("workspaceview/filter_active", + _filter_checkbox->isChecked ()); + + QStringList mru; + for (int i = 0; i < _filter->count (); i++) + mru.append (_filter->itemText (i)); + settings->setValue ("workspaceview/mru_list", mru); settings->sync (); } void workspace_view::setModel (workspace_model *model) { - view->setModel (model); + _filter_model->setSourceModel (model); + view->setModel (_filter_model); _model = model; } @@ -107,6 +156,34 @@ QDockWidget::closeEvent (e); } +void +workspace_view::filter_update (const QString& expression) +{ + _filter_model->setFilterRegExp (QRegExp (expression, + Qt::CaseSensitive, QRegExp::FixedString)); + handle_model_changed (); +} + +void +workspace_view::filter_activate (bool state) +{ + _filter->setEnabled (state); + _filter_model->setDynamicSortFilter (state); + + if (state) + filter_update (_filter->currentText ()); + else + filter_update (QString ()); +} + +void +workspace_view::update_filter_history () +{ + QString text = _filter->currentText (); + if (! text.isEmpty () && _filter->findText (text) == -1) + _filter->insertItem (0, _filter->currentText ()); +} + QString workspace_view::get_var_name (QModelIndex index) { @@ -256,11 +333,12 @@ void workspace_view::handle_model_changed (void) { +// view->resizeRowsToContents (); // Just modify those rows that have been added rather than go through // the whole list. For-loop test will handle when number of rows reduced. QFontMetrics fm = view->fontMetrics (); int row_height = fm.height (); - int new_row_count = view->model ()->rowCount (); + int new_row_count = _filter_model->rowCount (); for (int i = view_previous_row_count; i < new_row_count; i++) view->setRowHeight (i, row_height); view_previous_row_count = new_row_count; diff -r 9da61e3ecbe7 -r e4b25475ef3d libgui/src/workspace-view.h --- a/libgui/src/workspace-view.h Mon Jan 05 06:52:49 2015 +0100 +++ b/libgui/src/workspace-view.h Wed Jan 07 18:16:28 2015 +0100 @@ -27,6 +27,9 @@ #include #include #include +#include +#include +#include #include "octave-dock-widget.h" #include "workspace-model.h" @@ -73,6 +76,10 @@ void copyClipboard (); void selectAll (); + void filter_update (const QString& expression); + void filter_activate (bool enable); + void update_filter_history (); + private: void relay_contextmenu_command (const QString& cmdname); @@ -81,6 +88,11 @@ QTableView *view; int view_previous_row_count; workspace_model *_model; + + QSortFilterProxyModel *_filter_model; + QCheckBox *_filter_checkbox; + QComboBox *_filter; + enum { MaxFilterHistory = 10 }; }; #endif