diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 7134400d..918263d3 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -64,7 +64,7 @@ jobs: - name: Install Qt uses: jurplel/install-qt-action@v3 with: - version: 6.5.1 + version: 6.5.3 modules: qtwebsockets qtimageformats - name: macos install deps if: matrix.os == 'macos-latest' diff --git a/.github/workflows/tagged_master_release.yml b/.github/workflows/tagged_master_release.yml index e4706715..b6cc5626 100644 --- a/.github/workflows/tagged_master_release.yml +++ b/.github/workflows/tagged_master_release.yml @@ -19,7 +19,7 @@ jobs: - name: Install Qt uses: jurplel/install-qt-action@v3 with: - version: 6.5.1 + version: 6.5.3 modules: qtwebsockets qtimageformats - name: macos install deps if: matrix.os == 'macos-latest' diff --git a/CMakeLists.txt b/CMakeLists.txt index 686fa7ce..1d36c750 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,7 @@ if(DEFINED ENV{Qt6_DIR}) list(INSERT CMAKE_PREFIX_PATH 0 $ENV{Qt6_DIR}) endif() -set(AGAVE_QT_VERSION 6.5.1) +set(AGAVE_QT_VERSION 6.5.3) if(WIN32) set(GUESS_Qt6_DIR C:/Qt/${AGAVE_QT_VERSION}/msvc2019_64 CACHE STRING "Qt6 directory") @@ -137,12 +137,12 @@ CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/CMake/conf.py.cmake ${CMAKE_SOURCE_DIR}/docs/ # ##################### # CPack # ##################### -find_package(Qt6QTiffPlugin 6.5.1 REQUIRED PATHS ${Qt6Gui_DIR}) +find_package(Qt6QTiffPlugin 6.5.3 REQUIRED PATHS ${Qt6Gui_DIR}) # copy all dlls into place. if(WIN32) - # find_package(Qt6QWindowsIntegrationPlugin 6.5.1 REQUIRED PATHS ${Qt6Gui_DIR}) - # find_package(Qt6QWindowsVistaStylePlugin 6.5.1 REQUIRED PATHS ${Qt6Gui_DIR}) + # find_package(Qt6QWindowsIntegrationPlugin 6.5.3 REQUIRED PATHS ${Qt6Gui_DIR}) + # find_package(Qt6QWindowsVistaStylePlugin 6.5.3 REQUIRED PATHS ${Qt6Gui_DIR}) # assuming vcpkg has done some work already to get dlls in here install( @@ -212,8 +212,8 @@ if(WIN32) # ############### elseif(APPLE) - find_package(Qt6QCocoaIntegrationPlugin 6.5.1 REQUIRED PATHS ${Qt6Gui_DIR}) - find_package(Qt6QMacStylePlugin 6.5.1 REQUIRED PATHS ${Qt6Widgets_DIR}) + find_package(Qt6QCocoaIntegrationPlugin 6.5.3 REQUIRED PATHS ${Qt6Gui_DIR}) + find_package(Qt6QMacStylePlugin 6.5.3 REQUIRED PATHS ${Qt6Widgets_DIR}) # ############### set(PACKAGE_OSX_TARGET ${CMAKE_OSX_DEPLOYMENT_TARGET}) @@ -305,7 +305,7 @@ elseif(APPLE) include(CPack) else() # Linux - find_package(Qt6QXcbIntegrationPlugin 6.5.1 REQUIRED PATHS ${Qt6Gui_DIR}) + find_package(Qt6QXcbIntegrationPlugin 6.5.3 REQUIRED PATHS ${Qt6Gui_DIR}) install(FILES ${PROJECT_SOURCE_DIR}/LICENSE.txt diff --git a/Dockerfile b/Dockerfile index c414b81e..3a7e9588 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,7 +45,7 @@ RUN apt-get install -y python3-pip RUN pip3 install --upgrade pip # get Qt installed -ENV QT_VERSION=6.5.1 +ENV QT_VERSION=6.5.3 RUN pip3 install aqtinstall RUN aqt install-qt --outputdir /qt linux desktop ${QT_VERSION} -m qtwebsockets qtimageformats # required for qt offscreen platform plugin diff --git a/README.md b/README.md index cdbff26d..8924cd2d 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,11 @@ git submodule update --init ``` ### For WINDOWS: + Make sure you are in an environment where vsvarsall has been run, e.g. a "VS2022 x64 Native Tools Command Prompt" **tensorstore** requires: + - Python 3.7 or later - CMake 3.24 or later - Perl, for building libaom from source (default). Must be in PATH. Not required if -DTENSORSTORE_USE_SYSTEM_LIBAOM=ON is specified. @@ -27,25 +29,28 @@ Make sure you are in an environment where vsvarsall has been run, e.g. a "VS2022 - GNU Patch or equivalent. Must be in PATH. A convenient way to install Perl, NASM, and GNU Patch is with chocolatey. + ``` choco install strawberryperl nasm patch ``` -**Install Qt LTS 6.5.1.** +**Install Qt LTS 6.5.3.** In your favorite Python virtual environment: ``` pip install aqtinstall -aqt install-qt --outputdir C:\Qt windows desktop 6.5.1 win64_msvc2019_64 -m qtwebsockets qtimageformats +aqt install-qt --outputdir C:\Qt windows desktop 6.5.3 win64_msvc2019_64 -m qtwebsockets qtimageformats ``` Use vcpkg (must use target triplet x64-windows) to install the following: + ``` vcpkg install spdlog glm zlib libjpeg-turbo liblzma tiff zstd --triplet x64-windows ``` **Build AGAVE** + ``` mkdir build cd build @@ -53,18 +58,19 @@ cd build cmake -DCMAKE_TOOLCHAIN_FILE=D:\vcpkg\scripts\buildsystems\vcpkg.cmake -G "Visual Studio 17 2022" -A x64 -DVCPKG_TARGET_TRIPLET=x64-windows .. cmake --build . ``` + You may need to adjust the vcpkg path depending on your configuration. If you encounter issues during your build, check that all of your dependencies are installed and try again. You can also build to the INSTALL target with Visual Studio by opening the project solution (`agave.sln`). - ### For MAC OS: (using homebrew) In your favorite Python virtual environment: + ``` pip install aqtinstall -aqt install-qt --outputdir ~/Qt mac desktop 6.5.1 -m qtwebsockets qtimageformats -export Qt6_DIR=~/Qt/6.5.1/macos +aqt install-qt --outputdir ~/Qt mac desktop 6.5.3 -m qtwebsockets qtimageformats +export Qt6_DIR=~/Qt/6.5.3/macos # and then: brew install spdlog glm libtiff @@ -79,15 +85,15 @@ sudo make install ### For LINUX: -Install Qt 6.5.1 in your directory of choice and tell the build where to find it. +Install Qt 6.5.3 in your directory of choice and tell the build where to find it. In your favorite Python virtual environment: ``` pip install aqtinstall -aqt install-qt --outputdir ~/Qt linux desktop 6.5.1 -m qtwebsockets qtimageformats +aqt install-qt --outputdir ~/Qt linux desktop 6.5.3 -m qtwebsockets qtimageformats # the next line is needed for CMake -export Qt6_DIR=~/Qt/6.5.1/gcc_64 +export Qt6_DIR=~/Qt/6.5.3/gcc_64 ``` - sudo apt install libtiff-dev diff --git a/agave_app/AppearanceSettingsWidget.cpp b/agave_app/AppearanceSettingsWidget.cpp index 919a4be9..d4b79eeb 100644 --- a/agave_app/AppearanceSettingsWidget.cpp +++ b/agave_app/AppearanceSettingsWidget.cpp @@ -621,8 +621,10 @@ QAppearanceSettingsWidget::QAppearanceSettingsWidget(QWidget* pParent, m_clipRoiSection->setContentLayout(*roiSectionLayout); m_MainLayout.addRow(m_clipRoiSection); - Section* section = createLightingControls(pLightRotationAction); + Section* section = createAreaLightingControls(pLightRotationAction); m_MainLayout.addRow(section); + Section* section2 = createSkyLightingControls(); + m_MainLayout.addRow(section2); QFrame* lineA = new QFrame(); lineA->setFrameShape(QFrame::HLine); @@ -637,16 +639,16 @@ QAppearanceSettingsWidget::QAppearanceSettingsWidget(QWidget* pParent, } Section* -QAppearanceSettingsWidget::createLightingControls(QAction* pLightRotationAction) +QAppearanceSettingsWidget::createAreaLightingControls(QAction* pLightRotationAction) { - Section* section = new Section("Lighting", 0); - auto* sectionLayout = Controls::createFormLayout(); + Section* section = new Section("Area Light", 0); + auto* sectionLayout = Controls::createMyFormLayout(); m_lt0gui.m_enableControlsCheckBox = new QCheckBox(); m_lt0gui.m_enableControlsCheckBox->setStatusTip( - tr("Show interactive controls in viewport for area light rotation angle")); + tr("Show interactive controls in viewport for area light rotation angle (or press R to toggle)")); m_lt0gui.m_enableControlsCheckBox->setToolTip( - tr("Show interactive controls in viewport for area light rotation angle")); + tr("Show interactive controls in viewport for area light rotation angle (or press R to toggle)")); sectionLayout->addRow("Viewport Controls", m_lt0gui.m_enableControlsCheckBox); QObject::connect(m_lt0gui.m_enableControlsCheckBox, &QCheckBox::clicked, pLightRotationAction, &QAction::trigger); QObject::connect(pLightRotationAction, &QAction::triggered, [this](bool toggled) { @@ -659,7 +661,7 @@ QAppearanceSettingsWidget::createLightingControls(QAction* pLightRotationAction) m_lt0gui.m_thetaSlider->setRange(0.0, TWO_PI_F); m_lt0gui.m_thetaSlider->setSingleStep(TWO_PI_F / 100.0); m_lt0gui.m_thetaSlider->setValue(0.0); - sectionLayout->addRow("AreaLight Theta", m_lt0gui.m_thetaSlider); + sectionLayout->addRow("Theta", m_lt0gui.m_thetaSlider); QObject::connect( m_lt0gui.m_thetaSlider, &QNumericSlider::valueChanged, this, &QAppearanceSettingsWidget::OnSetAreaLightTheta); @@ -669,7 +671,7 @@ QAppearanceSettingsWidget::createLightingControls(QAction* pLightRotationAction) m_lt0gui.m_phiSlider->setRange(0.0, PI_F); m_lt0gui.m_phiSlider->setSingleStep(PI_F / 100.0); m_lt0gui.m_phiSlider->setValue(HALF_PI_F); - sectionLayout->addRow("AreaLight Phi", m_lt0gui.m_phiSlider); + sectionLayout->addRow("Phi", m_lt0gui.m_phiSlider); QObject::connect( m_lt0gui.m_phiSlider, &QNumericSlider::valueChanged, this, &QAppearanceSettingsWidget::OnSetAreaLightPhi); @@ -679,17 +681,17 @@ QAppearanceSettingsWidget::createLightingControls(QAction* pLightRotationAction) m_lt0gui.m_sizeSlider->setRange(0.1, 5.0); m_lt0gui.m_sizeSlider->setSingleStep(5.0 / 100.0); m_lt0gui.m_sizeSlider->setValue(1.0); - sectionLayout->addRow("AreaLight Size", m_lt0gui.m_sizeSlider); + sectionLayout->addRow("Size", m_lt0gui.m_sizeSlider); QObject::connect( m_lt0gui.m_sizeSlider, &QNumericSlider::valueChanged, this, &QAppearanceSettingsWidget::OnSetAreaLightSize); m_lt0gui.m_distSlider = new QNumericSlider(); m_lt0gui.m_distSlider->setStatusTip(tr("Set distance for area light")); m_lt0gui.m_distSlider->setToolTip(tr("Set distance for area light")); - m_lt0gui.m_distSlider->setRange(0.1, 100.0); + m_lt0gui.m_distSlider->setRange(0.1, 10.0); m_lt0gui.m_distSlider->setSingleStep(1.0); m_lt0gui.m_distSlider->setValue(10.0); - sectionLayout->addRow("AreaLight Distance", m_lt0gui.m_distSlider); + sectionLayout->addRow("Distance", m_lt0gui.m_distSlider); QObject::connect( m_lt0gui.m_distSlider, &QNumericSlider::valueChanged, this, &QAppearanceSettingsWidget::OnSetAreaLightDistance); @@ -698,14 +700,16 @@ QAppearanceSettingsWidget::createLightingControls(QAction* pLightRotationAction) m_lt0gui.m_intensitySlider->setStatusTip(tr("Set intensity for area light")); m_lt0gui.m_intensitySlider->setToolTip(tr("Set intensity for area light")); m_lt0gui.m_intensitySlider->setRange(0.0, 1000.0); - m_lt0gui.m_intensitySlider->setSingleStep(1.0); + m_lt0gui.m_intensitySlider->setSingleStep(10.0); m_lt0gui.m_intensitySlider->setValue(100.0); + m_lt0gui.m_intensitySlider->setDecimals(1); arealightLayout->addWidget(m_lt0gui.m_intensitySlider, 1); m_lt0gui.m_areaLightColorButton = new QColorPushButton(); m_lt0gui.m_areaLightColorButton->setStatusTip(tr("Set color for area light")); m_lt0gui.m_areaLightColorButton->setToolTip(tr("Set color for area light")); - arealightLayout->addWidget(m_lt0gui.m_areaLightColorButton); - sectionLayout->addRow("AreaLight Intensity", arealightLayout); + arealightLayout->addWidget(m_lt0gui.m_areaLightColorButton, 0); + arealightLayout->setContentsMargins(0, 0, 0, 0); + sectionLayout->addRow("Intensity", arealightLayout); QObject::connect(m_lt0gui.m_areaLightColorButton, &QColorPushButton::currentColorChanged, [this](const QColor& c) { this->OnSetAreaLightColor(this->m_lt0gui.m_intensitySlider->value(), c); }); @@ -713,11 +717,15 @@ QAppearanceSettingsWidget::createLightingControls(QAction* pLightRotationAction) this->OnSetAreaLightColor(v, this->m_lt0gui.m_areaLightColorButton->GetColor()); }); - // separator - QFrame* line = new QFrame(); - line->setFrameShape(QFrame::HLine); - line->setFrameShadow(QFrame::Sunken); - sectionLayout->addRow(line); + section->setContentLayout(*sectionLayout); + return section; +} + +Section* +QAppearanceSettingsWidget::createSkyLightingControls() +{ + Section* section = new Section("Sky Light", 0); + auto* sectionLayout = Controls::createMyFormLayout(); auto* skylightTopLayout = new QHBoxLayout(); m_lt1gui.m_stintensitySlider = new QNumericSlider(); @@ -730,7 +738,7 @@ QAppearanceSettingsWidget::createLightingControls(QAction* pLightRotationAction) m_lt1gui.m_stColorButton->setStatusTip(tr("Set color for top of skylight sphere")); m_lt1gui.m_stColorButton->setToolTip(tr("Set color for top of skylight sphere")); skylightTopLayout->addWidget(m_lt1gui.m_stColorButton); - sectionLayout->addRow("SkyLight Top", skylightTopLayout); + sectionLayout->addRow("Top", skylightTopLayout); QObject::connect(m_lt1gui.m_stColorButton, &QColorPushButton::currentColorChanged, [this](const QColor& c) { this->OnSetSkyLightTopColor(this->m_lt1gui.m_stintensitySlider->value(), c); }); @@ -749,7 +757,7 @@ QAppearanceSettingsWidget::createLightingControls(QAction* pLightRotationAction) m_lt1gui.m_smColorButton->setStatusTip(tr("Set color for middle of skylight sphere")); m_lt1gui.m_smColorButton->setToolTip(tr("Set color for middle of skylight sphere")); skylightMidLayout->addWidget(m_lt1gui.m_smColorButton); - sectionLayout->addRow("SkyLight Mid", skylightMidLayout); + sectionLayout->addRow("Mid", skylightMidLayout); QObject::connect(m_lt1gui.m_smColorButton, &QColorPushButton::currentColorChanged, [this](const QColor& c) { this->OnSetSkyLightMidColor(this->m_lt1gui.m_smintensitySlider->value(), c); }); @@ -768,7 +776,7 @@ QAppearanceSettingsWidget::createLightingControls(QAction* pLightRotationAction) m_lt1gui.m_sbColorButton->setStatusTip(tr("Set color for bottom of skylight sphere")); m_lt1gui.m_sbColorButton->setToolTip(tr("Set color for bottom of skylight sphere")); skylightBotLayout->addWidget(m_lt1gui.m_sbColorButton); - sectionLayout->addRow("SkyLight Bot", skylightBotLayout); + sectionLayout->addRow("Bot", skylightBotLayout); QObject::connect(m_lt1gui.m_sbColorButton, &QColorPushButton::currentColorChanged, [this](const QColor& c) { this->OnSetSkyLightBotColor(this->m_lt1gui.m_sbintensitySlider->value(), c); }); @@ -1298,7 +1306,7 @@ QAppearanceSettingsWidget::onNewImage(Scene* scene) auto* fullLayout = new QVBoxLayout(); - auto* sectionLayout = Controls::createFormLayout(); + auto* sectionLayout = Controls::createMyFormLayout(); GradientWidget* editor = new GradientWidget(scene->m_volume->channel(i)->m_histogram, &scene->m_material.m_gradientData[i]); diff --git a/agave_app/AppearanceSettingsWidget.h b/agave_app/AppearanceSettingsWidget.h index 794c0ff9..49803f0d 100644 --- a/agave_app/AppearanceSettingsWidget.h +++ b/agave_app/AppearanceSettingsWidget.h @@ -126,6 +126,7 @@ public slots: QColorPushButton* m_sbColorButton; } m_lt1gui; - Section* createLightingControls(QAction* pLightRotationAction); + Section* createSkyLightingControls(); + Section* createAreaLightingControls(QAction* pLightRotationAction); void initLightingControls(Scene* scene); }; diff --git a/agave_app/Controls.cpp b/agave_app/Controls.cpp index 69e1945d..f3a24f23 100644 --- a/agave_app/Controls.cpp +++ b/agave_app/Controls.cpp @@ -1,6 +1,7 @@ #include "Controls.h" #include +#include #include #include #include @@ -8,11 +9,13 @@ QColorPushButton::QColorPushButton(QWidget* pParent) : QPushButton(pParent) - , m_Margin(5) + , m_Margin(4) , m_Radius(4) , m_Color(Qt::gray) { setText(""); + // deal with a macos style bug which causes this button to misalign in some situations + setAttribute(Qt::WA_LayoutUsesWidgetRect); } void @@ -246,12 +249,6 @@ QDoubleSlider::wheelEvent(QWheelEvent* event) QSlider::wheelEvent(event); } -QSize -QDoubleSpinner::sizeHint() const -{ - return QSize(50, 20); -} - QDoubleSpinner::QDoubleSpinner(QWidget* pParent /*= NULL*/) : QDoubleSpinBox(pParent) { @@ -287,14 +284,19 @@ QNumericSlider::QNumericSlider(QWidget* pParent /*= NULL*/) m_slider.setOrientation(Qt::Horizontal); m_slider.setFocusPolicy(Qt::StrongFocus); - m_spinner.setDecimals(4); + m_spinner.setDecimals(2); m_spinner.setFocusPolicy(Qt::StrongFocus); - // entire control is one single row. - // slider is 3/4, spinner is 1/4 of the width + m_slider.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); + m_spinner.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); + + // entire control is one single row. + // slider is 3/4, spinner is 1/4 of the width const int sliderratio = 4; - m_layout.addWidget(&m_slider, 0, 0, 1, sliderratio - 1); - m_layout.addWidget(&m_spinner, 0, sliderratio - 1, 1, 1); + m_layout.addWidget(&m_slider, 3, Qt::AlignVCenter); + m_layout.addWidget(&m_spinner, 1, Qt::AlignVCenter); + // m_layout.addWidget(&m_slider, 0, 0, 1, sliderratio - 1); + // m_layout.addWidget(&m_spinner, 0, sliderratio - 1, 1, 1); m_layout.setContentsMargins(0, 0, 0, 0); @@ -327,6 +329,12 @@ QNumericSlider::QNumericSlider(QWidget* pParent /*= NULL*/) QObject::connect(&m_slider, SIGNAL(valueChanged(double)), this, SLOT(OnValueChanged(double))); } +QSize +QNumericSlider::sizeHint() const +{ + return QSize(100, 20); +} + void QNumericSlider::OnValueChanged(double value) { @@ -510,3 +518,50 @@ QIntSlider::setTracking(bool enabled) { m_slider.setTracking(enabled); } + +void +MyFormLayout::addRow(const QString& label, QWidget* widget) +{ + int row = rowCount(); + auto* labelWidget = new QLabel(label); + labelWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + addWidget(labelWidget, row, 0, Qt::AlignLeft); + addWidget(widget, row, 1); +} + +void +MyFormLayout::addRow(const QString& label, QLayout* layout) +{ + int row = rowCount(); + auto* labelWidget = new QLabel(label); + labelWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + addWidget(labelWidget, row, 0, Qt::AlignLeft); + addLayout(layout, row, 1); +} + +QFormLayout* +Controls::createFormLayout(QWidget* parent) +{ + QFormLayout* layout = new QFormLayout(parent); + initFormLayout(*layout); + return layout; +} + +void +Controls::initFormLayout(QFormLayout& layout) +{ + layout.setRowWrapPolicy(QFormLayout::DontWrapRows); + layout.setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); + layout.setFormAlignment(Qt::AlignHCenter | Qt::AlignTop); + layout.setLabelAlignment(Qt::AlignRight); +} + +MyFormLayout* +Controls::createMyFormLayout(QWidget* parent) +{ + MyFormLayout* layout = new MyFormLayout(parent); + // basically keep the label column a fixed width and let the widget column grow + layout->setColumnStretch(0, 1); + layout->setColumnStretch(1, 100); + return layout; +} diff --git a/agave_app/Controls.h b/agave_app/Controls.h index c74c417f..756c0ce9 100644 --- a/agave_app/Controls.h +++ b/agave_app/Controls.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -110,7 +111,6 @@ class QDoubleSpinner : public QDoubleSpinBox public: QDoubleSpinner(QWidget* pParent = NULL); - virtual QSize sizeHint() const; void setValue(double Value, bool BlockSignals = false); protected: @@ -123,6 +123,8 @@ class QNumericSlider : public QWidget public: QNumericSlider(QWidget* pParent = NULL); + virtual QSize sizeHint() const; + double value(void) const; void setValue(double value, bool BlockSignals = false); void setRange(double rmin, double rmax); @@ -139,7 +141,7 @@ private slots: void valueChanged(double value); private: - QGridLayout m_layout; + QHBoxLayout m_layout; QDoubleSpinner m_spinner; QDoubleSlider m_slider; }; @@ -191,22 +193,25 @@ private slots: QSlider m_slider; }; -class Controls +class MyFormLayout : public QGridLayout { + Q_OBJECT public: - static QFormLayout* createFormLayout(QWidget* parent = nullptr) - { - QFormLayout* layout = new QFormLayout(parent); - initFormLayout(*layout); - return layout; - } - static void initFormLayout(QFormLayout& layout) + MyFormLayout(QWidget* parent = nullptr) + : QGridLayout(parent) { - layout.setRowWrapPolicy(QFormLayout::DontWrapRows); - layout.setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); - layout.setFormAlignment(Qt::AlignLeft | Qt::AlignTop); - layout.setLabelAlignment(Qt::AlignLeft); } + void addRow(const QString& label, QWidget* widget); + void addRow(const QString& label, QLayout* layout); +}; + +class Controls +{ +public: + static QFormLayout* createFormLayout(QWidget* parent = nullptr); + static void initFormLayout(QFormLayout& layout); + + static MyFormLayout* createMyFormLayout(QWidget* parent = nullptr); }; /** diff --git a/agave_app/agaveGui.cpp b/agave_app/agaveGui.cpp index f4ea0d10..15b5041d 100644 --- a/agave_app/agaveGui.cpp +++ b/agave_app/agaveGui.cpp @@ -76,7 +76,13 @@ agaveGui::agaveGui(QWidget* parent) m_appScene.initLights(); - resize(1280, 720); + // find a nice size to init agave + QScreen* screen = QApplication::primaryScreen(); + QRect screenGeometry = screen->geometry(); + int height = screenGeometry.height(); + int width = screenGeometry.width(); + resize(width * 0.8, height * 0.8); + // consider resizeDocks to widen the appearance dock } void diff --git a/agave_app/main.cpp b/agave_app/main.cpp index a2d26af3..8a031d00 100644 --- a/agave_app/main.cpp +++ b/agave_app/main.cpp @@ -97,6 +97,7 @@ main(int argc, char* argv[]) QApplication::setAttribute(Qt::AA_UseDesktopOpenGL); QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication::setStyle("fusion"); QApplication a(argc, argv); a.setOrganizationName("Allen Institute for Cell Science"); a.setOrganizationDomain("allencell.org"); diff --git a/agave_app/tfeditor/gradients.cpp b/agave_app/tfeditor/gradients.cpp index 78c1a3e1..acc8c672 100644 --- a/agave_app/tfeditor/gradients.cpp +++ b/agave_app/tfeditor/gradients.cpp @@ -371,7 +371,7 @@ GradientWidget::GradientWidget(const Histogram& histogram, GradientData* dataObj m_editor = new GradientEditor(m_histogram, this); mainGroupLayout->addWidget(m_editor); - auto* sectionLayout = Controls::createFormLayout(); + auto* sectionLayout = Controls::createMyFormLayout(); QButtonGroup* btnGroup = new QButtonGroup(this); QPushButton* windowLevelButton = new QPushButton("Wnd/Lvl"); @@ -425,19 +425,19 @@ GradientWidget::GradientWidget(const Histogram& histogram, GradientData* dataObj mainGroupLayout->addLayout(hbox); QWidget* firstPageWidget = new QWidget; - auto* section0Layout = Controls::createFormLayout(); + auto* section0Layout = Controls::createMyFormLayout(); firstPageWidget->setLayout(section0Layout); QWidget* secondPageWidget = new QWidget; - auto* section1Layout = Controls::createFormLayout(); + auto* section1Layout = Controls::createMyFormLayout(); secondPageWidget->setLayout(section1Layout); QWidget* thirdPageWidget = new QWidget; - auto* section2Layout = Controls::createFormLayout(); + auto* section2Layout = Controls::createMyFormLayout(); thirdPageWidget->setLayout(section2Layout); QWidget* fourthPageWidget = new QWidget; - auto* section3Layout = Controls::createFormLayout(); + auto* section3Layout = Controls::createMyFormLayout(); fourthPageWidget->setLayout(section3Layout); QStackedLayout* stackedLayout = new QStackedLayout(mainGroupLayout); @@ -475,7 +475,7 @@ GradientWidget::GradientWidget(const Histogram& histogram, GradientData* dataObj windowSlider->setToolTip(tr("Set size of range of intensities")); windowSlider->setRange(0.0, 1.0); windowSlider->setSingleStep(0.01); - + windowSlider->setDecimals(3); windowSlider->setValue(m_gradientData->m_window); section0Layout->addRow("Window", windowSlider); QNumericSlider* levelSlider = new QNumericSlider(); @@ -483,6 +483,7 @@ GradientWidget::GradientWidget(const Histogram& histogram, GradientData* dataObj levelSlider->setToolTip(tr("Set level of mid intensity")); levelSlider->setRange(0.0, 1.0); levelSlider->setSingleStep(0.01); + levelSlider->setDecimals(3); levelSlider->setValue(m_gradientData->m_level); section0Layout->addRow("Level", levelSlider); connect(windowSlider, &QNumericSlider::valueChanged, [this, levelSlider](double d) { @@ -499,6 +500,7 @@ GradientWidget::GradientWidget(const Histogram& histogram, GradientData* dataObj isovalueSlider->setToolTip(tr("Set Isovalue")); isovalueSlider->setRange(0.0, 1.0); isovalueSlider->setSingleStep(0.01); + isovalueSlider->setDecimals(3); isovalueSlider->setValue(m_gradientData->m_isovalue); section1Layout->addRow("Isovalue", isovalueSlider); QNumericSlider* isorangeSlider = new QNumericSlider(); @@ -506,6 +508,7 @@ GradientWidget::GradientWidget(const Histogram& histogram, GradientData* dataObj isorangeSlider->setToolTip(tr("Set range above and below isovalue")); isorangeSlider->setRange(0.0, 1.0); isorangeSlider->setSingleStep(0.01); + isorangeSlider->setDecimals(3); isorangeSlider->setValue(m_gradientData->m_isorange); section1Layout->addRow("Iso-range", isorangeSlider); connect(isovalueSlider, &QNumericSlider::valueChanged, [this, isorangeSlider](double d) { @@ -522,6 +525,7 @@ GradientWidget::GradientWidget(const Histogram& histogram, GradientData* dataObj pctLowSlider->setToolTip(tr("Set bottom percentile")); pctLowSlider->setRange(0.0, 1.0); pctLowSlider->setSingleStep(0.01); + pctLowSlider->setDecimals(3); pctLowSlider->setValue(m_gradientData->m_pctLow); section2Layout->addRow("Pct Min", pctLowSlider); QNumericSlider* pctHighSlider = new QNumericSlider(); @@ -529,6 +533,7 @@ GradientWidget::GradientWidget(const Histogram& histogram, GradientData* dataObj pctHighSlider->setToolTip(tr("Set top percentile")); pctHighSlider->setRange(0.0, 1.0); pctHighSlider->setSingleStep(0.01); + pctHighSlider->setDecimals(3); pctHighSlider->setValue(m_gradientData->m_pctHigh); section2Layout->addRow("Pct Max", pctHighSlider); connect(pctLowSlider, &QNumericSlider::valueChanged, [this, pctHighSlider](double d) { diff --git a/renderlib/graphics/RenderGLPT.cpp b/renderlib/graphics/RenderGLPT.cpp index ad5d70cd..603341a0 100644 --- a/renderlib/graphics/RenderGLPT.cpp +++ b/renderlib/graphics/RenderGLPT.cpp @@ -489,7 +489,6 @@ RenderGLPT::resize(uint32_t w, uint32_t h) } initFB(w, h); - LOG_DEBUG << "Resized window to " << w << " x " << h; m_w = w; m_h = h;