File indexing completed on 2024-05-19 07:37:36
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2013 Utku Aydın <utkuaydin34@gmail.com> 0004 // 0005 0006 #include "ConflictDialog.h" 0007 0008 #include "MergeItem.h" 0009 0010 #include <QLabel> 0011 #include <QDialogButtonBox> 0012 #include <QPushButton> 0013 #include <QHBoxLayout> 0014 #include <QVBoxLayout> 0015 #include <QVariant> 0016 0017 namespace Marble { 0018 0019 ConflictDialog::ConflictDialog( QWidget *parent ) : 0020 QDialog( parent ), 0021 m_mergeItem( nullptr ), 0022 m_box( nullptr ), 0023 m_resolveAction(ConflictDialog::AskUser) 0024 { 0025 // nothing to do 0026 } 0027 0028 void ConflictDialog::setMergeItem( MergeItem *item ) 0029 { 0030 m_mergeItem = item; 0031 } 0032 0033 void ConflictDialog::stopAutoResolve() 0034 { 0035 m_resolveAction = ConflictDialog::AskUser; 0036 } 0037 0038 void ConflictDialog::open() 0039 { 0040 if( m_mergeItem == nullptr ) { 0041 return; 0042 } 0043 0044 switch( m_resolveAction ) { 0045 case ConflictDialog::AskUser: 0046 prepareLayout(); 0047 QDialog::open(); 0048 break; 0049 case ConflictDialog::PreferLocal: 0050 m_mergeItem->setResolution( MergeItem::A ); 0051 emit resolveConflict( m_mergeItem ); 0052 break; 0053 case ConflictDialog::PreferCloud: 0054 m_mergeItem->setResolution( MergeItem::B ); 0055 emit resolveConflict( m_mergeItem ); 0056 break; 0057 } 0058 } 0059 0060 void ConflictDialog::resolveConflict( QAbstractButton *button ) 0061 { 0062 accept(); 0063 0064 QDialogButtonBox::StandardButton standardButton = m_box->standardButton( button ); 0065 switch(standardButton) { 0066 case QDialogButtonBox::NoButton: 0067 { 0068 int actionRole = button->property( "ActionRole" ).toInt(); 0069 switch( actionRole ) { 0070 case ConflictDialog::Local: 0071 m_mergeItem->setResolution( MergeItem::A ); 0072 emit resolveConflict( m_mergeItem ); 0073 break; 0074 case ConflictDialog::Cloud: 0075 m_mergeItem->setResolution( MergeItem::B ); 0076 emit resolveConflict( m_mergeItem ); 0077 break; 0078 case ConflictDialog::AllLocal: 0079 m_mergeItem->setResolution( MergeItem::A ); 0080 m_resolveAction = ConflictDialog::PreferLocal; 0081 emit resolveConflict( m_mergeItem ); 0082 break; 0083 case ConflictDialog::AllCloud: 0084 m_mergeItem->setResolution( MergeItem::B ); 0085 m_resolveAction = ConflictDialog::PreferCloud; 0086 emit resolveConflict( m_mergeItem ); 0087 break; 0088 default: 0089 break; 0090 } 0091 } 0092 0093 default: 0094 break; 0095 } 0096 } 0097 0098 void ConflictDialog::prepareLayout() 0099 { 0100 delete layout(); 0101 qDeleteAll( children() ); 0102 m_box = new QDialogButtonBox( QDialogButtonBox::Cancel ); 0103 0104 QPushButton *localButton = new QPushButton( tr( "Use local" ) ); 0105 QPushButton *cloudButton = new QPushButton( tr( "Use cloud" ) ); 0106 QPushButton *allLocalButton = new QPushButton( tr( "Always use local" ) ); 0107 QPushButton *allCloudButton = new QPushButton( tr( "Always use cloud" ) ); 0108 0109 localButton->setDefault( true ); 0110 localButton->setProperty( "ActionRole", ConflictDialog::Local ); 0111 cloudButton->setProperty( "ActionRole", ConflictDialog::Cloud ); 0112 allLocalButton->setProperty( "ActionRole", ConflictDialog::AllLocal ); 0113 allCloudButton->setProperty( "ActionRole", ConflictDialog::AllCloud ); 0114 0115 m_box->addButton( localButton, QDialogButtonBox::ActionRole ); 0116 m_box->addButton( cloudButton, QDialogButtonBox::ActionRole ); 0117 m_box->addButton( allLocalButton, QDialogButtonBox::ActionRole ); 0118 m_box->addButton( allCloudButton, QDialogButtonBox::ActionRole ); 0119 0120 QVBoxLayout *leftLayout = new QVBoxLayout(); 0121 QString localHeaderText = tr( "Local placemark" ); 0122 QString localDetailText = tr( "Path: %0 <br /> Name: %1 <br /> Description: %2 <br /> Status: %3" ) 0123 .arg( m_mergeItem->pathA(), m_mergeItem->nameA(), m_mergeItem->descriptionA() ); 0124 switch( m_mergeItem->actionA() ) { 0125 case MergeItem::Changed: 0126 localDetailText = localDetailText.arg( tr( "Changed" ) ); 0127 break; 0128 case MergeItem::Deleted: 0129 localDetailText = localDetailText.arg( tr( "Deleted" ) ); 0130 break; 0131 default: 0132 break; 0133 } 0134 0135 QLabel *localHeaderLabel = new QLabel( localHeaderText ); 0136 QLabel *localDetailLabel = new QLabel( localDetailText ); 0137 leftLayout->addWidget( localHeaderLabel ); 0138 leftLayout->addWidget( localDetailLabel ); 0139 0140 QVBoxLayout *rightLayout = new QVBoxLayout(); 0141 QString cloudHeaderText = tr( "Cloud placemark" ); 0142 QString cloudDetailText = tr( "Path: %0 <br /> Name: %1 <br /> Description: %2 <br /> Status: %3" ) 0143 .arg( m_mergeItem->pathB(), m_mergeItem->nameB(), m_mergeItem->descriptionB() ); 0144 switch( m_mergeItem->actionB() ) { 0145 case MergeItem::Changed: 0146 cloudDetailText = cloudDetailText.arg( tr( "Changed" ) ); 0147 break; 0148 case MergeItem::Deleted: 0149 cloudDetailText = cloudDetailText.arg( tr( "Deleted" ) ); 0150 break; 0151 default: 0152 break; 0153 } 0154 QLabel *cloudHeaderLabel = new QLabel( cloudHeaderText ); 0155 QLabel *cloudDetailLabel = new QLabel( cloudDetailText ); 0156 rightLayout->addWidget( cloudHeaderLabel ); 0157 rightLayout->addWidget( cloudDetailLabel ); 0158 0159 QHBoxLayout *detailLayout = new QHBoxLayout(); 0160 detailLayout->addLayout( leftLayout ); 0161 detailLayout->addLayout( rightLayout ); 0162 0163 QLabel *descriptionLabel = new QLabel(); 0164 QString descriptionText = tr( "A bookmark on this device conflicts " \ 0165 "with a cloud bookmark. Which one do " \ 0166 "you want to keep?" ); 0167 descriptionLabel->setText( descriptionText ); 0168 0169 QVBoxLayout *mainLayout = new QVBoxLayout(); 0170 mainLayout->addWidget( descriptionLabel ); 0171 mainLayout->addLayout( detailLayout ); 0172 mainLayout->addWidget( m_box ); 0173 0174 setLayout( mainLayout ); 0175 setWindowTitle( tr( "Synchronization Conflict" ) ); 0176 0177 connect( m_box, SIGNAL(clicked(QAbstractButton*)), 0178 this, SLOT(resolveConflict(QAbstractButton*)) ); 0179 } 0180 0181 } 0182 0183 #include "moc_ConflictDialog.cpp"