Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
9bf0605
Fix potential race condition in CMake/GTest.
luciansmith Jul 28, 2026
894aadd
Update version number.
luciansmith Jul 28, 2026
e11d443
The dependencies for CI/CD build are now downloaded from the dedicate…
adelhpour Jul 30, 2026
ec3a794
The dependencies for CI/CD build are now downloaded from the dedicate…
adelhpour Jul 30, 2026
f4f9e6c
Merge branch 'develop' into update-ci-cd-workflow
adelhpour Jul 30, 2026
2bbb4f7
Revert "The dependencies for CI/CD build are now downloaded from the …
adelhpour Jul 30, 2026
9010a4e
Merge pull request #164 from sys-bio/update-version-3-2-0
luciansmith Jul 31, 2026
634d0ed
Add new functions to API, at Herbert's request.
luciansmith Jul 31, 2026
6cc155b
Fix warnings; add error messages.
luciansmith Jul 31, 2026
8b2cd91
Update workflows.
luciansmith Jul 31, 2026
7a5e014
Merge pull request #165 from sys-bio/supplement-api
luciansmith Aug 1, 2026
8e41a02
Add capabilities that the test suite revealed:
luciansmith Aug 4, 2026
8ab0801
Add species conversion factors.
luciansmith Aug 4, 2026
9341625
Add test files.
luciansmith Aug 4, 2026
038a9a5
add a debug line for CI/CD
adelhpour Aug 4, 2026
6ec718a
Merge branch 'develop' into update-ci-cd-workflow
adelhpour Aug 4, 2026
29f7354
fix the issue with CI/CD unzipping the deps
adelhpour Aug 4, 2026
eb45fed
fix mistakenly changed lines of CI/CD
adelhpour Aug 4, 2026
64fa4cb
fix mistakenly changed lines of CI/CD
adelhpour Aug 4, 2026
908b8d5
Add model conversion factor.
luciansmith Aug 4, 2026
071c3fb
Add test for correctly flattening function definitions.
luciansmith Aug 4, 2026
d42bc01
Handle SBML Level 1 'denominator' attribute on speciesRef.
luciansmith Aug 4, 2026
3362638
Update libsbml, which should fix functionDefinition bug.
luciansmith Aug 4, 2026
501180d
Add new test CI that roundtrips test suite models and checks results …
luciansmith Aug 4, 2026
6324b30
Update main.yml
luciansmith Aug 4, 2026
b52def9
Merge pull request #166 from sys-bio/cover-test-suite-gaps
luciansmith Aug 4, 2026
a9ea7ec
Test the roundtrip CI; fix bugs.
luciansmith Aug 4, 2026
ecdbcef
Fix downloading test cases.
luciansmith Aug 4, 2026
df78696
Find test cases.
luciansmith Aug 4, 2026
1ca00b1
Fix rule: we can fail original and roundtripped if we get the same er…
luciansmith Aug 4, 2026
1278252
Fix a harness issue and a real issue.
luciansmith Aug 5, 2026
7e65a42
No longer error out when a modifier species doesn't appear in a kinet…
luciansmith Aug 5, 2026
b51005d
Don't error out on error categories, instead of string-matched errors.
luciansmith Aug 5, 2026
6c1cc8e
Allow fast reactions to fail original, pass roundtrip.
luciansmith Aug 5, 2026
bf9f5f9
Fix comp lookup errors by giving roadrunner comp version of SBML.
luciansmith Aug 5, 2026
74bb676
Better error diagnostics.
luciansmith Aug 5, 2026
075e264
Fix parameter names for hierarchical models.
luciansmith Aug 5, 2026
049c7a6
Fix import of empty constraints.
luciansmith Aug 5, 2026
9c09a4a
fix mistakenly changed lines of CI/CD
adelhpour Aug 5, 2026
5cc8291
Merge branch 'develop' into update-ci-cd-workflow
adelhpour Aug 5, 2026
b7bad6b
Fix messages.
luciansmith Aug 5, 2026
f02405b
Merge pull request #163 from sys-bio/update-ci-cd-workflow
adelhpour Aug 5, 2026
0bdf9eb
Fix names for identical stoichiometry names on same reaction.
luciansmith Aug 5, 2026
944ab9c
Add missing functions to API, and then to createAntimonyLib.py
luciansmith Aug 5, 2026
6f00ecc
Workaround for comp models in roadrunner.
luciansmith Aug 5, 2026
d83690c
Skip and warn for tests where Antimony renames a variable.
luciansmith Aug 5, 2026
312067b
If 'fast' is present, don't worry about roundtripped version.
luciansmith Aug 5, 2026
254d859
Fix Antimony writing out hierarchical versions of files with conversi…
luciansmith Aug 5, 2026
4069b0f
Fix 'time' requests to convert to 'time_'.
luciansmith Aug 5, 2026
53cb6f3
Revert and actually fix conversion factor problem.
luciansmith Aug 6, 2026
28654d4
Correctly replace or don't replace rate rules when time conversion is…
luciansmith Aug 6, 2026
a679e97
Fix old test.
luciansmith Aug 6, 2026
f4c7340
Fix deleting rate rules.
luciansmith Aug 6, 2026
268b914
added build from source instructions to the README.md
adelhpour Aug 7, 2026
1c86219
Add test for deleted rate rule with a new value.
luciansmith Aug 11, 2026
1520a6f
Promote imported events with deleted bits.
luciansmith Aug 14, 2026
8aec954
Add missing test files.
luciansmith Aug 14, 2026
bef53bc
Allow 'sub1_t1' to substitute for 'sub1__t1'.
luciansmith Aug 14, 2026
0ac3f41
When parts of reactions are deleted, promote and replace.
luciansmith Aug 14, 2026
1acd20d
Fix init overrides when replacing multiple submodel elements at once.
luciansmith Aug 14, 2026
6c2f741
Allow booleans anywhere, including priorities.
luciansmith Aug 14, 2026
d3fe761
Add new test53 files.
luciansmith Aug 14, 2026
ff62b8a
Move the SBML Test Suite tests into the main CI; run on macos14.
luciansmith Aug 14, 2026
05a3b8a
Merge pull request #170 from sys-bio/test-roundtrip-test-suite-v2
luciansmith Aug 14, 2026
40df40e
Update README, and remove more dead configure code.
luciansmith Aug 14, 2026
bed2e3c
Add newer funding.
luciansmith Aug 15, 2026
a5454b5
More fiddly updates.
luciansmith Aug 15, 2026
3baebaf
Merge pull request #169 from sys-bio/build-instructions
adelhpour Aug 15, 2026
8f665f9
Update new libsbml to roundtrip tables correctly.
luciansmith Aug 22, 2026
b1a8af6
Update tutorial versions
luciansmith Aug 22, 2026
8c1ad19
Implement support for stoichiometries with the same ID.
luciansmith Aug 22, 2026
dfb266e
Update docs about named stoichiometries.
luciansmith Aug 22, 2026
487077b
Merge pull request #171 from sys-bio/same-name-stoichiometries
luciansmith Aug 24, 2026
1650f1d
Re-translate Biomodels, and move them all into subdirectories.
luciansmith Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
131 changes: 92 additions & 39 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,10 @@ jobs:
build_type: Debug
build_python: ON
build_qt_antimony: OFF
libroadrunner_deps_owner: [ "sys-bio" ]
libroadrunner_deps_repo: [ "libroadrunner-deps" ]
libroadrunner_deps_name: [ "libroadrunner-deps" ]
libroadrunner_deps_release_version: [ "v2.3.4" ]
antimony_deps_owner: [ "sys-bio" ]
antimony_deps_repo: [ "libroadrunner-deps" ]
antimony_deps_name: [ "antimony-deps" ]
antimony_deps_release_version: [ "v2.3.5" ]
python_version: [ "3.13" ]

