File indexing completed on 2024-05-26 05:56:50

0001 /*
0002     This file is part of the Okteta Kasten module, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2006-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 "viewconfigcontroller.hpp"
0010 
0011 // lib
0012 #include "bytesperlinedialog.hpp"
0013 #include "bytespergroupdialog.hpp"
0014 // Okteta Kasten gui
0015 #include <Kasten/Okteta/ByteArrayView>
0016 // Okteta core
0017 #include <Okteta/CharCodec>
0018 // KF
0019 #include <kwidgetsaddons_version.h>
0020 #include <KXMLGUIClient>
0021 #include <KLocalizedString>
0022 #include <KActionCollection>
0023 #include <KSelectAction>
0024 #include <KToggleAction>
0025 // Qt
0026 #include <QApplication>
0027 
0028 namespace Kasten {
0029 
0030 ViewConfigController::ViewConfigController(KXMLGUIClient* guiClient)
0031 {
0032     KActionCollection* actionCollection = guiClient->actionCollection();
0033 
0034     // Offset coding
0035     mOffsetCodingAction = new KSelectAction(i18nc("@title:menu", "&Offset Coding"), this);
0036     mOffsetCodingAction->setObjectName(QStringLiteral("view_offsetcoding"));
0037     mOffsetCodingAction->setItems(QStringList {
0038         i18nc("@item:inmenu offset in the hexadecimal format",
0039               "&Hexadecimal"),
0040         i18nc("@item:inmenu offset in the decimal format",
0041               "&Decimal"),
0042         i18nc("@item:inmenu offset in the octal format",
0043               "&Octal"),
0044     });
0045     connect(mOffsetCodingAction, &KSelectAction::indexTriggered,
0046             this, &ViewConfigController::setOffsetCoding);
0047 
0048     // value valueCoding
0049     mCodingAction = new KSelectAction(i18nc("@title:menu", "&Value Coding"), this);
0050     mCodingAction->setObjectName(QStringLiteral("view_valuecoding"));
0051     mCodingAction->setItems(QStringList {
0052         i18nc("@item:inmenu encoding of the bytes as values in the hexadecimal format",
0053               "&Hexadecimal"),
0054         i18nc("@item:inmenu encoding of the bytes as values in the decimal format",
0055               "&Decimal"),
0056         i18nc("@item:inmenu encoding of the bytes as values in the octal format",
0057               "&Octal"),
0058         i18nc("@item:inmenu encoding of the bytes as values in the binary format",
0059               "&Binary"),
0060     });
0061     connect(mCodingAction, &KSelectAction::indexTriggered,
0062             this, &ViewConfigController::setValueCoding);
0063 
0064     // char valueCoding
0065     mEncodingAction = new KSelectAction(i18nc("@title:menu", "&Char Coding"), this);
0066     mEncodingAction->setObjectName(QStringLiteral("view_charencoding"));
0067     mEncodingAction->setItems(Okteta::CharCodec::codecNames());
0068     connect(mEncodingAction, &KSelectAction::indexTriggered,
0069             this, &ViewConfigController::setCharCoding);
0070 
0071     mShowsNonprintingAction = new KToggleAction(i18nc("@option:check", "Show &Non-printing Chars"), this);
0072     mShowsNonprintingAction->setObjectName(QStringLiteral("view_showsnonprinting"));
0073     connect(mShowsNonprintingAction, &KToggleAction::triggered,
0074             this, &ViewConfigController::setShowsNonprinting);
0075 
0076     // bytes per line
0077     mSetBytesPerLineAction = new QAction(i18nc("@action:inmenu", "Set Bytes per Line..."), this);
0078     mSetBytesPerLineAction->setObjectName(QStringLiteral("view_bytesperline"));
0079     connect(mSetBytesPerLineAction, &QAction::triggered,
0080             this, &ViewConfigController::showBytesPerLineDialog);
0081 
0082     // byte groups size
0083     mSetBytesPerGroupAction = new QAction(i18nc("@action:inmenu", "Set Bytes per Group..."), this);
0084     mSetBytesPerGroupAction->setObjectName(QStringLiteral("view_bytespergroup"));
0085     connect(mSetBytesPerGroupAction, &QAction::triggered,
0086             this, &ViewConfigController::showBytesPerGroupDialog);
0087 
0088     // resize style
0089     mResizeStyleAction = new KSelectAction(i18nc("@title:menu", "&Dynamic Layout"), this);
0090     mResizeStyleAction->setObjectName(QStringLiteral("resizestyle"));
0091     mResizeStyleAction->setItems(QStringList {
0092         i18nc("@item:inmenu  The layout will not change on size changes.",
0093               "&Off"),
0094         i18nc("@item:inmenu  The layout will adapt to the size, but only with complete groups of bytes.",
0095               "&Wrap Only Complete Byte Groups"),
0096         i18nc("@item:inmenu  The layout will adapt to the size and fit in as much bytes per line as possible.",
0097               "&On"),
0098     });
0099     connect(mResizeStyleAction, &KSelectAction::indexTriggered,
0100             this, &ViewConfigController::setLayoutStyle);
0101 
0102     mShowOffsetColumnAction = new KToggleAction(i18nc("@option:check", "Show &Line Offset"), this);
0103     mShowOffsetColumnAction->setObjectName(QStringLiteral("view_lineoffset"));
0104     actionCollection->setDefaultShortcut(mShowOffsetColumnAction, QKeySequence(Qt::Key_F11));
0105     connect(mShowOffsetColumnAction, &KToggleAction::triggered,
0106             this, &ViewConfigController::toggleOffsetColumn);
0107 
0108     // show buffer columns
0109     mToggleColumnsAction = new KSelectAction(i18nc("@title:menu", "&Show Values or Chars"), this);
0110     mToggleColumnsAction->setObjectName(QStringLiteral("togglecolumns"));
0111     mToggleColumnsAction->setItems(QStringList {
0112         i18nc("@item:inmenu", "&Values"),
0113         i18nc("@item:inmenu", "&Chars"),
0114         i18nc("@item:inmenu", "Values && Chars"),
0115     });
0116     connect(mToggleColumnsAction, &KSelectAction::indexTriggered,
0117             this, &ViewConfigController::toggleValueCharColumns);
0118 
0119     actionCollection->addActions({
0120         mCodingAction,
0121         mEncodingAction,
0122         // mShowsNonprintingAction, TODOSHOWNONPRINTING hide from UI for now
0123         mSetBytesPerLineAction,
0124         mSetBytesPerGroupAction,
0125         mResizeStyleAction,
0126         mShowOffsetColumnAction,
0127         mOffsetCodingAction,
0128         mToggleColumnsAction,
0129     });
0130 
0131     setTargetModel(nullptr);
0132 }
0133 
0134 void ViewConfigController::setTargetModel(AbstractModel* model)
0135 {
0136     if (mByteArrayView) {
0137         mByteArrayView->disconnect(this);
0138     }
0139 
0140     mByteArrayView = model ? model->findBaseModel<ByteArrayView*>() : nullptr;
0141 
0142     const bool hasView = (mByteArrayView != nullptr);
0143     if (hasView) {
0144         onOffsetColumnVisibleChanged(mByteArrayView->offsetColumnVisible());
0145         onOffsetCodingChanged(mByteArrayView->offsetCoding());
0146         onShowsNonprintingChanged(mByteArrayView->showsNonprinting());
0147         onValueCodingChanged(mByteArrayView->valueCoding());
0148         onCharCodecChanged(mByteArrayView->charCodingName());
0149         onLayoutStyleChanged(mByteArrayView->layoutStyle());
0150         onVisibleByteArrayCodingsChanged(mByteArrayView->visibleByteArrayCodings());
0151 
0152         connect(mByteArrayView, &ByteArrayView::offsetColumnVisibleChanged,
0153                 this, &ViewConfigController::onOffsetColumnVisibleChanged);
0154         connect(mByteArrayView, &ByteArrayView::offsetCodingChanged, this, &ViewConfigController::onOffsetCodingChanged);
0155         connect(mByteArrayView, &ByteArrayView::showsNonprintingChanged,
0156                 this, &ViewConfigController::onShowsNonprintingChanged);
0157         connect(mByteArrayView, &ByteArrayView::valueCodingChanged, this, &ViewConfigController::onValueCodingChanged);
0158         connect(mByteArrayView, &ByteArrayView::charCodecChanged,
0159                 this, &ViewConfigController::onCharCodecChanged);
0160         connect(mByteArrayView, &ByteArrayView::layoutStyleChanged, this, &ViewConfigController::onLayoutStyleChanged);
0161         connect(mByteArrayView, &ByteArrayView::visibleByteArrayCodingsChanged,
0162                 this, &ViewConfigController::onVisibleByteArrayCodingsChanged);
0163     }
0164 
0165     mOffsetCodingAction->setEnabled(hasView);
0166     mCodingAction->setEnabled(hasView);
0167     mEncodingAction->setEnabled(hasView);
0168     mShowsNonprintingAction->setEnabled(hasView);
0169     mSetBytesPerLineAction->setEnabled(hasView);
0170     mSetBytesPerGroupAction->setEnabled(hasView);
0171     mResizeStyleAction->setEnabled(hasView);
0172     mShowOffsetColumnAction->setEnabled(hasView);
0173     mToggleColumnsAction->setEnabled(hasView);
0174 }
0175 
0176 void ViewConfigController::setValueCoding(int valueCoding)
0177 {
0178     mByteArrayView->setValueCoding(valueCoding);
0179 }
0180 
0181 void ViewConfigController::setShowsNonprinting(bool on)
0182 {
0183     mByteArrayView->setShowsNonprinting(on);
0184 }
0185 
0186 void ViewConfigController::toggleOffsetColumn(bool on)
0187 {
0188     mByteArrayView->toggleOffsetColumn(on);
0189 }
0190 
0191 void ViewConfigController::setOffsetCoding(int offsetCoding)
0192 {
0193     mByteArrayView->setOffsetCoding(offsetCoding);
0194 }
0195 
0196 void ViewConfigController::showBytesPerLineDialog()
0197 {
0198     auto* dialog = new BytesPerLineDialog(QApplication::activeWindow());
0199     dialog->setBytesPerLine(mByteArrayView->noOfBytesPerLine());
0200     connect(dialog, &BytesPerLineDialog::bytesPerLineAccepted,
0201             this, &ViewConfigController::setBytesPerLine);
0202     dialog->open();
0203 }
0204 
0205 void ViewConfigController::setBytesPerLine(int bytesPerLine)
0206 {
0207     mByteArrayView->setNoOfBytesPerLine(bytesPerLine);
0208 
0209     // TODO: change should be signalled and the action listen to that
0210     mResizeStyleAction->setCurrentItem(mByteArrayView->layoutStyle());
0211 }
0212 
0213 void ViewConfigController::showBytesPerGroupDialog()
0214 {
0215     auto* dialog = new BytesPerGroupDialog(QApplication::activeWindow());
0216     dialog->setGroupedBytesCount(mByteArrayView->noOfGroupedBytes());
0217     connect(dialog, &BytesPerGroupDialog::bytesPerGroupAccepted,
0218             this, &ViewConfigController::setBytesPerGroup);
0219     dialog->open();
0220 }
0221 
0222 void ViewConfigController::setBytesPerGroup(int bytesPerGroup)
0223 {
0224     mByteArrayView->setNoOfGroupedBytes(bytesPerGroup);
0225 }
0226 
0227 void ViewConfigController::setLayoutStyle(int layoutStyle)
0228 {
0229     mByteArrayView->setLayoutStyle(layoutStyle);
0230 }
0231 
0232 void ViewConfigController::setCharCoding(int charCoding)
0233 {
0234     mByteArrayView->setCharCoding(Okteta::CharCodec::codecNames()[charCoding]);
0235 }
0236 
0237 void ViewConfigController::toggleValueCharColumns(int visibleColumns)
0238 {
0239     mByteArrayView->setVisibleByteArrayCodings(visibleColumns + 1);
0240 }
0241 
0242 void ViewConfigController::onOffsetColumnVisibleChanged(bool offsetColumnVisible)
0243 {
0244     mShowOffsetColumnAction->setChecked(offsetColumnVisible);
0245 }
0246 
0247 void ViewConfigController::onOffsetCodingChanged(int offsetCoding)
0248 {
0249     mOffsetCodingAction->setCurrentItem(offsetCoding);
0250 }
0251 
0252 void ViewConfigController::onShowsNonprintingChanged(bool showsNonprinting)
0253 {
0254     mShowsNonprintingAction->setChecked(showsNonprinting);
0255 }
0256 
0257 void ViewConfigController::onValueCodingChanged(int valueCoding)
0258 {
0259     mCodingAction->setCurrentItem(valueCoding);
0260 }
0261 
0262 void ViewConfigController::onCharCodecChanged(const QString& charCodecName)
0263 {
0264     const int charCodingIndex = Okteta::CharCodec::codecNames().indexOf(charCodecName);
0265 
0266     mEncodingAction->setCurrentItem(charCodingIndex);
0267 }
0268 
0269 void ViewConfigController::onLayoutStyleChanged(int layoutStyle)
0270 {
0271     mResizeStyleAction->setCurrentItem(layoutStyle);
0272 }
0273 
0274 void ViewConfigController::onVisibleByteArrayCodingsChanged(int visibleByteArrayCodings)
0275 {
0276     mToggleColumnsAction->setCurrentItem(visibleByteArrayCodings - 1);
0277 }
0278 
0279 }
0280 
0281 #include "moc_viewconfigcontroller.cpp"