├── .github └── workflows │ └── update_translations.yml ├── .gitignore ├── .readthedocs.yaml ├── .tx └── config ├── CHANGELOG.txt ├── LICENSE.txt ├── MANIFEST.in ├── README.rst ├── pyproject.toml ├── setup.py ├── src ├── doc │ ├── DOC_LICENSE.txt │ ├── _static │ │ └── custom.css │ ├── conf.py │ ├── images │ │ ├── photini_logo.png │ │ ├── screenshot_001.png │ │ ├── screenshot_002.png │ │ ├── screenshot_003.png │ │ ├── screenshot_004.png │ │ ├── screenshot_005.png │ │ ├── screenshot_006.png │ │ ├── screenshot_007.png │ │ ├── screenshot_008.png │ │ ├── screenshot_009.png │ │ ├── screenshot_010.png │ │ ├── screenshot_020.png │ │ ├── screenshot_021.png │ │ ├── screenshot_022.png │ │ ├── screenshot_023.png │ │ ├── screenshot_024.png │ │ ├── screenshot_025.png │ │ ├── screenshot_026.png │ │ ├── screenshot_027.png │ │ ├── screenshot_028.png │ │ ├── screenshot_029.png │ │ ├── screenshot_030.png │ │ ├── screenshot_031.png │ │ ├── screenshot_032.png │ │ ├── screenshot_033.png │ │ ├── screenshot_034.png │ │ ├── screenshot_035.png │ │ ├── screenshot_036.png │ │ ├── screenshot_050.png │ │ ├── screenshot_051.png │ │ ├── screenshot_052.png │ │ ├── screenshot_053.png │ │ ├── screenshot_054.png │ │ ├── screenshot_055.png │ │ ├── screenshot_056.png │ │ ├── screenshot_057.png │ │ ├── screenshot_058.png │ │ ├── screenshot_059.png │ │ ├── screenshot_060.png │ │ ├── screenshot_061.png │ │ ├── screenshot_062.png │ │ ├── screenshot_063.png │ │ ├── screenshot_064.png │ │ ├── screenshot_065.png │ │ ├── screenshot_070.png │ │ ├── screenshot_080.png │ │ ├── screenshot_081.png │ │ ├── screenshot_082.png │ │ ├── screenshot_083.png │ │ ├── screenshot_084.png │ │ ├── screenshot_085.png │ │ ├── screenshot_086.png │ │ ├── screenshot_090.png │ │ ├── screenshot_091.png │ │ ├── screenshot_092.png │ │ ├── screenshot_100.png │ │ ├── screenshot_101.png │ │ ├── screenshot_102.png │ │ ├── screenshot_103.png │ │ ├── screenshot_104.png │ │ ├── screenshot_105.png │ │ ├── screenshot_106.png │ │ ├── screenshot_107.png │ │ ├── screenshot_108.png │ │ ├── screenshot_109.png │ │ ├── screenshot_110.png │ │ ├── screenshot_111.png │ │ ├── screenshot_112.png │ │ ├── screenshot_113.png │ │ ├── screenshot_114.png │ │ ├── screenshot_115.png │ │ ├── screenshot_116.png │ │ ├── screenshot_117.png │ │ ├── screenshot_118.png │ │ ├── screenshot_119.png │ │ ├── screenshot_120.png │ │ ├── screenshot_130.png │ │ ├── screenshot_131.png │ │ ├── screenshot_132.png │ │ ├── screenshot_133.png │ │ ├── screenshot_134.png │ │ ├── screenshot_135.png │ │ ├── screenshot_136.png │ │ ├── screenshot_137.png │ │ ├── screenshot_138.png │ │ ├── screenshot_139.png │ │ ├── screenshot_140.png │ │ ├── screenshot_141.png │ │ ├── screenshot_142.png │ │ ├── screenshot_143.png │ │ ├── screenshot_150.png │ │ ├── screenshot_151.png │ │ ├── screenshot_152.png │ │ ├── screenshot_153.png │ │ ├── screenshot_154.png │ │ ├── screenshot_155.png │ │ ├── screenshot_156.png │ │ ├── screenshot_157.png │ │ ├── screenshot_158.png │ │ ├── screenshot_159.png │ │ ├── screenshot_160.png │ │ ├── screenshot_161.png │ │ ├── screenshot_162.png │ │ ├── screenshot_170.png │ │ ├── screenshot_171.png │ │ ├── screenshot_172.png │ │ ├── screenshot_173.png │ │ ├── screenshot_174.png │ │ ├── screenshot_175.png │ │ ├── screenshot_180.png │ │ ├── screenshot_181.png │ │ ├── screenshot_182.png │ │ ├── screenshot_183.png │ │ ├── screenshot_184.png │ │ ├── screenshot_185.png │ │ ├── screenshot_200.png │ │ ├── screenshot_201.png │ │ ├── screenshot_202.png │ │ ├── screenshot_203.png │ │ ├── screenshot_204.png │ │ ├── screenshot_220.png │ │ ├── screenshot_221.png │ │ ├── screenshot_222.png │ │ ├── screenshot_223.png │ │ ├── screenshot_224.png │ │ ├── screenshot_225.png │ │ ├── screenshot_226.png │ │ ├── screenshot_230.png │ │ ├── screenshot_231.png │ │ ├── screenshot_232.png │ │ ├── screenshot_233.png │ │ ├── screenshot_234.png │ │ ├── screenshot_235.png │ │ ├── screenshot_236.png │ │ ├── screenshot_237.png │ │ ├── screenshot_238.png │ │ ├── screenshot_239.png │ │ ├── screenshot_240.png │ │ ├── screenshot_242.png │ │ ├── screenshot_250.png │ │ ├── screenshot_251.png │ │ ├── screenshot_252.png │ │ ├── screenshot_253.png │ │ ├── screenshot_254.png │ │ ├── screenshot_255.png │ │ ├── screenshot_256.png │ │ ├── screenshot_257.png │ │ ├── screenshot_258.png │ │ ├── screenshot_259.png │ │ ├── screenshot_260.png │ │ ├── screenshot_270.png │ │ ├── screenshot_271.png │ │ ├── screenshot_272.png │ │ ├── screenshot_273.png │ │ ├── screenshot_274.png │ │ ├── screenshot_275.png │ │ ├── screenshot_276.png │ │ ├── screenshot_277.png │ │ ├── screenshot_278.png │ │ ├── screenshot_279.png │ │ ├── screenshot_280.png │ │ ├── screenshot_281.png │ │ ├── screenshot_282.png │ │ ├── screenshot_290.png │ │ ├── screenshot_291.png │ │ ├── screenshot_292.png │ │ ├── screenshot_293.png │ │ ├── screenshot_294.png │ │ └── screenshot_295.png │ ├── index.rst │ ├── manual │ │ ├── address.rst │ │ ├── configuration.rst │ │ ├── descriptive_metadata.rst │ │ ├── extending.rst │ │ ├── flickr.rst │ │ ├── google_photos.rst │ │ ├── image_selector.rst │ │ ├── importer.rst │ │ ├── index.rst │ │ ├── ipernity.rst │ │ ├── keywords.rst │ │ ├── map.rst │ │ ├── ownership_metadata.rst │ │ ├── pixelfed.rst │ │ ├── regions.rst │ │ ├── tags.rst │ │ ├── technical_metadata.rst │ │ └── video.rst │ ├── misc │ │ ├── changelog.rst │ │ ├── doc_licence.rst │ │ ├── index.rst │ │ └── licence.rst │ ├── other │ │ ├── installation.rst │ │ ├── introduction.rst │ │ ├── localisation.rst │ │ ├── reading.rst │ │ └── workflow.rst │ └── requirements.txt ├── lang │ ├── README.rst │ ├── ca │ │ ├── LC_MESSAGES │ │ │ └── documentation.po │ │ └── photini.ts │ ├── cs │ │ ├── LC_MESSAGES │ │ │ └── documentation.po │ │ └── photini.ts │ ├── de │ │ ├── LC_MESSAGES │ │ │ └── documentation.po │ │ └── photini.ts │ ├── en │ │ └── photini.ts │ ├── es │ │ ├── LC_MESSAGES │ │ │ └── documentation.po │ │ └── photini.ts │ ├── fr │ │ ├── LC_MESSAGES │ │ │ └── documentation.po │ │ └── photini.ts │ ├── it │ │ ├── LC_MESSAGES │ │ │ └── documentation.po │ │ └── photini.ts │ ├── ko │ │ ├── LC_MESSAGES │ │ │ └── documentation.po │ │ └── photini.ts │ ├── nb │ │ ├── LC_MESSAGES │ │ │ └── documentation.po │ │ └── photini.ts │ ├── pl │ │ ├── LC_MESSAGES │ │ │ └── documentation.po │ │ └── photini.ts │ ├── ta │ │ ├── LC_MESSAGES │ │ │ └── documentation.po │ │ └── photini.ts │ └── templates │ │ ├── gettext │ │ └── documentation.pot │ │ └── qt │ │ └── photini.ts ├── photini │ ├── __init__.py │ ├── __main__.py │ ├── address.py │ ├── azuremap.py │ ├── bingmap.py │ ├── configstore.py │ ├── cv.py │ ├── data │ │ ├── LICENSE.txt │ │ ├── icons │ │ │ ├── linux │ │ │ │ ├── 128x128 │ │ │ │ │ └── photini.png │ │ │ │ ├── 16x16 │ │ │ │ │ └── photini.png │ │ │ │ ├── 24x24 │ │ │ │ │ └── photini.png │ │ │ │ ├── 256x256 │ │ │ │ │ └── photini.png │ │ │ │ ├── 32x32 │ │ │ │ │ └── photini.png │ │ │ │ ├── 48x48 │ │ │ │ │ └── photini.png │ │ │ │ └── 64x64 │ │ │ │ │ └── photini.png │ │ │ ├── photini.icns │ │ │ └── photini_win.ico │ │ ├── keys.txt │ │ └── map │ │ │ ├── azuremap.js │ │ │ ├── bingmap.js │ │ │ ├── googlemap.js │ │ │ ├── mapboxmap.js │ │ │ ├── mapboxmap_legacy.js │ │ │ ├── pin_alpha.png │ │ │ └── pin_image.png │ ├── descriptive.py │ ├── editor.py │ ├── editsettings.py │ ├── exiv2.py │ ├── ffmpeg.py │ ├── flickr.py │ ├── googlemap.py │ ├── googlephotos.py │ ├── gpximporter.py │ ├── imagelist.py │ ├── importer.py │ ├── ipernity.py │ ├── keywords.py │ ├── linux.py │ ├── loggerwindow.py │ ├── macos.py │ ├── mapboxmap.py │ ├── metadata.py │ ├── ownership.py │ ├── photinimap.py │ ├── pixelfed.py │ ├── pyqt.py │ ├── regions.py │ ├── scripts.py │ ├── spelling.py │ ├── technical.py │ ├── types.py │ ├── uploader.py │ ├── vocab.py │ ├── widgets.py │ └── windows.py └── run_photini.py ├── transifex.yml └── utils ├── README.rst ├── build_docs.py ├── download_cvs.py ├── lang_update.py ├── make_icons ├── icon_master.png ├── makefile ├── map_pin_red.png └── map_pin_yellow.png ├── marker_gen.py ├── store_keys.py └── tag_release.py /.github/workflows/update_translations.yml: -------------------------------------------------------------------------------- 1 | name: Update translations 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - 'src/lang/**' 9 | 10 | jobs: 11 | update-weblate: 12 | name: Merge main into weblate 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: checkout 16 | uses: actions/checkout@v3 17 | 18 | - name: weblate 19 | uses: mtanzi/action-automerge@v1 20 | with: 21 | github_token: ${{ github.token }} 22 | source: 'main' 23 | target: 'weblate' 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[co] 2 | 3 | # Packages 4 | *.egg 5 | *.egg-info 6 | dist 7 | build 8 | eggs 9 | parts 10 | bin 11 | var 12 | sdist 13 | develop-eggs 14 | .installed.cfg 15 | 16 | # Installer logs 17 | pip-log.txt 18 | 19 | # Unit test / coverage reports 20 | .coverage 21 | .tox 22 | 23 | #Translations 24 | *.mo 25 | 26 | #Mr Developer 27 | .mr.developer.cfg 28 | 29 | # Editor backups 30 | *~ 31 | 32 | # Extras 33 | MANIFEST 34 | /doc 35 | /doctrees 36 | /src/lang/en/LC_MESSAGES 37 | /src/lang/templates/gettext/_static 38 | /utils/make_icons/*.pam 39 | /src/photini/data/lang 40 | /src/photini/_version.py 41 | -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | # Read the Docs configuration file 2 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 3 | 4 | # Required 5 | version: 2 6 | 7 | # Set the version of Python and other tools you might need 8 | build: 9 | os: ubuntu-20.04 10 | tools: 11 | python: "3.11" 12 | 13 | # Build documentation in the docs/ directory with Sphinx 14 | sphinx: 15 | builder: html 16 | configuration: src/doc/conf.py 17 | 18 | # Optionally declare the Python requirements required to build your docs 19 | python: 20 | install: 21 | - path: . 22 | - requirements: src/doc/requirements.txt 23 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | 4 | [o:jim-easterbrook:p:photini:r:871ddecdd1224edeb992e2011932cb1e] 5 | file_filter = src/lang//LC_MESSAGES/documentation.po 6 | source_file = src/lang/templates/gettext/documentation.pot 7 | type = PO 8 | minimum_perc = 0 9 | resource_name = src..gettext/documentation.pot (transifex) 10 | 11 | [o:jim-easterbrook:p:photini:r:c549995fe0a7316739fcc02815e84316] 12 | file_filter = src/lang//photini.ts 13 | source_file = src/lang/en/photini.ts 14 | source_lang = en 15 | 16 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | # setuptools-scm automatically includes everything that's in git 2 | # ignore stuff that's not required to build photini 3 | recursive-exclude .github * 4 | recursive-exclude .tx * 5 | recursive-exclude src/doc * 6 | recursive-exclude src/lang *.po *.rst 7 | recursive-exclude src/lang/templates * 8 | recursive-exclude src/Photini.egg-info * 9 | recursive-exclude tests * 10 | recursive-exclude utils * 11 | exclude .gitignore .readthedocs.yaml transifex.yml src/run_photini.py 12 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | # Photini - a simple photo metadata editor. 2 | # http://github.com/jim-easterbrook/Photini 3 | # Copyright (C) 2023-24 Jim Easterbrook jim@jim-easterbrook.me.uk 4 | # 5 | # This program is free software: you can redistribute it and/or 6 | # modify it under the terms of the GNU General Public License as 7 | # published by the Free Software Foundation, either version 3 of the 8 | # License, or (at your option) any later version. 9 | # 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | # General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with this program. If not, see 17 | # . 18 | 19 | [build-system] 20 | requires = ["setuptools >= 59.6", "setuptools_scm[toml]>=6.2", "toml"] 21 | build-backend = "setuptools.build_meta" 22 | 23 | [project] 24 | name = "Photini" 25 | description = "Simple photo metadata editor" 26 | readme = "README.rst" 27 | license = {text = "GPLv3+"} 28 | authors = [{name = "Jim Easterbrook", email = "jim@jim-easterbrook.me.uk"}] 29 | keywords = ["Exif", "IPTC", "XMP"] 30 | classifiers = [ 31 | "Development Status :: 5 - Production/Stable", 32 | "Environment :: Win32 (MS Windows)", 33 | "Environment :: X11 Applications :: Qt", 34 | "Intended Audience :: End Users/Desktop", 35 | "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", 36 | "Operating System :: OS Independent", 37 | "Programming Language :: Python :: 3", 38 | "Topic :: Multimedia :: Graphics", 39 | ] 40 | dependencies = [ 41 | "cachetools >= 3.0", 42 | "chardet >= 3.0", 43 | "exiv2 >= 0.16", 44 | "filetype >= 1.0", 45 | "Pillow >= 5.3", 46 | "platformdirs >= 2.4", 47 | "requests >= 2.4", 48 | "pywin32 >= 302; platform_system == 'Windows'", 49 | ] 50 | dynamic = ["version"] 51 | requires-python = ">= 3.6" 52 | 53 | [project.optional-dependencies] 54 | flickr = ["photini[keyring,requests-oauthlib,requests-toolbelt]"] 55 | google = ["photini[keyring,requests-oauthlib]"] 56 | importer = ["gphoto2 >= 2.4; platform_system != 'Windows'"] 57 | ipernity = ["photini[keyring,requests-toolbelt]"] 58 | pixelfed = ["photini[keyring,requests-oauthlib,requests-toolbelt]"] 59 | spelling = ["pyenchant >= 2.0"] 60 | # install everything except the Qt package 61 | all = ["""photini[keyring,requests-oauthlib,requests-toolbelt,\ 62 | importer,spelling,gpxpy]"""] 63 | # set versions of common packages 64 | keyring = ["keyring >= 7.0"] 65 | requests-oauthlib = ["requests-oauthlib >= 1.0"] 66 | requests-toolbelt = ["requests-toolbelt >= 0.9"] 67 | # the following are intended for use by the photini-configure script 68 | PyQt5 = ["PyQt5 >= 5.9", "PyQtWebEngine >= 5.12"] 69 | PyQt6 = [ 70 | "photini[PyQt6-linux]; platform_system == 'Linux'", 71 | "photini[PyQt6-windows]; platform_system == 'Windows'", 72 | "photini[PyQt6-darwin]; platform_system == 'Darwin'", 73 | ] 74 | PyQt6-linux = [ 75 | "PyQt6 >= 6.2; python_version != '3.6.*'", 76 | "PyQt6-WebEngine >= 6.2; python_version != '3.6.*'", 77 | "PyQt6 >= 6.2, < 6.3; python_version == '3.6.*'", 78 | "PyQt6-Qt6 < 6.3; python_version == '3.6.*'", 79 | "PyQt6-WebEngine >= 6.2, < 6.3; python_version == '3.6.*'", 80 | "PyQt6-WebEngine-Qt6 < 6.3; python_version == '3.6.*'", 81 | ] 82 | PyQt6-windows = [ 83 | "PyQt6 >= 6.2; platform_release not in '7'", 84 | "PyQt6-WebEngine >= 6.2; platform_release not in '7'", 85 | ] 86 | PyQt6-darwin = [ 87 | "PyQt6-Qt6 >= 6.2, != 6.6.1", 88 | "PyQt6-WebEngine-Qt6 >= 6.2, != 6.6.1", 89 | ] 90 | PySide2 = [ 91 | "PySide2 >= 5.11.1; python_version < '3.8'", 92 | "PySide2 >= 5.14; python_version >= '3.8'", 93 | ] 94 | PySide6 = [ 95 | "photini[PySide6-linux]; platform_system == 'Linux'", 96 | "photini[PySide6-windows]; platform_system == 'Windows'", 97 | "photini[PySide6-darwin]; platform_system == 'Darwin'", 98 | ] 99 | PySide6-linux = ["PySide6 >= 6.2"] 100 | PySide6-windows = ["PySide6 >= 6.2; platform_release not in '7'"] 101 | PySide6-darwin = ["PySide6 >= 6.2, != 6.6.1"] 102 | gpxpy = ["gpxpy >= 1.3.5, != 1.6.0"] 103 | Pillow = [] 104 | 105 | [project.urls] 106 | Homepage = "https://github.com/jim-easterbrook/Photini" 107 | Documentation = "https://photini.readthedocs.io/" 108 | Repository = "https://github.com/jim-easterbrook/Photini" 109 | Changelog = "https://github.com/jim-easterbrook/Photini/blob/main/CHANGELOG.txt" 110 | 111 | [project.scripts] 112 | photini-configure = "photini.scripts:configure" 113 | photini-post-install = "photini.scripts:post_install" 114 | 115 | [project.gui-scripts] 116 | photini = "photini.editor:main" 117 | 118 | [tool.setuptools] 119 | zip-safe = false 120 | 121 | [tool.setuptools.packages.find] 122 | where = ["src"] 123 | exclude = ["doc*", "lang*"] 124 | 125 | [tool.setuptools_scm] 126 | write_to = "src/photini/_version.py" 127 | version_scheme = "post-release" 128 | -------------------------------------------------------------------------------- /src/doc/_static/custom.css: -------------------------------------------------------------------------------- 1 | .wy-table-responsive table td, .wy-table-responsive table th { 2 | white-space: normal !important; 3 | } 4 | 5 | .wy-table-responsive { 6 | overflow : visible !important; 7 | } 8 | 9 | .wy-table-responsive table td, .wy-table-responsive table th { 10 | white-space: inherit; 11 | } 12 | -------------------------------------------------------------------------------- /src/doc/images/photini_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/photini_logo.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_001.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_002.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_003.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_004.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_005.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_006.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_007.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_008.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_009.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_010.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_020.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_020.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_021.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_021.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_022.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_023.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_024.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_025.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_026.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_026.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_027.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_027.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_028.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_028.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_029.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_029.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_030.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_031.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_031.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_032.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_032.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_033.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_034.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_034.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_035.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_035.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_036.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_036.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_050.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_050.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_051.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_051.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_052.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_052.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_053.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_053.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_054.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_054.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_055.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_055.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_056.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_056.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_057.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_057.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_058.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_058.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_059.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_059.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_060.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_060.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_061.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_061.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_062.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_062.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_063.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_063.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_064.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_064.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_065.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_065.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_070.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_070.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_080.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_080.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_081.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_081.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_082.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_082.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_083.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_083.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_084.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_084.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_085.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_085.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_086.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_086.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_090.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_090.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_091.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_091.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_092.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_092.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_100.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_101.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_102.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_102.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_103.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_103.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_104.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_104.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_105.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_105.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_106.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_106.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_107.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_107.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_108.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_109.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_109.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_110.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_110.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_111.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_111.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_112.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_112.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_113.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_113.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_114.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_115.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_115.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_116.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_116.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_117.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_117.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_118.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_118.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_119.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_119.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_120.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_130.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_130.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_131.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_131.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_132.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_132.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_133.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_133.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_134.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_134.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_135.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_135.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_136.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_136.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_137.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_137.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_138.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_138.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_139.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_139.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_140.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_140.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_141.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_141.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_142.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_142.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_143.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_143.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_150.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_151.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_151.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_152.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_153.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_153.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_154.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_154.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_155.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_155.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_156.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_156.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_157.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_157.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_158.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_158.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_159.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_159.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_160.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_160.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_161.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_161.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_162.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_162.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_170.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_170.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_171.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_171.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_172.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_173.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_173.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_174.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_174.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_175.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_175.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_180.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_181.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_181.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_182.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_182.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_183.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_183.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_184.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_184.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_185.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_185.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_200.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_201.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_202.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_202.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_203.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_203.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_204.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_204.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_220.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_220.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_221.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_221.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_222.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_223.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_223.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_224.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_224.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_225.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_225.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_226.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_226.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_230.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_230.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_231.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_231.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_232.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_232.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_233.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_233.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_234.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_234.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_235.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_235.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_236.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_236.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_237.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_237.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_238.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_238.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_239.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_239.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_240.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_242.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_242.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_250.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_250.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_251.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_251.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_252.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_252.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_253.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_253.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_254.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_254.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_255.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_255.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_256.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_257.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_257.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_258.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_258.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_259.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_259.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_260.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_260.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_270.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_270.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_271.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_271.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_272.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_272.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_273.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_273.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_274.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_274.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_275.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_275.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_276.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_276.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_277.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_277.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_278.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_278.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_279.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_279.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_280.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_280.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_281.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_281.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_282.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_282.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_290.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_290.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_291.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_291.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_292.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_292.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_293.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_293.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_294.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_294.png -------------------------------------------------------------------------------- /src/doc/images/screenshot_295.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jim-easterbrook/Photini/f6af2bacc1aafc633f28c9d4016ac1936419708d/src/doc/images/screenshot_295.png -------------------------------------------------------------------------------- /src/doc/index.rst: -------------------------------------------------------------------------------- 1 | .. This is part of the Photini documentation. 2 | Copyright (C) 2012-23 Jim Easterbrook. 3 | See the file DOC_LICENSE.txt for copying conditions. 4 | 5 | Photini documentation 6 | ===================== 7 | 8 | Welcome to the documentation of Photini, an easy to use photograph metadata editor. 9 | For a quick introduction to Photini and its features I suggest you read :doc:`the introduction `. 10 | More detail about its capabilities can be found in :doc:`the user manual `. 11 | 12 | .. toctree:: 13 | :maxdepth: 2 14 | 15 | other/introduction 16 | other/installation 17 | manual/index 18 | other/workflow 19 | other/localisation 20 | misc/index 21 | other/reading 22 | 23 | Copyright (C) 2012-23 Jim Easterbrook. 24 | 25 | Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. 26 | A copy of the license is included in the section entitled "GNU Free Documentation License". 27 | -------------------------------------------------------------------------------- /src/doc/manual/address.rst: -------------------------------------------------------------------------------- 1 | .. This is part of the Photini documentation. 2 | Copyright (C) 2019-24 Jim Easterbrook. 3 | See the file ../DOC_LICENSE.txt for copying conditions. 4 | 5 | Location addresses 6 | ================== 7 | 8 | The ``Address`` tab shows text address data for the location from where the photograph was taken (``camera``) and one or more locations shown in the photograph (``subject``). 9 | For example, if the subject location is the Eiffel Tower then the camera location is almost certainly somewhere else in Paris. 10 | 11 | .. image:: ../images/screenshot_290.png 12 | 13 | Locations are stored in a 5-level hierarchy: ``street``, ``city``, ``province``, ``country`` and ``region``. 14 | The meaning of these terms is rather vague, especially when out in the countryside, and there's no requirement to fill them all in. 15 | Typically ``city`` can be anything from a village to a metropolis, and ``street`` is a more specific location, e.g. "23 Abdication Avenue". 16 | ``Province`` would be a state in the USA or a county in the UK. 17 | ``Country`` is stored as a name and a 2 or 3 letter `ISO code`_. 18 | ``Region`` appears to be rarely used but could be a continent or sub-continent. 19 | 20 | ``Name``, ``Location ID``, and GPS data are recent additions to the IPTC location specification. 21 | More detail about all of these can be found on the `IPTC web site`_. 22 | 23 | Note that "legacy" IPTC-IIM address metadata only stores the ``street``, ``city``, ``province``, and ``country`` fields and only the ``camera`` location. 24 | 25 | .. image:: ../images/screenshot_291.png 26 | 27 | The ``Get address from lat, long`` button uses "reverse geocoding" to convert latitude & longitude into a hierarchical address. 28 | This is a rather imprecise process so you may need to edit the results yourself. 29 | The address lookup service is provided by OpenCage_, using data from OpenStreetMap_. 30 | Other map providers don't allow lookup results to be permanently stored. 31 | 32 | Photini attempts to use all the data returned in an address lookup. 33 | This can lead to some duplication, e.g. a city name appearing twice in ``City``. 34 | Note also the blue underlining indicating text (in the ``City`` field) that is too long to store in IPTC-IIM metadata. 35 | 36 | .. image:: ../images/screenshot_292.png 37 | 38 | Scrolling down shows the latitude and longitude of the location. 39 | Note that these are not the same as the GPS coordinates shown at the top left. 40 | The reverse geocoding process chooses a "place" (address, business, landmark, etc.) near the actual coordinates and it is the coordinates of that place that are shown in the ``camera`` address. 41 | 42 | .. image:: ../images/screenshot_293.png 43 | 44 | It is usually necessary to edit the address. 45 | 46 | .. image:: ../images/screenshot_294.png 47 | 48 | Right-clicking on a location tab displays a context menu that allows the tab to be copied to a new tab or deleted. 49 | Copying the ``camera`` location is an easy way to initialise a ``subject`` location. 50 | (An empty ``subject 2`` tab is immediately created, in case the photograph has more than one subject.) 51 | 52 | .. image:: ../images/screenshot_295.png 53 | 54 | In this case most of the data is the same, but I changed ``street`` to the subject of the photograph rather than the place where I was standing, and then deleted the latitude & longitude. 55 | 56 | To reorder the subject locations, or to convert between camera and subject, you can drag any of the tabs to another position. 57 | Photini ensures there is always one empty subject location ready to be filled in. 58 | 59 | .. _IPTC web site: http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata#location-structure 60 | .. _ISO code: https://www.iso.org/iso-3166-country-codes.html 61 | .. _OpenCage: https://opencagedata.com/ 62 | .. _OpenStreetMap: https://www.openstreetmap.org/about/ 63 | -------------------------------------------------------------------------------- /src/doc/manual/extending.rst: -------------------------------------------------------------------------------- 1 | .. This is part of the Photini documentation. 2 | Copyright (C) 2019-24 Jim Easterbrook. 3 | See the file ../DOC_LICENSE.txt for copying conditions. 4 | 5 | Extending Photini 6 | ================= 7 | 8 | It is possible to add new functionality to Photini by providing a new "tab". 9 | This is of limited usefulness as the new functionality can only use existing Photini metadata items, unless you want to try "monkey patching" the ``photini.metadata`` module. 10 | 11 | Because the tabs are loaded dynamically at run-time the new tab does not need to be part of the Photini Python package. 12 | For example, if the package ``mypackage`` provides a Photini tab in the module ``mypackage.photini``, then adding ``mypackage.photini`` to the tab modules list (see :ref:`configuration-tabs`) will make the tab available in Photini. 13 | 14 | .. code-block:: guess 15 | 16 | [tabs] 17 | modules = ['photini.descriptive', 18 | 'photini.ownership', 19 | 'photini.technical', 20 | 'mypackage.photini', 21 | 'photini.googlemap', 22 | 'photini.bingmap', 23 | 'photini.azuremap', 24 | 'photini.mapboxmap', 25 | 'photini.address', 26 | 'photini.regions', 27 | 'photini.flickr', 28 | 'photini.ipernity', 29 | 'photini.pixelfed', 30 | 'photini.importer', 31 | 'photini.googlephotos'] 32 | 33 | You can add your module anywhere in the configuration file's module list. 34 | The user can then set the tab order by drag and drop. 35 | 36 | Every Photini tab has to have the following interface: 37 | 38 | .. code-block:: python 39 | 40 | class TabWidget(QtWidgets.QWidget): 41 | @staticmethod 42 | def tab_name(): 43 | return 'Tab name' 44 | 45 | def __init__(self, *arg, **kw): 46 | super(TabWidget, self).__init__(*arg, **kw) 47 | self.app = QtWidgets.QApplication.instance() 48 | # Add child widgets here. self.app has several useful attributes 49 | # such as the configuration and image_list objects. 50 | 51 | def refresh(self): 52 | # Called when the user selects the tab. If your tab does something 53 | # slow, such as contacting a server, then do it here rather than in 54 | # __init__. You might also want to update your tab to synchronise with 55 | # changes made in another tab, like the map tabs do. Otherwise, just 56 | # update the displayed metadata. 57 | self.new_selection(self.app.image_list.get_selected_images()) 58 | 59 | def do_not_close(self): 60 | # Return True if your tab is busy (e.g. uploading photographs) and 61 | # wants to stop the user closing the Photini program. 62 | return False 63 | 64 | def new_selection(self, selection): 65 | # Called when the image thumbnail area has a new selection. Most tabs 66 | # will need to update their displayed metadata to suit the selection. 67 | 68 | The ``tab_name`` method returns the label given to the tab. 69 | It should be as short as possible. 70 | 71 | When the user defines any new metadata you should get the current selection from the ``self.app.image_list`` and set the metadata on every image in the selection. 72 | 73 | It's probably easiest to start with a copy of the Photini tab module most like what you want to do, strip out the bits you don't need and then add your own stuff. 74 | -------------------------------------------------------------------------------- /src/doc/manual/flickr.rst: -------------------------------------------------------------------------------- 1 | .. This is part of the Photini documentation. 2 | Copyright (C) 2012-24 Jim Easterbrook. 3 | See the file ../DOC_LICENSE.txt for copying condidions. 4 | 5 | Flickr uploader 6 | =============== 7 | 8 | The ``Flickr upload`` tab (keyboard shortcut ``Alt+F``) allows you to upload your photographs to `Flickr `_, a popular online photograph sharing service. 9 | The Flickr upload tab uses the Flickr API but is not endorsed or certified by Flickr. 10 | 11 | Unlike some other Flickr uploaders, Photini uses the descriptive metadata you've created to set Flickr's title, description and tags. 12 | This means you don't have to retype all that information! 13 | 14 | Note that the Flickr upload tab is only enabled if you have installed some extra software packages (after activating your virtual environment, if you're using one):: 15 | 16 | pip install photini[flickr] 17 | 18 | See :ref:`installation ` for more detail. 19 | 20 | .. image:: ../images/screenshot_150.png 21 | 22 | Initially most of the Flickr uploader tab is disabled. 23 | It's only usable after you've authorised Photini to access your Flickr account by clicking the ``Log in`` button. 24 | 25 | .. image:: ../images/screenshot_151.png 26 | 27 | .. image:: ../images/screenshot_152.png 28 | 29 | The first time you click ``Log in`` Photini connects your web browser to Flickr, from where you can log in and give Photini permission to access Flickr on your behalf. 30 | (Note that Photini does not interact with other people's photos and videos.) 31 | 32 | .. image:: ../images/screenshot_153.png 33 | 34 | After authorisation your browser should display this page. 35 | The web browser window can then be closed. 36 | 37 | .. image:: ../images/screenshot_154.png 38 | 39 | If the authorisation is successful Photini displays your Flickr user name and profile picture. 40 | You should not need to redo this authorisation process unless you click the ``Log out`` button. 41 | 42 | Your current Flickr albums are shown on the right hand side of the Flickr uploader tab. 43 | You can add a new album with the ``New album`` button. 44 | This opens a pop-up dialog as shown below. 45 | 46 | .. image:: ../images/screenshot_155.png 47 | 48 | Type in the album details and click ``OK``. 49 | Note that the album will not be created on Flickr until you upload a photo to it. 50 | 51 | .. image:: ../images/screenshot_156.png 52 | 53 | To upload one or more photographs to Flickr, select them in the image selector area, then choose which (if any) of your albums to add them to and set the privacy, safety level and other settings, then click on the ``Start upload`` button. 54 | 55 | The album membership and privacy & other settings apply to all the photographs in this upload. 56 | If you want some photographs to have different album membership or privacy & other settings you need to upload them as a separate batch. 57 | 58 | .. image:: ../images/screenshot_157.png 59 | 60 | During uploading Photini displays a progress bar. 61 | Uploading takes place in the background, so you can continue to use other tabs while the upload is in progress. 62 | The upload can be stopped by clicking the ``Stop upload`` button. 63 | 64 | .. image:: ../images/screenshot_158.png 65 | 66 | After uploading photographs they are marked as having new metadata. 67 | 68 | .. image:: ../images/screenshot_159.png 69 | 70 | If you switch to the ``Keywords`` tab you can see there is a new keyword ``flickr:id=``. 71 | Photini uses this `triple tag`_ to store the Flickr photo id so it can be used to synchronise metadata later on, as described below. 72 | 73 | Synchronising local metadata to Flickr 74 | -------------------------------------- 75 | 76 | Sometimes you might change your photograph's metadata on Flickr and would like to copy those changes back to the image file on your computer. 77 | Select the image(s) you would like to update and click the ``Synchronise`` button. 78 | 79 | .. image:: ../images/screenshot_160.png 80 | 81 | If an image does not have a ``flickr:id`` keyword then Photini will try to find the photograph on Flickr by matching the date and time it was taken. 82 | If there is new metadata on Flickr then it is merged into the image's metadata. 83 | 84 | .. versionadded:: 2023.4.0 85 | Flickr "notes" attached to an image are shown on Photini's :doc:`regions` tab. 86 | 87 | .. image:: ../images/screenshot_161.png 88 | 89 | You can see what changed with the image's context menu ``View changes``. 90 | In this case Flickr has added some extra bits to the address. 91 | I chose to ignore this new metadata. 92 | 93 | Synchronising Flickr metadata to local 94 | -------------------------------------- 95 | 96 | If you change your image file metadata and would like to make the same changes on Flickr you can select the image and click on the ``Start upload`` button. 97 | 98 | .. image:: ../images/screenshot_162.png 99 | 100 | If you upload an image that already has a ``flickr:id`` keyword then Photini allows you to change the photograph's metadata instead of uploading a new photograph. 101 | You can also replace the image itself, which might be useful if you've processed it in another application. 102 | 103 | .. _triple tag: https://en.wikipedia.org/wiki/Tag_(metadata)#Triple_tags 104 | -------------------------------------------------------------------------------- /src/doc/manual/google_photos.rst: -------------------------------------------------------------------------------- 1 | .. This is part of the Photini documentation. 2 | Copyright (C) 2019-20 Jim Easterbrook. 3 | See the file ../DOC_LICENSE.txt for copying conditions. 4 | 5 | Google Photos uploader 6 | ====================== 7 | 8 | The ``Google Photos upload`` tab (keyboard shortcut ``Alt+P``) allows you to upload your photographs to `Google Photos`_. 9 | The Google Photos API is quite restrictive, so 3rd party software such as Photini is rather limited in its abilities. 10 | 11 | Note that the Google Photos upload tab is only enabled if you have installed some extra software packages (after activating your virtual environment, if you're using one):: 12 | 13 | pip install photini[google] 14 | 15 | See :ref:`installation ` for more detail. 16 | 17 | .. image:: ../images/screenshot_170.png 18 | 19 | Initially most of the Google Photos uploader tab is disabled. 20 | It's only usable after you've authorised Photini to access your Google Photos account by clicking the ``Log in`` button. 21 | 22 | The first time you click ``Log in`` Photini connects your web browser to Google Photos, from where you can log in and give Photini permission to access Google Photos on your behalf. 23 | 24 | .. note:: 25 | Unfortunately Google won't verify Photini because it continues to be developed, so you will be presented with several warning messages during the authentication process, and a warning email may be sent to your GMail account. 26 | 27 | .. image:: ../images/screenshot_171.png 28 | 29 | If the authorisation is successful Photini displays your Google Photos user name and profile picture. 30 | You should not need to redo this authorisation process unless you click the ``Log out`` button. 31 | 32 | Your current Google Photos albums are shown on the right hand side of the Google Photos uploader tab. 33 | The Google Photos API only allows Photini to add pictures to albums created by Photini. 34 | Other albums are shown but are disabled. 35 | 36 | You can add a new album with the ``New album`` button. 37 | This opens a pop-up dialog as shown below. 38 | 39 | .. image:: ../images/screenshot_172.png 40 | 41 | Type in the album title and click ``OK``. 42 | The title can be up to 500 characters long, so you may want to enlarge the dialog box. 43 | 44 | .. image:: ../images/screenshot_173.png 45 | 46 | To upload one or more photographs to Google Photos, select them in the image selector area, then choose which (if any) of your albums to add them to, then click on the ``Start upload`` button. 47 | 48 | .. image:: ../images/screenshot_174.png 49 | 50 | During uploading Photini displays a progress bar. 51 | Uploading takes place in the background, so you can continue to use other tabs while the upload is in progress. 52 | The upload can be stopped by clicking the ``Stop upload`` button. 53 | 54 | .. image:: ../images/screenshot_175.png 55 | 56 | .. _Google Photos: https://photos.google.com/ 57 | -------------------------------------------------------------------------------- /src/doc/manual/image_selector.rst: -------------------------------------------------------------------------------- 1 | .. This is part of the Photini documentation. 2 | Copyright (C) 2012-24 Jim Easterbrook. 3 | See the file ../DOC_LICENSE.txt for copying conditions. 4 | 5 | Image selector 6 | ============== 7 | 8 | When you start the Photini editor it displays a GUI (graphical user interface) as shown below. 9 | The exact appearance will depend on your operating system and window manager preferences, but the same functional elements should be present. 10 | (The appearance can be altered by setting a different style, see the :ref:`configuration section ` for more detail.) 11 | 12 | .. image:: ../images/screenshot_001.png 13 | 14 | The Photini editor GUI has two main areas. 15 | The upper part has a set of tabs to select different functions. 16 | (The tabs can be re-ordered by dragging and dropping a tab to your preferred position.) 17 | The lower part is an image selector that is common to all the tabs. 18 | In between the two is a divider that can be dragged with the mouse to change the relative sizes of the two parts. 19 | The overall size of the window can also be changed by dragging its edges or corners with the mouse. 20 | 21 | .. image:: ../images/screenshot_002.png 22 | 23 | Now load some images using the ``File`` menu ``Open files`` item (or its keyboard shortcut ``Ctrl+O``). 24 | The loaded files are displayed as thumbnail images in the image selector part of the GUI. 25 | Note that the thumbnail size can be changed with the slider control just beneath the thumbnail display area. 26 | The files can also be sorted by name or date by clicking on the appropriate button. 27 | 28 | Images can also be loaded by "drag and drop" from a file manager window or by adding them to the command line if you run Photini from a command terminal. 29 | If you open a directory then all the images in that directory will be opened. 30 | This is recursive, so beware of accidentally opening too many images in one go. 31 | 32 | .. image:: ../images/screenshot_003.png 33 | 34 | If you don't have a large screen you can reduce the image selector height to a single row. 35 | In this mode it scrolls horizontally instead of vertically. 36 | 37 | .. image:: ../images/screenshot_004.png 38 | 39 | Clicking on any thumbnail selects that file. 40 | The selected file is highlighted. 41 | The colours used depend on your system configuration. 42 | Double clicking on a thumbnail should display the full size image, using your computer's default image viewing application. 43 | 44 | .. tip:: 45 | 46 | If you change to a different image in the viewing application you may be able to right-click on the image and select "open with => Photini". 47 | This will select the image in Photini so you can be sure of editing the image you were just looking at. 48 | 49 | .. image:: ../images/screenshot_005.png 50 | 51 | Multiple files can be selected by holding down the 'shift' key while clicking on a second image. 52 | 53 | .. image:: ../images/screenshot_006.png 54 | 55 | To select multiple files that are not adjacent, hold down the 'control' key while clicking on the images. 56 | 57 | .. image:: ../images/screenshot_007.png 58 | 59 | The keyboard shortcut ``Ctrl+A`` selects all the loaded files. 60 | 61 | Selecting multiple files allows you to set metadata, such as the image title, on several files at once. 62 | This is much quicker than having to edit the metadata of each file separately. 63 | You will probably want to select a different group of files before editing each metadata item. 64 | For example, you might give the same title to all the images, then select only the first two or three before writing a description. 65 | 66 | Context menu 67 | ------------ 68 | 69 | Right-clicking on a thumbnail displays a context menu for all the currently selected files. 70 | 71 | .. image:: ../images/screenshot_008.png 72 | 73 | The context menu currently has five items. 74 | ``Reload file`` discards any metadata changes. 75 | ``Save changes`` saves any changes to the file(s). 76 | ``View changes`` displays any changes of metadata, as shown below. 77 | ``Regenerate thumbnail`` creates a new thumbnail of the image(s). 78 | ``Close file`` closes the file(s). 79 | 80 | .. image:: ../images/screenshot_009.png 81 | 82 | The ``view changes`` context menu item displays all the metadata items that have changed. 83 | In this example I've set two items that were previously empty. 84 | If you want to discard any of these changes then select the appropriate ``undo`` checkboxes and click on ``OK``. 85 | 86 | .. image:: ../images/screenshot_010.png 87 | 88 | The same menu items also appear in the main ``File`` menu. 89 | 90 | Using Photini with other programs 91 | --------------------------------- 92 | 93 | If you use other applications that can display or edit image metadata then you need to be careful when using them with Photini. 94 | Just like with a word processor or text editor it can be risky to have a file open for editing in more than one program. 95 | If you make changes in Photini you should save them before getting another program to reload or reopen the file. 96 | If you make changes in another program you should use the context menu described above to reload the file in Photini. 97 | 98 | You may also want to experiment with how other programs display the metadata you create in Photini and *vice versa*. 99 | Be aware that other programs might not store their metadata in the picture files, but use a database or separate files (other than XMP sidecars). 100 | Such programs are not compatible with Photini, unless they can be configured to use metadata standards. 101 | -------------------------------------------------------------------------------- /src/doc/manual/importer.rst: -------------------------------------------------------------------------------- 1 | .. This is part of the Photini documentation. 2 | Copyright (C) 2012-24 Jim Easterbrook. 3 | See the file ../DOC_LICENSE.txt for copying conditions. 4 | 5 | Image importer 6 | ============== 7 | 8 | The ``Import photos`` tab (keyboard shortcut ``Alt+I``) allows you to copy photographs from your digital camera or anywhere else on your computer (for example, a camera memory card if your computer has a card reader). 9 | Whilst there are many other programs to do this, I've never found one that does things the way I want, so I added one to Photini. 10 | 11 | Note that you can only import directly from cameras if you have installed python-gphoto2 (which is not available on Windows). 12 | This is easily done with ``pip`` (after activating your virtual environment, if you're using one):: 13 | 14 | pip install photini[importer] 15 | 16 | See :ref:`installation ` for more detail. 17 | 18 | The key part of the importer is the ``Target format`` field. 19 | This provides a very flexible way to specify where on your computer imported images should be stored. 20 | It uses ``%`` formats to generate file and directory names based on the image capture date & time. 21 | The most useful ones are ``%Y`` (year), ``%m`` (month number) and ``%d`` (day of the month) but many more are available. 22 | See the `Python documentation `_ for a complete list. 23 | 24 | As well as the date & time format strings, bracketed keywords can be used to manipulate parts of the file name: 25 | 26 | ======== ================================== ======= 27 | keyword meaning example 28 | ======== ================================== ======= 29 | {camera} the camera model name Canon_PowerShot_A1100_IS 30 | {name} the complete file name IMG_9999.JPG 31 | {number} the numeric part of the file name 9999 32 | {root} the filename without its extension IMG_9999 33 | {ext} the filename extension .JPG 34 | ======== ================================== ======= 35 | 36 | Below the ``Target format`` field is an example generated from the current format to help you edit it correctly. 37 | 38 | Note that Photini stores a different target format for each camera or source folder that you use. 39 | This can be useful if you have two cameras that use the same file names. 40 | For example, I use ``/home/jim/Pictures/from_camera/%Y/%Y_%m_%d/100D_{name}`` for my DSLR to rename files from ``IMG_9999.JPG`` to ``100D_IMG_9999.JPG`` so they don't clash with files from my compact camera, which also uses names like ``IMG_9999.JPG``. 41 | 42 | .. image:: ../images/screenshot_180.png 43 | 44 | After connecting one or more cameras, one of them can be chosen from the ``