Skip to content

Commit

Permalink
ENH: DICOM browser rework
Browse files Browse the repository at this point in the history
Huge performance and usability improvement of DICOM browser.

DICOM indexer:
- Implemented background indexing (in worker thread): indexing may take several minutes and it is not desirable to block the entire application for this long time
- Reduced indexing time by a factor of 3x (previously, inefficient database inserts, unnecessary queries, and table view updates slowed down the insertions)
DICOM browser:
- Removed popups from DICOM browser to not interfere with user workflow (questions, status updates, etc. are display in the browser layout)
- Do not block the GUI while importing data sets, provide continuous, detailed update about indexing progress
- Add separate displayed fields preset for DICOM query-retrieve database (this database is built without having access to the files, so less displayed fields can be computed)
- Condensed table headers in horizontal mode (one row can hold all the search/filter fields instead of using one for each)
- Set default sorting of columns (based on last insertion time, study date, and series number)
- Added option to show DICOM metadata (right-click menu)
- Added option to export datasets to file system (right-click menu)
DICOM database:
- Remove orphan empty directories after deleting files from the database
- Emit signals when the database is opened or closed
- Added display option for specifying column that is used for sorting by default
- Improved displayed field update speed by about a factor of 100x (batch execution is very slow on sqlite and individual queries in a transaction should be used instead)
DICOM query/retrieve:
- Fixed crash when query/retrieve was used from Python (where database cannot be passed to the Q/R widget as a shared pointer)
  • Loading branch information
Andras Lasso committed Oct 11, 2019
1 parent 35b1282 commit 7f2f24a
Show file tree
Hide file tree
Showing 31 changed files with 3,284 additions and 1,432 deletions.
6 changes: 3 additions & 3 deletions Applications/ctkDICOM/ctkDICOMMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,17 +57,17 @@ int main(int argc, char** argv)
if (argc > 1)
{
QString directory(argv[1]);
settings.setValue(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), directory);
settings.setValue("DatabaseDirectory", directory);
settings.sync();
}

if ( settings.value(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), "") == "" )
if ( settings.value("DatabaseDirectory", "") == "" )
{
databaseDirectory = QString("./ctkDICOM-Database");
std::cerr << "No DatabaseDirectory on command line or in settings. Using \"" << databaseDirectory.toLatin1().data() << "\".\n";
} else
{
databaseDirectory = settings.value(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), "").toString();
databaseDirectory = settings.value("DatabaseDirectory", "").toString();
}

QDir qdir(databaseDirectory);
Expand Down
33 changes: 4 additions & 29 deletions Applications/ctkDICOM2/ctkDICOM2Main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,39 +49,14 @@ int main(int argc, char** argv)
// set up Qt resource files
QResource::registerResource("./Resources/ctkDICOM.qrc");

QSettings settings;
QString databaseDirectory;

ctkDICOMBrowser DICOMApp;
DICOMApp.setDatabaseDirectorySettingsKey("DatabaseDirectory");
// set up the database
if (argc > 1)
{
QString directory(argv[1]);
settings.setValue(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), directory);
settings.sync();
}

if ( settings.value(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), "") == "" )
{
databaseDirectory = QString("./ctkDICOM-Database");
std::cerr << "No DatabaseDirectory on command line or in settings. Using \"" << databaseDirectory.toLatin1().data() << "\".\n";
} else
{
databaseDirectory = settings.value(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), "").toString();
DICOMApp.setDatabaseDirectory(argv[1]);
}

QDir qdir(databaseDirectory);
if ( !qdir.exists(databaseDirectory) )
{
if ( !qdir.mkpath(databaseDirectory) )
{
std::cerr << "Could not create database directory \"" << databaseDirectory.toLatin1().data() << "\".\n";
return EXIT_FAILURE;
}
}

ctkDICOMBrowser DICOMApp;

DICOMApp.setDatabaseDirectory(databaseDirectory);

DICOMApp.show();

return app.exec();
Expand Down
6 changes: 3 additions & 3 deletions Applications/ctkDICOMHost/ctkDICOMHostMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,17 +129,17 @@ int main(int argc, char** argv)
if (argc > 1)
{
QString directory(argv[1]);
settings.setValue(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), directory);
settings.setValue("DatabaseDirectory", directory);
settings.sync();
}

