Skip to content

Commit 50c3d50

Browse files
committed
feat: add CP437 as optional display format in ASCII display for #20
1 parent 362f27b commit 50c3d50

12 files changed

+437
-4
lines changed

src/hobbits-plugins/displays/AsciiView/AsciiView.pro

+8-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,14 @@ DEFINES += QT_DEPRECATED_WARNINGS
2727
# You can also select to disable deprecated APIs only up to a certain version of Qt.
2828
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
2929

30-
SOURCES += asciiview.cpp asciiviewwidget.cpp asciiviewcontrols.cpp
31-
32-
HEADERS += asciiview.h asciiviewwidget.h asciiviewcontrols.h
30+
SOURCES += asciiview.cpp asciiviewwidget.cpp asciiviewcontrols.cpp \
31+
ascii.cpp \
32+
cp437.cpp
33+
34+
HEADERS += asciiview.h asciiviewwidget.h asciiviewcontrols.h \
35+
ascii.h \
36+
charmaker.h \
37+
cp437.h
3338

3439
FORMS += asciiviewcontrols.ui
3540

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include "ascii.h"
2+
3+
Ascii::Ascii()
4+
{
5+
6+
}
7+
8+
QString Ascii::getName() {
9+
return "ASCII";
10+
}
11+
12+
QString Ascii::getDisplayChars(Frame frame, int offset) {
13+
QString frameString = "";
14+
if (offset + 7 >= frame.size()) {
15+
// partial char
16+
frameString += '.';
17+
}
18+
else {
19+
char byte = 0;
20+
for (int bit = 0; bit < 8; bit++) {
21+
byte <<= 1;
22+
if (frame.at(offset + bit)) {
23+
byte |= 0x01;
24+
}
25+
}
26+
if (isprint(byte)) {
27+
frameString += byte;
28+
}
29+
else {
30+
frameString += '.';
31+
}
32+
}
33+
return frameString;
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef ASCII_H
2+
#define ASCII_H
3+
4+
#include "charmaker.h"
5+
6+
class Ascii : public CharMaker
7+
{
8+
public:
9+
Ascii();
10+
QString getName() override;
11+
QString getDisplayChars(Frame frame, int offset) override;
12+
};
13+
14+
#endif // ASCII_H

src/hobbits-plugins/displays/AsciiView/asciiview.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
#include "asciiview.h"
2+
#include "charmaker.h"
3+
#include "ascii.h"
4+
#include "cp437.h"
25

36
AsciiView::AsciiView() :
47
m_displayWidget(nullptr),
@@ -35,8 +38,16 @@ void AsciiView::initialize(QSharedPointer<DisplayHandle> displayHandle)
3538
m_displayWidget = new AsciiViewWidget(displayHandle, this);
3639
m_controlsWidget = new AsciiViewControls();
3740

41+
QList<QSharedPointer<CharMaker>> charMakers;
42+
charMakers.append(QSharedPointer<CharMaker>(new Ascii()));
43+
charMakers.append(QSharedPointer<CharMaker>(new Cp437()));
44+
45+
m_controlsWidget->setCharMakers(charMakers);
46+
m_displayWidget->setCharMakers(charMakers);
47+
3848
connect(m_controlsWidget, SIGNAL(fontSizeChanged(int)), m_displayWidget, SLOT(setFontSize(int)));
3949
connect(m_controlsWidget, SIGNAL(columnGroupingChanged(int)), m_displayWidget, SLOT(setColumnGrouping(int)));
4050
connect(m_controlsWidget, SIGNAL(showHeadersChanged(bool)), m_displayWidget, SLOT(setShowHeaders(bool)));
51+
connect(m_controlsWidget, SIGNAL(charMakerChanged(QString)), m_displayWidget, SLOT(setCurrCharMaker(QString)));
4152
}
4253
}

src/hobbits-plugins/displays/AsciiView/asciiviewcontrols.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,20 @@ AsciiViewControls::AsciiViewControls() :
1111
connect(ui->hs_fontSize, SIGNAL(valueChanged(int)), this, SIGNAL(fontSizeChanged(int)));
1212
}
1313

