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"