runs-on: ${{ matrix.platform.os_name }}
Expand Down Expand Up @@ -180,7 +180,7 @@ jobs:
if: matrix.platform.os_type != 'windows'
uses: actions/cache@main
with:
path: ${RUNNER_WORKSPACE}/.ccache
path: ${{ runner.workspace }}/.ccache
key:
${{ runner.os }}-${{ steps.ccache_cache_timestamp.outputs.timestamp
}}
Expand Down Expand Up @@ -224,28 +224,35 @@ jobs:
shell: bash
run: |
cd ${RUNNER_WORKSPACE}
mkdir -p ${{ matrix.libroadrunner_deps_name }}-binaries
cd ${{ matrix.libroadrunner_deps_name }}-binaries
mkdir -p ${{ matrix.antimony_deps_name }}-binaries
cd ${{ matrix.antimony_deps_name }}-binaries
if [ "${{ matrix.platform.os_type }}" == 'windows' ]; then
compiler_version=$(ls "C:\Program Files\Microsoft Visual Studio")
binary_file_name=${{ matrix.libroadrunner_deps_name }}-${{ matrix.platform.os_type }}-msvc${compiler_version}-${host_architecture}-${{ matrix.platform.build_type }}
binary_file_name=${{ matrix.antimony_deps_name }}-${{ matrix.platform.os_type }}-msvc${compiler_version}-${host_architecture}-${{ matrix.platform.build_type }}
elif [ "${{ matrix.platform.os_type }}" == 'macos' ]; then
os_version=$(sw_vers -productVersion | cut -d '.' -f 1)
binary_file_name=${{ matrix.libroadrunner_deps_name }}-${{ matrix.platform.os_type }}-${os_version}-${host_architecture}-${{ matrix.platform.build_type }}
binary_file_name=${{ matrix.antimony_deps_name }}-${{ matrix.platform.os_type }}-${os_version}-${host_architecture}-${{ matrix.platform.build_type }}
elif [ "${{ matrix.platform.os_type }}" == 'ubuntu' ]; then
os_version=$(lsb_release -rs | cut -d '.' -f 1)
binary_file_name=${{ matrix.libroadrunner_deps_name }}-${{ matrix.platform.os_type }}-${os_version}-${host_architecture}-${{ matrix.platform.build_type }}
binary_file_name=${{ matrix.antimony_deps_name }}-${{ matrix.platform.os_type }}-${os_version}-${host_architecture}-${{ matrix.platform.build_type }}
elif [ "${{ matrix.platform.os_type }}" == 'manylinux' ]; then
os_name="${{ matrix.platform.name }}"
os_name_without_build_type="${os_name%%-*}"
binary_file_name=${{ matrix.libroadrunner_deps_name }}-${os_name_without_build_type}-${host_architecture}-${{ matrix.platform.build_type }}
binary_file_name=${{ matrix.antimony_deps_name }}-${os_name_without_build_type}-${host_architecture}-${{ matrix.platform.build_type }}
fi
curl -LO "https://github.com/${{ matrix.libroadrunner_deps_owner }}/${{ matrix.libroadrunner_deps_repo }}/releases/download/${{ matrix.libroadrunner_deps_release_version }}/$binary_file_name.zip"
curl -LO "https://github.com/${{ matrix.antimony_deps_owner }}/${{ matrix.antimony_deps_repo }}/releases/download/${{ matrix.antimony_deps_release_version }}/$binary_file_name.zip"
unzip -q $binary_file_name.zip
rm $binary_file_name.zip
echo ANT_DEPENDENCIES_INSTALL_PREFIX="-DANT_DEPENDENCIES_INSTALL_PREFIX=${RUNNER_WORKSPACE}/${{ matrix.libroadrunner_deps_name }}-binaries" >> "${GITHUB_ENV}"
if [ -d "$binary_file_name" ]; then
mv "$binary_file_name"/* .
rmdir "$binary_file_name"
fi

echo ANT_DEPENDENCIES_INSTALL_PREFIX="-DANT_DEPENDENCIES_INSTALL_PREFIX=${RUNNER_WORKSPACE}/${{ matrix.antimony_deps_name }}-binaries" >> "${GITHUB_ENV}"


#if [ "${{ matrix.platform.os_type }}" == 'windows' ]; then
# echo EXPAT_LIBRARY="-DEXPAT_LIBRARY=${RUNNER_WORKSPACE}/${{ matrix.libroadrunner_deps_name }}-binaries/lib/${{ matrix.platform.expat_lib_name }}" >> "${GITHUB_ENV}"
# echo EXPAT_LIBRARY="-DEXPAT_LIBRARY=${RUNNER_WORKSPACE}/${{ matrix.antimony_deps_name }}-binaries/lib/${{ matrix.platform.expat_lib_name }}" >> "${GITHUB_ENV}"
#fi

- name: Install Qt
Expand Down Expand Up @@ -280,7 +287,6 @@ jobs:
-DCMAKE_C_COMPILER_LAUNCHER=${COMPILER_LAUNCHER} \
-DCMAKE_CXX_COMPILER_LAUNCHER=${COMPILER_LAUNCHER} \
-DCMAKE_BUILD_TYPE=${{ matrix.platform.build_type }} \
-DUSE_UNIVERSAL_BINARIES=OFF \
-DCMAKE_OSX_ARCHITECTURES=${{ matrix.platform.arch }} \
-DCMAKE_INSTALL_PREFIX="${RUNNER_WORKSPACE}/install-antimony" \
${ANT_DEPENDENCIES_INSTALL_PREFIX} \
Expand All @@ -304,32 +310,17 @@ jobs:

# Valgrind is Linux-only (no Windows support, weak/no Apple Silicon
# support), so this only runs on one leg of the matrix rather than
# across every platform/config combination. See MEMORYCHECK_* in the
# root CMakeLists.txt and valgrind.supp for the suppressions file.
#
# This runs automatically on every push/PR, against the release build
# (which has -g added just for this leg -- see "Configure CMake for
# Antimony" above -- so it's still symbol-rich) so it's much faster
# than a full debug-build run and still gives usable stack traces, at
# the cost of somewhat less precise line numbers due to optimization
# (inlining etc.), and a small risk that -O3 could eliminate a
# provably-dead allocation an unoptimized debug build wouldn't.
# across every platform/config combination.
#
# For a slower but fully accurate debug-build memcheck run (e.g. to
# dig into something this one flagged), trigger
# .github/workflows/valgrind-debug-memcheck.yml manually from the
# Actions tab -- see the comment at the top of that file for why it's
# a separate workflow rather than another leg here.
# Actions tab.
#
# `ctest -T memcheck` only prints a per-test defect *count* to the
# console -- the actual valgrind report (stack traces, "definitely
# lost" byte counts, etc.) goes to a per-test log file instead:
# Testing/Temporary/MemoryChecker.<test-id>.log, one per test. Rather
# than running every test as one opaque block and only finding out
# what broke at the very end, run them in numbered chunks (via
# `ctest -I <start>,<end>`) and print any defects from each chunk
# immediately after it finishes, so problems surface within minutes
# rather than at the end of the whole run.
# Testing/Temporary/MemoryChecker.<test-id>.log, one per test.
- name: Run Antimony tests under valgrind (memcheck), in chunks
if : matrix.platform.name == 'ubuntu-latest-release'
shell: bash
Expand Down Expand Up @@ -396,14 +387,18 @@ jobs:
run: |
cd ${RUNNER_WORKSPACE}/install-antimony/bindings/python
if [ "${{ matrix.platform.os_type }}" == 'windows' ]; then
${{env.python_exe}} -m pip install setuptools wheel
${{env.python_exe}} setup.py bdist_wheel
${{env.python_exe}} -m pip install setuptools wheel build
${{env.python_exe}} -m build --wheel --no-isolation --outdir dist
elif [ "${{ matrix.platform.os_type }}" == 'manylinux' ]; then
python${{ matrix.python_version }} -m pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org setuptools wheel
python${{ matrix.python_version }} setup.py bdist_wheel
python${{ matrix.python_version }} -m pip install --root-user-action=ignore --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org setuptools wheel build
python${{ matrix.python_version }} -m build --wheel --no-isolation --outdir dist
elif [ "${{ matrix.platform.os_type }}" == 'macos' ]; then
export MACOSX_DEPLOYMENT_TARGET="$(sw_vers -productVersion | cut -d '.' -f 1).0"
python${{ matrix.python_version }} -m pip install setuptools wheel build
python${{ matrix.python_version }} -m build --wheel --no-isolation --outdir dist
else
python${{ matrix.python_version }} -m pip install setuptools wheel
python${{ matrix.python_version }} setup.py bdist_wheel
python${{ matrix.python_version }} -m pip install setuptools wheel build
python${{ matrix.python_version }} -m build --wheel --no-isolation --outdir dist
fi

- name: Rename Python wheel artifacts
Expand Down Expand Up @@ -436,3 +431,61 @@ jobs:
with:
name: ${{env.python_wheel_artifacts_name}}
path: ${{env.python_wheel_artifacts_file}}

# The SBML Test Suite round-trip only runs on one leg of the matrix,
# same reasoning as valgrind above: it's slow, and doesn't need to run
# on every OS/config combination to be useful. macos-14-release is
# chosen since ubuntu-latest-release is already dedicated to valgrind.
- name: Build Antimony Python wheel for SBML Test Suite round-trip
if: matrix.platform.name == 'macos-14-release'
shell: bash
run: |
cd ${RUNNER_WORKSPACE}/install-antimony/bindings/python
python${{ matrix.python_version }} -m pip install setuptools wheel build
python${{ matrix.python_version }} -m build --wheel --no-isolation --outdir dist-sbml-test-suite
python${{ matrix.python_version }} -m pip install dist-sbml-test-suite/antimony*.whl
python${{ matrix.python_version }} -m pip install -r "${GITHUB_WORKSPACE}/src/bindings/python/sbml_test_suite/requirements.txt"

- name: Download SBML Test Suite semantic cases
if: matrix.platform.name == 'macos-14-release'
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
cd "${RUNNER_WORKSPACE}"
mkdir -p sbml-test-suite
asset_url=$(gh api repos/sbmlteam/sbml-test-suite/releases/latest \
--jq '.assets[] | select(.name | startswith("semantic_tests")) | .browser_download_url')
if [ -z "$asset_url" ]; then
echo "::error::Failed to find a semantic_tests asset in the latest sbml-test-suite release."
exit 1
fi
echo "Downloading ${asset_url}"
curl -fL "$asset_url" -o sbml-test-suite/semantic_tests.zip
unzip -q sbml-test-suite/semantic_tests.zip -d sbml-test-suite/extracted
# -quit makes find stop after the first match itself, rather than
# relying on a downstream `head -n 1` to cut it off -- piping into
# head closes the pipe early and GNU find treats that broken pipe
# as a fatal write error instead of exiting quietly.
settings_file=$(find "${RUNNER_WORKSPACE}/sbml-test-suite/extracted" -name '*-settings.txt' -print -quit)
if [ -z "$settings_file" ]; then
echo "::error::No *-settings.txt files found under sbml-test-suite/extracted -- unexpected archive layout."
exit 1
fi
cases_dir=$(dirname "$settings_file")
echo "SBML_TEST_SUITE_DIR=$(dirname "$cases_dir")" >> "${GITHUB_ENV}"

- name: Run SBML Test Suite round-trip tests
if: matrix.platform.name == 'macos-14-release'
shell: bash
run: |
cd "${GITHUB_WORKSPACE}/src/bindings/python/sbml_test_suite"
python${{ matrix.python_version }} -m pytest -ra --junitxml="${RUNNER_WORKSPACE}/sbml-test-suite-results.xml" \
--sbml-test-suite-dir="${SBML_TEST_SUITE_DIR}"

- name: Upload SBML Test Suite round-trip results
if: always() && matrix.platform.name == 'macos-14-release'
uses: actions/upload-artifact@main
with:
name: sbml-test-suite-results
path: ${{ runner.workspace }}/sbml-test-suite-results.xml
2 changes: 1 addition & 1 deletion .github/workflows/valgrind-debug-memcheck.yml
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ jobs:
- name: Cache ccache files
uses: actions/cache@main
with:
path: ${RUNNER_WORKSPACE}/.ccache
path: ${{ runner.workspace }}/.ccache
key:
${{ runner.os }}-debug-memcheck-${{ steps.ccache_cache_timestamp.outputs.timestamp
}}
Expand Down
46 changes: 12 additions & 34 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ project(libantimony)
# Set up version information.
#
SET(LIBANTIMONY_VERSION_MAJOR 3)
SET(LIBANTIMONY_VERSION_MINOR 1)
SET(LIBANTIMONY_VERSION_PATCH ".3")
SET(LIBANTIMONY_VERSION_MINOR 2)
SET(LIBANTIMONY_VERSION_PATCH ".0")
SET(LIBANTIMONY_VERSION_RELEASE "")


Expand All @@ -31,7 +31,12 @@ endif()
# C++14 minimum: required by the vendored GoogleTest 1.16.x (see
# src/test/googletest/README.md), which uses std::make_index_sequence
# and friends internally.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
# MSVC doesn't understand the GNU-style -std= flag (and already
# defaults to a sufficiently modern standard), so only add it for
# GCC/Clang to avoid a D9002 "unknown option" warning on every file.
if(NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
endif()

include (InstallRequiredSystemLibraries)
include (CMakeTestCCompiler)
Expand Down Expand Up @@ -77,8 +82,11 @@ set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, op

# which language bindings should be build
option(WITH_CELLML "Generate CellML translations" OFF )
mark_as_advanced(WITH_CELLML)
if(WITH_CELLML)
message(FATAL_ERROR "The ability to export Antimony to CellML is not currently functional.")
endif()
option(WITH_QTANTIMONY "Generate QTAntimony" ON )
option(WITH_SWIG "Regenerate SWIG-based language bindings." OFF )
option(WITH_PYTHON "Generate Python language bindings." OFF)
if (WITH_PYTHON)
option(PYTHON_SYSTEM_INSTALL "Install the python bindings using setup.py and distutils. May require admin privileges." OFF )
Expand Down Expand Up @@ -290,36 +298,6 @@ set(LIBANTIMONY_LIBS ${LIBANTIMONY_LIBS} ${CMAKE_DL_LIBS} )

message(STATUS "Antimony libs: ${LIBANTIMONY_LIBS}")

###############################################################################
#
# If WITH_SWIG is selected, we need to find swig
#
if(WITH_SWIG)
find_program(SWIG_EXECUTABLE
NAMES swig
PATHS
"c:/Program Files (x86)/Swig"
c:/Program Files/Swig
c:/Program Files/swigwin-3.0.10
c:/Program Files/swigwin-4.0.2
/usr/local/bin
/opt/local/bin
/usr/bin
DOC "The file name of the swig executable."
)
find_package(SWIG)
set(SWIG_EXTRA_ARGS "" CACHE STRING "Extra arguments to SWIG" )
endif(WITH_SWIG)

if(WITH_SWIG)
message(STATUS " Using SWIG = ${SWIG_EXECUTABLE}")

if (SWIG_FOUND AND SWIG_VERSION VERSION_LESS "2.0.4")
message(WARNING " You are using swig version ${SWIG_VERSION} while we recommend at least version 2.0.4.")
endif()

endif()

if(WITH_PYTHON)
message(STATUS " Using Python = ${PYTHON_EXECUTABLE}")
endif()
Expand Down
4 changes: 3 additions & 1 deletion QTAntimony_src/QTAntimony.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
#include <QDesktopServices>
#include <QVariant>
#include <QIcon>
#include <QGuiApplication>
#include <QScreen>

#ifdef Q_OS_WIN
#ifndef WIN32_LEAN_AND_MEAN
Expand Down Expand Up @@ -107,7 +109,7 @@ void QTAntimony::DisplayWindow(QMainWindow* t) {
}
QRect desk = desktop()->availableGeometry(focus);
if (focus==NULL) {
desk = desktop()->availableGeometry(desktop()->primaryScreen());
desk = QGuiApplication::primaryScreen()->availableGeometry();
QRect window;
window.setTop(desk.height()/8);
window.setBottom(desk.height()*7/8);
Expand Down
Loading
Loading