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"