Warning, file /utilities/okteta/kasten/gui/io/bytearrayviewprofilesynchronizer.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     This file is part of the Okteta Kasten module, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2012 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "bytearrayviewprofilesynchronizer.hpp"
0010 
0011 // library
0012 #include <bytearrayviewprofilemanager.hpp>
0013 #include <bytearrayview.hpp>
0014 
0015 namespace Kasten {
0016 
0017 ByteArrayViewProfileSynchronizer::ByteArrayViewProfileSynchronizer(ByteArrayViewProfileManager* viewProfileManager)
0018     : mViewProfileManager(viewProfileManager)
0019 {
0020 }
0021 
0022 LocalSyncState
0023 ByteArrayViewProfileSynchronizer::localSyncState() const
0024 {
0025     return (mDirtyFlags == 0) ? LocalInSync : LocalHasChanges;
0026 }
0027 
0028 void
0029 ByteArrayViewProfileSynchronizer::setView(ByteArrayView* view)
0030 {
0031     if (mView && !mViewProfileId.isEmpty()) {
0032         mView->disconnect(this);
0033     }
0034 
0035     mView = view;
0036 
0037     // TODO: drop all changes and set view to profile if set
0038     mDirtyFlags = 0;
0039 
0040     if (mView && !mViewProfileId.isEmpty()) {
0041         const ByteArrayViewProfile viewProfile = mViewProfileManager->viewProfile(mViewProfileId);
0042         updateView(viewProfile);
0043         connectViewSignals();
0044     }
0045 }
0046 
0047 void ByteArrayViewProfileSynchronizer::setViewProfileId(const ByteArrayViewProfile::Id& viewProfileId)
0048 {
0049     if (mViewProfileId == viewProfileId) {
0050         return;
0051     }
0052 
0053     const bool isListeningBefore = (!mViewProfileId.isEmpty());
0054 
0055     mViewProfileId = viewProfileId;
0056 
0057     // TODO: drop all changes and set view to profile if set
0058     mDirtyFlags = 0;
0059     if (!viewProfileId.isEmpty()) {
0060         const ByteArrayViewProfile viewProfile = mViewProfileManager->viewProfile(viewProfileId);
0061         updateView(viewProfile);
0062     }
0063 
0064     const bool isListeningAfter = (!mViewProfileId.isEmpty());
0065 
0066     if (isListeningAfter) {
0067         if (!isListeningBefore) {
0068             connect(mViewProfileManager, &ByteArrayViewProfileManager::viewProfilesChanged,
0069                     this, &ByteArrayViewProfileSynchronizer::onViewProfilesChanged);
0070             connect(mViewProfileManager, &ByteArrayViewProfileManager::viewProfilesRemoved,
0071                     this, &ByteArrayViewProfileSynchronizer::onViewProfilesRemoved);
0072             if (mView) {
0073                 connectViewSignals();
0074             }
0075         }
0076     } else {
0077         if (isListeningBefore) {
0078             mViewProfileManager->disconnect(this);
0079             if (mView) {
0080                 mView->disconnect(this);
0081             }
0082         }
0083     }
0084 
0085     emit viewProfileChanged(mViewProfileId);
0086     if (mView) {
0087         emit localSyncStateChanged(LocalInSync);
0088     }
0089 }
0090 
0091 void
0092 ByteArrayViewProfileSynchronizer::syncToRemote()
0093 {
0094     if ((!mView) || (mViewProfileId.isEmpty())) {
0095         return;
0096     }
0097 
0098     ByteArrayViewProfile viewProfile = mViewProfileManager->viewProfile(mViewProfileId);
0099     updateViewProfile(viewProfile);
0100 
0101     mDirtyFlags = 0;
0102 
0103     QVector<ByteArrayViewProfile> viewProfiles {
0104         viewProfile
0105     };
0106     mViewProfileManager->saveViewProfiles(viewProfiles);
0107 
0108     if (mView) {
0109         emit localSyncStateChanged(LocalInSync);
0110     }
0111 }
0112 
0113 void
0114 ByteArrayViewProfileSynchronizer::syncFromRemote()
0115 {
0116     if ((!mView) || (mViewProfileId.isEmpty())) {
0117         return;
0118     }
0119 
0120     const ByteArrayViewProfile viewProfile = mViewProfileManager->viewProfile(mViewProfileId);
0121     // TODO: this is a lazy hack, simply sets all of the profile, even if not needed. Improve that.
0122     mDirtyFlags = 0;
0123     updateView(viewProfile);
0124 
0125     if (mView) {
0126         emit localSyncStateChanged(LocalInSync);
0127     }
0128 }
0129 
0130 void
0131 ByteArrayViewProfileSynchronizer::onViewProfilesChanged(const QVector<ByteArrayViewProfile>& viewProfiles)
0132 {
0133     if (!mView) {
0134         return;
0135     }
0136 
0137     for (const ByteArrayViewProfile& viewProfile : viewProfiles) {
0138         if (viewProfile.id() == mViewProfileId) {
0139             updateView(viewProfile);
0140             break;
0141         }
0142     }
0143 }
0144 
0145 void ByteArrayViewProfileSynchronizer::updateView(const ByteArrayViewProfile& viewProfile)
0146 {
0147     if (!mView) {
0148         return;
0149     }
0150 
0151     mUpdatingView = true;
0152 
0153     if ((mDirtyFlags & ShowsNonprintingChanged) == 0) {
0154         mView->setShowsNonprinting(viewProfile.showsNonprinting());
0155     }
0156 
0157     if ((mDirtyFlags & OffsetCodingChanged) == 0) {
0158         mView->setOffsetCoding(viewProfile.offsetCoding());
0159     }
0160 
0161     if ((mDirtyFlags & ValueCodingChanged) == 0) {
0162         mView->setValueCoding(viewProfile.valueCoding());
0163     }
0164 
0165     if ((mDirtyFlags & CharCodecChanged) == 0) {
0166         mView->setCharCoding(viewProfile.charCodingName());
0167     }
0168 
0169     if ((mDirtyFlags & SubstituteCharChanged) == 0) {
0170         mView->setSubstituteChar(viewProfile.substituteChar());
0171     }
0172 
0173     if ((mDirtyFlags & UndefinedCharChanged) == 0) {
0174         mView->setUndefinedChar(viewProfile.undefinedChar());
0175     }
0176 
0177     if ((mDirtyFlags & VisibleByteArrayCodingsChanged) == 0) {
0178         mView->setVisibleByteArrayCodings(viewProfile.visibleByteArrayCodings());
0179     }
0180 
0181     if ((mDirtyFlags & OffsetColumnVisibleChanged) == 0) {
0182         mView->toggleOffsetColumn(viewProfile.offsetColumnVisible());
0183     }
0184 
0185     if ((mDirtyFlags & NoOfBytesPerLineChanged) == 0) {
0186         mView->setNoOfBytesPerLine(viewProfile.noOfBytesPerLine());
0187     }
0188 
0189     if ((mDirtyFlags & NoOfGroupedBytesChanged) == 0) {
0190         mView->setNoOfGroupedBytes(viewProfile.noOfGroupedBytes());
0191     }
0192 
0193     if ((mDirtyFlags & LayoutStyleChanged) == 0) {
0194         mView->setLayoutStyle(viewProfile.layoutStyle());
0195     }
0196 
0197     if ((mDirtyFlags & ViewModusChanged) == 0) {
0198         mView->setViewModus(viewProfile.viewModus());
0199     }
0200 
0201     mUpdatingView = false;
0202 }
0203 
0204 void ByteArrayViewProfileSynchronizer::updateViewProfile(ByteArrayViewProfile& viewProfile)
0205 {
0206     if (!mView) {
0207         return;
0208     }
0209 
0210     if ((mDirtyFlags & ShowsNonprintingChanged)) {
0211         viewProfile.setShowsNonprinting(mView->showsNonprinting());
0212     }
0213 
0214     if ((mDirtyFlags & OffsetCodingChanged)) {
0215         viewProfile.setOffsetCoding(mView->offsetCoding());
0216     }
0217 
0218     if ((mDirtyFlags & ValueCodingChanged)) {
0219         viewProfile.setValueCoding(mView->valueCoding());
0220     }
0221 
0222     if ((mDirtyFlags & CharCodecChanged)) {
0223         viewProfile.setCharCoding(mView->charCodingName());
0224     }
0225 
0226     if ((mDirtyFlags & SubstituteCharChanged)) {
0227         viewProfile.setSubstituteChar(mView->substituteChar());
0228     }
0229 
0230     if ((mDirtyFlags & UndefinedCharChanged)) {
0231         viewProfile.setUndefinedChar(mView->undefinedChar());
0232     }
0233 
0234     if ((mDirtyFlags & VisibleByteArrayCodingsChanged)) {
0235         viewProfile.setVisibleByteArrayCodings(mView->visibleByteArrayCodings());
0236     }
0237 
0238     if ((mDirtyFlags & OffsetColumnVisibleChanged)) {
0239         viewProfile.setOffsetColumnVisible(mView->offsetColumnVisible());
0240     }
0241 
0242     if ((mDirtyFlags & NoOfBytesPerLineChanged)) {
0243         viewProfile.setNoOfBytesPerLine(mView->noOfBytesPerLine());
0244     }
0245 
0246     if ((mDirtyFlags & NoOfGroupedBytesChanged)) {
0247         viewProfile.setNoOfGroupedBytes(mView->noOfGroupedBytes());
0248     }
0249 
0250     if ((mDirtyFlags & LayoutStyleChanged)) {
0251         viewProfile.setLayoutStyle(mView->layoutStyle());
0252     }
0253 
0254     if ((mDirtyFlags & ViewModusChanged)) {
0255         viewProfile.setViewModus(mView->viewModus());
0256     }
0257 }
0258 
0259 void ByteArrayViewProfileSynchronizer::connectViewSignals()
0260 {
0261     connect(mView, &ByteArrayView::showsNonprintingChanged,
0262             this, &ByteArrayViewProfileSynchronizer::onShowsNonprintingChanged);
0263     connect(mView, &ByteArrayView::offsetCodingChanged,
0264             this, &ByteArrayViewProfileSynchronizer::onOffsetCodingChanged);
0265     connect(mView, &ByteArrayView::valueCodingChanged,
0266             this, &ByteArrayViewProfileSynchronizer::onValueCodingChanged);
0267     connect(mView, &ByteArrayView::charCodecChanged,
0268             this, &ByteArrayViewProfileSynchronizer::onCharCodecChanged);
0269     connect(mView, &ByteArrayView::substituteCharChanged,
0270             this, &ByteArrayViewProfileSynchronizer::onSubstituteCharChanged);
0271     connect(mView, &ByteArrayView::undefinedCharChanged,
0272             this, &ByteArrayViewProfileSynchronizer::onUndefinedCharChanged);
0273     connect(mView, &ByteArrayView::visibleByteArrayCodingsChanged,
0274             this, &ByteArrayViewProfileSynchronizer::onVisibleByteArrayCodingsChanged);
0275     connect(mView, &ByteArrayView::offsetColumnVisibleChanged,
0276             this, &ByteArrayViewProfileSynchronizer::onOffsetColumnVisibleChanged);
0277     connect(mView, &ByteArrayView::noOfBytesPerLineChanged,
0278             this, &ByteArrayViewProfileSynchronizer::onNoOfBytesPerLineChanged);
0279     connect(mView, &ByteArrayView::noOfGroupedBytesChanged,
0280             this, &ByteArrayViewProfileSynchronizer::onNoOfGroupedBytesChanged);
0281     connect(mView, &ByteArrayView::layoutStyleChanged,
0282             this, &ByteArrayViewProfileSynchronizer::onLayoutStyleChanged);
0283     connect(mView, &ByteArrayView::viewModusChanged,
0284             this, &ByteArrayViewProfileSynchronizer::onViewModusChanged);
0285 }
0286 
0287 void ByteArrayViewProfileSynchronizer::onViewProfilesRemoved(const QVector<ByteArrayViewProfile::Id>& viewProfileIds)
0288 {
0289     if (!mView) {
0290         return;
0291     }
0292 
0293     for (const ByteArrayViewProfile::Id& viewProfileId : viewProfileIds) {
0294         if (viewProfileId == mViewProfileId) {
0295             // TODO: really forget binding to that profile completely? cannot reappear?
0296             setViewProfileId(ByteArrayViewProfile::Id());
0297             break;
0298         }
0299     }
0300 }
0301 
0302 void
0303 ByteArrayViewProfileSynchronizer::setDirtyFlag(int dirtyFlag)
0304 {
0305     if (mUpdatingView) {
0306         return;
0307     }
0308 
0309     const bool isCleanBefore = (mDirtyFlags == 0);
0310 
0311     mDirtyFlags |= dirtyFlag;
0312 
0313     if (isCleanBefore) {
0314         emit localSyncStateChanged(LocalHasChanges);
0315     }
0316 }
0317 
0318 void ByteArrayViewProfileSynchronizer::onShowsNonprintingChanged()
0319 {
0320     setDirtyFlag(ShowsNonprintingChanged);
0321 }
0322 void ByteArrayViewProfileSynchronizer::onOffsetCodingChanged()
0323 {
0324     setDirtyFlag(OffsetCodingChanged);
0325 }
0326 void ByteArrayViewProfileSynchronizer::onValueCodingChanged()
0327 {
0328     setDirtyFlag(ValueCodingChanged);
0329 }
0330 void ByteArrayViewProfileSynchronizer::onCharCodecChanged()
0331 {
0332     setDirtyFlag(CharCodecChanged);
0333 }
0334 void ByteArrayViewProfileSynchronizer::onSubstituteCharChanged()
0335 {
0336     setDirtyFlag(SubstituteCharChanged);
0337 }
0338 void ByteArrayViewProfileSynchronizer::onUndefinedCharChanged()
0339 {
0340     setDirtyFlag(UndefinedCharChanged);
0341 }
0342 void ByteArrayViewProfileSynchronizer::onVisibleByteArrayCodingsChanged()
0343 {
0344     setDirtyFlag(VisibleByteArrayCodingsChanged);
0345 }
0346 void ByteArrayViewProfileSynchronizer::onOffsetColumnVisibleChanged()
0347 {
0348     setDirtyFlag(OffsetColumnVisibleChanged);
0349 }
0350 void ByteArrayViewProfileSynchronizer::onNoOfBytesPerLineChanged()
0351 {
0352     setDirtyFlag(NoOfBytesPerLineChanged);
0353 }
0354 void ByteArrayViewProfileSynchronizer::onNoOfGroupedBytesChanged()
0355 {
0356     setDirtyFlag(NoOfGroupedBytesChanged);
0357 }
0358 void ByteArrayViewProfileSynchronizer::onLayoutStyleChanged()
0359 {
0360     setDirtyFlag(LayoutStyleChanged);
0361 }
0362 void ByteArrayViewProfileSynchronizer::onViewModusChanged()
0363 {
0364     setDirtyFlag(ViewModusChanged);
0365 }
0366 
0367 }
0368 
0369 #include "moc_bytearrayviewprofilesynchronizer.cpp"