14+
15+
void AsciiViewControls::setCharMakers(QList<QSharedPointer<CharMaker>> charMakers) {
16+
ui->cb_charMaker->clear();
17+
for (auto maker : charMakers) {
18+
ui->cb_charMaker->addItem(maker->getName());
19+
}
20+
}
21+
1422
void AsciiViewControls::on_cb_showHeaders_stateChanged(int state)
1523
{
1624
emit showHeadersChanged(state != Qt::Unchecked);
1725
}
26+
27+
void AsciiViewControls::on_cb_charMaker_currentTextChanged(const QString &charMakerName)
28+
{
29+
emit charMakerChanged(charMakerName);
30+
}

src/hobbits-plugins/displays/AsciiView/asciiviewcontrols.h

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define ASCIIVIEWCONTROLS_H
33

44
#include <QWidget>
5+
#include "charmaker.h"
56

67
namespace Ui
78
{
@@ -15,14 +16,19 @@ class AsciiViewControls : public QWidget
1516
public:
1617
AsciiViewControls();
1718

19+
void setCharMakers(QList<QSharedPointer<CharMaker>> charMakers);
20+
1821
signals:
1922
void fontSizeChanged(int);
2023
void columnGroupingChanged(int);
2124
void showHeadersChanged(bool);
25+
void charMakerChanged(QString);
2226

2327
private slots:
2428
void on_cb_showHeaders_stateChanged(int state);
2529

30+
void on_cb_charMaker_currentTextChanged(const QString &charMakerName);
31+
2632
private:
2733
Ui::AsciiViewControls *ui;
2834
};

src/hobbits-plugins/displays/AsciiView/asciiviewcontrols.ui

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>581</width>
9+
<width>724</width>
1010
<height>56</height>
1111
</rect>
1212
</property>
@@ -81,6 +81,9 @@
8181
</property>
8282
</widget>
8383
</item>
84+
<item>
85+
<widget class="QComboBox" name="cb_charMaker"/>
86+
</item>
8487
</layout>
8588
</item>
8689
</layout>

src/hobbits-plugins/displays/AsciiView/asciiviewwidget.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ AsciiViewWidget::AsciiViewWidget(QSharedPointer<DisplayHandle> displayHandle, Di
1111

1212
QString AsciiViewWidget::getDisplayChars(Frame frame, int offset)
1313
{
14+
if (!m_currCharMaker.isNull()) {
15+
return m_currCharMaker->getDisplayChars(frame, offset);
16+
}
1417
QString frameString = "";
1518
if (offset + 7 >= frame.size()) {
1619
// partial char
@@ -38,3 +41,20 @@ int AsciiViewWidget::bitsPerChar()
3841
{
3942
return 8;
4043
}
44+
45+
46+
void AsciiViewWidget::setCharMakers(QList<QSharedPointer<CharMaker>> charMakers) {
47+
m_charMakers.clear();
48+
for (auto maker : charMakers) {
49+
m_charMakers.insert(maker->getName(), maker);
50+
}
51+
52+
if (!charMakers.isEmpty()) {
53+
setCurrCharMaker(charMakers.first()->getName());
54+
}
55+
}
56+
57+
void AsciiViewWidget::setCurrCharMaker(QString charMaker) {
58+
m_currCharMaker = m_charMakers.value(charMaker);
59+
repaint();
60+
}

src/hobbits-plugins/displays/AsciiView/asciiviewwidget.h

+9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define ASCIIVIEWWIDGET_H
33

44
#include "displaybasetext.h"
5+
#include "charmaker.h"
56

67
class AsciiViewWidget : public DisplayBaseText
78
{
@@ -12,6 +13,14 @@ class AsciiViewWidget : public DisplayBaseText
1213

1314
QString getDisplayChars(Frame frame, int offset) override;
1415
int bitsPerChar() override;
16+
void setCharMakers(QList<QSharedPointer<CharMaker>>);
17+
18+
public slots:
19+
void setCurrCharMaker(QString charMaker);
20+
21+
private:
22+
QSharedPointer<CharMaker> m_currCharMaker;
23+
QMap<QString, QSharedPointer<CharMaker>> m_charMakers;
1524

1625
};
1726

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#ifndef CHARMAKER_H
2+
#define CHARMAKER_H
3+
4+
#include "frame.h"
5+
#include <QString>
6+
7+
class CharMaker {
8+
public:
9+
virtual ~CharMaker()
10+
{
11+
}
12+
virtual QString getName() = 0;
13+
virtual QString getDisplayChars(Frame frame, int offset) = 0;
14+
};
15+
16+
#endif // CHARMAKER_H

0 commit comments

Comments
 (0)