diff options
author | Roland Knall <roland.knall@br-automation.com> | 2017-07-25 16:47:16 +0200 |
---|---|---|
committer | Roland Knall <rknall@gmail.com> | 2017-07-26 12:22:04 +0000 |
commit | 02e80019f2dc8f01e51d8bdc62a1cabff69fd51e (patch) | |
tree | 7cc68dab8e8ac9713b8c50176dd52fc36c0c0b11 /ui/qt/models/path_chooser_delegate.cpp | |
parent | ea998190cfe5a051224490172cfaedc69b777ff6 (diff) |
Qt: Create models directory
Following the move for widgets and utils directory, moving models
and delegates to the utils directory. Guidelines for this directory are:
- Implementation of a model
- Implementation of a delegate
- Utility class for data storage used by a model
Note: additionally all includes affected by this move have been changed
to absolute path includes, instead of relative ones.
Change-Id: I3bb868af7d3570437682b722a0cd46c906628570
Reviewed-on: https://code.wireshark.org/review/22790
Reviewed-by: Roland Knall <rknall@gmail.com>
Diffstat (limited to 'ui/qt/models/path_chooser_delegate.cpp')
-rw-r--r-- | ui/qt/models/path_chooser_delegate.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/ui/qt/models/path_chooser_delegate.cpp b/ui/qt/models/path_chooser_delegate.cpp new file mode 100644 index 0000000000..8538c75ea9 --- /dev/null +++ b/ui/qt/models/path_chooser_delegate.cpp @@ -0,0 +1,152 @@ +/* path_chooser_delegate.cpp + * Delegate to select a file path for a treeview entry + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" + +#include "epan/prefs.h" +#include "ui/last_open_dir.h" + +#include <ui/qt/models/path_chooser_delegate.h> + +#include <QHBoxLayout> +#include <QPushButton> +#include <QFileDialog> +#include <QWidget> +#include <QLineEdit> + +PathChooserDelegate::PathChooserDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{ +} + +QWidget* PathChooserDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &) const +{ + QWidget * pathEditor = new QWidget(parent); + QHBoxLayout *hbox = new QHBoxLayout(pathEditor); + pathEditor->setLayout(hbox); + QLineEdit * lineEdit = new QLineEdit(pathEditor); + QPushButton *btnBrowse = new QPushButton(pathEditor); + + btnBrowse->setText(tr("Browse")); + + hbox->setContentsMargins(0, 0, 0, 0); + hbox->addWidget(lineEdit); + hbox->addWidget(btnBrowse); + hbox->setSizeConstraint(QLayout::SetMinimumSize); + + // Grow the item to match the editor. According to the QAbstractItemDelegate + // documenation we're supposed to reimplement sizeHint but this seems to work. + QSize size = option.rect.size(); + size.setHeight(qMax(option.rect.height(), hbox->sizeHint().height())); + + lineEdit->selectAll(); + pathEditor->setFocusProxy(lineEdit); + pathEditor->setFocusPolicy(lineEdit->focusPolicy()); + + connect(btnBrowse, SIGNAL(pressed()), this, SLOT(browse_button_clicked())); + return pathEditor; +} + +void PathChooserDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const +{ + QRect rect = option.rect; + + // Make sure the editor doesn't get squashed. + editor->adjustSize(); + rect.setHeight(qMax(option.rect.height(), editor->height())); + editor->setGeometry(rect); +} + +void PathChooserDelegate::browse_button_clicked() +{ + char *open_dir = NULL; + + switch ( prefs.gui_fileopen_style ) + { + + case FO_STYLE_LAST_OPENED: + open_dir = get_last_open_dir(); + break; + + case FO_STYLE_SPECIFIED: + if ( prefs.gui_fileopen_dir[0] != '\0' ) + open_dir = prefs.gui_fileopen_dir; + break; + } + + QString file_name = QFileDialog::getOpenFileName(new QWidget(), tr("Open Pipe"), open_dir); + if ( !file_name.isEmpty() ) + { + QWidget * parent = ((QPushButton *)sender())->parentWidget(); + QLineEdit * lineEdit = parent->findChild<QLineEdit*>(); + if ( lineEdit ) + { + lineEdit->setText(file_name); + emit commitData(parent); + + } + } +} + +void PathChooserDelegate::setEditorData(QWidget *editor, const QModelIndex &idx) const +{ + if ( idx.isValid() ) + { + QString content = idx.data().toString(); + QLineEdit * lineEdit = editor->findChild<QLineEdit*>(); + if ( lineEdit ) + { + lineEdit->setText(content); + } + } + else + QStyledItemDelegate::setEditorData(editor, idx); +} + +void PathChooserDelegate::setModelData(QWidget *editor, QAbstractItemModel * model, const QModelIndex &idx) const +{ + if ( idx.isValid() ) + { + QLineEdit * lineEdit = editor->findChild<QLineEdit*>(); + if ( lineEdit ) + { + model->setData(idx, lineEdit->text()); + } + } + else + { + QStyledItemDelegate::setModelData(editor, model, idx); + } +} + +/* + * Editor modelines + * + * Local Variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * ex: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ |