Skip to content

Commit 360959c

Browse files
authored
Merge pull request #58 from ChrisHal/improvements
Improvements
2 parents bff83d1 + 9014966 commit 360959c

22 files changed

+221
-101
lines changed

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 3.16)
22
project(QtPMbrowser VERSION 2.4.3 LANGUAGES CXX)
3-
set(MY_COPYRIGHT "2020 - 2024 Christian R. Halaszovich")
3+
set(MY_COPYRIGHT "2020 - 2025 Christian R. Halaszovich")
44
set(LINUX_RELEASE_DESCRIPTION "<p>This is a bugfix release.</p>")
55

66
set(CMAKE_CXX_STANDARD 20)

QtPMbrowser/DlgGraphSettings.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2020 - 2022 Christian R. Halaszovich
2+
Copyright 2020 - 2022, 2025 Christian R. Halaszovich
33
44
This file is part of PMbrowser.
55

QtPMbrowser/DlgGraphSettings.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2020 -2022 Christian R. Halaszovich
2+
Copyright 2020 -2022, 2025 Christian R. Halaszovich
33
44
This file is part of PMbrowser.
55

QtPMbrowser/DlgPreferences.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ DlgPreferences::DlgPreferences(QWidget *parent)
3636
else ui->radioButtonCustomExt->setChecked(true);
3737
ui->lineEditVmon->setText(settings.value("Vmon", "Vmon").toString());
3838
ui->lineEditImon->setText(settings.value("Imon", "Imon").toString());
39+
ui->checkBoxSysLocale->setChecked(!settings.value("use_C_locale", false).toBool());
3940

