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"