if ( settings.value(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), "") == "" )
if ( settings.value("DatabaseDirectory", "") == "" )
{
databaseDirectory = QString("./ctkDICOM-Database");
std::cerr << "No DatabaseDirectory on command line or in settings. Using \"" << databaseDirectory.toLatin1().data() << "\".\n";
} else
{
databaseDirectory = settings.value(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), "").toString();
databaseDirectory = settings.value("DatabaseDirectory", "").toString();
}

QDir qdir(databaseDirectory);
Expand Down
8 changes: 4 additions & 4 deletions Applications/ctkDICOMIndexer/ctkDICOMIndexerMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ int main(int argc, char** argv)
QCoreApplication app(argc, argv);
QTextStream out(stdout);

ctkDICOMIndexer idx;
ctkDICOMDatabase myCTK;

ctkDICOMIndexer idx;
idx.setDatabase(&myCTK);

try
{
Expand All @@ -73,11 +73,11 @@ int main(int argc, char** argv)
myCTK.openDatabase( argv[2] );
if (argc > 4)
{
idx.addDirectory(myCTK,argv[3],argv[4]);
idx.addDirectory(argv[3],argv[4]);
}
else
{
idx.addDirectory(myCTK,argv[3]);
idx.addDirectory(argv[3]);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,17 +57,17 @@ int main(int argc, char** argv)
if (argc > 1)
{
QString directory(argv[1]);
settings.setValue(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), directory);
settings.setValue("DatabaseDirectory", directory);
settings.sync();
}

if ( settings.value(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), "") == "" )
if ( settings.value("DatabaseDirectory", "") == "" )
{
databaseDirectory = QString("./ctkDICOM-Database");
std::cerr << "No DatabaseDirectory on command line or in settings. Using \"" << databaseDirectory.toLatin1().data() << "\".\n";
} else
{
databaseDirectory = settings.value(ctkDICOMBrowser::defaultDatabaseDirectorySettingsKey(), "").toString();
databaseDirectory = settings.value("DatabaseDirectory", "").toString();
}

QDir qdir(databaseDirectory);
Expand Down
1 change: 1 addition & 0 deletions Libs/DICOM/Core/Resources/ctkDICOMCore.qrc
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/dicom">
<file>dicom-schema.sql</file>
<file>dicom-qr-schema.sql</file>
</qresource>
</RCC>

Expand Down
149 changes: 149 additions & 0 deletions Libs/DICOM/Core/Resources/dicom-qr-schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
--
-- A simple SQLITE3 database schema for temporary storage of query responses
--
-- Note: the semicolon at the end is necessary for the simple parser to separate
-- the statements since the SQlite driver does not handle multiple
-- commands per QSqlQuery::exec call!
-- Note: be sure to update ctkDICOMDatabase and SchemaInfo Version
-- whenever you make a change to this schema
-- ;

DROP TABLE IF EXISTS 'SchemaInfo' ;
DROP TABLE IF EXISTS 'Images' ;
DROP TABLE IF EXISTS 'Patients' ;
DROP TABLE IF EXISTS 'Series' ;
DROP TABLE IF EXISTS 'Studies' ;
DROP TABLE IF EXISTS 'ColumnDisplayProperties' ;
DROP TABLE IF EXISTS 'Directories' ;

DROP INDEX IF EXISTS 'ImagesFilenameIndex' ;
DROP INDEX IF EXISTS 'ImagesSeriesIndex' ;
DROP INDEX IF EXISTS 'SeriesStudyIndex' ;
DROP INDEX IF EXISTS 'StudiesPatientIndex' ;

CREATE TABLE 'SchemaInfo' ( 'Version' VARCHAR(1024) NOT NULL );
INSERT INTO 'SchemaInfo' VALUES('0.6.2');

