Skip to content

Commit

Permalink
Qt Gui Update: rtknavi_qt
Browse files Browse the repository at this point in the history
- scale solution text with window size
- make graph rendering use anti-aliasing
- i18n work
- combine some redundant code
- fix some label texts
  • Loading branch information
JensReimann committed Aug 18, 2024
1 parent ba29039 commit 56d0b49
Show file tree
Hide file tree
Showing 8 changed files with 339 additions and 114 deletions.
121 changes: 121 additions & 0 deletions app/qtapp/appcmn_qt/labelstretcher.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
#include "labelstretcher.h"

// https://github.com/KubaO/stackoverflown/tree/master/questions/label-text-size-vert-40861305
// adapted by Jens Reimann to support vertical streching of widgets
#include <QWidget>
#include <QEvent>
#include <QLayout>

LabelStretcher::LabelStretcher(QObject *parent) : QObject(parent) {
apply(qobject_cast<QWidget*>(parent));
}

void LabelStretcher::apply(QWidget *widget) {
if (!widget) return;
setManaged(widget);
setMinimumSize(widget);
widget->installEventFilter(this);
}

void LabelStretcher::setManaged(QWidget *w, bool managed) {
w->setProperty(kStretcherManaged, managed);
}

bool LabelStretcher::eventFilter(QObject * obj, QEvent * ev) {
auto widget = qobject_cast<QWidget*>(obj);

if (widget && ev->type() == QEvent::Resize)
resized(widget);

return false;
}

void LabelStretcher::onLayout(QLayout *layout, const std::function<void(QWidget*)> &onWidget) {
if (!layout) return;

auto N = layout->count();
for (int i = 0; i < N; ++i) {
auto item = layout->itemAt(i);
onWidget(item->widget());
onLayout(item->layout(), onWidget);
}
}

void LabelStretcher::setFont(QLayout *layout, const QFont &font) {
onLayout(layout, [&](QWidget *widget){ setFont(widget, font); });
}

void LabelStretcher::setFont(QWidget *widget, const QFont &font) {
if (!widget || !widget->property(kStretcherManaged).toBool())
return;

float scale = 1;
if (widget->sizePolicy().verticalStretch() != 0) {
scale = (double)widget->sizePolicy().verticalStretch()/10.;
}

QFont f(font);
f.setPointSizeF(font.pointSizeF()*scale*0.5);

widget->setFont(f);
setFont(widget->layout(), font);
}

void LabelStretcher::setMinimumSize(QWidget *widget) {
if (widget->layout())
return;
widget->setMinimumSize(widget->minimumSizeHint());
}

int LabelStretcher::dSize(const QSizeF & inner, const QSizeF & outer) {
auto dy = inner.height() - outer.height();
auto dx = inner.width() - outer.width();
return std::max(dx, dy);
}

qreal LabelStretcher::f(qreal fontSize, QWidget *widget) {
auto font = widget->font();
font.setPointSizeF(fontSize);
setFont(widget, font);
auto d = dSize(widget->sizeHint(), widget->size());
qDebug() << "f:" << fontSize << "d" << d;
return d;
}

qreal LabelStretcher::df(qreal fontSize, qreal dStep, QWidget *widget) {
fontSize = std::max(dStep + 1.0, fontSize);
return (f(fontSize + dStep, widget) - f(fontSize - dStep, widget)) / dStep;
}

void LabelStretcher::resized(QWidget *widget) {
qDebug() << "pre: " << widget->minimumSizeHint() << widget->sizeHint() << widget->size();
if (!widget->property(kMinimumsAcquired).toBool()) {
onLayout(widget->layout(), [=](QWidget *widget){ setMinimumSize(widget); });
widget->setProperty(kMinimumsAcquired, true);
}

// Newton's method
auto font = widget->font();
auto fontSize = font.pointSizeF();
qreal dStep = 1.0;
int i;
for (i = 0; i < 10; ++i) {
auto prevFontSize = fontSize;
auto d = df(fontSize, dStep, widget);
if (d == 0) {
dStep *= 2.0;
continue;
}
fontSize -= f(fontSize, widget)/d;
fontSize = std::max(dStep + 1.0, fontSize);
auto change = fabs(prevFontSize - fontSize)/fontSize;
qDebug() << "d:" << d << " delta" << change;
if (change < 0.01) break; // we're within 1% of target
}
font.setPointSizeF(fontSize); // use a font smaller than max
setFont(widget, font);
qDebug() << "post:" << i << widget->minimumSizeHint() << widget->sizeHint() << widget->size();
}

constexpr const char LabelStretcher::kMinimumsAcquired[];
constexpr const char LabelStretcher::kStretcherManaged[];
31 changes: 31 additions & 0 deletions app/qtapp/appcmn_qt/labelstretcher.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#ifndef LABELSTRETCHER_H
#define LABELSTRETCHER_H

#include <QObject>

class QLayout;

class LabelStretcher : public QObject {
Q_OBJECT
static constexpr const char kMinimumsAcquired[] = "ls_minimumsAcquired";
static constexpr const char kStretcherManaged[] = "ls_stretcherManaged";
public:
LabelStretcher(QObject *parent = 0);
void apply(QWidget *widget);
void setManaged(QWidget *w, bool managed = true);
void resized(QWidget *widget);

protected:
bool eventFilter(QObject * obj, QEvent * ev) override;

private:
void onLayout(QLayout *layout, const std::function<void(QWidget*)> &onWidget);
void setFont(QLayout *layout, const QFont &font);
void setFont(QWidget *widget, const QFont &font);
void setMinimumSize(QWidget *widget);
static int dSize(const QSizeF & inner, const QSizeF & outer);
qreal f(qreal fontSize, QWidget *widget);
qreal df(qreal fontSize, qreal dStep, QWidget *widget);
};

#endif // LABELSTRETCHER_H
2 changes: 1 addition & 1 deletion app/qtapp/rtknavi_qt/instrdlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -557,7 +557,7 @@ void InputStrDialog::showFtpOptionsDialog(int index, int opt)
//---------------------------------------------------------------------------
void InputStrDialog::updateEnable()
{
// (cBStream->currentIndex() == 4) -> Ffile stream
// (cBStream->currentIndex() == 4) -> File stream
int enaFile = (ui->cBStreamC1->isChecked() && (ui->cBStream1->currentIndex() == 4)) ||
(ui->cBStreamC2->isChecked() && (ui->cBStream2->currentIndex() == 4)) ||
(ui->cBStreamC3->isChecked() && (ui->cBStream3->currentIndex() == 4));
Expand Down
4 changes: 2 additions & 2 deletions app/qtapp/rtknavi_qt/markdlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ MarkDialog::MarkDialog(QWidget *parent)
ui->setupUi(this);

nMark = 1;
ui->lblMarker->setText(QString("%r=%1").arg(nMark, 3, 10, QLatin1Char('0')));
ui->lblMarker->setText(QStringLiteral("%r=%1").arg(nMark, 3, 10, QLatin1Char('0')));

connect(ui->btnKeyDlg, &QPushButton::clicked, this, &MarkDialog::showKeyDialog);
connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &MarkDialog::accept);
Expand All @@ -34,7 +34,7 @@ void MarkDialog::accept()
{
if (ui->cBMarkerNameC->isChecked()) {
nMark++;
ui->lblMarker->setText(QString("%r=%1").arg(nMark, 3, 10, QLatin1Char('0')));
ui->lblMarker->setText(QStringLiteral("%r=%1").arg(nMark, 3, 10, QLatin1Char('0')));
}

QDialog::accept();
Expand Down
Loading

0 comments on commit 56d0b49

Please sign in to comment.