4041
settings.endGroup();
4142
}
@@ -56,6 +57,7 @@ void DlgPreferences::accept()
5657
settings.setValue("selectionButton", selection);
5758
settings.setValue("Vmon", ui->lineEditVmon->text());
5859
settings.setValue("Imon", ui->lineEditImon->text());
60+
settings.setValue("use_C_locale", !ui->checkBoxSysLocale->isChecked());
5961
settings.endGroup();
6062
switch (selection) {
6163
case 0:

QtPMbrowser/DlgPreferences.ui

+31-24
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<x>0</x>
88
<y>0</y>
99
<width>453</width>
10-
<height>321</height>
10+
<height>360</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
@@ -17,29 +17,6 @@
1717
<locale language="English" country="UnitedStates"/>
1818
</property>
1919
<layout class="QGridLayout" name="gridLayout">
20-
<item row="2" column="0" colspan="3">
21-
<spacer name="verticalSpacer">
22-
<property name="orientation">
23-
<enum>Qt::Orientation::Vertical</enum>
24-
</property>
25-
<property name="sizeHint" stdset="0">
26-
<size>
27-
<width>20</width>
28-
<height>40</height>
29-
</size>
30-
</property>
31-
</spacer>
32-
</item>
33-
<item row="0" column="2">
34-
<widget class="QDialogButtonBox" name="buttonBox">
35-
<property name="orientation">
36-
<enum>Qt::Orientation::Vertical</enum>
37-
</property>
38-
<property name="standardButtons">
39-
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
40-
</property>
41-
</widget>
42-
</item>
4320
<item row="0" column="1">
4421
<widget class="QGroupBox" name="groupBox">
4522
<property name="title">
@@ -128,6 +105,36 @@
128105
</layout>
129106
</widget>
130107
</item>
108+
<item row="2" column="0" colspan="3">
109+
<spacer name="verticalSpacer">
110+
<property name="orientation">
111+
<enum>Qt::Orientation::Vertical</enum>
112+
</property>
113+
<property name="sizeHint" stdset="0">
114+
<size>
115+
<width>20</width>
116+
<height>40</height>
117+
</size>
118+
</property>
119+
</spacer>
120+
</item>
121+
<item row="0" column="2">
122+
<widget class="QDialogButtonBox" name="buttonBox">
123+
<property name="orientation">
124+
<enum>Qt::Orientation::Vertical</enum>
125+
</property>
126+
<property name="standardButtons">
127+
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
128+
</property>
129+
</widget>
130+
</item>
131+
<item row="1" column="1">
132+
<widget class="QCheckBox" name="checkBoxSysLocale">
133+
<property name="text">
134+
<string>Use System Locale (takes effect only after re-start!)</string>
135+
</property>
136+
</widget>
137+
</item>
131138
</layout>
132139
</widget>
133140
<resources/>

QtPMbrowser/main.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2020 - 2022 Christian R. Halaszovich
2+
Copyright 2020 - 2025 Christian R. Halaszovich
33
44
This file is part of PMbrowser.
55
@@ -17,9 +17,11 @@
1717
along with PMbrowser. If not, see <https://www.gnu.org/licenses/>.
1818
*/
1919

20+
#include <locale>
2021
#include "pmbrowserwindow.h"
2122
#include <QApplication>
2223
#include <QSettings>
24+
#include <QDebug>
2325

2426
int main(int argc, char *argv[])
2527
{
@@ -30,6 +32,17 @@ int main(int argc, char *argv[])
3032
QCoreApplication::setApplicationName("PM browser");
3133
QSettings::setDefaultFormat(QSettings::IniFormat);
3234
QApplication::setWindowIcon(QIcon(QString(":/myappico.ico"))); // sets icon in OS X dock
35+
36+
{
37+
QSettings settings;
38+
const bool use_C_locale = settings.value("Preferences/use_C_locale", false).toBool();
39+
if (use_C_locale) {
40+
QLocale::setDefault(QLocale::c());
41+
}
42+
QLocale loc;
43+
std::locale::global(std::locale(loc.name().toUtf8()));
44+
qDebug() << std::locale().name();
45+
}
3346
PMbrowserWindow w;
3447
w.show();
3548
if (argc > 1) {

QtPMbrowser/pmbrowserwindow.cpp

+12-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2020 - 2024 Christian R. Halaszovich
2+
Copyright 2020 - 2025 Christian R. Halaszovich
33
44
This file is part of PMbrowser.
55
@@ -111,7 +111,7 @@ void PMbrowserWindow::populateTreeView()
111111
tree->expandAll();
112112
}
113113

114-
void PMbrowserWindow::traceSelected(QTreeWidgetItem* item, hkTreeNode* trace)
114+
void PMbrowserWindow::traceSelected(const QTreeWidgetItem* item, const hkTreeNode* trace)
115115
{
116116
(void)item;
117117
int indextrace = trace->extractInt32(TrTraceID);
@@ -129,7 +129,7 @@ void PMbrowserWindow::traceSelected(QTreeWidgetItem* item, hkTreeNode* trace)
129129

130130
// keep the following, since here we format it more nicely, with correct name and units
131131
// this is beyond what PMparmaters can do right now.
132-
QString info = QString("%1=%2 %3").arg(prefix).arg(holding).arg(QLatin1StringView(yunit));
132+
QString info = QString("%1=%L2 %3").arg(prefix).arg(holding).arg(QLatin1StringView(yunit));
133133
std::string str;
134134
formatParamListPrint(*trace, parametersTrace, str);
135135
info.append("\n");
@@ -138,7 +138,7 @@ void PMbrowserWindow::traceSelected(QTreeWidgetItem* item, hkTreeNode* trace)
138138
ui->renderArea->renderTrace(trace, this->infile);
139139
}
140140

141-
void PMbrowserWindow::collectChildTraces(QTreeWidgetItem* item, int level, std::vector<hkTreeNode*>& trace_list)
141+
void PMbrowserWindow::collectChildTraces(const QTreeWidgetItem* item, int level, std::vector<hkTreeNode*>& trace_list)
142142
{
143143
if (!item->isHidden()) {
144144
if (level < hkTreeNode::LevelTrace) {
@@ -180,7 +180,7 @@ void PMbrowserWindow::animateTraceList(const QString& info_text, const std::vect
180180
progress.setValue(num_traces);
181181
}
182182

183-
static hkLib::hkTreeNode* item2node(QTreeWidgetItem* item)
183+
static const hkLib::hkTreeNode* item2node(const QTreeWidgetItem* item)
184184
{
185185
return item->data(0, Qt::UserRole).value<hkTreeNode*>();
186186
}
@@ -228,7 +228,7 @@ hkLib::hkTreeView PMbrowserWindow::getVisibleNodes()
228228
return tree;
229229
}
230230

231-
void PMbrowserWindow::sweepSelected(QTreeWidgetItem* item, hkTreeNode* sweep) {
231+
void PMbrowserWindow::sweepSelected(const QTreeWidgetItem* item, const hkTreeNode* sweep) {
232232
(void)item;
233233
QString txt = MakeSweepLabel(*sweep) + '\n';
234234
std::string str;
@@ -239,7 +239,7 @@ void PMbrowserWindow::sweepSelected(QTreeWidgetItem* item, hkTreeNode* sweep) {
239239
ui->textEdit->append(txt);
240240
}
241241

242-
void PMbrowserWindow::seriesSelected(QTreeWidgetItem* item, hkTreeNode* series)
242+
void PMbrowserWindow::seriesSelected(const QTreeWidgetItem* item, const hkTreeNode* series)
243243
{
244244
(void)item;
245245
QString label = qs_from_sv(series->getString(SeLabel));
@@ -252,7 +252,7 @@ void PMbrowserWindow::seriesSelected(QTreeWidgetItem* item, hkTreeNode* series)
252252
ui->textEdit->append(txt);
253253
}
254254

255-
void PMbrowserWindow::groupSelected(QTreeWidgetItem* item, hkTreeNode* group)
255+
void PMbrowserWindow::groupSelected(const QTreeWidgetItem* item, const hkTreeNode* group)
256256
{
257257
(void)item;
258258
QString label = qs_from_sv(group->getString(GrLabel));
@@ -803,7 +803,8 @@ void PMbrowserWindow::on_actionExport_Metadata_as_Table_triggered()
803803
try {
804804
hkLib::locale_manager lm;
805805
if (dlg.useSystemLocale()) {
806-
lm.setLocale(""); // set default locale
806+
// for macOS, we need to jump to some hoops
807+
lm.setLocale(QLocale::system().name().toUtf8());
807808
}
808809
else {
809810
lm.setLocale("C");
@@ -1009,12 +1010,12 @@ void PMbrowserWindow::on_actionSelect_Parameters_triggered()
10091010
}
10101011
}
10111012

1012-
void ::PMbrowserWindow::printAllParameters(QTreeWidgetItem* item)
1013+
void ::PMbrowserWindow::printAllParameters(const QTreeWidgetItem* item)
10131014
{
10141015
printAllParameters(item->data(0, Qt::UserRole).value<hkTreeNode*>());
10151016
}
10161017

1017-
void ::PMbrowserWindow::printAllParameters(hkTreeNode* n)
1018+
void ::PMbrowserWindow::printAllParameters(const hkTreeNode* n)
10181019
{
10191020
std::string s;
10201021
QString lb;

QtPMbrowser/pmbrowserwindow.h

+7-7
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,15 @@ public slots:
7878
void loadFile() {loadFile(currentFile);};
7979
void closeFile();
8080
void populateTreeView();
81-
void groupSelected(QTreeWidgetItem* item, hkLib::hkTreeNode* node);
82-
void seriesSelected(QTreeWidgetItem* item, hkLib::hkTreeNode* node);
83-
void sweepSelected(QTreeWidgetItem* item, hkLib::hkTreeNode* node);
84-
void traceSelected(QTreeWidgetItem* item, hkLib::hkTreeNode* trace);
85-
void collectChildTraces(QTreeWidgetItem* item, int level, std::vector<hkLib::hkTreeNode*>& trace_list);
81+
void groupSelected(const QTreeWidgetItem* item, const hkLib::hkTreeNode* node);
82+
void seriesSelected(const QTreeWidgetItem* item, const hkLib::hkTreeNode* node);
83+
void sweepSelected(const QTreeWidgetItem* item, const hkLib::hkTreeNode* node);
84+
void traceSelected(const QTreeWidgetItem* item, const hkLib::hkTreeNode* trace);
85+
void collectChildTraces(const QTreeWidgetItem* item, int level, std::vector<hkLib::hkTreeNode*>& trace_list);
8686
void animateTraceList(const QString& info_text, const std::vector<hkLib::hkTreeNode*>& trace_list);
8787
hkLib::hkTreeView getVisibleNodes();
88-
void printAllParameters(QTreeWidgetItem* item);
89-
void printAllParameters(hkLib::hkTreeNode* node);
88+
void printAllParameters(const QTreeWidgetItem* item);
89+
void printAllParameters(const hkLib::hkTreeNode* node);
9090
void printAmplifierState(const hkLib::hkTreeNode* series);
9191
void drawStimulus(const hkLib::hkTreeNode* sweep);
9292
void useStimAsX(const hkLib::hkTreeNode* sweep);

QtPMbrowser/renderarea.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2020 - 2022 Christian R. Halaszovich
2+
Copyright 2020 - 2022, 2025 Christian R. Halaszovich
33
44
This file is part of PMbrowser.
55
@@ -683,7 +683,7 @@ void RenderArea::zoomIn(double x_center, double y_center, double factor)
683683
update();
684684
}
685685

686-
void RenderArea::renderTrace(hkLib::hkTreeNode* TrRecord, std::istream& infile)
686+
void RenderArea::renderTrace(const hkLib::hkTreeNode* TrRecord, std::istream& infile)
687687
{
688688
using namespace hkLib;
689689
DisplayTrace newYtrace{};

QtPMbrowser/renderarea.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2020 - 2022 Christian R. Halaszovich
2+
Copyright 2020 - 2022, 2025 Christian R. Halaszovich
33
44
This file is part of PMbrowser.
55
@@ -48,7 +48,7 @@ class RenderArea : public QWidget
4848
explicit RenderArea(QWidget *parent = nullptr);
4949
~RenderArea();
5050
bool noData() { return !yTrace.isValid(); };
51-
void renderTrace(hkLib::hkTreeNode* trace, std::istream& infile);
51+
void renderTrace(const hkLib::hkTreeNode* trace, std::istream& infile);
5252
void addTrace(DisplayTrace&& dt);
5353

5454
/// <summary>

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# PMbrowser
2-
Copyright 2020 - 2024 Christian R. Halaszovich
2+
Copyright 2020 - 2025 Christian R. Halaszovich
33

44
Created using Qt under GPLv3.
55

demo/calc_mean.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
def getMeta(npy_filename):
77
json_filename=os.path.splitext(npy_filename)[0]+".json"
8-
with open(json_filename, "r", encoding='latin1') as f:
8+
with open(json_filename, "r", encoding='utf8') as f:
99
meta=json.load(f)
1010
return meta
1111

demo/calc_means.py

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# This Python file uses the following encoding: utf-8
2+
import os.path
3+
import sys
4+
import json
5+
import glob
6+
import numpy as np
7+
8+
def getMeta(npy_filename):
9+
json_filename=os.path.splitext(npy_filename)[0]+".json"
10+
with open(json_filename, "r", encoding='utf8') as f:
11+
meta=json.load(f)
12+
return meta
13+
14+
def getNpyBasename(npy_filename):
15+
return os.path.basename(os.path.splitext(npy_filename)[0])
16+
17+
class TraceKey:
18+
"""Key useable for sorting tracenames."""
19+
def __init__(self,npy_filename):
20+
c=getNpyBasename(npy_filename).split('_')
21+
self.prefix=c[0]
22+
self.group=int(c[1])
23+
self.series=int(c[2])
24+
self.sweep=int(c[3])
25+
self.trace=c[4]
26+
27+
def __lt__(self, other):
28+
if(self.prefix<other.prefix):
29+
return True
30+
if(self.prefix>other.prefix):
31+
return False
32+
if(self.group<other.group):
33+
return True
34+
if(self.group>other.group):
35+
return False
36+
if(self.series<other.series):
37+
return True
38+
if(self.series>other.series):
39+
return False
40+
if(self.sweep<other.sweep):
41+
return True
42+
if(self.sweep>other.sweep):
43+
return False
44+
if(self.trace<other.trace):
45+
return True
46+
return False
47+
48+
if __name__ == '__main__':
49+
if(len(sys.argv)<4):
50+
print("""
51+
usage: calc_mean <1st point> <last point> <file1>.npy [additional files ...]
52+
example: calc_mean 0 100 PM_1_1_1_Imon.npy
53+
""",file=sys.stderr)
54+
sys.exit(-1)
55+
p1=int(sys.argv[1])
56+
p2=int(sys.argv[2])
57+
filelist=[]
58+
for index in range(3,len(sys.argv)):
59+
filelist+=glob.glob(sys.argv[index])
60+
if(len(filelist)==0):
61+
print("no matching files found",file=sys.stderr)
62+
sys.exit(-1)
63+
filelist.sort(key=TraceKey)
64+
for npy_filename in filelist:
65+
basename=os.path.basename(os.path.splitext(npy_filename)[0])
66+
meta=getMeta(npy_filename)
67+
y_w=np.load(npy_filename)
68+
print(basename, meta['params']['sweep']['Rel. Sweep Time'], np.mean(y_w[p1:p2]), sep='\t')

demo/multiplot_traces.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
def getMeta(npy_filename):
88
json_filename=os.path.splitext(npy_filename)[0]+".json"
9-
with open(json_filename, "r", encoding='latin1') as f:
9+
with open(json_filename, "r", encoding='utf8') as f:
1010
meta=json.load(f)
1111
return meta
1212

0 commit comments

Comments
 (0)