File indexing completed on 2024-06-23 05:49:08
0001 /* 0002 This file is part of the Okteta Kasten module, made within the KDE community. 0003 0004 SPDX-FileCopyrightText: 2010, 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 "viewprofilecontroller.hpp" 0010 0011 // controller 0012 #include "viewprofileeditdialog.hpp" 0013 // Okteta Gui Kasten 0014 #include <Kasten/Okteta/ByteArrayViewProfileManager> 0015 #include <Kasten/Okteta/ByteArrayViewProfileSynchronizer> 0016 #include <Kasten/Okteta/ByteArrayView> 0017 // KF 0018 #include <kwidgetsaddons_version.h> 0019 #include <KXMLGUIClient> 0020 #include <KXMLGUIFactory> 0021 #include <KActionMenu> 0022 #include <KActionCollection> 0023 #include <KLocalizedString> 0024 // Qt 0025 #include <QActionGroup> 0026 #include <QAction> 0027 0028 namespace Kasten { 0029 0030 ViewProfileController::ViewProfileController(ByteArrayViewProfileManager* viewProfileManager, 0031 QWidget* parentWidget, 0032 KXMLGUIClient* guiClient) 0033 : mViewProfileManager(viewProfileManager) 0034 , mParentWidget(parentWidget) 0035 { 0036 mViewProfileActionMenu = 0037 new KActionMenu(i18nc("@title:menu submenu to select the view profile or change it", 0038 "View Profile"), 0039 this); 0040 mViewProfileActionMenu->setPopupMode(QToolButton::InstantPopup); 0041 0042 mCreateNewAction = 0043 new QAction(QIcon::fromTheme(QStringLiteral("document-new")), 0044 i18nc("@action:inmenu create a new view profile", 0045 "Create New..."), 0046 this); 0047 connect(mCreateNewAction, &QAction::triggered, this, &ViewProfileController::onCreateNewActionTriggered); 0048 0049 mSaveChangesAction = 0050 new QAction(QIcon::fromTheme(QStringLiteral("document-save")), 0051 i18nc("@action:inmenu save changed to the view profile to the base profile", 0052 "Save Changes"), 0053 this); 0054 connect(mSaveChangesAction, &QAction::triggered, this, &ViewProfileController::onSaveChangesActionTriggered); 0055 0056 mResetChangesAction = 0057 new QAction(QIcon::fromTheme(QStringLiteral("document-revert")), 0058 i18nc("@action:inmenu reset settings back to those of the saved base profile", 0059 "Reset Changes"), 0060 this); 0061 connect(mResetChangesAction, &QAction::triggered, this, &ViewProfileController::onResetChangesActionTriggered); 0062 0063 mViewProfileActionMenu->addAction(mCreateNewAction); 0064 mViewProfileActionMenu->addSeparator(); 0065 mViewProfileActionMenu->addAction(mSaveChangesAction); 0066 mViewProfileActionMenu->addAction(mResetChangesAction); 0067 0068 mViewProfilesActionGroup = new QActionGroup(this); 0069 mViewProfilesActionGroup->setExclusive(true); 0070 connect(mViewProfilesActionGroup, &QActionGroup::triggered, 0071 this, &ViewProfileController::onViewProfileTriggered); 0072 0073 guiClient->actionCollection()->addAction(QStringLiteral("view_profile"), mViewProfileActionMenu); 0074 0075 connect(mViewProfileManager, &ByteArrayViewProfileManager::viewProfilesChanged, 0076 this, &ViewProfileController::onViewProfilesChanged); 0077 connect(mViewProfileManager, &ByteArrayViewProfileManager::viewProfilesRemoved, 0078 this, &ViewProfileController::onViewProfilesChanged); 0079 0080 onViewProfilesChanged(); 0081 0082 setTargetModel(nullptr); 0083 } 0084 0085 void ViewProfileController::setTargetModel(AbstractModel* model) 0086 { 0087 if (mByteArrayViewProfileSynchronizer) { 0088 mByteArrayViewProfileSynchronizer->disconnect(this); 0089 } 0090 0091 mByteArrayView = model ? model->findBaseModel<ByteArrayView*>() : nullptr; 0092 mByteArrayViewProfileSynchronizer = mByteArrayView ? mByteArrayView->synchronizer() : nullptr; 0093 0094 const bool hasSynchronizer = (mByteArrayViewProfileSynchronizer != nullptr); 0095 if (hasSynchronizer) { 0096 onViewProfileChanged(mByteArrayViewProfileSynchronizer->viewProfileId()); 0097 0098 connect(mByteArrayViewProfileSynchronizer, &ByteArrayViewProfileSynchronizer::viewProfileChanged, 0099 this, &ViewProfileController::onViewProfileChanged); 0100 0101 onLocalSyncStateChanged(mByteArrayViewProfileSynchronizer->localSyncState()); 0102 0103 connect(mByteArrayViewProfileSynchronizer, &ByteArrayViewProfileSynchronizer::localSyncStateChanged, 0104 this, &ViewProfileController::onLocalSyncStateChanged); 0105 } else { 0106 mSaveChangesAction->setEnabled(false); 0107 mResetChangesAction->setEnabled(false); 0108 } 0109 0110 mCreateNewAction->setEnabled(hasSynchronizer); 0111 mViewProfileActionMenu->setEnabled(hasSynchronizer); 0112 } 0113 0114 void ViewProfileController::onViewProfileChanged(const Kasten::ByteArrayViewProfile::Id& viewProfileId) 0115 { 0116 const QList<QAction*> actions = mViewProfilesActionGroup->actions(); 0117 0118 for (QAction* action : actions) { 0119 if (action->data().toString() == viewProfileId) { 0120 action->setChecked(true); 0121 break; 0122 } 0123 } 0124 } 0125 0126 void ViewProfileController::onViewProfilesChanged() 0127 { 0128 qDeleteAll(mViewProfilesActionGroup->actions()); 0129 0130 const QVector<ByteArrayViewProfile> viewProfiles = mViewProfileManager->viewProfiles(); 0131 const ByteArrayViewProfile::Id currentViewProfileId = mByteArrayViewProfileSynchronizer ? 0132 mByteArrayViewProfileSynchronizer->viewProfileId() : 0133 ByteArrayViewProfile::Id(); 0134 0135 if (!viewProfiles.isEmpty()) { 0136 mViewProfileActionMenu->addSeparator(); 0137 } 0138 0139 bool isCurrentViewProfileExisting = false; 0140 for (const ByteArrayViewProfile& viewProfile : viewProfiles) { 0141 const QString title = viewProfile.viewProfileTitle(); 0142 auto* action = new QAction(title, mViewProfilesActionGroup); 0143 action->setCheckable(true); 0144 const ByteArrayViewProfile::Id viewProfileId = viewProfile.id(); 0145 action->setData(viewProfileId); 0146 const bool isCurrentViewProfile = (viewProfileId == currentViewProfileId); 0147 action->setChecked(isCurrentViewProfile); 0148 if (isCurrentViewProfile) { 0149 isCurrentViewProfileExisting = true; 0150 } 0151 0152 mViewProfilesActionGroup->addAction(action); 0153 mViewProfileActionMenu->addAction(action); 0154 } 0155 0156 // reset id if no longer existing 0157 if (!isCurrentViewProfileExisting && mByteArrayViewProfileSynchronizer) { 0158 mByteArrayViewProfileSynchronizer->setViewProfileId(ByteArrayViewProfile::Id()); 0159 } 0160 } 0161 0162 void ViewProfileController::onViewProfileTriggered(QAction* action) 0163 { 0164 mByteArrayViewProfileSynchronizer->setViewProfileId(action->data().toString()); 0165 } 0166 0167 void ViewProfileController::onLocalSyncStateChanged(Kasten::LocalSyncState localSyncState) 0168 { 0169 const bool hasDifference = (localSyncState == LocalHasChanges); 0170 0171 mSaveChangesAction->setEnabled(hasDifference); 0172 mResetChangesAction->setEnabled(hasDifference); 0173 } 0174 0175 void ViewProfileController::onCreateNewActionTriggered() 0176 { 0177 auto* dialog = new ViewProfileEditDialog(mParentWidget); 0178 const QString dialogTitle = i18nc("@window:title", 0179 "New View Profile"); 0180 dialog->setWindowTitle(dialogTitle); 0181 0182 ByteArrayViewProfile viewProfile; 0183 viewProfile.setId(QString()); 0184 // const QString modifiedTitle = i18n( "Modification of %1", newByteArrayViewProfile.viewProfileTitle() ); 0185 // viewProfile.setViewProfileTitle( modifiedTitle ); 0186 viewProfile.setOffsetColumnVisible(mByteArrayView->offsetColumnVisible()); 0187 viewProfile.setVisibleByteArrayCodings(mByteArrayView->visibleByteArrayCodings()); 0188 viewProfile.setViewModus(mByteArrayView->viewModus()); 0189 viewProfile.setLayoutStyle(mByteArrayView->layoutStyle()); 0190 viewProfile.setNoOfGroupedBytes(mByteArrayView->noOfGroupedBytes()); 0191 viewProfile.setNoOfBytesPerLine(mByteArrayView->noOfBytesPerLine()); 0192 viewProfile.setValueCoding(mByteArrayView->valueCoding()); 0193 viewProfile.setCharCoding(mByteArrayView->charCodingName()); 0194 viewProfile.setShowsNonprinting(mByteArrayView->showsNonprinting()); 0195 viewProfile.setUndefinedChar(mByteArrayView->undefinedChar()); 0196 viewProfile.setSubstituteChar(mByteArrayView->substituteChar()); 0197 dialog->setViewProfile(viewProfile); 0198 connect(dialog, &ViewProfileEditDialog::viewProfileAccepted, 0199 this, &ViewProfileController::addNewViewProfile); 0200 0201 dialog->open(); 0202 } 0203 0204 void ViewProfileController::addNewViewProfile(const ByteArrayViewProfile& viewProfile) 0205 { 0206 QVector<ByteArrayViewProfile> viewProfiles { 0207 viewProfile 0208 }; 0209 mViewProfileManager->saveViewProfiles(viewProfiles); 0210 0211 mByteArrayViewProfileSynchronizer->setViewProfileId(viewProfiles.at(0).id()); 0212 } 0213 0214 void ViewProfileController::onResetChangesActionTriggered() 0215 { 0216 mByteArrayViewProfileSynchronizer->syncFromRemote(); 0217 } 0218 0219 void ViewProfileController::onSaveChangesActionTriggered() 0220 { 0221 mByteArrayViewProfileSynchronizer->syncToRemote(); 0222 } 0223 0224 } 0225 0226 #include "moc_viewprofilecontroller.cpp"