@ -48,7 +48,7 @@ DetailWidget::DetailWidget(QWidget *parent) : QWidget(parent) {
warning_widget = new QWidget ( this ) ;
QHBoxLayout * warning_hlayout = new QHBoxLayout ( warning_widget ) ;
QLabel * warning_icon = new QLabel ( this ) ;
warning_icon - > setPixmap ( style ( ) - > standardIcon ( QStyle : : SP_MessageBoxWarning ) . pixmap ( { 16 , 16 } ) ) ;
warning_icon - > setPixmap ( style ( ) - > standardPixmap ( QStyle : : SP_MessageBoxWarning ) ) ;
warning_hlayout - > addWidget ( warning_icon ) ;
warning_label = new QLabel ( this ) ;
warning_hlayout - > addWidget ( warning_label , 1 , Qt : : AlignLeft ) ;
@ -78,7 +78,7 @@ DetailWidget::DetailWidget(QWidget *parent) : QWidget(parent) {
QObject : : connect ( binary_view , & BinaryView : : resizeSignal , this , & DetailWidget : : resizeSignal ) ;
QObject : : connect ( binary_view , & BinaryView : : addSignal , this , & DetailWidget : : addSignal ) ;
QObject : : connect ( can , & CANMessages : : updated , this , & DetailWidget : : updateState ) ;
QObject : : connect ( dbc ( ) , & DBCManager : : DBCFileChanged , this , & DetailWidget : : dbcMsgChanged ) ;
QObject : : connect ( dbc ( ) , & DBCManager : : DBCFileChanged , [ this ] ( ) { dbcMsgChanged ( ) ; } ) ;
QObject : : connect ( tabbar , & QTabBar : : currentChanged , [ this ] ( int index ) { setMessage ( messages [ index ] ) ; } ) ;
QObject : : connect ( tabbar , & QTabBar : : tabCloseRequested , [ = ] ( int index ) {
messages . removeAt ( index ) ;
@ -103,7 +103,7 @@ void DetailWidget::setMessage(const QString &message_id) {
dbcMsgChanged ( ) ;
}
void DetailWidget : : dbcMsgChanged ( ) {
void DetailWidget : : dbcMsgChanged ( int show_form_idx ) {
if ( msg_id . isEmpty ( ) ) return ;
warning_widget - > hide ( ) ;
@ -111,7 +111,7 @@ void DetailWidget::dbcMsgChanged() {
QString msg_name = tr ( " untitled " ) ;
if ( auto msg = dbc ( ) - > msg ( msg_id ) ) {
for ( int i = 0 ; i < msg - > sigs . size ( ) ; + + i ) {
auto form = new SignalEdit ( i , msg_id , msg - > sigs [ i ] ) ;
auto form = new SignalEdit ( i , msg_id , & ( msg - > sigs [ i ] ) ) ;
signals_container - > layout ( ) - > addWidget ( form ) ;
QObject : : connect ( form , & SignalEdit : : showChart , [ this , sig = & msg - > sigs [ i ] ] ( ) { emit showChart ( msg_id , sig ) ; } ) ;
QObject : : connect ( form , & SignalEdit : : showFormClicked , this , & DetailWidget : : showForm ) ;
@ -119,6 +119,9 @@ void DetailWidget::dbcMsgChanged() {
QObject : : connect ( form , & SignalEdit : : save , this , & DetailWidget : : saveSignal ) ;
QObject : : connect ( form , & SignalEdit : : highlight , binary_view , & BinaryView : : highlight ) ;
QObject : : connect ( binary_view , & BinaryView : : signalHovered , form , & SignalEdit : : signalHovered ) ;
if ( i = = show_form_idx ) {
QTimer : : singleShot ( 0 , [ = ] ( ) { emit form - > showFormClicked ( ) ; } ) ;
}
}
msg_name = msg - > name . c_str ( ) ;
if ( msg - > size ! = can - > lastMessage ( msg_id ) . dat . size ( ) ) {
@ -162,46 +165,54 @@ void DetailWidget::editMsg() {
}
}
void DetailWidget : : addSignal ( int start_bit , int to ) {
if ( dbc ( ) - > msg ( msg_id ) ) {
AddSignalDialog dlg ( msg_id , start_bit , to - start_bit + 1 , this ) ;
if ( dlg . exec ( ) ) {
dbc ( ) - > addSignal ( msg_id , dlg . form - > getSignal ( ) ) ;
dbcMsgChanged ( ) ;
void DetailWidget : : addSignal ( int from , int to ) {
if ( auto msg = dbc ( ) - > msg ( msg_id ) ) {
Signal sig = { } ;
for ( int i = 1 ; /**/ ; + + i ) {
sig . name = " NEW_SIGNAL_ " + std : : to_string ( i ) ;
auto it = std : : find_if ( msg - > sigs . begin ( ) , msg - > sigs . end ( ) , [ & ] ( auto & s ) { return sig . name = = s . name ; } ) ;
if ( it = = msg - > sigs . end ( ) ) break ;
}
sig . is_little_endian = false ,
updateSigSizeParamsFromRange ( sig , from , to ) ;
dbc ( ) - > addSignal ( msg_id , sig ) ;
dbcMsgChanged ( msg - > sigs . size ( ) - 1 ) ;
}
}
void DetailWidget : : resizeSignal ( const Signal * sig , int from , int to ) {
assert ( sig ! = nullptr ) ;
Signal s = * sig ;
s . start_bit = s . is_little_endian ? from : bigEndianBitIndex ( from ) ; ;
s . size = to - from + 1 ;
if ( s . is_little_endian ) {
s . lsb = s . start_bit ;
s . msb = s . start_bit + s . size - 1 ;
} else {
s . lsb = bigEndianStartBitsIndex ( bigEndianBitIndex ( s . start_bit ) + s . size - 1 ) ;
s . msb = s . start_bit ;
}
dbc ( ) - > updateSignal ( msg_id , s . name . c_str ( ) , s ) ;
dbcMsgChanged ( ) ;
updateSigSizeParamsFromRange ( s , from , to ) ;
saveSignal ( sig , s ) ;
}
void DetailWidget : : saveSignal ( const Signal * sig , const Signal & new_sig ) {
auto msg = dbc ( ) - > msg ( msg_id ) ;
if ( new_sig . name ! = sig - > name ) {
auto it = std : : find_if ( msg - > sigs . begin ( ) , msg - > sigs . end ( ) , [ & ] ( auto & s ) { return s . name = = new_sig . name ; } ) ;
if ( it ! = msg - > sigs . end ( ) ) {
QString warning_str = tr ( " There is already a signal with the same name '%1' " ) . arg ( new_sig . name . c_str ( ) ) ;
QMessageBox : : warning ( this , tr ( " Failed to save signal " ) , warning_str ) ;
return ;
}
}
auto [ start , end ] = getSignalRange ( & new_sig ) ;
if ( start < 0 | | end > = msg - > size * 8 ) {
QString warning_str = tr ( " Signal size [%1] exceed limit " ) . arg ( new_sig . size ) ;
QMessageBox : : warning ( this , tr ( " Failed to save signal " ) , warning_str ) ;
return ;
}
void DetailWidget : : saveSignal ( ) {
SignalEdit * sig_form = qobject_cast < SignalEdit * > ( QObject : : sender ( ) ) ;
auto s = sig_form - > form - > getSignal ( ) ;
dbc ( ) - > updateSignal ( msg_id , sig_form - > sig_name , s ) ;
dbc ( ) - > updateSignal ( msg_id , sig - > name . c_str ( ) , new_sig ) ;
// update binary view and history log
binary_view - > setMessage ( msg_id ) ;
history_log - > setMessage ( msg_id ) ;
dbcMsgChanged ( ) ;
}
void DetailWidget : : removeSignal ( ) {
SignalEdit * sig_form = qobject_cast < SignalEdit * > ( QObject : : sender ( ) ) ;
QString text = tr ( " Are you sure you want to remove signal '%1' " ) . arg ( sig_form - > sig_name ) ;
void DetailWidget : : removeSignal ( const Signal * sig ) {
QString text = tr ( " Are you sure you want to remove signal '%1' " ) . arg ( sig - > name . c_str ( ) ) ;
if ( QMessageBox : : Yes = = QMessageBox : : question ( this , tr ( " Remove signal " ) , text ) ) {
dbc ( ) - > removeSignal ( msg_id , sig_form - > sig_name ) ;
dbc ( ) - > removeSignal ( msg_id , sig - > name . c_str ( ) ) ;
dbcMsgChanged ( ) ;
}
}