File indexing completed on 2024-05-05 03:49:15

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"