CREATE TABLE 'Images' (
'SOPInstanceUID' VARCHAR(64) NOT NULL,
'Filename' VARCHAR(1024) NOT NULL ,
'SeriesInstanceUID' VARCHAR(64) NOT NULL ,
'InsertTimestamp' VARCHAR(20) NOT NULL ,
'DisplayedFieldsUpdatedTimestamp' DATETIME NULL ,
PRIMARY KEY ('SOPInstanceUID') );
CREATE TABLE 'Patients' (
'UID' INTEGER PRIMARY KEY AUTOINCREMENT,
'PatientsName' VARCHAR(255) NULL ,
'PatientID' VARCHAR(255) NULL ,
'PatientsBirthDate' DATE NULL ,
'PatientsBirthTime' TIME NULL ,
'PatientsSex' VARCHAR(1) NULL ,
'PatientsAge' VARCHAR(10) NULL ,
'PatientsComments' VARCHAR(255) NULL ,
'InsertTimestamp' VARCHAR(20) NOT NULL ,
'DisplayedPatientsName' VARCHAR(255) NULL ,
'DisplayedNumberOfStudies' INT NULL ,
'DisplayedFieldsUpdatedTimestamp' DATETIME NULL );
CREATE TABLE 'Studies' (
'StudyInstanceUID' VARCHAR(64) NOT NULL ,
'PatientsUID' INT NOT NULL ,
'StudyID' VARCHAR(255) NULL ,
'StudyDate' DATE NULL ,
'StudyTime' VARCHAR(20) NULL ,
'StudyDescription' VARCHAR(255) NULL ,
'AccessionNumber' VARCHAR(255) NULL ,
'ModalitiesInStudy' VARCHAR(255) NULL ,
'InstitutionName' VARCHAR(255) NULL ,
'ReferringPhysician' VARCHAR(255) NULL ,
'PerformingPhysiciansName' VARCHAR(255) NULL ,
'InsertTimestamp' VARCHAR(20) NOT NULL ,
'DisplayedNumberOfSeries' INT NULL ,
'DisplayedFieldsUpdatedTimestamp' DATETIME NULL ,
PRIMARY KEY ('StudyInstanceUID') );
CREATE TABLE 'Series' (
'SeriesInstanceUID' VARCHAR(64) NOT NULL ,
'StudyInstanceUID' VARCHAR(64) NOT NULL ,
'SeriesNumber' INT NULL ,
'SeriesDate' DATE NULL ,
'SeriesTime' VARCHAR(20) NULL ,
'SeriesDescription' VARCHAR(255) NULL ,
'Modality' VARCHAR(20) NULL ,
'BodyPartExamined' VARCHAR(255) NULL ,
'FrameOfReferenceUID' VARCHAR(64) NULL ,
'AcquisitionNumber' INT NULL ,
'ContrastAgent' VARCHAR(255) NULL ,
'ScanningSequence' VARCHAR(45) NULL ,
'EchoNumber' INT NULL ,
'TemporalPosition' INT NULL ,
'InsertTimestamp' VARCHAR(20) NOT NULL ,
'DisplayedCount' INT NULL ,
'DisplayedSize' VARCHAR(20) NULL ,
'DisplayedNumberOfFrames' INT NULL ,
'DisplayedFieldsUpdatedTimestamp' DATETIME NULL ,
PRIMARY KEY ('SeriesInstanceUID') );

CREATE UNIQUE INDEX IF NOT EXISTS 'ImagesFilenameIndex' ON 'Images' ('Filename');
CREATE INDEX IF NOT EXISTS 'ImagesSeriesIndex' ON 'Images' ('SeriesInstanceUID');
CREATE INDEX IF NOT EXISTS 'SeriesStudyIndex' ON 'Series' ('StudyInstanceUID');
CREATE INDEX IF NOT EXISTS 'StudiesPatientIndex' ON 'Studies' ('PatientsUID');

CREATE TABLE 'Directories' (
'Dirname' VARCHAR(1024) ,
PRIMARY KEY ('Dirname') );

CREATE TABLE 'ColumnDisplayProperties' (
'TableName' VARCHAR(64) NOT NULL,
'FieldName' VARCHAR(64) NOT NULL ,
'DisplayedName' VARCHAR(255) NULL ,
'Visibility' INT NULL DEFAULT 1 ,
'Weight' INT NULL ,
'Format' VARCHAR(255) NULL ,
PRIMARY KEY ('TableName', 'FieldName') );

INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'UID', '', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'PatientsName', 'Patient name', 1, 0, '{"sort": "ascending", "resizeMode":"stretch"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'PatientID', 'Patient ID', 1, 1, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'PatientsBirthDate', 'Birth date', 1, 2, '{"resizeMode":"resizeToContents"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'PatientsBirthTime', 'Birth time', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'PatientsSex', 'Sex', 1, 3, '{"resizeMode":"resizeToContents"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'PatientsAge', 'Age', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'PatientsComments', 'Comments', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'InsertTimestamp', 'Date added', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'DisplayedPatientsName', 'Patient name', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'DisplayedNumberOfStudies', 'Studies', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'DisplayedFieldsUpdatedTimestamp', '', 0, 0, '');

INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyInstanceUID', '', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'PatientsUID', '', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyID', 'Study ID', 1, 2, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyDate', 'Study date', 1, 1, '{"resizeMode":"resizeToContents", "sort": "ascending"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyTime', 'Study time', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyDescription', 'Study description', 1, 3, '{"resizeMode":"stretch"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'AccessionNumber', 'Accession #', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'ModalitiesInStudy', 'Modalities', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'InstitutionName', 'Institution', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'ReferringPhysician', 'Referring physician', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'PerformingPhysiciansName', 'Performing physician', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'InsertTimestamp', 'Date added', 0, 5, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'DisplayedNumberOfSeries', 'Series', 0, 4, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'DisplayedFieldsUpdatedTimestamp', '', 0, 0, '');

INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'SeriesInstanceUID', '', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'StudyInstanceUID', '', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'SeriesNumber', 'Series #', 1, 0, '{"resizeMode":"resizeToContents", "sort": "ascending"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'SeriesDate', 'Series date', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'SeriesTime', 'Series time', 1, 3, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'SeriesDescription', 'Series description', 1, 2, '{"resizeMode":"stretch"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'Modality', 'Modality', 1, 1, '{"resizeMode":"resizeToContents"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'BodyPartExamined', 'Body part', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'FrameOfReferenceUID', '', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'AcquisitionNumber', 'Acquisition #', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'ContrastAgent', 'Contrast agent', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'ScanningSequence', 'Scanning sequence', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'EchoNumber', 'Echo #', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'TemporalPosition', 'Temporal position', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'InsertTimestamp', 'Date added', 0, 6, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'DisplayedSize', 'Size', 0, 4, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'DisplayedCount', 'Count', 0, 5, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'DisplayedNumberOfFrames', 'Number of frames', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'DisplayedFieldsUpdatedTimestamp', '', 0, 0, '');
12 changes: 6 additions & 6 deletions Libs/DICOM/Core/Resources/dicom-schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -108,15 +108,15 @@ INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'PatientsBirthTime',
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'PatientsSex', 'Sex', 1, 4, '{"resizeMode":"resizeToContents"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'PatientsAge', 'Age', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'PatientsComments', 'Comments', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'InsertTimestamp', 'Date added', 1, 6, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'InsertTimestamp', 'Date added', 1, 6, '{"sort": "descending"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'DisplayedPatientsName', 'Patient name', 1, 1, '{"resizeMode":"stretch"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'DisplayedNumberOfStudies', 'Studies', 1, 5, '{"resizeMode":"resizeToContents"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Patients', 'DisplayedFieldsUpdatedTimestamp', '', 0, 0, '');

INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyInstanceUID', '', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'PatientsUID', '', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyID', 'Study ID', 1, 1, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyDate', 'Study date', 1, 2, '{"resizeMode":"resizeToContents"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyID', 'Study ID', 1, 2, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyDate', 'Study date', 1, 1, '{"resizeMode":"resizeToContents", "sort": "ascending"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyTime', 'Study time', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'StudyDescription', 'Study description', 1, 3, '{"resizeMode":"stretch"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'AccessionNumber', 'Accession #', 0, 0, '');
Expand All @@ -130,7 +130,7 @@ INSERT INTO 'ColumnDisplayProperties' VALUES('Studies', 'DisplayedFieldsUpdated

INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'SeriesInstanceUID', '', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'StudyInstanceUID', '', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'SeriesNumber', 'Series #', 1, 1, '{"resizeMode":"resizeToContents"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'SeriesNumber', 'Series #', 1, 1, '{"resizeMode":"resizeToContents", "sort": "ascending"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'SeriesDate', 'Series date', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'SeriesTime', 'Series time', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'SeriesDescription', 'Series description', 1, 2, '{"resizeMode":"stretch"}');
Expand All @@ -143,7 +143,7 @@ INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'ScanningSequence',
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'EchoNumber', 'Echo #', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'TemporalPosition', 'Temporal position', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'InsertTimestamp', 'Date added', 1, 6, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'DisplayedCount', 'Count', 1, 4, '{"resizeMode":"resizeToContents"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'DisplayedSize', 'Size', 1, 5, '{"resizeMode":"resizeToContents"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'DisplayedSize', 'Size', 1, 4, '{"resizeMode":"resizeToContents"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'DisplayedCount', 'Count', 1, 5, '{"resizeMode":"resizeToContents"}');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'DisplayedNumberOfFrames', 'Number of frames', 0, 0, '');
INSERT INTO 'ColumnDisplayProperties' VALUES('Series', 'DisplayedFieldsUpdatedTimestamp', '', 0, 0, '');
Loading

0 comments on commit 7f2f24a

Please sign in to comment.