2019-10-18 22:19:05 +00:00
/* column_list_models.cpp
*
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
* Copyright 1998 Gerald Combs
*
* SPDX - License - Identifier : GPL - 2.0 - or - later
*/
# include <ui/qt/models/column_list_model.h>
# include <ui/qt/utils/qt_ui_utils.h>
# include <ui/qt/widgets/field_filter_edit.h>
# include <ui/qt/widgets/syntax_line_edit.h>
2019-11-03 12:03:12 +00:00
# include <ui/qt/utils/wireshark_mime_data.h>
2019-10-18 22:19:05 +00:00
# include <glib.h>
# include <epan/column.h>
# include <epan/prefs.h>
# include <epan/proto.h>
# include <ui/preference_utils.h>
2024-02-09 02:19:39 +00:00
# include <ui/recent.h>
2019-10-18 22:19:05 +00:00
# include <QLineEdit>
# include <QStringList>
# include <QComboBox>
struct ListElement
{
QString title ;
QString customFields ;
int nr ;
int type ;
int originalType ;
int occurrence ;
2024-02-09 02:19:39 +00:00
int width ;
char xalign ;
2019-10-18 22:19:05 +00:00
bool displayed ;
2022-07-01 02:48:37 +00:00
bool resolved ;
2019-10-18 22:19:05 +00:00
} ;
static QList < ListElement > store_ ;
2019-10-20 22:19:58 +00:00
ColumnProxyModel : : ColumnProxyModel ( QObject * parent ) :
QSortFilterProxyModel ( parent ) ,
showDisplayedOnly_ ( false )
{ }
bool ColumnProxyModel : : filterAcceptsRow ( int source_row , const QModelIndex & /*source_parent*/ ) const
{
bool displayed = false ;
2019-11-17 19:02:20 +00:00
if ( sourceModel ( ) & &
sourceModel ( ) - > index ( source_row , ColumnListModel : : COL_DISPLAYED ) . data ( ColumnListModel : : DisplayedState ) . toBool ( ) )
2019-10-20 22:19:58 +00:00
displayed = true ;
2019-11-17 19:02:20 +00:00
if ( showDisplayedOnly_ & & ! displayed )
2019-10-20 22:19:58 +00:00
return false ;
return true ;
}
void ColumnProxyModel : : setShowDisplayedOnly ( bool set )
{
showDisplayedOnly_ = set ;
invalidateFilter ( ) ;
}
2019-10-18 22:19:05 +00:00
ColumnTypeDelegate : : ColumnTypeDelegate ( QObject * parent ) :
QStyledItemDelegate ( parent )
{ }
2024-02-09 02:19:39 +00:00
QString ColumnTypeDelegate : : alignDesc ( char xalign )
{
switch ( xalign ) {
case COLUMN_XALIGN_DEFAULT :
return tr ( " Default " ) ;
case COLUMN_XALIGN_LEFT :
return tr ( " Left " ) ;
case COLUMN_XALIGN_CENTER :
return tr ( " Center " ) ;
case COLUMN_XALIGN_RIGHT :
return tr ( " Right " ) ;
default :
return tr ( " Unknown " ) ;
}
}
2019-10-18 22:19:05 +00:00
QWidget * ColumnTypeDelegate : : createEditor ( QWidget * parent ,
const QStyleOptionViewItem & option ,
const QModelIndex & index ) const
{
2020-03-02 20:40:50 +00:00
QWidget * editor = nullptr ;
2019-11-17 19:02:20 +00:00
if ( index . column ( ) = = ColumnListModel : : COL_TYPE )
2019-10-18 22:19:05 +00:00
{
2020-03-02 20:40:50 +00:00
QComboBox * cb_editor = new QComboBox ( parent ) ;
2019-10-18 22:19:05 +00:00
for ( int i = 0 ; i < NUM_COL_FMTS ; i + + )
{
2020-03-02 20:40:50 +00:00
cb_editor - > addItem ( col_format_desc ( i ) , QVariant ( i ) ) ;
2019-11-17 19:02:20 +00:00
if ( i = = index . data ( ) . toInt ( ) )
2020-03-02 20:40:50 +00:00
cb_editor - > setCurrentIndex ( i ) ;
2019-10-18 22:19:05 +00:00
}
2020-03-02 20:40:50 +00:00
cb_editor - > setFrame ( false ) ;
editor = cb_editor ;
2019-10-18 22:19:05 +00:00
}
2019-11-17 19:02:20 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_FIELDS )
2019-10-18 22:19:05 +00:00
{
2020-03-02 20:40:50 +00:00
FieldFilterEdit * ff_editor = new FieldFilterEdit ( parent ) ;
2022-07-01 00:14:52 +00:00
connect ( ff_editor , & FieldFilterEdit : : textChanged , ff_editor , & FieldFilterEdit : : checkCustomColumn ) ;
2020-03-02 20:40:50 +00:00
ff_editor - > setText ( index . data ( ) . toString ( ) ) ;
editor = ff_editor ;
2019-10-18 22:19:05 +00:00
}
2024-02-09 02:19:39 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_OCCURRENCE | |
index . column ( ) = = ColumnListModel : : COL_WIDTH )
2019-10-18 22:19:05 +00:00
{
2020-03-02 20:40:50 +00:00
SyntaxLineEdit * sl_editor = new SyntaxLineEdit ( parent ) ;
connect ( sl_editor , & SyntaxLineEdit : : textChanged , sl_editor , & SyntaxLineEdit : : checkInteger ) ;
sl_editor - > setText ( index . data ( ) . toString ( ) ) ;
editor = sl_editor ;
2019-10-18 22:19:05 +00:00
}
2024-02-09 02:19:39 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_XALIGN )
{
QComboBox * cb_editor = new QComboBox ( parent ) ;
cb_editor - > addItem ( alignDesc ( COLUMN_XALIGN_DEFAULT ) , QVariant ( COLUMN_XALIGN_DEFAULT ) ) ;
cb_editor - > addItem ( alignDesc ( COLUMN_XALIGN_LEFT ) , QVariant ( COLUMN_XALIGN_LEFT ) ) ;
cb_editor - > addItem ( alignDesc ( COLUMN_XALIGN_CENTER ) , QVariant ( COLUMN_XALIGN_CENTER ) ) ;
cb_editor - > addItem ( alignDesc ( COLUMN_XALIGN_RIGHT ) , QVariant ( COLUMN_XALIGN_RIGHT ) ) ;
cb_editor - > setCurrentIndex ( cb_editor - > findText ( index . data ( ) . toString ( ) ) ) ;
cb_editor - > setFrame ( false ) ;
editor = cb_editor ;
}
2019-10-18 22:19:05 +00:00
2020-03-02 20:40:50 +00:00
if ( ! editor ) {
editor = QStyledItemDelegate : : createEditor ( parent , option , index ) ;
}
editor - > setAutoFillBackground ( true ) ;
return editor ;
2019-10-18 22:19:05 +00:00
}
void ColumnTypeDelegate : : setEditorData ( QWidget * editor ,
const QModelIndex & index ) const
{
QVariant data = index . model ( ) - > data ( index ) ;
2024-02-09 02:19:39 +00:00
if ( index . column ( ) = = ColumnListModel : : COL_TYPE | |
index . column ( ) = = ColumnListModel : : COL_XALIGN )
2019-10-18 22:19:05 +00:00
{
QComboBox * comboBox = static_cast < QComboBox * > ( editor ) ;
comboBox - > setCurrentText ( data . toString ( ) ) ;
}
2019-11-17 19:02:20 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_FIELDS )
2019-10-18 22:19:05 +00:00
{
2019-11-17 19:02:20 +00:00
if ( qobject_cast < FieldFilterEdit * > ( editor ) )
2019-10-18 22:19:05 +00:00
qobject_cast < FieldFilterEdit * > ( editor ) - > setText ( data . toString ( ) ) ;
}
2024-02-09 02:19:39 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_OCCURRENCE | |
index . column ( ) = = ColumnListModel : : COL_WIDTH )
2019-10-18 22:19:05 +00:00
{
2019-11-17 19:02:20 +00:00
if ( qobject_cast < SyntaxLineEdit * > ( editor ) )
2019-10-18 22:19:05 +00:00
qobject_cast < SyntaxLineEdit * > ( editor ) - > setText ( data . toString ( ) ) ;
}
else
{
2019-11-17 19:02:20 +00:00
if ( qobject_cast < QLineEdit * > ( editor ) )
2019-10-18 22:19:05 +00:00
qobject_cast < QLineEdit * > ( editor ) - > setText ( data . toString ( ) ) ;
}
}
void ColumnTypeDelegate : : setModelData ( QWidget * editor , QAbstractItemModel * model ,
const QModelIndex & index ) const
{
2024-02-09 02:19:39 +00:00
if ( index . column ( ) = = ColumnListModel : : COL_TYPE | |
index . column ( ) = = ColumnListModel : : COL_XALIGN )
2019-10-18 22:19:05 +00:00
{
QComboBox * comboBox = static_cast < QComboBox * > ( editor ) ;
bool ok = false ;
int value = comboBox - > currentData ( ) . toInt ( & ok ) ;
2019-11-17 19:02:20 +00:00
if ( ok )
2019-10-18 22:19:05 +00:00
model - > setData ( index , value , Qt : : EditRole ) ;
}
2019-11-17 19:02:20 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_FIELDS )
2019-10-18 22:19:05 +00:00
{
FieldFilterEdit * ffe = qobject_cast < FieldFilterEdit * > ( editor ) ;
2019-12-11 01:03:34 +00:00
if ( ffe )
2019-10-18 22:19:05 +00:00
{
2022-07-01 00:14:52 +00:00
if ( ffe - > syntaxState ( ) = = SyntaxLineEdit : : Valid ) {
2019-12-11 01:03:34 +00:00
QModelIndex typeIndex = index . sibling ( index . row ( ) , ColumnListModel : : COL_TYPE ) ;
model - > setData ( typeIndex , COL_CUSTOM , Qt : : EditRole ) ;
model - > setData ( index , ffe - > text ( ) , Qt : : EditRole ) ;
}
else
{
ffe - > setText ( index . data ( ) . toString ( ) ) ;
}
2019-10-18 22:19:05 +00:00
}
2019-11-17 19:02:20 +00:00
if ( index . data ( ) . toString ( ) . length ( ) = = 0 )
2019-10-18 22:19:05 +00:00
{
QModelIndex typeIndex = index . sibling ( index . row ( ) , ColumnListModel : : COL_TYPE ) ;
model - > setData ( typeIndex , index . data ( ColumnListModel : : OriginalType ) . toInt ( ) , Qt : : EditRole ) ;
}
}
2019-11-17 19:02:20 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_OCCURRENCE )
2019-10-18 22:19:05 +00:00
{
SyntaxLineEdit * sle = qobject_cast < SyntaxLineEdit * > ( editor ) ;
bool ok = false ;
2019-11-17 19:02:20 +00:00
if ( sle )
2019-10-18 22:19:05 +00:00
{
sle - > checkInteger ( index . data ( ) . toString ( ) ) ;
2019-11-17 19:02:20 +00:00
if ( sle - > syntaxState ( ) = = SyntaxLineEdit : : Valid )
2019-10-18 22:19:05 +00:00
ok = true ;
}
2019-11-17 19:02:20 +00:00
if ( ok )
2019-10-18 22:19:05 +00:00
{
QModelIndex typeIndex = index . sibling ( index . row ( ) , ColumnListModel : : COL_TYPE ) ;
model - > setData ( typeIndex , COL_CUSTOM , Qt : : EditRole ) ;
model - > setData ( index , sle - > text ( ) , Qt : : EditRole ) ;
}
2019-12-11 01:03:34 +00:00
else if ( sle )
{
2019-10-18 22:19:05 +00:00
sle - > setText ( index . data ( ) . toString ( ) ) ;
2019-12-11 01:03:34 +00:00
}
2019-10-18 22:19:05 +00:00
2019-11-17 19:02:20 +00:00
if ( index . data ( ) . toString ( ) . length ( ) = = 0 )
2019-10-18 22:19:05 +00:00
{
QModelIndex typeIndex = index . sibling ( index . row ( ) , ColumnListModel : : COL_TYPE ) ;
model - > setData ( typeIndex , index . data ( ColumnListModel : : OriginalType ) . toInt ( ) , Qt : : EditRole ) ;
}
}
2024-02-09 02:19:39 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_WIDTH )
{
SyntaxLineEdit * sle = qobject_cast < SyntaxLineEdit * > ( editor ) ;
bool ok = false ;
if ( sle )
{
sle - > checkInteger ( index . data ( ) . toString ( ) ) ;
if ( sle - > syntaxState ( ) = = SyntaxLineEdit : : Valid )
ok = true ;
}
if ( ok )
{
model - > setData ( index , sle - > text ( ) , Qt : : EditRole ) ;
}
}
2019-10-18 22:19:05 +00:00
else
QStyledItemDelegate : : setModelData ( editor , model , index ) ;
}
void ColumnTypeDelegate : : updateEditorGeometry ( QWidget * editor ,
const QStyleOptionViewItem & option ,
const QModelIndex & /* index */ ) const
{
editor - > setGeometry ( option . rect ) ;
}
ColumnListModel : : ColumnListModel ( QObject * parent ) :
QAbstractTableModel ( parent )
{
populate ( ) ;
}
QVariant ColumnListModel : : headerData ( int section , Qt : : Orientation orientation , int role ) const
{
2024-02-09 02:19:39 +00:00
if ( section > ColumnListModel : : COL_XALIGN | | orientation ! = Qt : : Horizontal | |
2019-11-17 19:02:20 +00:00
role ! = Qt : : DisplayRole )
2019-10-18 22:19:05 +00:00
return QVariant ( ) ;
return headerTitle ( section ) ;
}
int ColumnListModel : : rowCount ( const QModelIndex & /*parent*/ ) const
{
2022-03-23 13:42:35 +00:00
return static_cast < int > ( store_ . count ( ) ) ;
2019-10-18 22:19:05 +00:00
}
int ColumnListModel : : columnCount ( const QModelIndex & /*parent*/ ) const
{
2024-02-09 02:19:39 +00:00
return ColumnListModel : : COL_XALIGN + 1 ;
2019-10-18 22:19:05 +00:00
}
QString ColumnListModel : : headerTitle ( int section ) const
{
2019-11-17 19:02:20 +00:00
switch ( section )
2019-10-18 22:19:05 +00:00
{
case ColumnListModel : : COL_DISPLAYED :
return tr ( " Displayed " ) ;
case ColumnListModel : : COL_TITLE :
return tr ( " Title " ) ;
case ColumnListModel : : COL_TYPE :
return tr ( " Type " ) ;
case ColumnListModel : : COL_FIELDS :
return tr ( " Fields " ) ;
case ColumnListModel : : COL_OCCURRENCE :
2020-12-09 04:47:26 +00:00
return tr ( " Field Occurrence " ) ;
2022-07-01 02:48:37 +00:00
case ColumnListModel : : COL_RESOLVED :
return tr ( " Resolved " ) ;
2024-02-09 02:19:39 +00:00
case ColumnListModel : : COL_WIDTH :
return tr ( " Width " ) ;
case ColumnListModel : : COL_XALIGN :
return tr ( " Alignment " ) ;
2019-10-18 22:19:05 +00:00
}
return QString ( ) ;
}
void ColumnListModel : : populate ( )
{
store_ . clear ( ) ;
int nr = 0 ;
for ( GList * cur = g_list_first ( prefs . col_list ) ; cur ! = NULL & & cur - > data ! = NULL ; cur = cur - > next ) {
fmt_data * cfmt = ( fmt_data * ) cur - > data ;
ListElement ne ;
ne . nr = nr ;
ne . displayed = cfmt - > visible ;
ne . title = cfmt - > title ;
ne . type = ne . originalType = cfmt - > fmt ;
ne . customFields = cfmt - > custom_fields ;
ne . occurrence = cfmt - > custom_occurrence ;
2022-07-01 02:48:37 +00:00
ne . resolved = cfmt - > resolved ;
2019-10-18 22:19:05 +00:00
2024-02-09 02:19:39 +00:00
ne . width = recent_get_column_width ( nr ) ;
ne . xalign = recent_get_column_xalign ( nr ) ;
2019-10-18 22:19:05 +00:00
nr + + ;
store_ < < ne ;
}
}
QVariant ColumnListModel : : data ( const QModelIndex & index , int role ) const
{
2019-11-17 19:02:20 +00:00
if ( ! index . isValid ( ) | | index . column ( ) > = store_ . count ( ) )
2019-10-18 22:19:05 +00:00
return QVariant ( ) ;
ListElement ne = store_ . at ( index . row ( ) ) ;
2019-11-17 19:02:20 +00:00
if ( role = = Qt : : DisplayRole )
2019-10-18 22:19:05 +00:00
{
switch ( index . column ( ) )
{
case COL_DISPLAYED :
2022-07-01 02:48:37 +00:00
case COL_RESOLVED :
2019-10-18 22:19:05 +00:00
return QVariant ( ) ;
case ColumnListModel : : COL_TITLE :
return ne . title ;
case ColumnListModel : : COL_TYPE :
return col_format_desc ( ne . type ) ;
case ColumnListModel : : COL_FIELDS :
return ne . customFields ;
case ColumnListModel : : COL_OCCURRENCE :
2019-12-20 05:57:04 +00:00
return ne . customFields . length ( ) > 0 ? QVariant : : fromValue ( ne . occurrence ) : QVariant ( ) ;
2024-02-09 02:19:39 +00:00
case ColumnListModel : : COL_WIDTH :
return ne . width ;
case ColumnListModel : : COL_XALIGN :
return ColumnTypeDelegate : : alignDesc ( ne . xalign ) ;
2019-10-18 22:19:05 +00:00
}
}
2019-11-17 19:02:20 +00:00
else if ( role = = Qt : : CheckStateRole )
2019-10-18 22:19:05 +00:00
{
2019-11-17 19:02:20 +00:00
if ( index . column ( ) = = COL_DISPLAYED )
2019-10-18 22:19:05 +00:00
{
return ne . displayed ? Qt : : Checked : Qt : : Unchecked ;
}
2022-07-01 02:48:37 +00:00
else if ( index . column ( ) = = COL_RESOLVED )
{
QModelIndex fieldsIndex = index . sibling ( index . row ( ) , ColumnListModel : : COL_FIELDS ) ;
if ( column_prefs_custom_resolve ( fieldsIndex . data ( ) . toString ( ) . toUtf8 ( ) . constData ( ) ) ) {
return ne . resolved ? Qt : : Checked : Qt : : Unchecked ;
}
}
}
else if ( role = = Qt : : ToolTipRole )
{
if ( index . column ( ) = = COL_RESOLVED )
{
return tr ( " <html>Show human-readable strings instead of raw values for fields. Only applicable to custom columns with fields that have value strings.</html> " ) ;
}
2019-10-18 22:19:05 +00:00
}
2019-11-17 19:02:20 +00:00
else if ( role = = OriginalType )
2019-12-20 05:57:04 +00:00
return QVariant : : fromValue ( ne . originalType ) ;
2019-11-17 19:02:20 +00:00
else if ( role = = DisplayedState )
2019-12-20 05:57:04 +00:00
return QVariant : : fromValue ( ne . displayed ) ;
2019-10-18 22:19:05 +00:00
return QVariant ( ) ;
}
Qt : : ItemFlags ColumnListModel : : flags ( const QModelIndex & index ) const
{
Qt : : ItemFlags defaultFlags = QAbstractTableModel : : flags ( index ) ;
2019-11-17 19:02:20 +00:00
if ( index . isValid ( ) & & index . row ( ) < store_ . count ( ) )
2019-10-18 22:19:05 +00:00
{
ListElement ne = store_ . at ( index . row ( ) ) ;
Qt : : ItemFlags flags = Qt : : ItemIsDragEnabled | Qt : : ItemIsDropEnabled | defaultFlags ;
2022-07-01 02:48:37 +00:00
if ( index . column ( ) = = COL_DISPLAYED | | index . column ( ) = = COL_RESOLVED ) {
2019-10-18 22:19:05 +00:00
flags | = Qt : : ItemIsUserCheckable ;
2022-07-01 02:48:37 +00:00
} else {
flags | = Qt : : ItemIsEditable ;
}
2019-10-18 22:19:05 +00:00
return flags ;
}
else
return Qt : : ItemIsDropEnabled | defaultFlags ;
}
2019-11-03 12:03:12 +00:00
QStringList ColumnListModel : : mimeTypes ( ) const
{
return QStringList ( ) < < WiresharkMimeData : : ColumnListMimeType ;
}
2019-10-18 22:19:05 +00:00
QMimeData * ColumnListModel : : mimeData ( const QModelIndexList & indexes ) const
{
QMimeData * mimeData = new QMimeData ;
int row = - 1 ;
2019-11-17 19:02:20 +00:00
if ( indexes . count ( ) > 0 )
2019-10-18 22:19:05 +00:00
row = indexes . at ( 0 ) . row ( ) ;
2019-11-03 12:03:12 +00:00
mimeData - > setData ( WiresharkMimeData : : ColumnListMimeType , QString : : number ( row ) . toUtf8 ( ) ) ;
2019-10-18 22:19:05 +00:00
return mimeData ;
}
bool ColumnListModel : : canDropMimeData ( const QMimeData * data ,
Qt : : DropAction /* action */ , int /* row */ , int /* column */ , const QModelIndex & parent ) const
{
2019-11-17 19:02:20 +00:00
if ( parent . isValid ( ) | | ! data - > hasFormat ( WiresharkMimeData : : ColumnListMimeType ) )
2019-10-18 22:19:05 +00:00
return false ;
return true ;
}
bool ColumnListModel : : dropMimeData ( const QMimeData * data ,
Qt : : DropAction action , int row , int column , const QModelIndex & parent )
{
int moveTo ;
if ( ! canDropMimeData ( data , action , row , column , parent ) )
return false ;
2019-11-17 19:02:20 +00:00
if ( action = = Qt : : IgnoreAction | | parent . isValid ( ) )
2019-10-18 22:19:05 +00:00
return true ;
if ( row ! = - 1 )
moveTo = row ;
else
moveTo = rowCount ( QModelIndex ( ) ) ;
bool ok = false ;
2019-11-03 12:03:12 +00:00
int moveFrom = QString ( data - > data ( WiresharkMimeData : : ColumnListMimeType ) ) . toInt ( & ok ) ;
2019-11-17 19:02:20 +00:00
if ( ! ok )
2019-10-18 22:19:05 +00:00
return false ;
2019-11-17 19:02:20 +00:00
if ( moveFrom < moveTo )
2019-10-18 22:19:05 +00:00
moveTo = moveTo - 1 ;
2019-11-17 19:02:20 +00:00
if ( moveTo > = store_ . count ( ) )
2022-03-23 13:42:35 +00:00
moveTo = static_cast < int > ( store_ . count ( ) ) - 1 ;
2019-10-18 22:19:05 +00:00
2022-05-12 16:56:40 +00:00
beginResetModel ( ) ;
2019-10-18 22:19:05 +00:00
store_ . move ( moveFrom , moveTo ) ;
2022-05-12 16:56:40 +00:00
endResetModel ( ) ;
2019-10-18 22:19:05 +00:00
return true ;
}
Qt : : DropActions ColumnListModel : : supportedDropActions ( ) const
{
return Qt : : MoveAction ;
}
bool ColumnListModel : : setData ( const QModelIndex & index , const QVariant & value , int role )
{
2019-11-17 19:02:20 +00:00
if ( ! index . isValid ( ) | | ! value . isValid ( ) )
2019-10-18 22:19:05 +00:00
return false ;
bool change = false ;
2019-11-17 19:02:20 +00:00
if ( role = = Qt : : CheckStateRole & & index . column ( ) = = ColumnListModel : : COL_DISPLAYED )
2019-10-18 22:19:05 +00:00
{
store_ [ index . row ( ) ] . displayed = value . toInt ( ) = = Qt : : Checked ? true : false ;
change = true ;
}
2019-11-17 19:02:20 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_TYPE )
2019-10-18 22:19:05 +00:00
{
bool ok = false ;
int val = value . toInt ( & ok ) ;
2019-11-17 19:02:20 +00:00
if ( ok )
2019-10-18 22:19:05 +00:00
store_ [ index . row ( ) ] . type = val ;
}
2019-11-17 19:02:20 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_TITLE )
2019-10-18 22:19:05 +00:00
{
store_ [ index . row ( ) ] . title = value . toString ( ) ;
}
2019-11-17 19:02:20 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_FIELDS )
2019-10-18 22:19:05 +00:00
{
store_ [ index . row ( ) ] . customFields = value . toString ( ) ;
}
2019-11-17 19:02:20 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_OCCURRENCE )
2019-10-18 22:19:05 +00:00
{
bool ok = false ;
int val = value . toInt ( & ok ) ;
2019-11-17 19:02:20 +00:00
if ( ok )
2019-10-18 22:19:05 +00:00
store_ [ index . row ( ) ] . occurrence = val ;
}
2022-07-01 02:48:37 +00:00
else if ( role = = Qt : : CheckStateRole & & index . column ( ) = = ColumnListModel : : COL_RESOLVED )
{
store_ [ index . row ( ) ] . resolved = value . toInt ( ) = = Qt : : Checked ? true : false ;
}
2024-02-09 02:19:39 +00:00
else if ( index . column ( ) = = ColumnListModel : : COL_WIDTH )
{
bool ok = false ;
int val = value . toInt ( & ok ) ;
if ( ok )
store_ [ index . row ( ) ] . width = val ;
}
else if ( index . column ( ) = = ColumnListModel : : COL_XALIGN )
{
bool ok = false ;
int val = value . toInt ( & ok ) ;
if ( ok )
store_ [ index . row ( ) ] . xalign = static_cast < char > ( val ) ;
}
2019-10-18 22:19:05 +00:00
2019-11-17 19:02:20 +00:00
if ( change )
2019-10-18 22:19:05 +00:00
emit dataChanged ( index , index ) ;
return change ;
}
void ColumnListModel : : saveColumns ( )
{
GList * new_col_list = Q_NULLPTR ;
2019-11-17 19:02:20 +00:00
for ( int row = 0 ; row < store_ . count ( ) ; row + + )
2019-10-18 22:19:05 +00:00
{
2019-11-05 11:42:13 +00:00
fmt_data * cfmt = g_new0 ( fmt_data , 1 ) ;
2019-10-18 22:19:05 +00:00
ListElement elem = store_ . at ( row ) ;
cfmt - > title = qstring_strdup ( elem . title ) ;
cfmt - > visible = elem . displayed ;
cfmt - > fmt = elem . type ;
cfmt - > resolved = TRUE ;
2019-11-17 19:02:20 +00:00
if ( cfmt - > fmt = = COL_CUSTOM )
2019-10-18 22:19:05 +00:00
{
cfmt - > custom_fields = qstring_strdup ( elem . customFields ) ;
cfmt - > custom_occurrence = elem . occurrence ;
2022-07-01 02:48:37 +00:00
cfmt - > resolved = elem . resolved ;
2019-10-18 22:19:05 +00:00
}
new_col_list = g_list_append ( new_col_list , cfmt ) ;
}
while ( prefs . col_list )
column_prefs_remove_link ( prefs . col_list ) ;
prefs . col_list = new_col_list ;
2024-02-09 02:19:39 +00:00
2024-02-09 01:21:28 +00:00
recent_free_column_width_info ( & recent ) ;
2024-02-09 02:19:39 +00:00
for ( int row = 0 ; row < store_ . count ( ) ; row + + )
{
ListElement elem = store_ . at ( row ) ;
2024-02-09 01:21:28 +00:00
recent_insert_column ( row ) ;
2024-02-09 02:19:39 +00:00
recent_set_column_width ( row , elem . width ) ;
recent_set_column_xalign ( row , elem . xalign ) ;
}
2019-10-18 22:19:05 +00:00
}
void ColumnListModel : : addEntry ( )
{
2022-05-12 16:56:40 +00:00
beginInsertRows ( QModelIndex ( ) , rowCount ( ) , rowCount ( ) ) ;
2019-10-18 22:19:05 +00:00
ListElement elem ;
elem . nr = rowCount ( ) ;
elem . title = tr ( " New Column " ) ;
elem . displayed = true ;
elem . type = elem . originalType = COL_NUMBER ;
elem . occurrence = 0 ;
elem . customFields = QString ( ) ;
2022-07-01 02:48:37 +00:00
elem . resolved = true ;
2024-02-09 02:19:39 +00:00
elem . width = - 1 ;
elem . xalign = COLUMN_XALIGN_DEFAULT ;
2019-10-18 22:19:05 +00:00
store_ < < elem ;
2022-05-12 16:56:40 +00:00
endInsertRows ( ) ;
2019-10-18 22:19:05 +00:00
}
void ColumnListModel : : deleteEntry ( int row )
{
2022-05-12 16:56:40 +00:00
beginRemoveRows ( QModelIndex ( ) , row , row ) ;
2019-10-18 22:19:05 +00:00
store_ . removeAt ( row ) ;
2022-05-12 16:56:40 +00:00
endRemoveRows ( ) ;
2019-10-18 22:19:05 +00:00
}
2019-10-21 16:57:56 +00:00
void ColumnListModel : : reset ( )
{
2022-05-12 16:56:40 +00:00
beginResetModel ( ) ;
2019-10-21 16:57:56 +00:00
populate ( ) ;
2022-05-12 16:56:40 +00:00
endResetModel ( ) ;
2019-10-21 16:57:56 +00:00
}