Merge remote-tracking branch 'refs/remotes/upstream/feature/manual-layout'
Conflicts: src/app/puzzle/vpmainwindow.cpp src/app/puzzle/vpmainwindow.h
This commit is contained in:
commit
c9a25613f5
Valentina.promain.cpppuzzle.pripuzzle.provpapplication.cppvpapplication.hvpmainwindow.cppvpmainwindow.hvpmainwindow.uivpsheet.h
dist
share
icons
128x128
256x256
48x48
512x512
64x64
translations
translations.provalentina.tsvalentina_cs_CZ.tsvalentina_de_DE.tsvalentina_el_GR.tsvalentina_en_CA.tsvalentina_en_IN.tsvalentina_en_US.tsvalentina_es_ES.tsvalentina_fi_FI.tsvalentina_fr_FR.tsvalentina_he_IL.tsvalentina_id_ID.tsvalentina_it_IT.tsvalentina_nl_NL.tsvalentina_pl_PL.tsvalentina_pt_BR.tsvalentina_ro_RO.tsvalentina_ru_RU.tsvalentina_uk_UA.tsvalentina_zh_CN.ts
src
app
puzzle
dialogs
configpages
puzzlepreferencesconfigurationpage.cpppuzzlepreferencesconfigurationpage.hpuzzlepreferencesconfigurationpage.uipuzzlepreferencespathpage.cpppuzzlepreferencespathpage.hpuzzlepreferencespathpage.ui
dialogpuzzlepreferences.cppdialogpuzzlepreferences.hdialogpuzzlepreferences.uixml
tape
valentina
libs
|
@ -53,6 +53,3 @@ unix {
|
|||
|
||||
TEMPLATE = subdirs
|
||||
SUBDIRS = src
|
||||
|
||||
RESOURCES += \
|
||||
src/app/puzzle/share/resources/puzzleicon.qrc
|
||||
|
|
1
dist/debian/menu
vendored
1
dist/debian/menu
vendored
|
@ -1,2 +1,3 @@
|
|||
?package(valentina): needs="X11" section="Applications/Graphics" title="Valentina" command="valentina"
|
||||
?package(valentina): needs="X11" section="Applications/Data Management" title="Tape" command="tape"
|
||||
?package(valentina): needs="X11" section="Applications/Data Management" title="Puzzle" command="puzzle"
|
||||
|
|
12
dist/debian/puzzle.1
vendored
12
dist/debian/puzzle.1
vendored
|
@ -20,7 +20,7 @@ The filename of exported layout file. Use it to enable console export mode.
|
|||
.IP "-r, --rawLayout <The raw layout data file>"
|
||||
Load pattern pieces form the raw layout data file.
|
||||
.IP "-f, --format <Format number>"
|
||||
Number corresponding to tiled pdf page template (default = 0, export mode with tiled pdf format): <not defined>
|
||||
Number corresponding to tiled pdf page template (default = 0, export mode with tiled pdf format): <not defined>
|
||||
.IP "--bdxf"
|
||||
Export dxf in binary form.
|
||||
.IP "--text2paths"
|
||||
|
@ -40,20 +40,16 @@ Tiled page top margin in current units like 3.0 (export mode). If not set will b
|
|||
.IP "--tiledbmargin <The bottom margin>"
|
||||
Tiled page bottom margin in current units like 3.0 (export mode). If not set will be used value default value 1 cm.
|
||||
.IP "--tiledLandscape"
|
||||
Set tiled page orienatation to landscape (export mode). Default value if not set portrait.
|
||||
Set tiled page orienatation to landscape (export mode). Default value if not set portrait.
|
||||
.IP "-t, --test"
|
||||
Run the program in a test mode. The program in this mode loads a single layout file and silently quit without showing the main window. The key have priority before key 'exportFile'.
|
||||
Run the program in a test mode. The program in this mode loads a single layout file and silently quit without showing the main window. The key have priority before key 'exportFile'.
|
||||
.IP "--no-scaling"
|
||||
Disable high dpi scaling. Call this option if has problem with scaling (by default scaling enabled). Alternatively you can use the QT_AUTO_SCREEN_SCALE_FACTOR=0 environment variable.
|
||||
Disable high dpi scaling. Call this option if has problem with scaling (by default scaling enabled). Alternatively you can use the QT_AUTO_SCREEN_SCALE_FACTOR=0 environment variable.
|
||||
.IP Arguments:
|
||||
.I filename
|
||||
\- the manual layout file.
|
||||
.SH AUTHOR
|
||||
.RI "This manual page was written by Roman Telezhynskyi <" dismine@gmail.com ">"
|
||||
.SH "SEE ALSO"
|
||||
.RB "Full " "User Manual" " is availiable in"
|
||||
.UR https://bitbucket.org/dismine/valentina/wiki/manual/Content
|
||||
.UE
|
||||
|
||||
.BR valentina (1)
|
||||
|
||||
|
|
3
dist/debian/source/include-binaries
vendored
3
dist/debian/source/include-binaries
vendored
|
@ -1,10 +1,13 @@
|
|||
debian/usr/share/pixmaps/valentina.png
|
||||
debian/usr/share/pixmaps/tape.png
|
||||
debian/usr/share/pixmaps/puzzle.png
|
||||
debian/usr/share/pixmaps/application-x-valentina-pattern.png
|
||||
debian/usr/share/pixmaps/application-x-valentina-i-measurements.png
|
||||
debian/usr/share/pixmaps/application-x-valentina-s-measurements.png
|
||||
debian/usr/share/pixmaps/application-x-valentina-layout.png
|
||||
debian/valentina/usr/bin/valentina
|
||||
debian/valentina/usr/bin/tape
|
||||
debian/valentina/usr/bin/puzzle
|
||||
debian/valentina/usr/share/valentina/diagrams.rcc
|
||||
debian/valentina/usr/share/valentina/translations/measurements_p0_cs_CZ.qm
|
||||
debian/valentina/usr/share/valentina/translations/measurements_p0_de_DE.qm
|
||||
|
|
1
dist/debian/valentina.manpages
vendored
1
dist/debian/valentina.manpages
vendored
|
@ -1,2 +1,3 @@
|
|||
debian/valentina.1
|
||||
debian/tape.1
|
||||
debian/puzzle.1
|
||||
|
|
1
dist/debian/valentina.mime
vendored
1
dist/debian/valentina.mime
vendored
|
@ -1,3 +1,4 @@
|
|||
application/x-valentina-pattern; valentina %s; nametemplate=%s.val; description="Valentina pattern" edit=valentina '%s'; priority=6
|
||||
application/x-valentina-i-pattern; tape %s; nametemplate=%s.vit; description="Valentina individual measurments" edit=tape '%s'; priority=6
|
||||
application/x-valentina-s-pattern; tape %s; nametemplate=%s.vst; description="Valentina standard measurments" edit=tape '%s'; priority=6
|
||||
application/x-valentina-layout; puzzle %s; nametemplate=%s.vlt; description="Valentina layout" edit=puzzle '%s'; priority=6
|
||||
|
|
94
dist/debian/valentina.sharedmimeinfo
vendored
94
dist/debian/valentina.sharedmimeinfo
vendored
|
@ -282,4 +282,98 @@
|
|||
<glob pattern="*.vst"/>
|
||||
<icon name="application-x-valentina-s-measurements"/>
|
||||
</mime-type>
|
||||
<mime-type type="application/x-valentina-layout">
|
||||
<sub-class-of type="text/xml"/>
|
||||
<_comment>Valentina layout</_comment>
|
||||
<comment xml:lang="af">Valentina layout</comment>
|
||||
<comment xml:lang="ar">Valentina layout</comment>
|
||||
<comment xml:lang="as">Valentina layout</comment>
|
||||
<comment xml:lang="ast">Valentina layout</comment>
|
||||
<comment xml:lang="be">Valentina layout</comment>
|
||||
<comment xml:lang="bg">Valentina layout</comment>
|
||||
<comment xml:lang="bn">Valentina layout</comment>
|
||||
<comment xml:lang="br">Valentina layout</comment>
|
||||
<comment xml:lang="bs">Valentina layout</comment>
|
||||
<comment xml:lang="ca">Valentina layout</comment>
|
||||
<comment xml:lang="ca-valencia">Valentina layout</comment>
|
||||
<comment xml:lang="cs">Valentina layout</comment>
|
||||
<comment xml:lang="cy">Valentina layout</comment>
|
||||
<comment xml:lang="da">Valentina layout</comment>
|
||||
<comment xml:lang="de">Valentina layout</comment>
|
||||
<comment xml:lang="dz">Valentina layout</comment>
|
||||
<comment xml:lang="el">Valentina layout</comment>
|
||||
<comment xml:lang="en-GB">Valentina layout</comment>
|
||||
<comment xml:lang="en-ZA">Valentina layout</comment>
|
||||
<comment xml:lang="eo">Valentina layout</comment>
|
||||
<comment xml:lang="es">Valentina layout</comment>
|
||||
<comment xml:lang="et">Valentina layout</comment>
|
||||
<comment xml:lang="eu">Valentina layout</comment>
|
||||
<comment xml:lang="fa">Valentina layout</comment>
|
||||
<comment xml:lang="fi">Valentina layout</comment>
|
||||
<comment xml:lang="fr">Valentina layout</comment>
|
||||
<comment xml:lang="ga">Valentina layout</comment>
|
||||
<comment xml:lang="gd">Valentina layout</comment>
|
||||
<comment xml:lang="gl">Valentina layout</comment>
|
||||
<comment xml:lang="gu">Valentina layout</comment>
|
||||
<comment xml:lang="he">Valentina layout</comment>
|
||||
<comment xml:lang="hi">Valentina layout</comment>
|
||||
<comment xml:lang="hr">Valentina layout</comment>
|
||||
<comment xml:lang="hu">Valentina layout</comment>
|
||||
<comment xml:lang="id">Valentina layout</comment>
|
||||
<comment xml:lang="is">Valentina layout</comment>
|
||||
<comment xml:lang="it">Valentina layout</comment>
|
||||
<comment xml:lang="ja">Valentina layout</comment>
|
||||
<comment xml:lang="ka">Valentina layout</comment>
|
||||
<comment xml:lang="kk">Valentina layout</comment>
|
||||
<comment xml:lang="km">Valentina layout</comment>
|
||||
<comment xml:lang="kmr-Latn">Valentina layout</comment>
|
||||
<comment xml:lang="ko">Valentina layout</comment>
|
||||
<comment xml:lang="lt">Valentina layout</comment>
|
||||
<comment xml:lang="lv">Valentina layout</comment>
|
||||
<comment xml:lang="mk">Valentina layout</comment>
|
||||
<comment xml:lang="ml">Valentina layout</comment>
|
||||
<comment xml:lang="mn">Valentina layout</comment>
|
||||
<comment xml:lang="mr">Valentina layout</comment>
|
||||
<comment xml:lang="nb">Valentina layout</comment>
|
||||
<comment xml:lang="ne">Valentina layout</comment>
|
||||
<comment xml:lang="nl">Valentina layout</comment>
|
||||
<comment xml:lang="nn">Valentina layout</comment>
|
||||
<comment xml:lang="nr">Valentina layout</comment>
|
||||
<comment xml:lang="nso">Valentina layout</comment>
|
||||
<comment xml:lang="oc">Valentina layout</comment>
|
||||
<comment xml:lang="om">Valentina layout</comment>
|
||||
<comment xml:lang="or">Valentina layout</comment>
|
||||
<comment xml:lang="pa-IN">Valentina layout</comment>
|
||||
<comment xml:lang="pl">Valentina layout</comment>
|
||||
<comment xml:lang="pt">Valentina layout</comment>
|
||||
<comment xml:lang="pt-BR">Valentina layout</comment>
|
||||
<comment xml:lang="ro">Valentina layout</comment>
|
||||
<comment xml:lang="ru">Valentina раскладка</comment>
|
||||
<comment xml:lang="rw">Valentina layout</comment>
|
||||
<comment xml:lang="si">Valentina layout</comment>
|
||||
<comment xml:lang="sk">Valentina layout</comment>
|
||||
<comment xml:lang="sl">Valentina layout</comment>
|
||||
<comment xml:lang="sr">Valentina layout</comment>
|
||||
<comment xml:lang="ss">Valentina layout</comment>
|
||||
<comment xml:lang="st">Valentina layout</comment>
|
||||
<comment xml:lang="sv">Valentina layout</comment>
|
||||
<comment xml:lang="ta">Valentina layout</comment>
|
||||
<comment xml:lang="te">Valentina layout</comment>
|
||||
<comment xml:lang="tg">Valentina layout</comment>
|
||||
<comment xml:lang="th">Valentina layout</comment>
|
||||
<comment xml:lang="tn">Valentina layout</comment>
|
||||
<comment xml:lang="tr">Valentina layout</comment>
|
||||
<comment xml:lang="ts">Valentina layout</comment>
|
||||
<comment xml:lang="ug">Valentina layout</comment>
|
||||
<comment xml:lang="uk">Valentina розкладка</comment>
|
||||
<comment xml:lang="uz">Valentina layout</comment>
|
||||
<comment xml:lang="ve">Valentina layout</comment>
|
||||
<comment xml:lang="vi">Valentina layout</comment>
|
||||
<comment xml:lang="xh">Valentina layout</comment>
|
||||
<comment xml:lang="zh-CN">Valentina layout</comment>
|
||||
<comment xml:lang="zh-TW">Valentina layout</comment>
|
||||
<comment xml:lang="zu">Valentina layout</comment>
|
||||
<glob pattern="*.vlt"/>
|
||||
<icon name="application-x-valentina-layout"/>
|
||||
</mime-type>
|
||||
</mime-info>
|
||||
|
|
|
@ -59,6 +59,7 @@ src_install() {
|
|||
|
||||
doman dist/debian/${PN}.1
|
||||
doman dist/debian/tape.1
|
||||
doman dist/debian/puzzle.1
|
||||
|
||||
cp dist/debian/valentina.sharedmimeinfo dist/debian/${PN}.xml || die
|
||||
insinto /usr/share/mime/packages
|
||||
|
|
BIN
dist/macx/layout.icns
vendored
Normal file
BIN
dist/macx/layout.icns
vendored
Normal file
Binary file not shown.
50
dist/macx/puzzle/Info.plist
vendored
50
dist/macx/puzzle/Info.plist
vendored
|
@ -9,9 +9,9 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>10.6</string>
|
||||
<string>10.7</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>© 2013-2020, Valentina project</string>
|
||||
<string>© 2013-2021, Valentina project</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>@TYPEINFO@</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
|
@ -19,11 +19,53 @@
|
|||
<key>CFBundleIdentifier</key>
|
||||
<string>io.bitbucket.valentinaproject.@EXECUTABLE@</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.7.0</string>
|
||||
<string>0.7.47</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>0.7.0.0</string>
|
||||
<string>0.7.47.0</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Editor</string>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
<string>layout.incs</string>
|
||||
<key>LSItemContentTypes</key>
|
||||
<array>
|
||||
<string>io.bitbucket.valentinaproject.vlt</string>
|
||||
</array>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Valentina layout</string>
|
||||
<key>LSHandlerRank</key>
|
||||
<string>Owner</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>UTExportedTypeDeclarations</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>UTTypeConformsTo</key>
|
||||
<array>
|
||||
<string>public.text</string>
|
||||
<string>public.xml</string>
|
||||
</array>
|
||||
<key>UTTypeDescription</key>
|
||||
<string>Valentina layout</string>
|
||||
<key>UTTypeIconFile</key>
|
||||
<string>layout.icns</string>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>io.bitbucket.valentinaproject.vlt</string>
|
||||
<key>UTTypeTagSpecification</key>
|
||||
<dict>
|
||||
<key>public.filename-extension</key>
|
||||
<array>
|
||||
<string>vlt</string>
|
||||
</array>
|
||||
<key>public.mime-type</key>
|
||||
<string>text/xml</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
<key>NSRequiresAquaSystemAppearance</key>
|
||||
<true/>
|
||||
</dict>
|
||||
|
|
14
dist/puzzle.desktop
vendored
Normal file
14
dist/puzzle.desktop
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Puzzle
|
||||
Exec=puzzle %F
|
||||
Version=1.0
|
||||
GenericName=Valentina's layout editor
|
||||
Comment=Create and edit layouts
|
||||
Comment[uk]=Створюйте і редагуйте розкладки
|
||||
Comment[ru]=Создавайте и редактируйте раскладку
|
||||
Icon=puzzle
|
||||
Terminal=false
|
||||
MimeType=application/x-valentina-layout;
|
||||
Categories=Qt;Utility;FileTools;
|
||||
TryExec=puzzle
|
9
dist/rpm/valentina.spec
vendored
9
dist/rpm/valentina.spec
vendored
|
@ -151,6 +151,9 @@ gzip -9c dist/debian/%{name}.1 > dist/debian/%{name}.1.gz &&
|
|||
gzip -9c dist/debian/tape.1 > dist/debian/tape.1.gz &&
|
||||
%{__install} -Dm 644 dist/debian/tape.1.gz %{buildroot}%{_mandir}/man1/tape.1.gz
|
||||
|
||||
gzip -9c dist/debian/puzzle.1 > dist/debian/puzzle.1.gz &&
|
||||
%{__install} -Dm 644 dist/debian/puzzle.1.gz %{buildroot}%{_mandir}/man1/puzzle.1.gz
|
||||
|
||||
cp dist/debian/valentina.sharedmimeinfo dist/debian/%{name}.xml &&
|
||||
%{__install} -Dm 644 dist/debian/%{name}.xml %{buildroot}%{_datadir}/mime/packages/%{name}.xml
|
||||
|
||||
|
@ -160,6 +163,7 @@ cp dist/debian/valentina.mime dist/debian/%{name} &&
|
|||
%if 0%{?suse_version} > 0
|
||||
%suse_update_desktop_file -r %{name} Graphics VectorGraphics 2DGraphics
|
||||
%suse_update_desktop_file -r tape Utility Applet
|
||||
%suse_update_desktop_file -r puzzle Utility Applet
|
||||
%endif
|
||||
|
||||
%post
|
||||
|
@ -194,8 +198,10 @@ fi
|
|||
%license LICENSE_GPL.txt
|
||||
%doc %{_mandir}/man1/%{name}.1*
|
||||
%doc %{_mandir}/man1/tape.1*
|
||||
%doc %{_mandir}/man1/puzzle.1*
|
||||
%{_bindir}/valentina
|
||||
%{_bindir}/tape
|
||||
%{_bindir}/puzzle
|
||||
%{_libdir}/libvpropertyexplorer.so
|
||||
%{_libdir}/libvpropertyexplorer.so.*
|
||||
%{_libdir}/libqmuparser.so
|
||||
|
@ -208,6 +214,7 @@ fi
|
|||
%{_datadir}/mime/packages/%{name}.xml
|
||||
%{_datadir}/applications/%{name}.desktop
|
||||
%{_datadir}/applications/tape.desktop
|
||||
%{_datadir}/applications/puzzle.desktop
|
||||
|
||||
%dir %{_datadir}/icons/
|
||||
%dir %{_datadir}/icons/hicolor/
|
||||
|
@ -242,7 +249,7 @@ fi
|
|||
%{_datadir}/%{name}/labels/*.xml
|
||||
|
||||
%clean
|
||||
rm -f dist/debian/%{name}.1.gz dist/debian/tape.1.gz dist/debian/%{name}.xml dist/debian/%{name}
|
||||
rm -f dist/debian/%{name}.1.gz dist/debian/tape.1.gz dist/debian/puzzle.1.gz dist/debian/%{name}.xml dist/debian/%{name}
|
||||
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}
|
||||
|
||||
|
||||
|
|
13
dist/win/inno/valentina.iss
vendored
13
dist/win/inno/valentina.iss
vendored
|
@ -86,6 +86,7 @@ Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescrip
|
|||
Name: "fileassoc1"; Description: "{cm:CreateFileAssocVal}"; GroupDescription: "{cm:FileAssoc}"
|
||||
Name: "fileassoc2"; Description: "{cm:CreateFileAssocVit}"; GroupDescription: "{cm:FileAssoc}"
|
||||
Name: "fileassoc3"; Description: "{cm:CreateFileAssocVst}"; GroupDescription: "{cm:FileAssoc}"
|
||||
Name: "fileassoc4"; Description: "{cm:CreateFileAssocVlt}"; GroupDescription: "{cm:FileAssoc}"
|
||||
Name: "deletesettings"; Description: "{cm:RemoveAnyExistingSettings}"; GroupDescription: "{cm:ManageSettings}"; Flags: unchecked
|
||||
|
||||
[Types]
|
||||
|
@ -161,6 +162,7 @@ Name: "lang_files\chinese"; Description: "Chinese (China)"; Types: full custom;
|
|||
; Signing
|
||||
Source: ".\valentina\valentina.exe"; DestDir: "{app}"; Flags: ignoreversion sign
|
||||
Source: ".\valentina\tape.exe"; DestDir: "{app}"; Flags: ignoreversion sign
|
||||
Source: ".\valentina\puzzle.exe"; DestDir: "{app}"; Flags: ignoreversion sign
|
||||
Source: ".\valentina\vpropertyexplorer.dll"; DestDir: "{app}"; Flags: ignoreversion sign
|
||||
Source: ".\valentina\qmuparser2.dll"; DestDir: "{app}"; Flags: ignoreversion sign
|
||||
; Localizations
|
||||
|
@ -249,6 +251,7 @@ Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChang
|
|||
Root: "HKCR"; Subkey: ".val"; ValueType: string; ValueName: ""; ValueData: "Valentina.Pattern"; Flags: uninsdeletevalue; Tasks: fileassoc1
|
||||
Root: "HKCR"; Subkey: ".vit"; ValueType: string; ValueName: ""; ValueData: "Valentina.IndividualMeasurements"; Flags: uninsdeletevalue; Tasks: fileassoc2
|
||||
Root: "HKCR"; Subkey: ".vst"; ValueType: string; ValueName: ""; ValueData: "Valentina.StandardMeasurements"; Flags: uninsdeletevalue; Tasks: fileassoc3
|
||||
Root: "HKCR"; Subkey: ".vlt"; ValueType: string; ValueName: ""; ValueData: "Valentina.Layout"; Flags: uninsdeletevalue; Tasks: fileassoc3
|
||||
|
||||
Root: "HKCR"; Subkey: "Valentina.Pattern"; ValueType: string; ValueData: "Valentina pattern file"; Flags: uninsdeletekey; Tasks: fileassoc1
|
||||
Root: "HKCR"; Subkey: "Valentina.Pattern\DefaultIcon"; ValueType: string; ValueData: "{app}\pattern.ico,0"; Tasks: fileassoc1
|
||||
|
@ -262,6 +265,10 @@ Root: "HKCR"; Subkey: "Valentina.StandardMeasurements"; ValueType: string; Value
|
|||
Root: "HKCR"; Subkey: "Valentina.StandardMeasurements\DefaultIcon"; ValueType: string; ValueData: "{app}\s-measurements.ico,0"; Tasks: fileassoc3
|
||||
Root: "HKCR"; Subkey: "Valentina.StandardMeasurements\shell\open\command"; ValueType: string; ValueData: """{app}\tape.exe"" ""%1"""; Tasks: fileassoc3
|
||||
|
||||
Root: "HKCR"; Subkey: "Valentina.Layout"; ValueType: string; ValueData: "Valentina layout file"; Flags: uninsdeletekey; Tasks: fileassoc1
|
||||
Root: "HKCR"; Subkey: "Valentina.Layout\DefaultIcon"; ValueType: string; ValueData: "{app}\layout.ico,0"; Tasks: fileassoc1
|
||||
Root: "HKCR"; Subkey: "Valentina.Layout\shell\open\command"; ValueType: string; ValueData: """{app}\puzzle.exe"" ""%1"""; Tasks: fileassoc1
|
||||
|
||||
[CustomMessages]
|
||||
FileAssoc = Create file associations
|
||||
english.FileAssoc = Create file associations
|
||||
|
@ -287,6 +294,12 @@ russian.CreateFileAssocVst = *.vst (Мультиразмерный файл ме
|
|||
ukrainian.CreateFileAssocVst = *.vst (Мультирозмірний файл мірок)
|
||||
german.CreateFileAssocVst = *.vst (Multi-Size Maßdatei)
|
||||
|
||||
CreateFileAssocVlt = *.vlt (Layout file)
|
||||
english.CreateFileAssocVlt = *.vlt (Layout file)
|
||||
russian.CreateFileAssocVlt = *.vlt (Файл раскладки)
|
||||
ukrainian.CreateFileAssocVlt = *.vlt (Файл роскладки)
|
||||
german.CreateFileAssocVlt = *.vlt (Layoutdatei)
|
||||
|
||||
WarnRemoveOld = is installed at the moment. Remove old version?
|
||||
english.WarnRemoveOld = is installed at the moment. Remove old version?
|
||||
russian.WarnRemoveOld = установлена на данный момент. Удалить старую версию?
|
||||
|
|
BIN
dist/win/layout.ico
vendored
Normal file
BIN
dist/win/layout.ico
vendored
Normal file
Binary file not shown.
After (image error) Size: 17 KiB |
BIN
share/icons/128x128/apps/puzzle.png
Normal file
BIN
share/icons/128x128/apps/puzzle.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 3.1 KiB |
BIN
share/icons/128x128/mimetypes/application-x-valentina-layout.png
Normal file
BIN
share/icons/128x128/mimetypes/application-x-valentina-layout.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 4.4 KiB |
BIN
share/icons/256x256/apps/puzzle.png
Normal file
BIN
share/icons/256x256/apps/puzzle.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 5.6 KiB |
BIN
share/icons/256x256/mimetypes/application-x-valentina-layout.png
Normal file
BIN
share/icons/256x256/mimetypes/application-x-valentina-layout.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 9.5 KiB |
BIN
share/icons/48x48/apps/puzzle.png
Normal file
BIN
share/icons/48x48/apps/puzzle.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 4.9 KiB |
BIN
share/icons/48x48/mimetypes/application-x-valentina-layout.png
Normal file
BIN
share/icons/48x48/mimetypes/application-x-valentina-layout.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 10 KiB |
BIN
share/icons/512x512/apps/puzzle.png
Normal file
BIN
share/icons/512x512/apps/puzzle.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 12 KiB |
BIN
share/icons/512x512/mimetypes/application-x-valentina-layout.png
Normal file
BIN
share/icons/512x512/mimetypes/application-x-valentina-layout.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 23 KiB |
BIN
share/icons/64x64/apps/puzzle.png
Normal file
BIN
share/icons/64x64/apps/puzzle.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 1.5 KiB |
BIN
share/icons/64x64/mimetypes/application-x-valentina-layout.png
Normal file
BIN
share/icons/64x64/mimetypes/application-x-valentina-layout.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 2.1 KiB |
|
@ -10,6 +10,7 @@ TEMPLATE = app
|
|||
DEPENDPATH += \
|
||||
../../src/app/valentina \
|
||||
../../src/app/tape \
|
||||
../../src/app/puzzle \
|
||||
../../src/libs/qmuparser \
|
||||
../../src/libs/vpropertyexplorer \
|
||||
../../src/libs/ifc \
|
||||
|
@ -25,6 +26,7 @@ DEPENDPATH += \
|
|||
|
||||
include(../../src/app/valentina/valentina.pri)
|
||||
include(../../src/app/tape/tape.pri)
|
||||
include(../../src/app/puzzle/puzzle.pri)
|
||||
include(../../src/libs/qmuparser/qmuparser.pri)
|
||||
include(../../src/libs/vpropertyexplorer/vpropertyexplorer.pri)
|
||||
include(../../src/libs/ifc/ifc.pri)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,104 @@
|
|||
/************************************************************************
|
||||
**
|
||||
** @file puzzlepreferencesconfigurationpage.cpp
|
||||
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||
** @date 21 5, 2021
|
||||
**
|
||||
** @brief
|
||||
** @copyright
|
||||
** This source code is part of the Valentina project, a pattern making
|
||||
** program, whose allow create and modeling patterns of clothing.
|
||||
** Copyright (C) 2021 Valentina project
|
||||
** <https://gitlab.com/smart-pattern/valentina> All Rights Reserved.
|
||||
**
|
||||
** Valentina is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** Valentina is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with Valentina. If not, see <http://www.gnu.org/licenses/>.
|
||||
**
|
||||
*************************************************************************/
|
||||
|
||||
#include "puzzlepreferencesconfigurationpage.h"
|
||||
#include "ui_puzzlepreferencesconfigurationpage.h"
|
||||
#include "../../vpapplication.h"
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
PuzzlePreferencesConfigurationPage::PuzzlePreferencesConfigurationPage(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::PuzzlePreferencesConfigurationPage)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
InitLanguages(ui->langCombo);
|
||||
connect(ui->langCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [this]()
|
||||
{
|
||||
m_langChanged = true;
|
||||
});
|
||||
|
||||
// Theme
|
||||
ui->darkModeCheck->setChecked(VPApplication::VApp()->PuzzleSettings()->GetDarkMode());
|
||||
|
||||
// Native dialogs
|
||||
ui->checkBoxDontUseNativeDialog->setChecked(VPApplication::VApp()->PuzzleSettings()->IsDontUseNativeDialog());
|
||||
|
||||
//----------------------- Toolbar
|
||||
ui->toolBarStyleCheck->setChecked(VPApplication::VApp()->PuzzleSettings()->GetToolBarStyle());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
PuzzlePreferencesConfigurationPage::~PuzzlePreferencesConfigurationPage()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QStringList PuzzlePreferencesConfigurationPage::Apply()
|
||||
{
|
||||
QStringList preferences;
|
||||
VPSettings *settings = VPApplication::VApp()->PuzzleSettings();
|
||||
|
||||
settings->SetToolBarStyle(ui->toolBarStyleCheck->isChecked());
|
||||
|
||||
if (settings->GetDarkMode() != ui->darkModeCheck->isChecked())
|
||||
{
|
||||
settings->SetDarkMode(ui->darkModeCheck->isChecked());
|
||||
preferences.append(tr("dark mode"));
|
||||
}
|
||||
|
||||
if (settings->IsDontUseNativeDialog() != ui->checkBoxDontUseNativeDialog->isChecked())
|
||||
{
|
||||
settings->SetDontUseNativeDialog(ui->checkBoxDontUseNativeDialog->isChecked());
|
||||
}
|
||||
|
||||
if (m_langChanged)
|
||||
{
|
||||
const QString locale = qvariant_cast<QString>(ui->langCombo->currentData());
|
||||
settings->SetLocale(locale);
|
||||
m_langChanged = false;
|
||||
|
||||
VAbstractApplication::VApp()->LoadTranslation(locale);
|
||||
qApp->processEvents();// force to call changeEvent
|
||||
}
|
||||
|
||||
return preferences;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void PuzzlePreferencesConfigurationPage::changeEvent(QEvent *event)
|
||||
{
|
||||
if (event->type() == QEvent::LanguageChange)
|
||||
{
|
||||
// retranslate designer form (single inheritance approach)
|
||||
ui->retranslateUi(this);
|
||||
}
|
||||
// remember to call base class implementation
|
||||
QWidget::changeEvent(event);
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
/************************************************************************
|
||||
**
|
||||
** @file puzzlepreferencesconfigurationpage.h
|
||||
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||
** @date 21 5, 2021
|
||||
**
|
||||
** @brief
|
||||
** @copyright
|
||||
** This source code is part of the Valentina project, a pattern making
|
||||
** program, whose allow create and modeling patterns of clothing.
|
||||
** Copyright (C) 2021 Valentina project
|
||||
** <https://gitlab.com/smart-pattern/valentina> All Rights Reserved.
|
||||
**
|
||||
** Valentina is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** Valentina is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with Valentina. If not, see <http://www.gnu.org/licenses/>.
|
||||
**
|
||||
*************************************************************************/
|
||||
#ifndef PUZZLEPREFERENCESCONFIGURATIONPAGE_H
|
||||
#define PUZZLEPREFERENCESCONFIGURATIONPAGE_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class PuzzlePreferencesConfigurationPage;
|
||||
}
|
||||
|
||||
class PuzzlePreferencesConfigurationPage : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit PuzzlePreferencesConfigurationPage(QWidget *parent = nullptr);
|
||||
virtual ~PuzzlePreferencesConfigurationPage();
|
||||
|
||||
QStringList Apply();
|
||||
|
||||
protected:
|
||||
virtual void changeEvent(QEvent* event) override;
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(PuzzlePreferencesConfigurationPage)
|
||||
Ui::PuzzlePreferencesConfigurationPage *ui;
|
||||
bool m_langChanged{false};
|
||||
};
|
||||
|
||||
#endif // PUZZLEPREFERENCESCONFIGURATIONPAGE_H
|
|
@ -0,0 +1,117 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>PuzzlePreferencesConfigurationPage</class>
|
||||
<widget class="QWidget" name="PuzzlePreferencesConfigurationPage">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>505</width>
|
||||
<height>548</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollArea">
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>494</width>
|
||||
<height>514</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Language</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>GUI language:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="langCombo"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_6">
|
||||
<property name="title">
|
||||
<string>Toolbar</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="toolBarStyleCheck">
|
||||
<property name="text">
|
||||
<string>The text appears under the icon (recommended for beginners).</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_4">
|
||||
<property name="title">
|
||||
<string>User Interface</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="darkModeCheck">
|
||||
<property name="text">
|
||||
<string>Activate dark mode</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxDontUseNativeDialog">
|
||||
<property name="text">
|
||||
<string>Don't use the native file dialog</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
220
src/app/puzzle/dialogs/configpages/puzzlepreferencespathpage.cpp
Normal file
220
src/app/puzzle/dialogs/configpages/puzzlepreferencespathpage.cpp
Normal file
|
@ -0,0 +1,220 @@
|
|||
/************************************************************************
|
||||
**
|
||||
** @file puzzlepreferencespathpage.cpp
|
||||
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||
** @date 21 5, 2021
|
||||
**
|
||||
** @brief
|
||||
** @copyright
|
||||
** This source code is part of the Valentina project, a pattern making
|
||||
** program, whose allow create and modeling patterns of clothing.
|
||||
** Copyright (C) 2021 Valentina project
|
||||
** <https://gitlab.com/smart-pattern/valentina> All Rights Reserved.
|
||||
**
|
||||
** Valentina is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** Valentina is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with Valentina. If not, see <http://www.gnu.org/licenses/>.
|
||||
**
|
||||
*************************************************************************/
|
||||
#include "puzzlepreferencespathpage.h"
|
||||
#include "ui_puzzlepreferencespathpage.h"
|
||||
#include "../../vpapplication.h"
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
PuzzlePreferencesPathPage::PuzzlePreferencesPathPage(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::PuzzlePreferencesPathPage)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
InitTable();
|
||||
|
||||
connect(ui->pathTable, &QTableWidget::itemSelectionChanged, this, [this]()
|
||||
{
|
||||
ui->defaultButton->setEnabled(not ui->pathTable->selectedItems().isEmpty());
|
||||
ui->defaultButton->setDefault(false);
|
||||
|
||||
ui->editButton->setEnabled(not ui->pathTable->selectedItems().isEmpty());
|
||||
ui->editButton->setDefault(true);
|
||||
});
|
||||
|
||||
connect(ui->defaultButton, &QPushButton::clicked, this, &PuzzlePreferencesPathPage::DefaultPath);
|
||||
connect(ui->editButton, &QPushButton::clicked, this, &PuzzlePreferencesPathPage::EditPath);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
PuzzlePreferencesPathPage::~PuzzlePreferencesPathPage()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void PuzzlePreferencesPathPage::Apply()
|
||||
{
|
||||
VPSettings *settings = VPApplication::VApp()->PuzzleSettings();
|
||||
settings->SetPathIndividualMeasurements(ui->pathTable->item(0, 1)->text());
|
||||
settings->SetPathMultisizeMeasurements(ui->pathTable->item(1, 1)->text());
|
||||
settings->SetPathPattern(ui->pathTable->item(2, 1)->text());
|
||||
settings->SetPathTemplate(ui->pathTable->item(3, 1)->text());
|
||||
settings->SetPathManualLayouts(ui->pathTable->item(4, 1)->text());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void PuzzlePreferencesPathPage::changeEvent(QEvent *event)
|
||||
{
|
||||
if (event->type() == QEvent::LanguageChange)
|
||||
{
|
||||
// retranslate designer form (single inheritance approach)
|
||||
ui->retranslateUi(this);
|
||||
InitTable();
|
||||
}
|
||||
// remember to call base class implementation
|
||||
QWidget::changeEvent(event);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void PuzzlePreferencesPathPage::DefaultPath()
|
||||
{
|
||||
const int row = ui->pathTable->currentRow();
|
||||
QTableWidgetItem *item = ui->pathTable->item(row, 1);
|
||||
SCASSERT(item != nullptr)
|
||||
|
||||
QString path;
|
||||
switch (row)
|
||||
{
|
||||
case 0: // individual measurements
|
||||
path = VCommonSettings::GetDefPathIndividualMeasurements();
|
||||
break;
|
||||
case 1: // multisize measurements
|
||||
path = VCommonSettings::GetDefPathMultisizeMeasurements();
|
||||
break;
|
||||
case 2: // pattern path
|
||||
path = VCommonSettings::GetDefPathPattern();
|
||||
break;
|
||||
case 3: // templates
|
||||
path = VCommonSettings::GetDefPathTemplate();
|
||||
break;
|
||||
case 4: // layouts
|
||||
path = VCommonSettings::GetDefPathManualLayouts();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
item->setText(path);
|
||||
item->setToolTip(path);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void PuzzlePreferencesPathPage::EditPath()
|
||||
{
|
||||
const int row = ui->pathTable->currentRow();
|
||||
QTableWidgetItem *item = ui->pathTable->item(row, 1);
|
||||
SCASSERT(item != nullptr)
|
||||
|
||||
QString path;
|
||||
switch (row)
|
||||
{
|
||||
case 0: // individual measurements
|
||||
path = VPApplication::VApp()->PuzzleSettings()->GetPathIndividualMeasurements();
|
||||
break;
|
||||
case 1: // multisize measurements
|
||||
path = VPApplication::VApp()->PuzzleSettings()->GetPathMultisizeMeasurements();
|
||||
path = VCommonSettings::PrepareMultisizeTables(path);
|
||||
break;
|
||||
case 2: // pattern path
|
||||
path = VPApplication::VApp()->PuzzleSettings()->GetPathPattern();
|
||||
break;
|
||||
case 3: // templates
|
||||
path = VPApplication::VApp()->PuzzleSettings()->GetPathTemplate();
|
||||
break;
|
||||
case 4: // layouts
|
||||
path = VPApplication::VApp()->PuzzleSettings()->GetPathManualLayouts();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
bool usedNotExistedDir = false;
|
||||
QDir directory(path);
|
||||
if (not directory.exists())
|
||||
{
|
||||
usedNotExistedDir = directory.mkpath(QChar('.'));
|
||||
}
|
||||
|
||||
const QString dir = QFileDialog::getExistingDirectory(
|
||||
this, tr("Open Directory"), path,
|
||||
VAbstractApplication::VApp()->NativeFileDialog(QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks));
|
||||
if (dir.isEmpty())
|
||||
{
|
||||
if (usedNotExistedDir)
|
||||
{
|
||||
QDir(path).rmpath(QChar('.'));
|
||||
}
|
||||
|
||||
DefaultPath();
|
||||
return;
|
||||
}
|
||||
|
||||
item->setText(dir);
|
||||
item->setToolTip(dir);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void PuzzlePreferencesPathPage::InitTable()
|
||||
{
|
||||
ui->pathTable->clearContents();
|
||||
ui->pathTable->setRowCount(5);
|
||||
ui->pathTable->setColumnCount(2);
|
||||
|
||||
const VPSettings *settings = VPApplication::VApp()->PuzzleSettings();
|
||||
|
||||
{
|
||||
ui->pathTable->setItem(0, 0, new QTableWidgetItem(tr("My Individual Measurements")));
|
||||
QTableWidgetItem *item = new QTableWidgetItem(settings->GetPathIndividualMeasurements());
|
||||
item->setToolTip(settings->GetPathIndividualMeasurements());
|
||||
ui->pathTable->setItem(0, 1, item);
|
||||
}
|
||||
|
||||
{
|
||||
ui->pathTable->setItem(1, 0, new QTableWidgetItem(tr("My Multisize Measurements")));
|
||||
QTableWidgetItem *item = new QTableWidgetItem(settings->GetPathMultisizeMeasurements());
|
||||
item->setToolTip(settings->GetPathMultisizeMeasurements());
|
||||
ui->pathTable->setItem(1, 1, item);
|
||||
}
|
||||
|
||||
{
|
||||
ui->pathTable->setItem(2, 0, new QTableWidgetItem(tr("My Patterns")));
|
||||
QTableWidgetItem *item = new QTableWidgetItem(settings->GetPathPattern());
|
||||
item->setToolTip(settings->GetPathPattern());
|
||||
ui->pathTable->setItem(2, 1, item);
|
||||
}
|
||||
|
||||
{
|
||||
ui->pathTable->setItem(3, 0, new QTableWidgetItem(tr("My Templates")));
|
||||
QTableWidgetItem *item = new QTableWidgetItem(settings->GetPathTemplate());
|
||||
item->setToolTip(settings->GetPathTemplate());
|
||||
ui->pathTable->setItem(3, 1, item);
|
||||
}
|
||||
|
||||
{
|
||||
ui->pathTable->setItem(4, 0, new QTableWidgetItem(tr("My Layouts")));
|
||||
QTableWidgetItem *item = new QTableWidgetItem(settings->GetPathManualLayouts());
|
||||
item->setToolTip(settings->GetPathManualLayouts());
|
||||
ui->pathTable->setItem(4, 1, item);
|
||||
}
|
||||
|
||||
ui->pathTable->verticalHeader()->setDefaultSectionSize(20);
|
||||
ui->pathTable->resizeColumnsToContents();
|
||||
ui->pathTable->resizeRowsToContents();
|
||||
ui->pathTable->horizontalHeader()->setStretchLastSection(true);
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
/************************************************************************
|
||||
**
|
||||
** @file puzzlepreferencespathpage.h
|
||||
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||
** @date 21 5, 2021
|
||||
**
|
||||
** @brief
|
||||
** @copyright
|
||||
** This source code is part of the Valentina project, a pattern making
|
||||
** program, whose allow create and modeling patterns of clothing.
|
||||
** Copyright (C) 2021 Valentina project
|
||||
** <https://gitlab.com/smart-pattern/valentina> All Rights Reserved.
|
||||
**
|
||||
** Valentina is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** Valentina is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with Valentina. If not, see <http://www.gnu.org/licenses/>.
|
||||
**
|
||||
*************************************************************************/
|
||||
#ifndef PUZZLEPREFERENCESPATHPAGE_H
|
||||
#define PUZZLEPREFERENCESPATHPAGE_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class PuzzlePreferencesPathPage;
|
||||
}
|
||||
|
||||
class PuzzlePreferencesPathPage : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit PuzzlePreferencesPathPage(QWidget *parent = nullptr);
|
||||
virtual ~PuzzlePreferencesPathPage();
|
||||
|
||||
void Apply();
|
||||
|
||||
protected:
|
||||
virtual void changeEvent(QEvent* event) override;
|
||||
|
||||
private slots:
|
||||
void DefaultPath();
|
||||
void EditPath();
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(PuzzlePreferencesPathPage)
|
||||
Ui::PuzzlePreferencesPathPage *ui;
|
||||
|
||||
void InitTable();
|
||||
};
|
||||
|
||||
#endif // PUZZLEPREFERENCESPATHPAGE_H
|
111
src/app/puzzle/dialogs/configpages/puzzlepreferencespathpage.ui
Normal file
111
src/app/puzzle/dialogs/configpages/puzzlepreferencespathpage.ui
Normal file
|
@ -0,0 +1,111 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>PuzzlePreferencesPathPage</class>
|
||||
<widget class="QWidget" name="PuzzlePreferencesPathPage">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>586</width>
|
||||
<height>808</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Paths that Valentina uses</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTableWidget" name="pathTable">
|
||||
<property name="editTriggers">
|
||||
<set>QAbstractItemView::NoEditTriggers</set>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::SingleSelection</enum>
|
||||
</property>
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectRows</enum>
|
||||
</property>
|
||||
<property name="showGrid">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<attribute name="horizontalHeaderStretchLastSection">
|
||||
<bool>true</bool>
|
||||
</attribute>
|
||||
<attribute name="verticalHeaderVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Type</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Path</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QPushButton" name="defaultButton">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Default</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="editButton">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Edit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
160
src/app/puzzle/dialogs/dialogpuzzlepreferences.cpp
Normal file
160
src/app/puzzle/dialogs/dialogpuzzlepreferences.cpp
Normal file
|
@ -0,0 +1,160 @@
|
|||
/************************************************************************
|
||||
**
|
||||
** @file dialogpuzzlepreferences.cpp
|
||||
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||
** @date 21 5, 2021
|
||||
**
|
||||
** @brief
|
||||
** @copyright
|
||||
** This source code is part of the Valentina project, a pattern making
|
||||
** program, whose allow create and modeling patterns of clothing.
|
||||
** Copyright (C) 2021 Valentina project
|
||||
** <https://gitlab.com/smart-pattern/valentina> All Rights Reserved.
|
||||
**
|
||||
** Valentina is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** Valentina is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with Valentina. If not, see <http://www.gnu.org/licenses/>.
|
||||
**
|
||||
*************************************************************************/
|
||||
|
||||
#include "dialogpuzzlepreferences.h"
|
||||
#include "ui_dialogpuzzlepreferences.h"
|
||||
#include "../vpapplication.h"
|
||||
#include "configpages/puzzlepreferencesconfigurationpage.h"
|
||||
#include "configpages/puzzlepreferencespathpage.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
#include <QPushButton>
|
||||
#include <QShowEvent>
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
DialogPuzzlePreferences::DialogPuzzlePreferences(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
ui(new Ui::DialogPuzzlePreferences),
|
||||
m_configurationPage(new PuzzlePreferencesConfigurationPage),
|
||||
m_pathPage(new PuzzlePreferencesPathPage)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
#if defined(Q_OS_MAC)
|
||||
setWindowFlags(Qt::Window);
|
||||
#endif
|
||||
|
||||
VAbstractApplication::VApp()->Settings()->GetOsSeparator() ? setLocale(QLocale()) : setLocale(QLocale::c());
|
||||
|
||||
QPushButton *bOk = ui->buttonBox->button(QDialogButtonBox::Ok);
|
||||
SCASSERT(bOk != nullptr)
|
||||
connect(bOk, &QPushButton::clicked, this, &DialogPuzzlePreferences::Ok);
|
||||
|
||||
QPushButton *bApply = ui->buttonBox->button(QDialogButtonBox::Apply);
|
||||
SCASSERT(bApply != nullptr)
|
||||
connect(bApply, &QPushButton::clicked, this, &DialogPuzzlePreferences::Apply);
|
||||
|
||||
ui->pagesWidget->insertWidget(0, m_configurationPage);
|
||||
ui->pagesWidget->insertWidget(1, m_pathPage);
|
||||
|
||||
connect(ui->contentsWidget, &QListWidget::currentItemChanged, this, &DialogPuzzlePreferences::PageChanged);
|
||||
ui->pagesWidget->setCurrentIndex(0);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
DialogPuzzlePreferences::~DialogPuzzlePreferences()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogPuzzlePreferences::showEvent(QShowEvent *event)
|
||||
{
|
||||
QDialog::showEvent( event );
|
||||
if ( event->spontaneous() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_isInitialized)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// do your init stuff here
|
||||
|
||||
QSize sz = VAbstractApplication::VApp()->Settings()->GetPreferenceDialogSize();
|
||||
if (not sz.isEmpty())
|
||||
{
|
||||
resize(sz);
|
||||
}
|
||||
|
||||
m_isInitialized = true;//first show windows are held
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogPuzzlePreferences::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
Q_UNUSED(event)
|
||||
// remember the size for the next time this dialog is opened, but only
|
||||
// if widget was already initialized, which rules out the resize at
|
||||
// dialog creating, which would
|
||||
if (m_isInitialized)
|
||||
{
|
||||
VAbstractApplication::VApp()->Settings()->SetPreferenceDialogSize(size());
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogPuzzlePreferences::changeEvent(QEvent *event)
|
||||
{
|
||||
if (event->type() == QEvent::LanguageChange)
|
||||
{
|
||||
// retranslate designer form (single inheritance approach)
|
||||
ui->retranslateUi(this);
|
||||
}
|
||||
// remember to call base class implementation
|
||||
QDialog::changeEvent(event);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogPuzzlePreferences::Apply()
|
||||
{
|
||||
QStringList preferences;
|
||||
|
||||
preferences += m_configurationPage->Apply();
|
||||
m_pathPage->Apply();
|
||||
|
||||
if (not preferences.isEmpty())
|
||||
{
|
||||
const QString text = tr("Followed %n option(s) require restart to take effect: %1.", "",
|
||||
preferences.size()).arg(preferences.join(QStringLiteral(", ")));
|
||||
QMessageBox::information(this, QCoreApplication::applicationName(), text);
|
||||
}
|
||||
|
||||
VPApplication::VApp()->PuzzleSettings()->GetOsSeparator() ? setLocale(QLocale()) : setLocale(QLocale::c());
|
||||
emit UpdateProperties();
|
||||
setResult(QDialog::Accepted);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogPuzzlePreferences::Ok()
|
||||
{
|
||||
Apply();
|
||||
done(QDialog::Accepted);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogPuzzlePreferences::PageChanged(QListWidgetItem *current, QListWidgetItem *previous)
|
||||
{
|
||||
if (current == nullptr)
|
||||
{
|
||||
current = previous;
|
||||
}
|
||||
int rowIndex = ui->contentsWidget->row(current);
|
||||
ui->pagesWidget->setCurrentIndex(rowIndex);
|
||||
}
|
71
src/app/puzzle/dialogs/dialogpuzzlepreferences.h
Normal file
71
src/app/puzzle/dialogs/dialogpuzzlepreferences.h
Normal file
|
@ -0,0 +1,71 @@
|
|||
/************************************************************************
|
||||
**
|
||||
** @file dialogpuzzlepreferences.h
|
||||
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||
** @date 21 5, 2021
|
||||
**
|
||||
** @brief
|
||||
** @copyright
|
||||
** This source code is part of the Valentina project, a pattern making
|
||||
** program, whose allow create and modeling patterns of clothing.
|
||||
** Copyright (C) 2021 Valentina project
|
||||
** <https://gitlab.com/smart-pattern/valentina> All Rights Reserved.
|
||||
**
|
||||
** Valentina is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** Valentina is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with Valentina. If not, see <http://www.gnu.org/licenses/>.
|
||||
**
|
||||
*************************************************************************/
|
||||
#ifndef DIALOGPUZZLEPREFERENCES_H
|
||||
#define DIALOGPUZZLEPREFERENCES_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class DialogPuzzlePreferences;
|
||||
}
|
||||
|
||||
class PuzzlePreferencesConfigurationPage;
|
||||
class PuzzlePreferencesPathPage;
|
||||
class QListWidgetItem;
|
||||
|
||||
class DialogPuzzlePreferences : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DialogPuzzlePreferences(QWidget *parent = nullptr);
|
||||
virtual ~DialogPuzzlePreferences();
|
||||
|
||||
signals:
|
||||
void UpdateProperties();
|
||||
|
||||
protected:
|
||||
virtual void showEvent(QShowEvent *event) override;
|
||||
virtual void resizeEvent(QResizeEvent *event) override;
|
||||
virtual void changeEvent(QEvent* event) override;
|
||||
|
||||
private slots:
|
||||
void Apply();
|
||||
void Ok();
|
||||
void PageChanged(QListWidgetItem *current, QListWidgetItem *previous);
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(DialogPuzzlePreferences)
|
||||
Ui::DialogPuzzlePreferences *ui;
|
||||
bool m_isInitialized{false};
|
||||
PuzzlePreferencesConfigurationPage *m_configurationPage;
|
||||
PuzzlePreferencesPathPage *m_pathPage;
|
||||
};
|
||||
|
||||
#endif // DIALOGPUZZLEPREFERENCES_H
|
159
src/app/puzzle/dialogs/dialogpuzzlepreferences.ui
Normal file
159
src/app/puzzle/dialogs/dialogpuzzlepreferences.ui
Normal file
|
@ -0,0 +1,159 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>DialogPuzzlePreferences</class>
|
||||
<widget class="QDialog" name="DialogPuzzlePreferences">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>851</width>
|
||||
<height>551</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Puzzle preferences</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="../share/resources/puzzleicon.qrc">
|
||||
<normaloff>:/puzzleicon/64x64/logo.png</normaloff>:/puzzleicon/64x64/logo.png</iconset>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QListWidget" name="contentsWidget">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>128</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>128</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>96</width>
|
||||
<height>84</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="textElideMode">
|
||||
<enum>Qt::ElideMiddle</enum>
|
||||
</property>
|
||||
<property name="movement">
|
||||
<enum>QListView::Static</enum>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>12</number>
|
||||
</property>
|
||||
<property name="viewMode">
|
||||
<enum>QListView::IconMode</enum>
|
||||
</property>
|
||||
<property name="currentRow">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Configuration</string>
|
||||
</property>
|
||||
<property name="textAlignment">
|
||||
<set>AlignCenter</set>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../libs/vmisc/share/resources/icon.qrc">
|
||||
<normaloff>:/icon/config.png</normaloff>:/icon/config.png</iconset>
|
||||
</property>
|
||||
<property name="flags">
|
||||
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Paths</string>
|
||||
</property>
|
||||
<property name="textAlignment">
|
||||
<set>AlignCenter</set>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../libs/vmisc/share/resources/icon.qrc">
|
||||
<normaloff>:/icon/path_config.png</normaloff>:/icon/path_config.png</iconset>
|
||||
</property>
|
||||
<property name="flags">
|
||||
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QStackedWidget" name="pagesWidget">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="sizeIncrement">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<widget class="QWidget" name="page_2"/>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="../share/resources/puzzleicon.qrc"/>
|
||||
<include location="../../../libs/vmisc/share/resources/icon.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>DialogPuzzlePreferences</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>DialogPuzzlePreferences</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
|
@ -53,6 +53,11 @@ int main(int argc, char *argv[])
|
|||
#endif // defined(APPIMAGE) && defined(Q_OS_LINUX)
|
||||
|
||||
Q_INIT_RESOURCE(puzzleicon);
|
||||
Q_INIT_RESOURCE(theme);
|
||||
Q_INIT_RESOURCE(icon);
|
||||
Q_INIT_RESOURCE(schema);
|
||||
Q_INIT_RESOURCE(flags);
|
||||
Q_INIT_RESOURCE(style);
|
||||
|
||||
QT_REQUIRE_VERSION(argc, argv, "5.4.0")// clazy:exclude=qstring-arg,qstring-allocations
|
||||
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
# This need for corect working file translations.pro
|
||||
|
||||
SOURCES += \
|
||||
$$PWD/dialogs/configpages/puzzlepreferencesconfigurationpage.cpp \
|
||||
$$PWD/dialogs/configpages/puzzlepreferencespathpage.cpp \
|
||||
$$PWD/dialogs/dialogpuzzlepreferences.cpp \
|
||||
$$PWD/dialogs/vpdialogabout.cpp \
|
||||
$$PWD/main.cpp \
|
||||
$$PWD/vpapplication.cpp \
|
||||
|
@ -30,6 +33,9 @@ SOURCES += \
|
|||
*msvc*:SOURCES += $$PWD/stable.cpp
|
||||
|
||||
HEADERS += \
|
||||
$$PWD/dialogs/configpages/puzzlepreferencesconfigurationpage.h \
|
||||
$$PWD/dialogs/configpages/puzzlepreferencespathpage.h \
|
||||
$$PWD/dialogs/dialogpuzzlepreferences.h \
|
||||
$$PWD/dialogs/vpdialogabout.h \
|
||||
$$PWD/stable.h \
|
||||
$$PWD/vpapplication.h \
|
||||
|
@ -56,6 +62,9 @@ HEADERS += \
|
|||
$$PWD/xml/vplayoutliterals.h
|
||||
|
||||
FORMS += \
|
||||
$$PWD/dialogs/configpages/puzzlepreferencesconfigurationpage.ui \
|
||||
$$PWD/dialogs/configpages/puzzlepreferencespathpage.ui \
|
||||
$$PWD/dialogs/dialogpuzzlepreferences.ui \
|
||||
$$PWD/dialogs/vpdialogabout.ui \
|
||||
$$PWD/vpcarrousel.ui \
|
||||
$$PWD/vpmainwindow.ui
|
||||
|
|
|
@ -66,17 +66,9 @@ include(../translations.pri)
|
|||
|
||||
# Set "make install" command for Unix-like systems.
|
||||
unix{
|
||||
# Prefix for binary file.
|
||||
isEmpty(PREFIX){
|
||||
PREFIX = $$DEFAULT_PREFIX
|
||||
}
|
||||
|
||||
unix:!macx{
|
||||
DATADIR =$$PREFIX/share
|
||||
DEFINES += DATADIR=\\\"$$DATADIR\\\" PKGDATADIR=\\\"$$PKGDATADIR\\\"
|
||||
|
||||
!macx{
|
||||
# Path to bin file after installation
|
||||
target.path = $$PREFIX/bin
|
||||
target.path = $$BINDIR
|
||||
|
||||
INSTALLS += \
|
||||
target
|
||||
|
@ -112,8 +104,7 @@ unix{
|
|||
QMAKE_INFO_PLIST = $$PWD/../../../dist/macx/puzzle/Info.plist
|
||||
|
||||
format.path = $$RESOURCES_DIR/
|
||||
format.files += $$PWD/../../../dist/macx/i-measurements.icns
|
||||
format.files += $$PWD/../../../dist/macx/s-measurements.icns
|
||||
format.files += $$PWD/../../../dist/macx/layout.icns
|
||||
|
||||
QMAKE_BUNDLE_DATA += \
|
||||
#libraries \
|
||||
|
|
|
@ -61,7 +61,7 @@ inline void noisyFailureMsgHandler(QtMsgType type, const QMessageLogContext &con
|
|||
// writing a multithreaded application and the error happens on
|
||||
// a non-GUI thread, you'll have to queue the message to the GUI
|
||||
QCoreApplication *instance = QCoreApplication::instance();
|
||||
const bool isGuiThread = instance && (QThread::currentThread() == instance->thread());
|
||||
const bool isGuiThread = (instance != nullptr) && (QThread::currentThread() == instance->thread());
|
||||
|
||||
if (not isGuiThread)
|
||||
{
|
||||
|
@ -199,7 +199,7 @@ inline void noisyFailureMsgHandler(QtMsgType type, const QMessageLogContext &con
|
|||
|
||||
if (type == QtWarningMsg || type == QtCriticalMsg || type == QtFatalMsg)
|
||||
{
|
||||
if (qApp->IsAppInGUIMode())
|
||||
if (VPApplication::VApp()->IsAppInGUIMode())
|
||||
{
|
||||
if (topWinAllowsPop)
|
||||
{
|
||||
|
@ -234,9 +234,7 @@ inline void noisyFailureMsgHandler(QtMsgType type, const QMessageLogContext &con
|
|||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VPApplication::VPApplication(int &argc, char **argv)
|
||||
:VAbstractApplication(argc, argv),
|
||||
mainWindows(),
|
||||
localServer(nullptr)
|
||||
:VAbstractApplication(argc, argv)
|
||||
{
|
||||
setApplicationDisplayName(VER_PRODUCTNAME_STR);
|
||||
setApplicationName(VER_INTERNALNAME_STR);
|
||||
|
@ -264,7 +262,7 @@ VPApplication::~VPApplication()
|
|||
* @return value that is returned from the receiver's event handler.
|
||||
*/
|
||||
// reimplemented from QApplication so we can throw exceptions in slots
|
||||
bool VPApplication::notify(QObject *receiver, QEvent *event)
|
||||
auto VPApplication::notify(QObject *receiver, QEvent *event) -> bool
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -325,26 +323,24 @@ bool VPApplication::notify(QObject *receiver, QEvent *event)
|
|||
/**
|
||||
* @brief IsAppInGUIMode little hack that allow to have access to application state from VAbstractApplication class.
|
||||
*/
|
||||
bool VPApplication::IsAppInGUIMode() const
|
||||
auto VPApplication::IsAppInGUIMode() const -> bool
|
||||
{
|
||||
return CommandLine()->IsGuiEnabled();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VPMainWindow *VPApplication::MainWindow()
|
||||
auto VPApplication::MainWindow()-> VPMainWindow *
|
||||
{
|
||||
Clean();
|
||||
if (mainWindows.isEmpty())
|
||||
{
|
||||
VPCommandLinePtr cmd;
|
||||
VPCommandLine::ProcessInstance(cmd, QStringList());
|
||||
NewMainWindow(VPCommandLinePtr());
|
||||
NewMainWindow();
|
||||
}
|
||||
return mainWindows[0];
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QList<VPMainWindow *> VPApplication::MainWindows()
|
||||
auto VPApplication::MainWindows() -> QList<VPMainWindow *>
|
||||
{
|
||||
Clean();
|
||||
QList<VPMainWindow*> list;
|
||||
|
@ -356,13 +352,22 @@ QList<VPMainWindow *> VPApplication::MainWindows()
|
|||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VPMainWindow *VPApplication::NewMainWindow(const VPCommandLinePtr &cmd)
|
||||
auto VPApplication::NewMainWindow() -> VPMainWindow *
|
||||
{
|
||||
VPMainWindow *puzzle = new VPMainWindow(cmd);
|
||||
VPCommandLinePtr cmd;
|
||||
VPCommandLine::ProcessInstance(cmd, {ConstFirst<QString>(VPApplication::arguments())});
|
||||
return NewMainWindow(cmd);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
auto VPApplication::NewMainWindow(const VPCommandLinePtr &cmd) -> VPMainWindow *
|
||||
{
|
||||
auto *puzzle = new VPMainWindow(cmd);
|
||||
mainWindows.prepend(puzzle);
|
||||
if (cmd->IsGuiEnabled())
|
||||
if (not cmd->IsTestModeEnabled())
|
||||
{
|
||||
puzzle->show();
|
||||
puzzle->UpdateWindowTitle();
|
||||
}
|
||||
puzzle->InitZoom();
|
||||
return puzzle;
|
||||
|
@ -399,7 +404,7 @@ void VPApplication::InitOptions()
|
|||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
const VTranslateVars *VPApplication::TrVars()
|
||||
auto VPApplication::TrVars() -> const VTranslateVars *
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -412,7 +417,7 @@ void VPApplication::OpenSettings()
|
|||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VPSettings *VPApplication::PuzzleSettings()
|
||||
auto VPApplication::PuzzleSettings() -> VPSettings *
|
||||
{
|
||||
SCASSERT(settings != nullptr)
|
||||
return qobject_cast<VPSettings *>(settings);
|
||||
|
@ -421,7 +426,7 @@ VPSettings *VPApplication::PuzzleSettings()
|
|||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPApplication::ActivateDarkMode()
|
||||
{
|
||||
VPSettings *settings = qApp->PuzzleSettings();
|
||||
VPSettings *settings = VPApplication::VApp()->PuzzleSettings();
|
||||
if (settings->GetDarkMode())
|
||||
{
|
||||
QFile f(":qdarkstyle/style.qss");
|
||||
|
@ -498,14 +503,14 @@ void VPApplication::ProcessArguments(const VPCommandLinePtr &cmd)
|
|||
cmd.get()->parser.showHelp(V_EX_USAGE);
|
||||
}
|
||||
|
||||
if (args.count() > 1 && rawLayouts.size() > 0)
|
||||
if (args.count() > 1 && not rawLayouts.isEmpty())
|
||||
{
|
||||
qCCritical(pApp, "%s\n",
|
||||
qPrintable(tr("Import raw layout data does not support penning several layout files.")));
|
||||
qPrintable(tr("Import raw layout data does not support openning several layout files.")));
|
||||
cmd.get()->parser.showHelp(V_EX_USAGE);
|
||||
}
|
||||
|
||||
for (auto &arg : args)
|
||||
for (const auto &arg : args)
|
||||
{
|
||||
NewMainWindow(cmd);
|
||||
if (not MainWindow()->LoadFile(arg))
|
||||
|
@ -518,7 +523,7 @@ void VPApplication::ProcessArguments(const VPCommandLinePtr &cmd)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (rawLayouts.size() > 0)
|
||||
if (not rawLayouts.isEmpty())
|
||||
{
|
||||
MainWindow()->ImportRawLayouts(rawLayouts);
|
||||
}
|
||||
|
@ -533,7 +538,7 @@ void VPApplication::ProcessArguments(const VPCommandLinePtr &cmd)
|
|||
}
|
||||
|
||||
NewMainWindow(cmd);
|
||||
if (rawLayouts.size() > 0)
|
||||
if (not rawLayouts.isEmpty())
|
||||
{
|
||||
// MainWindow()->New(); // prepare layout settings
|
||||
MainWindow()->ImportRawLayouts(rawLayouts);
|
||||
|
@ -553,7 +558,7 @@ void VPApplication::ProcessCMD()
|
|||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool VPApplication::event(QEvent *e)
|
||||
auto VPApplication::event(QEvent *e) -> bool
|
||||
{
|
||||
switch(e->type())
|
||||
{
|
||||
|
@ -561,12 +566,12 @@ bool VPApplication::event(QEvent *e)
|
|||
// Mac specific).
|
||||
case QEvent::FileOpen:
|
||||
{
|
||||
QFileOpenEvent *fileOpenEvent = static_cast<QFileOpenEvent *>(e);
|
||||
auto *fileOpenEvent = static_cast<QFileOpenEvent *>(e);
|
||||
const QString macFileOpen = fileOpenEvent->file();
|
||||
if(not macFileOpen.isEmpty())
|
||||
{
|
||||
VPMainWindow *mw = MainWindow();
|
||||
if (mw)
|
||||
if (mw != nullptr)
|
||||
{
|
||||
mw->LoadFile(macFileOpen); // open file in existing window
|
||||
}
|
||||
|
@ -639,8 +644,14 @@ void VPApplication::Clean()
|
|||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------
|
||||
VPCommandLinePtr VPApplication::CommandLine() const
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
auto VPApplication::CommandLine() -> VPCommandLinePtr
|
||||
{
|
||||
return VPCommandLine::instance;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VPApplication *VPApplication::VApp()
|
||||
{
|
||||
return qobject_cast<VPApplication*>(QCoreApplication::instance());
|
||||
}
|
||||
|
|
|
@ -35,15 +35,9 @@
|
|||
|
||||
#include <memory>
|
||||
|
||||
class VPApplication;// use in define
|
||||
class VPMainWindow;
|
||||
class QLocalServer;
|
||||
|
||||
#if defined(qApp)
|
||||
#undef qApp
|
||||
#endif
|
||||
#define qApp (static_cast<VPApplication*>(VAbstractApplication::instance()))
|
||||
|
||||
enum class SocketConnection : bool {Client = false, Server = true};
|
||||
|
||||
class VPApplication : public VAbstractApplication
|
||||
|
@ -58,6 +52,7 @@ public:
|
|||
virtual bool IsAppInGUIMode() const override;
|
||||
VPMainWindow *MainWindow();
|
||||
QList<VPMainWindow*> MainWindows();
|
||||
VPMainWindow *NewMainWindow();
|
||||
VPMainWindow *NewMainWindow(const VPCommandLinePtr &cmd);
|
||||
|
||||
void InitOptions();
|
||||
|
@ -70,7 +65,9 @@ public:
|
|||
|
||||
void ParseCommandLine(const SocketConnection &connection, const QStringList &arguments);
|
||||
void ProcessArguments(const VPCommandLinePtr &cmd);
|
||||
VPCommandLinePtr CommandLine() const;
|
||||
|
||||
static VPCommandLinePtr CommandLine();
|
||||
static VPApplication *VApp();
|
||||
public slots:
|
||||
void ProcessCMD();
|
||||
|
||||
|
@ -86,8 +83,8 @@ private slots:
|
|||
|
||||
private:
|
||||
Q_DISABLE_COPY(VPApplication)
|
||||
QList<QPointer<VPMainWindow> > mainWindows;
|
||||
QLocalServer *localServer;
|
||||
QList<QPointer<VPMainWindow> > mainWindows{};
|
||||
QLocalServer *localServer{nullptr};
|
||||
|
||||
void Clean();
|
||||
};
|
||||
|
|
|
@ -44,6 +44,13 @@
|
|||
#include "../ifc/exception/vexception.h"
|
||||
#include "../vwidgets/vmaingraphicsscene.h"
|
||||
#include "vpsheet.h"
|
||||
#include "dialogs/dialogpuzzlepreferences.h"
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 12, 0)
|
||||
#include "../vmisc/backport/qscopeguard.h"
|
||||
#else
|
||||
#include <QScopeGuard>
|
||||
#endif
|
||||
|
||||
#include <QLoggingCategory>
|
||||
|
||||
|
@ -57,19 +64,18 @@ QT_WARNING_POP
|
|||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VPMainWindow::VPMainWindow(const VPCommandLinePtr &cmd, QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
VAbstractMainWindow(parent),
|
||||
ui(new Ui::VPMainWindow),
|
||||
m_cmd(cmd)
|
||||
m_cmd(cmd),
|
||||
m_statusLabel(new QLabel(this))
|
||||
{
|
||||
m_layout = new VPLayout();
|
||||
|
||||
// create a standard sheet
|
||||
VPSheet *sheet = new VPSheet(m_layout);
|
||||
auto *sheet = new VPSheet(m_layout);
|
||||
sheet->SetName(QObject::tr("Sheet 1"));
|
||||
m_layout->AddSheet(sheet);
|
||||
m_layout->SetFocusedSheet();
|
||||
|
||||
// ----- for test purposes, to be removed------------------
|
||||
// // ----- for test purposes, to be removed------------------
|
||||
sheet->SetSheetMarginsConverted(1, 1, 1, 1);
|
||||
sheet->SetSheetSizeConverted(84.1, 118.9);
|
||||
sheet->SetPiecesGapConverted(1);
|
||||
|
@ -82,31 +88,42 @@ VPMainWindow::VPMainWindow(const VPCommandLinePtr &cmd, QWidget *parent) :
|
|||
m_layout->SetTilesSizeConverted(21,29.7);
|
||||
m_layout->SetTilesOrientation(PageOrientation::Portrait);
|
||||
m_layout->SetTilesMarginsConverted(1,1,1,1);
|
||||
// m_layout->SetShowTiles(true);
|
||||
m_layout->SetShowTiles(true);
|
||||
|
||||
// --------------------------------------------------------
|
||||
|
||||
ui->setupUi(this);
|
||||
|
||||
// init the tile factory
|
||||
m_tileFactory = new VPTileFactory(m_layout, qApp->Settings());
|
||||
m_tileFactory = new VPTileFactory(m_layout, VPApplication::VApp()->Settings());
|
||||
m_tileFactory->refreshTileInfos();
|
||||
|
||||
// init the export tool
|
||||
m_exporter = new VPExporter(m_layout, qApp->Settings());
|
||||
|
||||
InitMenuBar();
|
||||
|
||||
// init status bar
|
||||
statusBar()->addPermanentWidget(m_statusLabel, 1);
|
||||
|
||||
SetupMenu();
|
||||
InitProperties();
|
||||
InitCarrousel();
|
||||
|
||||
InitMainGraphics();
|
||||
|
||||
InitZoomToolBar();
|
||||
InitScaleToolBar();
|
||||
|
||||
SetPropertiesData();
|
||||
|
||||
ReadSettings();
|
||||
|
||||
#if defined(Q_OS_MAC)
|
||||
// Mac OS Dock Menu
|
||||
QMenu *menu = new QMenu(this);
|
||||
connect(menu, &QMenu::aboutToShow, this, &VPMainWindow::AboutToShowDockMenu);
|
||||
AboutToShowDockMenu();
|
||||
menu->setAsDockMenu();
|
||||
#endif //defined(Q_OS_MAC)
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -117,11 +134,50 @@ VPMainWindow::~VPMainWindow()
|
|||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool VPMainWindow::LoadFile(QString path)
|
||||
auto VPMainWindow::CurrentFile() const -> QString
|
||||
{
|
||||
return curFile;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
auto VPMainWindow::LoadFile(QString path) -> bool
|
||||
{
|
||||
if (not QFileInfo::exists(path))
|
||||
{
|
||||
qCCritical(pWindow, "%s", qUtf8Printable(tr("File '%1' doesn't exist!").arg(path)));
|
||||
if (m_cmd->IsTestModeEnabled())
|
||||
{
|
||||
qApp->exit(V_EX_NOINPUT);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if file already opened
|
||||
QList<VPMainWindow*> list = VPApplication::VApp()->MainWindows();
|
||||
auto w = std::find_if(list.begin(), list.end(),
|
||||
[path](VPMainWindow *window) { return window->CurrentFile() == path; });
|
||||
if (w != list.end())
|
||||
{
|
||||
(*w)->activateWindow();
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
|
||||
VlpCreateLock(lock, path);
|
||||
|
||||
if (not lock->IsLocked())
|
||||
{
|
||||
if (not IgnoreLocking(lock->GetLockError(), path, m_cmd->IsGuiEnabled()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
VLayoutConverter converter(path);
|
||||
m_curFileFormatVersion = converter.GetCurrentFormatVersion();
|
||||
m_curFileFormatVersionStr = converter.GetFormatVersionStr();
|
||||
path = converter.Convert();
|
||||
}
|
||||
catch (VException &e)
|
||||
|
@ -134,31 +190,81 @@ bool VPMainWindow::LoadFile(QString path)
|
|||
QFile file(path);
|
||||
file.open(QIODevice::ReadOnly);
|
||||
|
||||
QScopedPointer<VPLayoutFileReader> fileReader(new VPLayoutFileReader());
|
||||
VPLayoutFileReader fileReader;
|
||||
|
||||
if(m_layout == nullptr)
|
||||
{
|
||||
m_layout = new VPLayout();
|
||||
}
|
||||
|
||||
fileReader->ReadFile(m_layout, &file);
|
||||
fileReader.ReadFile(m_layout, &file);
|
||||
|
||||
// TODO / FIXME : better return value and error handling
|
||||
if (fileReader.hasError())
|
||||
{
|
||||
qCCritical(pWindow, "%s\n\n%s", qUtf8Printable(tr("File error.")),
|
||||
qUtf8Printable(tr("Unable to read a layout file")));
|
||||
lock.reset();
|
||||
|
||||
if (m_cmd->IsTestModeEnabled())
|
||||
{
|
||||
qApp->exit(V_EX_NOINPUT);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// updates the properties with the loaded data
|
||||
SetPropertiesData();
|
||||
|
||||
// TODO : update the Carrousel and the QGraphicView
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool VPMainWindow::SaveFile(const QString &path)
|
||||
void VPMainWindow::LayoutWasSaved(bool saved)
|
||||
{
|
||||
setWindowModified(!saved);
|
||||
not lIsReadOnly ? ui->actionSave->setEnabled(!saved): ui->actionSave->setEnabled(false);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::SetCurrentFile(const QString &fileName)
|
||||
{
|
||||
curFile = fileName;
|
||||
if (not curFile.isEmpty())
|
||||
{
|
||||
auto *settings = VPApplication::VApp()->PuzzleSettings();
|
||||
QStringList files = settings->GetRecentFileList();
|
||||
files.removeAll(fileName);
|
||||
files.prepend(fileName);
|
||||
while (files.size() > MaxRecentFiles)
|
||||
{
|
||||
files.removeLast();
|
||||
}
|
||||
settings->SetRecentFileList(files);
|
||||
UpdateRecentFileActions();
|
||||
}
|
||||
|
||||
UpdateWindowTitle();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
auto VPMainWindow::SaveLayout(const QString &path, QString &error) -> bool
|
||||
{
|
||||
QFile file(path);
|
||||
file.open(QIODevice::WriteOnly);
|
||||
|
||||
VPLayoutFileWriter *fileWriter = new VPLayoutFileWriter();
|
||||
fileWriter->WriteFile(m_layout, &file);
|
||||
VPLayoutFileWriter fileWriter;
|
||||
fileWriter.WriteFile(m_layout, &file);
|
||||
|
||||
// TODO / FIXME : better return value and error handling
|
||||
if (fileWriter.hasError())
|
||||
{
|
||||
error = tr("Fail to create layout.");
|
||||
return false;
|
||||
}
|
||||
|
||||
SetCurrentFile(path);
|
||||
LayoutWasSaved(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -207,7 +313,10 @@ void VPMainWindow::ImportRawLayouts(const QStringList &rawLayouts)
|
|||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::InitZoom()
|
||||
{
|
||||
m_graphicsView->ZoomFitBest();
|
||||
if (m_graphicsView != nullptr)
|
||||
{
|
||||
m_graphicsView->ZoomFitBest();
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -234,13 +343,17 @@ VPPiece* VPMainWindow::CreatePiece(const VLayoutPiece &rawPiece)
|
|||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::InitMenuBar()
|
||||
void VPMainWindow::SetupMenu()
|
||||
{
|
||||
// most of the actions are connected through name convention (auto-connection)
|
||||
|
||||
|
||||
// -------------------- connects the actions for the file menu
|
||||
ui->actionNew->setShortcuts(QKeySequence::New);
|
||||
ui->actionSave->setShortcuts(QKeySequence::Save);
|
||||
ui->actionSaveAs->setShortcuts(QKeySequence::SaveAs);
|
||||
|
||||
connect(ui->actionExit, &QAction::triggered, this, &VPMainWindow::close);
|
||||
ui->actionExit->setShortcuts(QKeySequence::Quit);
|
||||
|
||||
// -------------------- connects the actions for the edit menu
|
||||
// TODO : initialise the undo / redo
|
||||
|
@ -250,8 +363,43 @@ void VPMainWindow::InitMenuBar()
|
|||
|
||||
// Add dock properties action
|
||||
QAction* actionDockWidgetToolOptions = ui->dockWidgetProperties->toggleViewAction();
|
||||
ui->menuWindows->addAction(actionDockWidgetToolOptions);
|
||||
ui->menuEdit->addAction(actionDockWidgetToolOptions);
|
||||
|
||||
// File
|
||||
m_recentFileActs.fill(nullptr);
|
||||
for (auto & recentFileAct : m_recentFileActs)
|
||||
{
|
||||
auto *action = new QAction(this);
|
||||
recentFileAct = action;
|
||||
connect(action, &QAction::triggered, this, [this]()
|
||||
{
|
||||
if (auto *senderAction = qobject_cast<QAction *>(sender()))
|
||||
{
|
||||
const QString filePath = senderAction->data().toString();
|
||||
if (not filePath.isEmpty())
|
||||
{
|
||||
LoadFile(filePath);
|
||||
}
|
||||
}
|
||||
});
|
||||
ui->menuFile->insertAction(ui->actionPreferences, recentFileAct);
|
||||
recentFileAct->setVisible(false);
|
||||
}
|
||||
|
||||
m_separatorAct = new QAction(this);
|
||||
m_separatorAct->setSeparator(true);
|
||||
m_separatorAct->setVisible(false);
|
||||
ui->menuFile->insertAction(ui->actionPreferences, m_separatorAct);
|
||||
|
||||
// Actions for recent files loaded by a puzzle window application.
|
||||
UpdateRecentFileActions();
|
||||
|
||||
// Window
|
||||
connect(ui->menuWindow, &QMenu::aboutToShow, this, [this]()
|
||||
{
|
||||
ui->menuWindow->clear();
|
||||
CreateWindowMenu(ui->menuWindow);
|
||||
});
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -603,10 +751,7 @@ void VPMainWindow::InitZoomToolBar()
|
|||
delete m_doubleSpinBoxScale;
|
||||
}
|
||||
|
||||
if (m_mouseCoordinate != nullptr)
|
||||
{
|
||||
delete m_mouseCoordinate;
|
||||
}
|
||||
delete m_mouseCoordinate;
|
||||
|
||||
// connect the zoom buttons and shortcuts to the slots
|
||||
QList<QKeySequence> zoomInShortcuts;
|
||||
|
@ -631,27 +776,29 @@ void VPMainWindow::InitZoomToolBar()
|
|||
zoomFitBestShortcuts.append(QKeySequence(Qt::ControlModifier + Qt::Key_Equal));
|
||||
ui->actionZoomFitBest->setShortcuts(zoomFitBestShortcuts);
|
||||
connect(ui->actionZoomFitBest, &QAction::triggered, m_graphicsView, &VPMainGraphicsView::ZoomFitBest);
|
||||
}
|
||||
|
||||
// defined the scale
|
||||
ui->toolBarZoom->addSeparator();
|
||||
QLabel* zoomScale = new QLabel(tr("Scale:"), this);
|
||||
ui->toolBarZoom->addWidget(zoomScale);
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::InitScaleToolBar()
|
||||
{
|
||||
auto* zoomScale = new QLabel(tr("Scale:"), this);
|
||||
ui->toolBarScale->addWidget(zoomScale);
|
||||
|
||||
m_doubleSpinBoxScale = new QDoubleSpinBox(this);
|
||||
m_doubleSpinBoxScale->setDecimals(1);
|
||||
m_doubleSpinBoxScale->setSuffix("%");
|
||||
m_doubleSpinBoxScale->setSuffix(QChar('%'));
|
||||
on_ScaleChanged(m_graphicsView->transform().m11());
|
||||
connect(m_doubleSpinBoxScale.data(), QOverload<double>::of(&QDoubleSpinBox::valueChanged),
|
||||
this, [this](double d){m_graphicsView->Zoom(d/100.0);});
|
||||
ui->toolBarZoom->addWidget(m_doubleSpinBoxScale);
|
||||
ui->toolBarScale->addWidget(m_doubleSpinBoxScale);
|
||||
|
||||
|
||||
// define the mouse position
|
||||
ui->toolBarZoom->addSeparator();
|
||||
ui->toolBarScale->addSeparator();
|
||||
|
||||
m_mouseCoordinate = new QLabel(QString("0, 0 (%1)").arg(UnitsToStr(m_layout->GetUnit(), true)));
|
||||
ui->toolBarZoom->addWidget(m_mouseCoordinate);
|
||||
ui->toolBarZoom->addSeparator();
|
||||
m_mouseCoordinate = new QLabel(QStringLiteral("0, 0 (%1)").arg(UnitsToStr(m_layout->GetUnit(), true)));
|
||||
ui->toolBarScale->addWidget(m_mouseCoordinate);
|
||||
ui->toolBarScale->addSeparator();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -670,11 +817,75 @@ void VPMainWindow::SetCheckBoxValue(QCheckBox *checkbox, bool value)
|
|||
checkbox->blockSignals(false);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::UpdateWindowTitle()
|
||||
{
|
||||
QString showName;
|
||||
bool isFileWritable = true;
|
||||
if (not curFile.isEmpty())
|
||||
{
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup++; // turn checking on
|
||||
#endif /*Q_OS_WIN32*/
|
||||
isFileWritable = QFileInfo(curFile).isWritable();
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup--; // turn it off again
|
||||
#endif /*Q_OS_WIN32*/
|
||||
showName = StrippedName(curFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
int index = VPApplication::VApp()->MainWindows().indexOf(this);
|
||||
if (index != -1)
|
||||
{
|
||||
showName = tr("untitled %1.vlt").arg(index+1);
|
||||
}
|
||||
else
|
||||
{
|
||||
showName = tr("untitled.vlt");
|
||||
}
|
||||
}
|
||||
|
||||
showName += QLatin1String("[*]");
|
||||
|
||||
if (lIsReadOnly || not isFileWritable)
|
||||
{
|
||||
showName += QStringLiteral(" (") + tr("read only") + QChar(')');
|
||||
}
|
||||
|
||||
setWindowTitle(showName);
|
||||
setWindowFilePath(curFile);
|
||||
|
||||
#if defined(Q_OS_MAC)
|
||||
static QIcon fileIcon = QIcon(QCoreApplication::applicationDirPath() +
|
||||
QLatin1String("/../Resources/layout.icns"));
|
||||
QIcon icon;
|
||||
if (not curFile.isEmpty())
|
||||
{
|
||||
if (not isWindowModified())
|
||||
{
|
||||
icon = fileIcon;
|
||||
}
|
||||
else
|
||||
{
|
||||
static QIcon darkIcon;
|
||||
|
||||
if (darkIcon.isNull())
|
||||
{
|
||||
darkIcon = QIcon(darkenPixmap(fileIcon.pixmap(16, 16)));
|
||||
}
|
||||
icon = darkIcon;
|
||||
}
|
||||
}
|
||||
setWindowIcon(icon);
|
||||
#endif //defined(Q_OS_MAC)
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::ReadSettings()
|
||||
{
|
||||
qCDebug(pWindow, "Reading settings.");
|
||||
const VPSettings *settings = qApp->PuzzleSettings();
|
||||
const VPSettings *settings = VPApplication::VApp()->PuzzleSettings();
|
||||
|
||||
if (settings->status() == QSettings::NoError)
|
||||
{
|
||||
|
@ -682,6 +893,9 @@ void VPMainWindow::ReadSettings()
|
|||
restoreState(settings->GetWindowState());
|
||||
restoreState(settings->GetToolbarsState(), APP_VERSION);
|
||||
|
||||
// Text under tool buton icon
|
||||
ToolBarStyles();
|
||||
|
||||
ui->dockWidgetProperties->setVisible(settings->IsDockWidgetPropertiesActive());
|
||||
ui->dockWidgetPropertiesContents->setVisible(settings->IsDockWidgetPropertiesContentsActive());
|
||||
|
||||
|
@ -700,7 +914,7 @@ void VPMainWindow::ReadSettings()
|
|||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::WriteSettings()
|
||||
{
|
||||
VPSettings *settings = qApp->PuzzleSettings();
|
||||
VPSettings *settings = VPApplication::VApp()->PuzzleSettings();
|
||||
settings->SetGeometry(saveGeometry());
|
||||
settings->SetWindowState(saveState());
|
||||
settings->SetToolbarsState(saveState(APP_VERSION));
|
||||
|
@ -837,20 +1051,56 @@ void VPMainWindow::generateTiledPdf(QString fileName)
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::CreateWindowMenu(QMenu *menu)
|
||||
{
|
||||
SCASSERT(menu != nullptr)
|
||||
|
||||
QAction *action = menu->addAction(tr("&New Window"));
|
||||
connect(action, &QAction::triggered, this, []()
|
||||
{
|
||||
VPApplication::VApp()->NewMainWindow()->activateWindow();
|
||||
});
|
||||
action->setMenuRole(QAction::NoRole);
|
||||
menu->addSeparator();
|
||||
|
||||
const QList<VPMainWindow*> windows = VPApplication::VApp()->MainWindows();
|
||||
for (int i = 0; i < windows.count(); ++i)
|
||||
{
|
||||
VPMainWindow *window = windows.at(i);
|
||||
|
||||
QString title = QStringLiteral("%1. %2").arg(i+1).arg(window->windowTitle());
|
||||
const int index = title.lastIndexOf(QLatin1String("[*]"));
|
||||
if (index != -1)
|
||||
{
|
||||
window->isWindowModified() ? title.replace(index, 3, QChar('*')) : title.replace(index, 3, QString());
|
||||
}
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 6, 0)
|
||||
QAction *action = menu->addAction(title, this, SLOT(ShowWindow()));
|
||||
#else
|
||||
QAction *action = menu->addAction(title, this, &VPMainWindow::ShowWindow);
|
||||
#endif //QT_VERSION < QT_VERSION_CHECK(5, 6, 0)
|
||||
action->setData(i);
|
||||
action->setCheckable(true);
|
||||
action->setMenuRole(QAction::NoRole);
|
||||
if (window->isActiveWindow())
|
||||
{
|
||||
action->setChecked(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::on_actionNew_triggered()
|
||||
{
|
||||
// just for test purpuses, to be removed:
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText("TODO VPMainWindow::New");
|
||||
int ret = msgBox.exec();
|
||||
|
||||
Q_UNUSED(ret);
|
||||
|
||||
// TODO
|
||||
|
||||
VPApplication::VApp()->NewMainWindow();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::ShowToolTip(const QString &toolTip)
|
||||
{
|
||||
m_statusLabel->setText(toolTip);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -877,102 +1127,196 @@ void VPMainWindow::closeEvent(QCloseEvent *event)
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::changeEvent(QEvent *event)
|
||||
{
|
||||
if (event->type() == QEvent::LanguageChange)
|
||||
{
|
||||
// retranslate designer form (single inheritance approach)
|
||||
ui->retranslateUi(this);
|
||||
|
||||
WindowsLocale();
|
||||
UpdateWindowTitle();
|
||||
}
|
||||
|
||||
// remember to call base class implementation
|
||||
QMainWindow::changeEvent(event);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QStringList VPMainWindow::RecentFileList() const
|
||||
{
|
||||
return VPApplication::VApp()->PuzzleSettings()->GetRecentFileList();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::on_actionOpen_triggered()
|
||||
{
|
||||
qCDebug(pWindow, "Openning puzzle layout file.");
|
||||
|
||||
const QString filter(tr("Layout files") + QLatin1String(" (*.vlt)"));
|
||||
//Use standard path to individual measurements
|
||||
const QString pathTo = VPApplication::VApp()->PuzzleSettings()->GetPathManualLayouts();
|
||||
|
||||
//Get list last open files
|
||||
QStringList recentFiles = qApp->PuzzleSettings()->GetRecentFileList();
|
||||
QString dir;
|
||||
if (recentFiles.isEmpty())
|
||||
bool usedNotExistedDir = false;
|
||||
QDir directory(pathTo);
|
||||
if (not directory.exists())
|
||||
{
|
||||
dir = QDir::homePath();
|
||||
}
|
||||
else
|
||||
{
|
||||
//Absolute path to last open file
|
||||
dir = QFileInfo(recentFiles.first()).absolutePath();
|
||||
}
|
||||
qCDebug(pWindow, "Run QFileDialog::getOpenFileName: dir = %s.", qUtf8Printable(dir));
|
||||
const QString filePath = QFileDialog::getOpenFileName(this, tr("Open file"), dir, filter, nullptr);
|
||||
|
||||
if (filePath.isEmpty())
|
||||
{
|
||||
return;
|
||||
usedNotExistedDir = directory.mkpath(QChar('.'));
|
||||
}
|
||||
|
||||
const QString mPath = QFileDialog::getOpenFileName(this, tr("Open file"), pathTo, filter, nullptr,
|
||||
VAbstractApplication::VApp()->NativeFileDialog());
|
||||
|
||||
// TODO : if m_layout == nullptr, open in current window
|
||||
// otherwise open in new window
|
||||
|
||||
// TODO : if layout file has a lock, warning message
|
||||
|
||||
|
||||
if(!LoadFile(filePath))
|
||||
if (not mPath.isEmpty())
|
||||
{
|
||||
return;
|
||||
VPApplication::VApp()->NewMainWindow()->LoadFile(mPath);
|
||||
}
|
||||
|
||||
// Updates the list of recent files
|
||||
recentFiles.removeAll(filePath);
|
||||
recentFiles.prepend(filePath);
|
||||
while (recentFiles.size() > MaxRecentFiles)
|
||||
if (usedNotExistedDir)
|
||||
{
|
||||
recentFiles.removeLast();
|
||||
QDir(pathTo).rmpath(QChar('.'));
|
||||
}
|
||||
qApp->PuzzleSettings()->SetRecentFileList(recentFiles);
|
||||
|
||||
// updates the properties with the loaded data
|
||||
SetPropertiesData();
|
||||
|
||||
// TODO : update the Carrousel and the QGraphicView
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::on_actionSave_triggered()
|
||||
bool VPMainWindow::on_actionSave_triggered()
|
||||
{
|
||||
// just for test purpuses, to be removed:
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText("TODO VPMainWindow::Save");
|
||||
int ret = msgBox.exec();
|
||||
if (curFile.isEmpty() || lIsReadOnly)
|
||||
{
|
||||
return on_actionSaveAs_triggered();
|
||||
}
|
||||
|
||||
Q_UNUSED(ret);
|
||||
if (m_curFileFormatVersion < VLayoutConverter::LayoutMaxVer
|
||||
&& not ContinueFormatRewrite(m_curFileFormatVersionStr, VLayoutConverter::LayoutMaxVerStr))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO
|
||||
if (not CheckFilePermissions(curFile, this))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QString error;
|
||||
if (not SaveLayout(curFile, error))
|
||||
{
|
||||
QMessageBox messageBox;
|
||||
messageBox.setIcon(QMessageBox::Warning);
|
||||
messageBox.setText(tr("Could not save the file"));
|
||||
messageBox.setDefaultButton(QMessageBox::Ok);
|
||||
messageBox.setDetailedText(error);
|
||||
messageBox.setStandardButtons(QMessageBox::Ok);
|
||||
messageBox.exec();
|
||||
return false;
|
||||
}
|
||||
|
||||
m_curFileFormatVersion = VLayoutConverter::LayoutMaxVer;
|
||||
m_curFileFormatVersionStr = VLayoutConverter::LayoutMaxVerStr;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::on_actionSaveAs_triggered()
|
||||
bool VPMainWindow::on_actionSaveAs_triggered()
|
||||
{
|
||||
// TODO / FIXME : See valentina how the save is done over there. we need to add the
|
||||
// extension .vlt, check for empty file names etc.
|
||||
QString filters = tr("Layout files") + QStringLiteral(" (*.vlt)");
|
||||
QString suffix = QStringLiteral("vlt");
|
||||
QString fName = tr("layout") + QChar('.') + suffix;
|
||||
|
||||
//Get list last open files
|
||||
QStringList recentFiles = qApp->PuzzleSettings()->GetRecentFileList();
|
||||
QString dir;
|
||||
if (recentFiles.isEmpty())
|
||||
if (curFile.isEmpty())
|
||||
{
|
||||
dir = QDir::homePath();
|
||||
dir = VPApplication::VApp()->PuzzleSettings()->GetPathManualLayouts();
|
||||
}
|
||||
else
|
||||
{
|
||||
//Absolute path to last open file
|
||||
dir = QFileInfo(recentFiles.first()).absolutePath();
|
||||
dir = QFileInfo(curFile).absolutePath();
|
||||
}
|
||||
|
||||
QString filters(tr("Layout files") + QLatin1String("(*.vlt)"));
|
||||
QString fileName = QFileDialog::getSaveFileName(this, tr("Save as"),
|
||||
dir + QLatin1String("/") + tr("Layout") + QLatin1String(".vlt"),
|
||||
filters, nullptr
|
||||
#ifdef Q_OS_LINUX
|
||||
, QFileDialog::DontUseNativeDialog
|
||||
#endif
|
||||
);
|
||||
bool usedNotExistedDir = false;
|
||||
QDir directory(dir);
|
||||
if (not directory.exists())
|
||||
{
|
||||
usedNotExistedDir = directory.mkpath(QChar('.'));
|
||||
}
|
||||
|
||||
SaveFile(fileName);
|
||||
QString fileName = QFileDialog::getSaveFileName(this, tr("Save as"), dir + QChar('/') + fName, filters, nullptr,
|
||||
VAbstractApplication::VApp()->NativeFileDialog());
|
||||
|
||||
auto RemoveTempDir = qScopeGuard([usedNotExistedDir, dir]()
|
||||
{
|
||||
if (usedNotExistedDir)
|
||||
{
|
||||
QDir(dir).rmpath(QChar('.'));
|
||||
}
|
||||
});
|
||||
|
||||
if (fileName.isEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QFileInfo f( fileName );
|
||||
if (f.suffix().isEmpty() && f.suffix() != suffix)
|
||||
{
|
||||
fileName += QChar('.') + suffix;
|
||||
}
|
||||
|
||||
if (QFileInfo::exists(fileName) && curFile != fileName)
|
||||
{
|
||||
// Temporary try to lock the file before saving
|
||||
VLockGuard<char> tmp(fileName);
|
||||
if (not tmp.IsLocked())
|
||||
{
|
||||
qCCritical(pWindow, "%s",
|
||||
qUtf8Printable(tr("Failed to lock. This file already opened in another window.")));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Need for restoring previous state in case of failure
|
||||
// const bool readOnly = m_layout->IsReadOnly();
|
||||
|
||||
// m_layout->SetReadOnly(false);
|
||||
lIsReadOnly = false;
|
||||
|
||||
QString error;
|
||||
bool result = SaveLayout(fileName, error);
|
||||
if (not result)
|
||||
{
|
||||
QMessageBox messageBox;
|
||||
messageBox.setIcon(QMessageBox::Warning);
|
||||
messageBox.setInformativeText(tr("Could not save file"));
|
||||
messageBox.setDefaultButton(QMessageBox::Ok);
|
||||
messageBox.setDetailedText(error);
|
||||
messageBox.setStandardButtons(QMessageBox::Ok);
|
||||
messageBox.exec();
|
||||
|
||||
// Restore previous state
|
||||
// m_layout->SetReadOnly(readOnly);
|
||||
// lIsReadOnly = readOnly;
|
||||
return false;
|
||||
}
|
||||
|
||||
m_curFileFormatVersion = VLayoutConverter::LayoutMaxVer;
|
||||
m_curFileFormatVersionStr = VLayoutConverter::LayoutMaxVerStr;
|
||||
|
||||
// UpdatePadlock(false);
|
||||
UpdateWindowTitle();
|
||||
|
||||
if (curFile == fileName && not lock.isNull())
|
||||
{
|
||||
lock->Unlock();
|
||||
}
|
||||
VlpCreateLock(lock, fileName);
|
||||
if (not lock->IsLocked())
|
||||
{
|
||||
qCCritical(pWindow, "%s", qUtf8Printable(tr("Failed to lock. This file already opened in another window. "
|
||||
"Expect collissions when run 2 copies of the program.")));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -1004,19 +1348,6 @@ void VPMainWindow::on_actionImportRawLayout_triggered()
|
|||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::on_actionCloseLayout_triggered()
|
||||
{
|
||||
// just for test purpuses, to be removed:
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText("TODO VPMainWindow::CloseLayout");
|
||||
int ret = msgBox.exec();
|
||||
|
||||
Q_UNUSED(ret);
|
||||
|
||||
// TODO
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::on_actionAboutQt_triggered()
|
||||
{
|
||||
|
@ -1509,3 +1840,64 @@ void VPMainWindow::on_MouseMoved(const QPointF &scenePos)
|
|||
.arg(UnitsToStr(m_layout->GetUnit(), true)));
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::ShowWindow() const
|
||||
{
|
||||
if (auto *action = qobject_cast<QAction*>(sender()))
|
||||
{
|
||||
const QVariant v = action->data();
|
||||
if (v.canConvert<int>())
|
||||
{
|
||||
const int offset = qvariant_cast<int>(v);
|
||||
const QList<VPMainWindow*> windows = VPApplication::VApp()->MainWindows();
|
||||
windows.at(offset)->raise();
|
||||
windows.at(offset)->activateWindow();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::on_actionPreferences_triggered()
|
||||
{
|
||||
// Calling constructor of the dialog take some time. Because of this user have time to call the dialog twice.
|
||||
static QPointer<DialogPuzzlePreferences> guard;// Prevent any second run
|
||||
if (guard.isNull())
|
||||
{
|
||||
QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
|
||||
auto *preferences = new DialogPuzzlePreferences(this);
|
||||
// QScopedPointer needs to be sure any exception will never block guard
|
||||
QScopedPointer<DialogPuzzlePreferences> dlg(preferences);
|
||||
guard = preferences;
|
||||
// Must be first
|
||||
connect(dlg.data(), &DialogPuzzlePreferences::UpdateProperties, this, &VPMainWindow::WindowsLocale);
|
||||
connect(dlg.data(), &DialogPuzzlePreferences::UpdateProperties, this, &VPMainWindow::ToolBarStyles);
|
||||
QGuiApplication::restoreOverrideCursor();
|
||||
dlg->exec();
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPMainWindow::ToolBarStyles()
|
||||
{
|
||||
ToolBarStyle(ui->mainToolBar);
|
||||
ToolBarStyle(ui->toolBarZoom);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
#if defined(Q_OS_MAC)
|
||||
void VPMainWindow::AboutToShowDockMenu()
|
||||
{
|
||||
if (QMenu *menu = qobject_cast<QMenu *>(sender()))
|
||||
{
|
||||
menu->clear();
|
||||
CreateWindowMenu(menu);
|
||||
|
||||
menu->addSeparator();
|
||||
|
||||
QAction *actionPreferences = menu->addAction(tr("Preferences"));
|
||||
actionPreferences->setMenuRole(QAction::NoRole);
|
||||
connect(actionPreferences, &QAction::triggered, this, &VPMainWindow::Preferences);
|
||||
}
|
||||
}
|
||||
#endif //defined(Q_OS_MAC)
|
||||
|
|
|
@ -43,13 +43,15 @@
|
|||
#include "vpexporter.h"
|
||||
#include "vpcommandline.h"
|
||||
#include "../vlayout/vlayoutdef.h"
|
||||
#include "../vwidgets/vabstractmainwindow.h"
|
||||
#include "../vmisc/vlockguard.h"
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class VPMainWindow;
|
||||
}
|
||||
|
||||
class VPMainWindow : public QMainWindow
|
||||
class VPMainWindow : public VAbstractMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
@ -57,6 +59,8 @@ public:
|
|||
explicit VPMainWindow(const VPCommandLinePtr &cmd, QWidget *parent = nullptr);
|
||||
virtual ~VPMainWindow();
|
||||
|
||||
QString CurrentFile() const;
|
||||
|
||||
/**
|
||||
* @brief LoadFile Loads the layout file of given path in m_layout.
|
||||
* This function doesn't update the gui.
|
||||
|
@ -65,12 +69,15 @@ public:
|
|||
*/
|
||||
bool LoadFile(QString path);
|
||||
|
||||
void LayoutWasSaved(bool saved);
|
||||
void SetCurrentFile(const QString &fileName);
|
||||
|
||||
/**
|
||||
* @brief SaveFile Saves the current layout to the layout file of given path
|
||||
* @brief SaveLayout Saves the current layout to the layout file of given path
|
||||
* @param path path to layout file
|
||||
* @return true if success
|
||||
*/
|
||||
bool SaveFile(const QString &path);
|
||||
bool SaveLayout(const QString &path, QString &error);
|
||||
|
||||
/**
|
||||
* @brief ImportRawLayouts The function imports the raw layouts of given paths
|
||||
|
@ -83,6 +90,8 @@ public:
|
|||
*/
|
||||
void InitZoom();
|
||||
|
||||
void UpdateWindowTitle();
|
||||
|
||||
public slots:
|
||||
/**
|
||||
* @brief on_actionNew_triggered When the menu action File > New
|
||||
|
@ -90,146 +99,14 @@ public slots:
|
|||
*/
|
||||
void on_actionNew_triggered();
|
||||
|
||||
virtual void ShowToolTip(const QString &toolTip) override;
|
||||
|
||||
protected:
|
||||
enum { MaxRecentFiles = 5 };
|
||||
|
||||
virtual void closeEvent(QCloseEvent *event) override;
|
||||
virtual void changeEvent(QEvent* event) override;
|
||||
virtual QStringList RecentFileList() const override;
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(VPMainWindow)
|
||||
Ui::VPMainWindow *ui;
|
||||
|
||||
VPCarrousel *m_carrousel{nullptr};
|
||||
VPMainGraphicsView *m_graphicsView{nullptr};
|
||||
|
||||
VPCommandLinePtr m_cmd;
|
||||
|
||||
VPLayout *m_layout{nullptr};
|
||||
QList<VPPiece *>m_selectedPieces{QList<VPPiece *>()};
|
||||
|
||||
VPTileFactory *m_tileFactory{nullptr};
|
||||
VPExporter *m_exporter{nullptr};
|
||||
|
||||
/**
|
||||
* @brief spin box with the scale factor of the graphic view
|
||||
*/
|
||||
QPointer<QDoubleSpinBox> m_doubleSpinBoxScale{nullptr};
|
||||
|
||||
/**
|
||||
* @brief mouseCoordinate pointer to label who show mouse coordinate.
|
||||
*/
|
||||
QLabel* m_mouseCoordinate{nullptr};
|
||||
|
||||
/**
|
||||
* @brief CreatePiece creates a piece from the given VLayoutPiece data
|
||||
* @param rawPiece the raw piece data
|
||||
*/
|
||||
VPPiece* CreatePiece(const VLayoutPiece &rawPiece);
|
||||
|
||||
/**
|
||||
* @brief InitMenuBar Inits the menu bar (File, Edit, Help ...)
|
||||
*/
|
||||
void InitMenuBar();
|
||||
|
||||
/**
|
||||
* @brief InitProperties Init the properties
|
||||
*/
|
||||
void InitProperties();
|
||||
|
||||
/**
|
||||
* @brief InitPropertyTabCurrentPiece Inits the current piece tab in the properties
|
||||
*/
|
||||
void InitPropertyTabCurrentPiece();
|
||||
|
||||
/**
|
||||
* @brief InitPropertyTabCurrentSheet Inits the current sheet tab in the properties;
|
||||
*/
|
||||
void InitPropertyTabCurrentSheet();
|
||||
|
||||
/**
|
||||
* @brief InitPropertyTabLayout Inits the layout tab in the properties
|
||||
*/
|
||||
void InitPropertyTabLayout();
|
||||
|
||||
/**
|
||||
* @brief InitPropertyTabTiles Inits the tiles tab in the properties
|
||||
*/
|
||||
void InitPropertyTabTiles();
|
||||
|
||||
/**
|
||||
* @brief InitCarrousel Inits the carrousel
|
||||
*/
|
||||
void InitCarrousel();
|
||||
|
||||
/**
|
||||
* @brief InitMainGraphics Initialises the puzzle main graphics
|
||||
*/
|
||||
void InitMainGraphics();
|
||||
|
||||
/**
|
||||
* @brief InitToolBar Initialises the tool bar
|
||||
*/
|
||||
void InitZoomToolBar();
|
||||
|
||||
/**
|
||||
* @brief SetPropertiesData Sets the values of UI elements
|
||||
* in all the property tabs to the values saved in m_layout
|
||||
*/
|
||||
void SetPropertiesData();
|
||||
|
||||
/**
|
||||
* @brief SetPropertyTabCurrentPieceData Sets the values of UI elements
|
||||
* in the Current Piece Tab to the values saved in m_layout
|
||||
*/
|
||||
void SetPropertyTabCurrentPieceData();
|
||||
|
||||
/**
|
||||
* @brief SetPropertyTabSheetData Sets the values of UI elements
|
||||
* in the Sheet Tab to the values saved in focused sheet
|
||||
*/
|
||||
void SetPropertyTabSheetData();
|
||||
|
||||
/**
|
||||
* @brief SetPropertyTabTilesData Sets the values of UI elements
|
||||
* in the Tiles Tab to the values saved in m_layout
|
||||
*/
|
||||
void SetPropertyTabTilesData();
|
||||
|
||||
/**
|
||||
* @brief SetPropertyTabLayoutData Sets the values of UI elements
|
||||
* in the Layout Tab to the values saved in m_layout
|
||||
*/
|
||||
void SetPropertyTabLayoutData();
|
||||
|
||||
/**
|
||||
* @brief SetDoubleSpinBoxValue sets the given spinbox to the given value.
|
||||
* the signals are blocked before changing the value and unblocked after
|
||||
* @param spinBox pointer to spinbox
|
||||
* @param value spinbox value
|
||||
*/
|
||||
void SetDoubleSpinBoxValue(QDoubleSpinBox *spinBox, qreal value);
|
||||
|
||||
/**
|
||||
* @brief SetCheckBoxValue sets the given checkbox to the given value.
|
||||
* the signals are blocked before changing the value and unblocked after
|
||||
* @param checkbox pointer to checkbox
|
||||
* @param value checkbox value
|
||||
*/
|
||||
void SetCheckBoxValue(QCheckBox *checkbox, bool value);
|
||||
|
||||
void ReadSettings();
|
||||
void WriteSettings();
|
||||
|
||||
bool MaybeSave();
|
||||
|
||||
/**
|
||||
* @brief generateTiledPdf Generates the tiled Pdf in the given filename
|
||||
* @param fileName output file name
|
||||
*/
|
||||
void generateTiledPdf(QString fileName);
|
||||
|
||||
|
||||
private slots:
|
||||
private slots:
|
||||
/**
|
||||
* @brief on_actionOpen_triggered When the menu action File > Open is
|
||||
* triggered.
|
||||
|
@ -242,14 +119,14 @@ private slots:
|
|||
* triggered.
|
||||
* The slot is automatically connected through name convention.
|
||||
*/
|
||||
void on_actionSave_triggered();
|
||||
bool on_actionSave_triggered();
|
||||
|
||||
/**
|
||||
* @brief on_actionSaveAs_triggered When the menu action File > Save As
|
||||
* is triggered.
|
||||
* The slot is automatically connected through name convention.
|
||||
*/
|
||||
void on_actionSaveAs_triggered();
|
||||
bool on_actionSaveAs_triggered();
|
||||
|
||||
/**
|
||||
* @brief on_actionImportRawLayout_triggered When the menu action
|
||||
|
@ -258,13 +135,6 @@ private slots:
|
|||
*/
|
||||
void on_actionImportRawLayout_triggered();
|
||||
|
||||
/**
|
||||
* @brief on_actionCloseLayout_triggered When the menu action
|
||||
* File > Close Layout is triggered.
|
||||
* The slot is automatically connected through name convention.
|
||||
*/
|
||||
void on_actionCloseLayout_triggered();
|
||||
|
||||
/**
|
||||
* @brief on_actionAboutQt_triggered When the menu action Help > About Qt
|
||||
* is triggered.
|
||||
|
@ -523,6 +393,165 @@ private slots:
|
|||
* @param scenePos position mouse.
|
||||
*/
|
||||
void on_MouseMoved(const QPointF &scenePos);
|
||||
|
||||
void on_actionPreferences_triggered();
|
||||
|
||||
void ShowWindow() const;
|
||||
|
||||
void ToolBarStyles();
|
||||
|
||||
#if defined(Q_OS_MAC)
|
||||
void AboutToShowDockMenu();
|
||||
#endif //defined(Q_OS_MAC)
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(VPMainWindow)
|
||||
Ui::VPMainWindow *ui;
|
||||
|
||||
VPCarrousel *m_carrousel{nullptr};
|
||||
VPMainGraphicsView *m_graphicsView{nullptr};
|
||||
|
||||
VPCommandLinePtr m_cmd;
|
||||
|
||||
VPLayout *m_layout{new VPLayout()};
|
||||
QList<VPPiece *>m_selectedPieces{QList<VPPiece *>()};
|
||||
|
||||
VPTileFactory *m_tileFactory{nullptr};
|
||||
VPExporter *m_exporter{nullptr};
|
||||
|
||||
/**
|
||||
* @brief spin box with the scale factor of the graphic view
|
||||
*/
|
||||
QPointer<QDoubleSpinBox> m_doubleSpinBoxScale{nullptr};
|
||||
|
||||
/**
|
||||
* @brief mouseCoordinate pointer to label who show mouse coordinate.
|
||||
*/
|
||||
QLabel* m_mouseCoordinate{nullptr};
|
||||
|
||||
QLabel* m_statusLabel{nullptr};
|
||||
|
||||
QString curFile{};
|
||||
|
||||
bool isInitialized{false};
|
||||
bool lIsReadOnly{false};
|
||||
|
||||
QSharedPointer<VLockGuard<char>> lock{nullptr};
|
||||
|
||||
/**
|
||||
* @brief CreatePiece creates a piece from the given VLayoutPiece data
|
||||
* @param rawPiece the raw piece data
|
||||
*/
|
||||
VPPiece* CreatePiece(const VLayoutPiece &rawPiece);
|
||||
|
||||
/**
|
||||
* @brief InitMenuBar Inits the menu bar (File, Edit, Help ...)
|
||||
*/
|
||||
void SetupMenu();
|
||||
|
||||
/**
|
||||
* @brief InitProperties Init the properties
|
||||
*/
|
||||
void InitProperties();
|
||||
|
||||
/**
|
||||
* @brief InitPropertyTabCurrentPiece Inits the current piece tab in the properties
|
||||
*/
|
||||
void InitPropertyTabCurrentPiece();
|
||||
|
||||
/**
|
||||
* @brief InitPropertyTabCurrentSheet Inits the current sheet tab in the properties;
|
||||
*/
|
||||
void InitPropertyTabCurrentSheet();
|
||||
|
||||
/**
|
||||
* @brief InitPropertyTabLayout Inits the layout tab in the properties
|
||||
*/
|
||||
void InitPropertyTabLayout();
|
||||
|
||||
/**
|
||||
* @brief InitPropertyTabTiles Inits the tiles tab in the properties
|
||||
*/
|
||||
void InitPropertyTabTiles();
|
||||
|
||||
/**
|
||||
* @brief InitCarrousel Inits the carrousel
|
||||
*/
|
||||
void InitCarrousel();
|
||||
|
||||
/**
|
||||
* @brief InitMainGraphics Initialises the puzzle main graphics
|
||||
*/
|
||||
void InitMainGraphics();
|
||||
|
||||
/**
|
||||
* @brief InitToolBar Initialises the tool bar
|
||||
*/
|
||||
void InitZoomToolBar();
|
||||
|
||||
/**
|
||||
* @brief InitScaleToolBar Initialises the scale tool bar
|
||||
*/
|
||||
void InitScaleToolBar();
|
||||
|
||||
/**
|
||||
* @brief SetPropertiesData Sets the values of UI elements
|
||||
* in all the property tabs to the values saved in m_layout
|
||||
*/
|
||||
void SetPropertiesData();
|
||||
|
||||
/**
|
||||
* @brief SetPropertyTabCurrentPieceData Sets the values of UI elements
|
||||
* in the Current Piece Tab to the values saved in m_layout
|
||||
*/
|
||||
void SetPropertyTabCurrentPieceData();
|
||||
|
||||
/**
|
||||
* @brief SetPropertyTabSheetData Sets the values of UI elements
|
||||
* in the Sheet Tab to the values saved in focused sheet
|
||||
*/
|
||||
void SetPropertyTabSheetData();
|
||||
|
||||
/**
|
||||
* @brief SetPropertyTabTilesData Sets the values of UI elements
|
||||
* in the Tiles Tab to the values saved in m_layout
|
||||
*/
|
||||
void SetPropertyTabTilesData();
|
||||
|
||||
/**
|
||||
* @brief SetPropertyTabLayoutData Sets the values of UI elements
|
||||
* in the Layout Tab to the values saved in m_layout
|
||||
*/
|
||||
void SetPropertyTabLayoutData();
|
||||
|
||||
/**
|
||||
* @brief SetDoubleSpinBoxValue sets the given spinbox to the given value.
|
||||
* the signals are blocked before changing the value and unblocked after
|
||||
* @param spinBox pointer to spinbox
|
||||
* @param value spinbox value
|
||||
*/
|
||||
void SetDoubleSpinBoxValue(QDoubleSpinBox *spinBox, qreal value);
|
||||
|
||||
/**
|
||||
* @brief SetCheckBoxValue sets the given checkbox to the given value.
|
||||
* the signals are blocked before changing the value and unblocked after
|
||||
* @param checkbox pointer to checkbox
|
||||
* @param value checkbox value
|
||||
*/
|
||||
void SetCheckBoxValue(QCheckBox *checkbox, bool value);
|
||||
|
||||
void ReadSettings();
|
||||
void WriteSettings();
|
||||
|
||||
bool MaybeSave();
|
||||
|
||||
/**
|
||||
* @brief generateTiledPdf Generates the tiled Pdf in the given filename
|
||||
* @param fileName output file name
|
||||
*/
|
||||
void generateTiledPdf(QString fileName);
|
||||
|
||||
void CreateWindowMenu(QMenu *menu);
|
||||
};
|
||||
|
||||
#endif // VPMAINWINDOW_H
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
<string>Puzzle</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/logo.png</normaloff>:/puzzleicon/64x64/logo.png</iconset>
|
||||
</property>
|
||||
<property name="layoutDirection">
|
||||
|
@ -53,6 +53,8 @@
|
|||
<addaction name="separator"/>
|
||||
<addaction name="actionImportRawLayout"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionPreferences"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionExit"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuEdit">
|
||||
|
@ -61,11 +63,10 @@
|
|||
</property>
|
||||
<addaction name="separator"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuWindows">
|
||||
<widget class="QMenu" name="menuWindow">
|
||||
<property name="title">
|
||||
<string>&Windows</string>
|
||||
<string>&Window</string>
|
||||
</property>
|
||||
<addaction name="actionCloseLayout"/>
|
||||
<addaction name="separator"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuHelp">
|
||||
|
@ -77,18 +78,29 @@
|
|||
</widget>
|
||||
<addaction name="menuFile"/>
|
||||
<addaction name="menuEdit"/>
|
||||
<addaction name="menuWindows"/>
|
||||
<addaction name="menuWindow"/>
|
||||
<addaction name="menuHelp"/>
|
||||
</widget>
|
||||
<widget class="QToolBar" name="mainToolBar">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Menu</string>
|
||||
</property>
|
||||
<property name="toolButtonStyle">
|
||||
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
||||
</property>
|
||||
<attribute name="toolBarArea">
|
||||
<enum>TopToolBarArea</enum>
|
||||
</attribute>
|
||||
<attribute name="toolBarBreak">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<addaction name="actionNew"/>
|
||||
<addaction name="actionOpen"/>
|
||||
<addaction name="actionSave"/>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusBar"/>
|
||||
<widget class="QDockWidget" name="dockWidgetCarrousel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
|
@ -163,6 +175,9 @@
|
|||
</property>
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidgetProperties">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
|
@ -192,7 +207,7 @@
|
|||
<string notr="true"/>
|
||||
</property>
|
||||
<attribute name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconCurrentPiece.png</normaloff>:/puzzleicon/64x64/iconCurrentPiece.png</iconset>
|
||||
</attribute>
|
||||
<attribute name="title">
|
||||
|
@ -216,6 +231,9 @@
|
|||
</property>
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollAreaCurrentPiece">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
|
@ -390,7 +408,7 @@
|
|||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconRotate90Clockwise.png</normaloff>:/puzzleicon/64x64/iconRotate90Clockwise.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
|
@ -410,7 +428,7 @@
|
|||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconRotate90Anticlockwise.png</normaloff>:/puzzleicon/64x64/iconRotate90Anticlockwise.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
|
@ -430,7 +448,7 @@
|
|||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconRotateGrainlineVertical.png</normaloff>:/puzzleicon/64x64/iconRotateGrainlineVertical.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
|
@ -450,7 +468,7 @@
|
|||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconRotateGrainlineHorizontal.png</normaloff>:/puzzleicon/64x64/iconRotateGrainlineHorizontal.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
|
@ -610,7 +628,7 @@
|
|||
</widget>
|
||||
<widget class="QWidget" name="tabSheetProperty">
|
||||
<attribute name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconLayout.png</normaloff>:/puzzleicon/64x64/iconLayout.png</iconset>
|
||||
</attribute>
|
||||
<attribute name="title">
|
||||
|
@ -762,7 +780,7 @@
|
|||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconPortrait.png</normaloff>:/puzzleicon/64x64/iconPortrait.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
|
@ -785,7 +803,7 @@
|
|||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconLandscape.png</normaloff>:/puzzleicon/64x64/iconLandscape.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
|
@ -977,7 +995,7 @@
|
|||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconGrainlineVertical.png</normaloff>:/puzzleicon/64x64/iconGrainlineVertical.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
|
@ -997,7 +1015,7 @@
|
|||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconGrainlineHorizontal.png</normaloff>:/puzzleicon/64x64/iconGrainlineHorizontal.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
|
@ -1083,7 +1101,7 @@
|
|||
</widget>
|
||||
<widget class="QWidget" name="tabTilesProperty">
|
||||
<attribute name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconTiles.png</normaloff>:/puzzleicon/64x64/iconTiles.png</iconset>
|
||||
</attribute>
|
||||
<attribute name="title">
|
||||
|
@ -1125,7 +1143,7 @@
|
|||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>356</width>
|
||||
<height>717</height>
|
||||
<height>700</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
|
@ -1193,7 +1211,7 @@
|
|||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconPortrait.png</normaloff>:/puzzleicon/64x64/iconPortrait.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
|
@ -1213,7 +1231,7 @@
|
|||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconLandscape.png</normaloff>:/puzzleicon/64x64/iconLandscape.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
|
@ -1371,7 +1389,7 @@
|
|||
</widget>
|
||||
<widget class="QWidget" name="tabLayoutProperty">
|
||||
<attribute name="icon">
|
||||
<iconset resource="share/resources/puzzleicon.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/puzzleicon/64x64/iconProperties.png</normaloff>:/puzzleicon/64x64/iconProperties.png</iconset>
|
||||
</attribute>
|
||||
<attribute name="title">
|
||||
|
@ -1413,7 +1431,7 @@
|
|||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>356</width>
|
||||
<height>717</height>
|
||||
<height>700</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
|
@ -1539,7 +1557,7 @@
|
|||
</widget>
|
||||
<widget class="QToolBar" name="toolBarZoom">
|
||||
<property name="windowTitle">
|
||||
<string>toolBar</string>
|
||||
<string>zoom</string>
|
||||
</property>
|
||||
<property name="toolButtonStyle">
|
||||
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
||||
|
@ -1555,7 +1573,26 @@
|
|||
<addaction name="actionZoomOriginal"/>
|
||||
<addaction name="actionZoomFitBest"/>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusBar"/>
|
||||
<widget class="QToolBar" name="toolBarScale">
|
||||
<property name="windowTitle">
|
||||
<string>Scale</string>
|
||||
</property>
|
||||
<property name="allowedAreas">
|
||||
<set>Qt::AllToolBarAreas</set>
|
||||
</property>
|
||||
<attribute name="toolBarArea">
|
||||
<enum>BottomToolBarArea</enum>
|
||||
</attribute>
|
||||
<attribute name="toolBarBreak">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
<action name="actionOpen">
|
||||
<property name="icon">
|
||||
<iconset theme="document-open">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Open</string>
|
||||
</property>
|
||||
|
@ -1564,6 +1601,13 @@
|
|||
</property>
|
||||
</action>
|
||||
<action name="actionSave">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="document-save">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Save</string>
|
||||
</property>
|
||||
|
@ -1572,6 +1616,13 @@
|
|||
</property>
|
||||
</action>
|
||||
<action name="actionSaveAs">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="document-save-as">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Save &As</string>
|
||||
</property>
|
||||
|
@ -1579,12 +1630,10 @@
|
|||
<string>Ctrl+Shift+S</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCloseLayout">
|
||||
<property name="text">
|
||||
<string>&Close Layout</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionImportRawLayout">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Import Raw Layout Data</string>
|
||||
</property>
|
||||
|
@ -1603,8 +1652,15 @@
|
|||
<property name="shortcut">
|
||||
<string>Ctrl+Q</string>
|
||||
</property>
|
||||
<property name="menuRole">
|
||||
<enum>QAction::QuitRole</enum>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionNew">
|
||||
<property name="icon">
|
||||
<iconset theme="document-new">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&New</string>
|
||||
</property>
|
||||
|
@ -1616,11 +1672,21 @@
|
|||
<property name="text">
|
||||
<string>About &Qt</string>
|
||||
</property>
|
||||
<property name="menuRole">
|
||||
<enum>QAction::AboutQtRole</enum>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionAboutPuzzle">
|
||||
<property name="icon">
|
||||
<iconset theme="help-about">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>About &Puzzle</string>
|
||||
</property>
|
||||
<property name="menuRole">
|
||||
<enum>QAction::AboutRole</enum>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionProperties">
|
||||
<property name="checkable">
|
||||
|
@ -1629,11 +1695,20 @@
|
|||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Properties</string>
|
||||
</property>
|
||||
<property name="menuRole">
|
||||
<enum>QAction::PreferencesRole</enum>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionZoomIn">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="zoom-in">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
|
@ -1643,6 +1718,9 @@
|
|||
</property>
|
||||
</action>
|
||||
<action name="actionZoomOut">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="zoom-out">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
|
@ -1652,6 +1730,9 @@
|
|||
</property>
|
||||
</action>
|
||||
<action name="actionZoomOriginal">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="zoom-original">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
|
@ -1661,6 +1742,9 @@
|
|||
</property>
|
||||
</action>
|
||||
<action name="actionZoomFitBest">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="zoom-fit-best">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
|
@ -1672,6 +1756,11 @@
|
|||
<string>Zoom sheet</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPreferences">
|
||||
<property name="text">
|
||||
<string>Preferences</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<tabstops>
|
||||
|
@ -1721,9 +1810,6 @@
|
|||
<tabstop>checkBoxLayoutWarningPiecesSuperposition</tabstop>
|
||||
<tabstop>checkBoxLayoutWarningPiecesOutOfBound</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="share/resources/puzzleicon.qrc"/>
|
||||
<include location="share/resources/puzzleicon.qrc"/>
|
||||
</resources>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
|
|
@ -70,8 +70,6 @@ class VPSheet : public QObject
|
|||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
|
||||
explicit VPSheet(VPLayout* layout);
|
||||
|
||||
~VPSheet();
|
||||
|
|
|
@ -33,19 +33,6 @@
|
|||
#include "../ifc/exception/vexception.h"
|
||||
#include "../ifc/exception/vexceptionconversionerror.h"
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VPLayoutFileReader::VPLayoutFileReader()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VPLayoutFileReader::~VPLayoutFileReader()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool VPLayoutFileReader::ReadFile(VPLayout *layout, QFile *file)
|
||||
{
|
||||
|
@ -56,7 +43,7 @@ bool VPLayoutFileReader::ReadFile(VPLayout *layout, QFile *file)
|
|||
ReadLayout(layout);
|
||||
}
|
||||
|
||||
return !error();
|
||||
return hasError();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -39,8 +39,8 @@ class VPLayoutFileReader : public QXmlStreamReader
|
|||
{
|
||||
Q_DECLARE_TR_FUNCTIONS(VPLayoutFileReader)
|
||||
public:
|
||||
VPLayoutFileReader();
|
||||
~VPLayoutFileReader();
|
||||
VPLayoutFileReader()=default;
|
||||
~VPLayoutFileReader()=default;
|
||||
|
||||
bool ReadFile(VPLayout *layout, QFile *file);
|
||||
|
||||
|
@ -64,7 +64,7 @@ private:
|
|||
static QString ReadAttributeEmptyString(const QXmlStreamAttributes &attribs, const QString &name);
|
||||
static bool ReadAttributeBool(const QXmlStreamAttributes &attribs, const QString &name, const QString &defValue);
|
||||
static qreal ReadAttributeDouble(const QXmlStreamAttributes &attribs, const QString &name,
|
||||
const QString &defValue);
|
||||
const QString &defValue);
|
||||
};
|
||||
|
||||
#endif // VPLAYOUTFILEREADER_H
|
||||
|
|
|
@ -34,18 +34,6 @@
|
|||
#include "vplayoutliterals.h"
|
||||
#include "../ifc/xml/vlayoutconverter.h"
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VPLayoutFileWriter::VPLayoutFileWriter()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VPLayoutFileWriter::~VPLayoutFileWriter()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPLayoutFileWriter::WriteFile(VPLayout *layout, QFile *file)
|
||||
{
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
|
||||
#include <QLocale>
|
||||
#include <QXmlStreamWriter>
|
||||
#include <QCoreApplication>
|
||||
|
||||
#include "../vmisc/literals.h"
|
||||
|
||||
|
@ -43,14 +44,14 @@ class QMarginsF;
|
|||
|
||||
class VPLayoutFileWriter : public QXmlStreamWriter
|
||||
{
|
||||
Q_DECLARE_TR_FUNCTIONS(VPLayoutFileWriter)
|
||||
public:
|
||||
VPLayoutFileWriter();
|
||||
~VPLayoutFileWriter();
|
||||
VPLayoutFileWriter()= default;
|
||||
~VPLayoutFileWriter()= default;
|
||||
|
||||
void WriteFile(VPLayout *layout, QFile *file);
|
||||
|
||||
private:
|
||||
|
||||
void WriteLayout(VPLayout *layout);
|
||||
void WriteProperties(VPLayout *layout);
|
||||
void WriteUnplacePiecesList(VPLayout *layout);
|
||||
|
@ -69,7 +70,6 @@ private:
|
|||
|
||||
template <size_t N>
|
||||
void SetAttribute(const QString &name, const char (&value)[N]);
|
||||
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -70,6 +70,7 @@ void TapePreferencesPathPage::Apply()
|
|||
settings->SetPathMultisizeMeasurements(ui->pathTable->item(1, 1)->text());
|
||||
settings->SetPathPattern(ui->pathTable->item(2, 1)->text());
|
||||
settings->SetPathTemplate(ui->pathTable->item(3, 1)->text());
|
||||
settings->SetPathManualLayouts(ui->pathTable->item(4, 1)->text());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -107,6 +108,9 @@ void TapePreferencesPathPage::DefaultPath()
|
|||
case 3: // templates
|
||||
path = VCommonSettings::GetDefPathTemplate();
|
||||
break;
|
||||
case 4: // layouts
|
||||
path = VCommonSettings::GetDefPathManualLayouts();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -138,6 +142,9 @@ void TapePreferencesPathPage::EditPath()
|
|||
case 3: // templates
|
||||
path = MApplication::VApp()->TapeSettings()->GetPathTemplate();
|
||||
break;
|
||||
case 4: // layouts
|
||||
path = MApplication::VApp()->TapeSettings()->GetPathManualLayouts();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -171,7 +178,7 @@ void TapePreferencesPathPage::EditPath()
|
|||
void TapePreferencesPathPage::InitTable()
|
||||
{
|
||||
ui->pathTable->clearContents();
|
||||
ui->pathTable->setRowCount(4);
|
||||
ui->pathTable->setRowCount(5);
|
||||
ui->pathTable->setColumnCount(2);
|
||||
|
||||
const VTapeSettings *settings = MApplication::VApp()->TapeSettings();
|
||||
|
@ -204,6 +211,13 @@ void TapePreferencesPathPage::InitTable()
|
|||
ui->pathTable->setItem(3, 1, item);
|
||||
}
|
||||
|
||||
{
|
||||
ui->pathTable->setItem(4, 0, new QTableWidgetItem(tr("My Layouts")));
|
||||
QTableWidgetItem *item = new QTableWidgetItem(settings->GetPathManualLayouts());
|
||||
item->setToolTip(settings->GetPathManualLayouts());
|
||||
ui->pathTable->setItem(4, 1, item);
|
||||
}
|
||||
|
||||
ui->pathTable->verticalHeader()->setDefaultSectionSize(20);
|
||||
ui->pathTable->resizeColumnsToContents();
|
||||
ui->pathTable->resizeRowsToContents();
|
||||
|
|
|
@ -89,7 +89,7 @@ void DialogTapePreferences::showEvent(QShowEvent *event)
|
|||
// do your init stuff here
|
||||
|
||||
QSize sz = VAbstractApplication::VApp()->Settings()->GetPreferenceDialogSize();
|
||||
if (sz.isEmpty() == false)
|
||||
if (not sz.isEmpty())
|
||||
{
|
||||
resize(sz);
|
||||
}
|
||||
|
|
|
@ -374,7 +374,7 @@ bool MApplication::IsTestMode() const
|
|||
*/
|
||||
bool MApplication::IsAppInGUIMode() const
|
||||
{
|
||||
return IsTestMode();
|
||||
return not IsTestMode();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -854,6 +854,7 @@ TMainWindow *MApplication::NewMainWindow()
|
|||
if (not MApplication::VApp()->IsTestMode())
|
||||
{
|
||||
tape->show();
|
||||
tape->UpdateWindowTitle();
|
||||
}
|
||||
return tape;
|
||||
}
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#include "../vmisc/vabstractapplication.h"
|
||||
#include "dialogs/dialogmdatabase.h"
|
||||
|
||||
class MApplication;// use in define
|
||||
class TMainWindow;
|
||||
class QLocalServer;
|
||||
|
||||
|
|
|
@ -133,7 +133,7 @@ TMainWindow::TMainWindow(QWidget *parent)
|
|||
connect(gradation, &QTimer::timeout, this, &TMainWindow::GradationChanged);
|
||||
|
||||
SetupMenu();
|
||||
UpdateWindowTitle();
|
||||
|
||||
ReadSettings();
|
||||
|
||||
#if defined(Q_OS_MAC)
|
||||
|
@ -278,21 +278,20 @@ bool TMainWindow::LoadFile(const QString &path)
|
|||
|
||||
// Check if file already opened
|
||||
const QList<TMainWindow*> list = MApplication::VApp()->MainWindows();
|
||||
for (auto w : list)
|
||||
auto w = std::find_if(list.begin(), list.end(),
|
||||
[path](TMainWindow *window) { return window->CurrentFile() == path; });
|
||||
if (w != list.end())
|
||||
{
|
||||
if (w->CurrentFile() == path)
|
||||
{
|
||||
w->activateWindow();
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
(*w)->activateWindow();
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
|
||||
VlpCreateLock(lock, path);
|
||||
|
||||
if (not lock->IsLocked())
|
||||
{
|
||||
if (not IgnoreLocking(lock->GetLockError(), path))
|
||||
if (not IgnoreLocking(lock->GetLockError(), path, MApplication::VApp()->IsAppInGUIMode()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -388,13 +387,6 @@ bool TMainWindow::LoadFile(const QString &path)
|
|||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void TMainWindow::ShowToolTip(const QString &toolTip)
|
||||
{
|
||||
Q_UNUSED(toolTip)
|
||||
// do nothing
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void TMainWindow::FileNew()
|
||||
{
|
||||
|
@ -597,11 +589,13 @@ void TMainWindow::changeEvent(QEvent *event)
|
|||
{
|
||||
if (event->type() == QEvent::LanguageChange)
|
||||
{
|
||||
VAbstractApplication::VApp()->Settings()->GetOsSeparator() ? setLocale(QLocale()) : setLocale(QLocale::c());
|
||||
WindowsLocale();
|
||||
|
||||
// retranslate designer form (single inheritance approach)
|
||||
ui->retranslateUi(this);
|
||||
|
||||
UpdateWindowTitle();
|
||||
|
||||
InitMeasurementUnits();
|
||||
|
||||
if (mType == MeasurementsType::Multisize)
|
||||
|
@ -782,48 +776,9 @@ bool TMainWindow::FileSave()
|
|||
return false;
|
||||
}
|
||||
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup++; // turn checking on
|
||||
#endif /*Q_OS_WIN32*/
|
||||
const bool isFileWritable = QFileInfo(curFile).isWritable();
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup--; // turn it off again
|
||||
#endif /*Q_OS_WIN32*/
|
||||
if (not isFileWritable)
|
||||
if (not CheckFilePermissions(curFile, this))
|
||||
{
|
||||
QMessageBox messageBox(this);
|
||||
messageBox.setIcon(QMessageBox::Question);
|
||||
messageBox.setText(tr("The measurements document has no write permissions."));
|
||||
messageBox.setInformativeText(tr("Do you want to change the premissions?"));
|
||||
messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
|
||||
messageBox.setDefaultButton(QMessageBox::Yes);
|
||||
|
||||
if (messageBox.exec() == QMessageBox::Yes)
|
||||
{
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup++; // turn checking on
|
||||
#endif /*Q_OS_WIN32*/
|
||||
bool changed = QFile::setPermissions(curFile,
|
||||
QFileInfo(curFile).permissions() | QFileDevice::WriteUser);
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup--; // turn it off again
|
||||
#endif /*Q_OS_WIN32*/
|
||||
|
||||
if (not changed)
|
||||
{
|
||||
messageBox.setIcon(QMessageBox::Warning);
|
||||
messageBox.setText(tr("Cannot set permissions for %1 to writable.").arg(curFile));
|
||||
messageBox.setInformativeText(tr("Could not save the file."));
|
||||
messageBox.setStandardButtons(QMessageBox::Ok);
|
||||
messageBox.setDefaultButton(QMessageBox::Ok);
|
||||
messageBox.exec();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QString error;
|
||||
|
@ -2410,7 +2365,6 @@ void TMainWindow::SetupMenu()
|
|||
m_separatorAct->setVisible(false);
|
||||
ui->menuFile->insertAction(ui->actionPreferences, m_separatorAct );
|
||||
|
||||
|
||||
connect(ui->actionQuit, &QAction::triggered, this, &TMainWindow::close);
|
||||
ui->actionQuit->setShortcuts(QKeySequence::Quit);
|
||||
|
||||
|
@ -3289,7 +3243,15 @@ void TMainWindow::UpdateWindowTitle()
|
|||
}
|
||||
else
|
||||
{
|
||||
showName = tr("untitled %1").arg(MApplication::VApp()->MainWindows().size()+1);
|
||||
int index = MApplication::VApp()->MainWindows().indexOf(this);
|
||||
if (index != -1)
|
||||
{
|
||||
showName = tr("untitled %1").arg(index+1);
|
||||
}
|
||||
else
|
||||
{
|
||||
showName = tr("untitled");
|
||||
}
|
||||
mType == MeasurementsType::Multisize ? showName += QLatin1String(".vst") : showName += QLatin1String(".vit");
|
||||
}
|
||||
|
||||
|
@ -3525,21 +3487,20 @@ bool TMainWindow::LoadFromExistingFile(const QString &path)
|
|||
|
||||
// Check if file already opened
|
||||
const QList<TMainWindow*> list = MApplication::VApp()->MainWindows();
|
||||
for (auto w : list)
|
||||
auto w = std::find_if(list.begin(), list.end(),
|
||||
[path](TMainWindow *window) { return window->CurrentFile() == path; });
|
||||
if (w != list.end())
|
||||
{
|
||||
if (w->CurrentFile() == path)
|
||||
{
|
||||
w->activateWindow();
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
(*w)->activateWindow();
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
|
||||
VlpCreateLock(lock, path);
|
||||
|
||||
if (not lock->IsLocked())
|
||||
{
|
||||
if (not IgnoreLocking(lock->GetLockError(), path))
|
||||
if (not IgnoreLocking(lock->GetLockError(), path, MApplication::VApp()->IsAppInGUIMode()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -3653,7 +3614,11 @@ void TMainWindow::CreateWindowMenu(QMenu *menu)
|
|||
window->isWindowModified() ? title.replace(index, 3, QChar('*')) : title.replace(index, 3, QString());
|
||||
}
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 6, 0)
|
||||
QAction *action = menu->addAction(title, this, SLOT(ShowWindow()));
|
||||
#else
|
||||
QAction *action = menu->addAction(title, this, &TMainWindow::ShowWindow);
|
||||
#endif //QT_VERSION < QT_VERSION_CHECK(5, 6, 0)
|
||||
action->setData(i);
|
||||
action->setCheckable(true);
|
||||
action->setMenuRole(QAction::NoRole);
|
||||
|
@ -3664,72 +3629,6 @@ void TMainWindow::CreateWindowMenu(QMenu *menu)
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool TMainWindow::IgnoreLocking(int error, const QString &path)
|
||||
{
|
||||
QMessageBox::StandardButton answer = QMessageBox::Abort;
|
||||
if (not MApplication::VApp()->IsTestMode())
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
case QLockFile::LockFailedError:
|
||||
answer = QMessageBox::warning(this, tr("Locking file"),
|
||||
tr("This file already opened in another window. Ignore if you want "
|
||||
"to continue (not recommended, can cause a data corruption)."),
|
||||
QMessageBox::Abort|QMessageBox::Ignore, QMessageBox::Abort);
|
||||
break;
|
||||
case QLockFile::PermissionError:
|
||||
answer = QMessageBox::question(this, tr("Locking file"),
|
||||
tr("The lock file could not be created, for lack of permissions. "
|
||||
"Ignore if you want to continue (not recommended, can cause "
|
||||
"a data corruption)."),
|
||||
QMessageBox::Abort|QMessageBox::Ignore, QMessageBox::Abort);
|
||||
break;
|
||||
case QLockFile::UnknownError:
|
||||
answer = QMessageBox::question(this, tr("Locking file"),
|
||||
tr("Unknown error happened, for instance a full partition "
|
||||
"prevented writing out the lock file. Ignore if you want to "
|
||||
"continue (not recommended, can cause a data corruption)."),
|
||||
QMessageBox::Abort|QMessageBox::Ignore, QMessageBox::Abort);
|
||||
break;
|
||||
default:
|
||||
answer = QMessageBox::Abort;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (answer == QMessageBox::Abort)
|
||||
{
|
||||
qCDebug(tMainWindow, "Failed to lock %s", qUtf8Printable(path));
|
||||
qCDebug(tMainWindow, "Error type: %d", error);
|
||||
if (MApplication::VApp()->IsTestMode())
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
case QLockFile::LockFailedError:
|
||||
qCCritical(tMainWindow, "%s",
|
||||
qUtf8Printable(tr("This file already opened in another window.")));
|
||||
break;
|
||||
case QLockFile::PermissionError:
|
||||
qCCritical(tMainWindow, "%s",
|
||||
qUtf8Printable(tr("The lock file could not be created, for lack of permissions.")));
|
||||
break;
|
||||
case QLockFile::UnknownError:
|
||||
qCCritical(tMainWindow, "%s",
|
||||
qUtf8Printable(tr("Unknown error happened, for instance a full partition "
|
||||
"prevented writing out the lock file.")));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
qApp->exit(V_EX_NOINPUT);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void TMainWindow::HackDimensionBaseValue()
|
||||
{
|
||||
|
|
|
@ -65,8 +65,7 @@ public:
|
|||
|
||||
bool LoadFile(const QString &path);
|
||||
|
||||
public slots:
|
||||
virtual void ShowToolTip(const QString &toolTip) override;
|
||||
void UpdateWindowTitle();
|
||||
|
||||
protected:
|
||||
virtual void closeEvent(QCloseEvent *event) override;
|
||||
|
@ -218,7 +217,6 @@ private:
|
|||
void MeasurementGUI();
|
||||
void Controls();
|
||||
void MFields(bool enabled);
|
||||
void UpdateWindowTitle();
|
||||
|
||||
void ReadSettings();
|
||||
void WriteSettings();
|
||||
|
@ -231,8 +229,6 @@ private:
|
|||
|
||||
void CreateWindowMenu(QMenu *menu);
|
||||
|
||||
bool IgnoreLocking(int error, const QString &path);
|
||||
|
||||
template <class T>
|
||||
void HackWidget(T **widget);
|
||||
void HackDimensionBaseValue();
|
||||
|
|
|
@ -3253,52 +3253,9 @@ bool MainWindow::on_actionSave_triggered()
|
|||
return false;
|
||||
}
|
||||
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup++; // turn checking on
|
||||
#endif /*Q_OS_WIN32*/
|
||||
const bool isFileWritable = QFileInfo(VAbstractValApplication::VApp()->GetPatternPath()).isWritable();
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup--; // turn it off again
|
||||
#endif /*Q_OS_WIN32*/
|
||||
if (not isFileWritable)
|
||||
if (not CheckFilePermissions(VAbstractValApplication::VApp()->GetPatternPath(), this))
|
||||
{
|
||||
QMessageBox messageBox(this);
|
||||
messageBox.setIcon(QMessageBox::Question);
|
||||
messageBox.setText(tr("The document has no write permissions."));
|
||||
messageBox.setInformativeText(tr("Do you want to change the premissions?"));
|
||||
messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
|
||||
messageBox.setDefaultButton(QMessageBox::Yes);
|
||||
|
||||
if (messageBox.exec() == QMessageBox::Yes)
|
||||
{
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup++; // turn checking on
|
||||
#endif /*Q_OS_WIN32*/
|
||||
bool changed =
|
||||
QFile::setPermissions(VAbstractValApplication::VApp()->GetPatternPath(),
|
||||
QFileInfo(VAbstractValApplication::VApp()
|
||||
->GetPatternPath()).permissions() | QFileDevice::WriteUser);
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup--; // turn it off again
|
||||
#endif /*Q_OS_WIN32*/
|
||||
|
||||
if (not changed)
|
||||
{
|
||||
QMessageBox messageBox(this);
|
||||
messageBox.setIcon(QMessageBox::Warning);
|
||||
messageBox.setText(tr("Cannot set permissions for %1 to writable.")
|
||||
.arg(VAbstractValApplication::VApp()->GetPatternPath()));
|
||||
messageBox.setInformativeText(tr("Could not save the file."));
|
||||
messageBox.setDefaultButton(QMessageBox::Ok);
|
||||
messageBox.setStandardButtons(QMessageBox::Ok);
|
||||
messageBox.exec();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QString error;
|
||||
|
@ -5325,7 +5282,7 @@ bool MainWindow::LoadPattern(QString fileName, const QString& customMeasureFile)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (not IgnoreLocking(lock->GetLockError(), fileName))
|
||||
if (not IgnoreLocking(lock->GetLockError(), fileName, VApplication::IsGUIMode()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -6433,73 +6390,6 @@ void MainWindow::UpdateWindowTitle()
|
|||
#endif //defined(Q_OS_MAC)
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool MainWindow::IgnoreLocking(int error, const QString &path)
|
||||
{
|
||||
QMessageBox::StandardButton answer = QMessageBox::Abort;
|
||||
if (VApplication::IsGUIMode())
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
case QLockFile::LockFailedError:
|
||||
answer = QMessageBox::warning(this, tr("Locking file"),
|
||||
tr("This file already opened in another window. Ignore if you want "
|
||||
"to continue (not recommended, can cause a data corruption)."),
|
||||
QMessageBox::Abort|QMessageBox::Ignore, QMessageBox::Abort);
|
||||
break;
|
||||
case QLockFile::PermissionError:
|
||||
answer = QMessageBox::question(this, tr("Locking file"),
|
||||
tr("The lock file could not be created, for lack of permissions. "
|
||||
"Ignore if you want to continue (not recommended, can cause "
|
||||
"a data corruption)."),
|
||||
QMessageBox::Abort|QMessageBox::Ignore, QMessageBox::Abort);
|
||||
break;
|
||||
case QLockFile::UnknownError:
|
||||
answer = QMessageBox::question(this, tr("Locking file"),
|
||||
tr("Unknown error happened, for instance a full partition prevented "
|
||||
"writing out the lock file. Ignore if you want to continue (not "
|
||||
"recommended, can cause a data corruption)."),
|
||||
QMessageBox::Abort|QMessageBox::Ignore, QMessageBox::Abort);
|
||||
break;
|
||||
default:
|
||||
answer = QMessageBox::Abort;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (answer == QMessageBox::Abort)
|
||||
{
|
||||
qCDebug(vMainWindow, "Failed to lock %s", qUtf8Printable(path));
|
||||
qCDebug(vMainWindow, "Error type: %d", error);
|
||||
Clear();
|
||||
if (not VApplication::IsGUIMode())
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
case QLockFile::LockFailedError:
|
||||
qCCritical(vMainWindow, "%s",
|
||||
qUtf8Printable(tr("This file already opened in another window.")));
|
||||
break;
|
||||
case QLockFile::PermissionError:
|
||||
qCCritical(vMainWindow, "%s",
|
||||
qUtf8Printable(tr("The lock file could not be created, for lack of permissions.")));
|
||||
break;
|
||||
case QLockFile::UnknownError:
|
||||
qCCritical(vMainWindow, "%s",
|
||||
qUtf8Printable(tr("Unknown error happened, for instance a full partition prevented "
|
||||
"writing out the lock file.")));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
qApp->exit(V_EX_NOINPUT);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void MainWindow::ToolSelectPoint()
|
||||
{
|
||||
|
|
|
@ -392,8 +392,6 @@ private:
|
|||
|
||||
void UpdateWindowTitle();
|
||||
|
||||
bool IgnoreLocking(int error, const QString &path);
|
||||
|
||||
void ToolSelectPoint();
|
||||
void ToolSelectPointByPress();
|
||||
void ToolSelectPointByRelease();
|
||||
|
|
|
@ -149,66 +149,80 @@ unix{
|
|||
tape.path = $$BINDIR
|
||||
tape.files += $${OUT_PWD}/../tape/$${DESTDIR}/tape
|
||||
|
||||
puzzle.path = $$BINDIR
|
||||
puzzle.files += $${OUT_PWD}/../puzzle/$${DESTDIR}/puzzle
|
||||
|
||||
# .desktop file
|
||||
desktop.path = $$DATADIR/applications/
|
||||
desktop.files += ../../../dist/$${TARGET}.desktop \
|
||||
desktop.files += ../../../dist/tape.desktop
|
||||
desktop.files += ../../../dist/tape.desktop \
|
||||
desktop.files += ../../../dist/puzzle.desktop
|
||||
|
||||
# logo
|
||||
hicolor_48_apps.path = $$DATADIR/icons/hicolor/48x48/apps/
|
||||
hicolor_48_apps.files += \
|
||||
../../../share/icons/48x48/apps/$${TARGET}.png \
|
||||
../../../share/icons/48x48/apps/tape.png
|
||||
../../../share/icons/48x48/apps/tape.png \
|
||||
../../../share/icons/48x48/apps/puzzle.png
|
||||
|
||||
hicolor_48_mimetypes.path = $$DATADIR/icons/hicolor/48x48/mimetypes/
|
||||
hicolor_48_mimetypes.files += \
|
||||
../../../share/icons/48x48/mimetypes/application-x-valentina-pattern.png \
|
||||
../../../share/icons/48x48/mimetypes/application-x-valentina-i-measurements.png \
|
||||
../../../share/icons/48x48/mimetypes/application-x-valentina-s-measurements.png
|
||||
../../../share/icons/48x48/mimetypes/application-x-valentina-s-measurements.png \
|
||||
../../../share/icons/48x48/mimetypes/application-x-valentina-layout.png
|
||||
|
||||
hicolor_64_apps.path = $$DATADIR/icons/hicolor/64x64/apps/
|
||||
hicolor_64_apps.files += \
|
||||
../../../share/icons/64x64/apps/$${TARGET}.png \
|
||||
../../../share/icons/64x64/apps/tape.png
|
||||
../../../share/icons/64x64/apps/tape.png \
|
||||
../../../share/icons/64x64/apps/puzzle.png
|
||||
|
||||
hicolor_64_mimetypes.path = $$DATADIR/icons/hicolor/64x64/mimetypes/
|
||||
hicolor_64_mimetypes.files += \
|
||||
../../../share/icons/64x64/mimetypes/application-x-valentina-pattern.png \
|
||||
../../../share/icons/64x64/mimetypes/application-x-valentina-i-measurements.png \
|
||||
../../../share/icons/64x64/mimetypes/application-x-valentina-s-measurements.png
|
||||
../../../share/icons/64x64/mimetypes/application-x-valentina-s-measurements.png \
|
||||
../../../share/icons/64x64/mimetypes/application-x-valentina-layout.png
|
||||
|
||||
hicolor_128_apps.path = $$DATADIR/icons/hicolor/128x128/apps/
|
||||
hicolor_128_apps.files += \
|
||||
../../../share/icons/128x128/apps/$${TARGET}.png \
|
||||
../../../share/icons/128x128/apps/tape.png
|
||||
../../../share/icons/128x128/apps/tape.png \
|
||||
../../../share/icons/128x128/apps/puzzle.png
|
||||
|
||||
hicolor_128_mimetypes.path = $$DATADIR/icons/hicolor/128x128/mimetypes/
|
||||
hicolor_128_mimetypes.files += \
|
||||
../../../share/icons/128x128/mimetypes/application-x-valentina-pattern.png \
|
||||
../../../share/icons/128x128/mimetypes/application-x-valentina-i-measurements.png \
|
||||
../../../share/icons/128x128/mimetypes/application-x-valentina-s-measurements.png
|
||||
../../../share/icons/128x128/mimetypes/application-x-valentina-s-measurements.png \
|
||||
../../../share/icons/128x128/mimetypes/application-x-valentina-layout.png
|
||||
|
||||
hicolor_256_apps.path = $$DATADIR/icons/hicolor/256x256/apps/
|
||||
hicolor_256_apps.files += \
|
||||
../../../share/icons/256x256/apps/$${TARGET}.png \
|
||||
../../../share/icons/256x256/apps/tape.png
|
||||
../../../share/icons/256x256/apps/tape.png \
|
||||
../../../share/icons/256x256/apps/puzzle.png
|
||||
|
||||
hicolor_256_mimetypes.path = $$DATADIR/icons/hicolor/256x256/mimetypes/
|
||||
hicolor_256_mimetypes.files += \
|
||||
../../../share/icons/256x256/mimetypes/application-x-valentina-pattern.png \
|
||||
../../../share/icons/256x256/mimetypes/application-x-valentina-i-measurements.png \
|
||||
../../../share/icons/256x256/mimetypes/application-x-valentina-s-measurements.png
|
||||
../../../share/icons/256x256/mimetypes/application-x-valentina-s-measurements.png \
|
||||
../../../share/icons/256x256/mimetypes/application-x-valentina-layout.png
|
||||
|
||||
hicolor_512_apps.path = $$DATADIR/icons/hicolor/512x512/apps/
|
||||
hicolor_512_apps.files += \
|
||||
../../../share/icons/512x512/apps/$${TARGET}.png \
|
||||
../../../share/icons/512x512/apps/tape.png
|
||||
../../../share/icons/512x512/apps/tape.png \
|
||||
../../../share/icons/512x512/apps/puzzle.png
|
||||
|
||||
hicolor_512_mimetypes.path = $$DATADIR/icons/hicolor/512x512/mimetypes/
|
||||
hicolor_512_mimetypes.files += \
|
||||
../../../share/icons/512x512/mimetypes/application-x-valentina-pattern.png \
|
||||
../../../share/icons/512x512/mimetypes/application-x-valentina-i-measurements.png \
|
||||
../../../share/icons/512x512/mimetypes/application-x-valentina-s-measurements.png
|
||||
../../../share/icons/512x512/mimetypes/application-x-valentina-s-measurements.png \
|
||||
../../../share/icons/512x512/mimetypes/application-x-valentina-layout.png
|
||||
|
||||
# Path to translation files after installation
|
||||
translations.path = $$PKGDATADIR/translations/
|
||||
|
@ -229,6 +243,7 @@ unix{
|
|||
INSTALLS += \
|
||||
target \
|
||||
tape \
|
||||
puzzle \
|
||||
desktop \
|
||||
hicolor_48_apps \
|
||||
hicolor_48_mimetypes \
|
||||
|
@ -273,6 +288,9 @@ unix{
|
|||
tape.path = $$MACOS_DIR
|
||||
tape.files += $${OUT_PWD}/../tape/$${DESTDIR}/tape.app/$$MACOS_DIR/tape
|
||||
|
||||
puzzle.path = $$MACOS_DIR
|
||||
puzzle.files += $${OUT_PWD}/../puzzle/$${DESTDIR}/puzzle.app/$$MACOS_DIR/puzzle
|
||||
|
||||
# Utility pdftops need for saving a layout image to PS and EPS formates.
|
||||
xpdf.path = $$MACOS_DIR
|
||||
xpdf.files += $${PWD}/../../../dist/macx/bin64/pdftops
|
||||
|
@ -298,6 +316,7 @@ unix{
|
|||
icns_resources.files += $$PWD/../../../dist/macx/i-measurements.icns
|
||||
icns_resources.files += $$PWD/../../../dist/macx/s-measurements.icns
|
||||
icns_resources.files += $$PWD/../../../dist/macx/pattern.icns
|
||||
icns_resources.files += $$PWD/../../../dist/macx/layout.icns
|
||||
|
||||
# Copy to bundle multisize measurements files
|
||||
# We cannot add none exist files to bundle through QMAKE_BUNDLE_DATA. That's why we must do this manually.
|
||||
|
@ -309,6 +328,7 @@ unix{
|
|||
label \
|
||||
libraries \
|
||||
tape \
|
||||
puzzle \
|
||||
xpdf \
|
||||
icns_resources
|
||||
}
|
||||
|
@ -322,11 +342,13 @@ win32:*g++* {
|
|||
package.files += \
|
||||
$${OUT_PWD}/$${DESTDIR}/valentina.exe \
|
||||
$${OUT_PWD}/../tape/$${DESTDIR}/tape.exe \
|
||||
$${OUT_PWD}/../puzzle/$${DESTDIR}/puzzle.exe \
|
||||
$${OUT_PWD}/../tape/$${DESTDIR}/diagrams.rcc \
|
||||
$$PWD/../../../dist/win/valentina.ico \
|
||||
$$PWD/../../../dist/win/i-measurements.ico \
|
||||
$$PWD/../../../dist/win/s-measurements.ico \
|
||||
$$PWD/../../../dist/win/pattern.ico \
|
||||
$$PWD/../../../dist/win/layout.ico \
|
||||
$$PWD/../../../dist/win/pdftops.exe \
|
||||
$$PWD/../../../dist/win/EUDC.TTE \
|
||||
$$PWD/../../../AUTHORS.txt \
|
||||
|
|
|
@ -153,16 +153,14 @@ QString VAbstractApplication::translationsPath(const QString &locale) const
|
|||
{
|
||||
return dir.absolutePath();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
#if defined(APPIMAGE) && defined(Q_OS_LINUX)
|
||||
/* Fix path to trasnaltions when run inside AppImage. */
|
||||
return AppImageRoot() + PKGDATADIR + trPath;
|
||||
/* Fix path to trasnaltions when run inside AppImage. */
|
||||
return AppImageRoot() + PKGDATADIR + trPath;
|
||||
#else
|
||||
return PKGDATADIR + trPath;
|
||||
return PKGDATADIR + trPath;
|
||||
#endif // defined(APPIMAGE) && defined(Q_OS_LINUX)
|
||||
}
|
||||
#endif
|
||||
#endif // Unix
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/************************************************************************
|
||||
/************************************************************************
|
||||
**
|
||||
** @file vcommonsettings.h
|
||||
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||
|
|
|
@ -831,12 +831,20 @@ QVector<QLineF> VPassmark::BuiltInSAPassmarkBaseLine(const VPiece &piece) const
|
|||
}
|
||||
else
|
||||
{
|
||||
const QString errorMsg = QObject::tr("Cannot calculate a notch for point '%1' in piece '%2' with built in "
|
||||
"seam allowance. User must manually provide length.")
|
||||
.arg(m_data.nodeName, m_data.pieceName);
|
||||
VAbstractApplication::VApp()->IsPedantic() ? throw VExceptionInvalidNotch(errorMsg) :
|
||||
qWarning() << VAbstractValApplication::warningMessageSignature + errorMsg;
|
||||
return QVector<QLineF>();
|
||||
if (m_data.globalPassmarkLength > accuracyPointOnLine)
|
||||
{
|
||||
length = m_data.globalPassmarkLength;
|
||||
}
|
||||
else
|
||||
{
|
||||
const QString errorMsg = QObject::tr("Cannot calculate a notch for point '%1' in piece '%2' with built "
|
||||
"in seam allowance. User must manually provide length.")
|
||||
.arg(m_data.nodeName, m_data.pieceName);
|
||||
VAbstractApplication::VApp()->IsPedantic()
|
||||
? throw VExceptionInvalidNotch(errorMsg)
|
||||
: qWarning() << VAbstractValApplication::warningMessageSignature + errorMsg;
|
||||
return {};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -31,18 +31,31 @@
|
|||
#include "../vmisc/vabstractapplication.h"
|
||||
#include "../vmisc/compatibility.h"
|
||||
#include "../vmisc/def.h"
|
||||
#include "../vmisc/vsysexits.h"
|
||||
#include "dialogs/dialogexporttocsv.h"
|
||||
#include "../vwidgets/vmaingraphicsview.h"
|
||||
|
||||
#include <QStyle>
|
||||
#include <QToolBar>
|
||||
#include <QFileDialog>
|
||||
#include <QAction>
|
||||
#include <QLockFile>
|
||||
#include <QMessageBox>
|
||||
|
||||
#if defined(Q_OS_MAC)
|
||||
#include "../vwidgets/vmaingraphicsview.h"
|
||||
#include <QStyleFactory>
|
||||
#endif
|
||||
|
||||
#include <QLoggingCategory>
|
||||
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_CLANG("-Wmissing-prototypes")
|
||||
QT_WARNING_DISABLE_INTEL(1418)
|
||||
|
||||
Q_LOGGING_CATEGORY(abstactMainWindow, "abs.MainWindow")
|
||||
|
||||
QT_WARNING_POP
|
||||
|
||||
namespace
|
||||
{
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -134,6 +147,13 @@ VAbstractMainWindow::VAbstractMainWindow(QWidget *parent)
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VAbstractMainWindow::ShowToolTip(const QString &toolTip)
|
||||
{
|
||||
Q_UNUSED(toolTip)
|
||||
// do nothing
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool VAbstractMainWindow::ContinueFormatRewrite(const QString ¤tFormatVersion,
|
||||
const QString &maxFormatVersion)
|
||||
|
@ -197,6 +217,16 @@ QString VAbstractMainWindow::CSVFilePath()
|
|||
return fileName;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VAbstractMainWindow::ExportToCSVData(const QString &fileName, bool withHeader, int mib, const QChar &separator)
|
||||
{
|
||||
Q_UNUSED(fileName)
|
||||
Q_UNUSED(withHeader)
|
||||
Q_UNUSED(mib)
|
||||
Q_UNUSED(separator)
|
||||
// do nothing
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VAbstractMainWindow::UpdateRecentFileActions()
|
||||
{
|
||||
|
@ -219,6 +249,121 @@ void VAbstractMainWindow::UpdateRecentFileActions()
|
|||
m_separatorAct->setVisible(numRecentFiles>0);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
auto VAbstractMainWindow::CheckFilePermissions(const QString &path, QWidget *messageBoxParent) -> bool
|
||||
{
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup++; // turn checking on
|
||||
#endif /*Q_OS_WIN32*/
|
||||
// cppcheck-suppress unreadVariable
|
||||
const bool isFileWritable = QFileInfo(path).isWritable();
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup--; // turn it off again
|
||||
#endif /*Q_OS_WIN32*/
|
||||
if (not isFileWritable)
|
||||
{
|
||||
QMessageBox messageBox(messageBoxParent);
|
||||
messageBox.setIcon(QMessageBox::Question);
|
||||
messageBox.setText(tr("The measurements document has no write permissions."));
|
||||
messageBox.setInformativeText(tr("Do you want to change the premissions?"));
|
||||
messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
|
||||
messageBox.setDefaultButton(QMessageBox::Yes);
|
||||
|
||||
if (messageBox.exec() == QMessageBox::Yes)
|
||||
{
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup++; // turn checking on
|
||||
#endif /*Q_OS_WIN32*/
|
||||
bool changed = QFile::setPermissions(path, QFileInfo(path).permissions() | QFileDevice::WriteUser);
|
||||
#ifdef Q_OS_WIN32
|
||||
qt_ntfs_permission_lookup--; // turn it off again
|
||||
#endif /*Q_OS_WIN32*/
|
||||
|
||||
if (not changed)
|
||||
{
|
||||
messageBox.setIcon(QMessageBox::Warning);
|
||||
messageBox.setText(tr("Cannot set permissions for %1 to writable.").arg(path));
|
||||
messageBox.setInformativeText(tr("Could not save the file."));
|
||||
messageBox.setStandardButtons(QMessageBox::Ok);
|
||||
messageBox.setDefaultButton(QMessageBox::Ok);
|
||||
messageBox.exec();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool VAbstractMainWindow::IgnoreLocking(int error, const QString &path, bool guiMode)
|
||||
{
|
||||
QMessageBox::StandardButton answer = QMessageBox::Abort;
|
||||
if (guiMode)
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
case QLockFile::LockFailedError:
|
||||
answer = QMessageBox::warning(this, tr("Locking file"),
|
||||
tr("This file already opened in another window. Ignore if you want "
|
||||
"to continue (not recommended, can cause a data corruption)."),
|
||||
QMessageBox::Abort|QMessageBox::Ignore, QMessageBox::Abort);
|
||||
break;
|
||||
case QLockFile::PermissionError:
|
||||
answer = QMessageBox::question(this, tr("Locking file"),
|
||||
tr("The lock file could not be created, for lack of permissions. "
|
||||
"Ignore if you want to continue (not recommended, can cause "
|
||||
"a data corruption)."),
|
||||
QMessageBox::Abort|QMessageBox::Ignore, QMessageBox::Abort);
|
||||
break;
|
||||
case QLockFile::UnknownError:
|
||||
answer = QMessageBox::question(this, tr("Locking file"),
|
||||
tr("Unknown error happened, for instance a full partition "
|
||||
"prevented writing out the lock file. Ignore if you want to "
|
||||
"continue (not recommended, can cause a data corruption)."),
|
||||
QMessageBox::Abort|QMessageBox::Ignore, QMessageBox::Abort);
|
||||
break;
|
||||
default:
|
||||
answer = QMessageBox::Abort;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (answer == QMessageBox::Abort)
|
||||
{
|
||||
qCDebug(abstactMainWindow, "Failed to lock %s", qUtf8Printable(path));
|
||||
qCDebug(abstactMainWindow, "Error type: %d", error);
|
||||
if (not guiMode)
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
case QLockFile::LockFailedError:
|
||||
qCCritical(abstactMainWindow, "%s",
|
||||
qUtf8Printable(tr("This file already opened in another window.")));
|
||||
break;
|
||||
case QLockFile::PermissionError:
|
||||
qCCritical(abstactMainWindow, "%s",
|
||||
qUtf8Printable(tr("The lock file could not be created, for lack of permissions.")));
|
||||
break;
|
||||
case QLockFile::UnknownError:
|
||||
qCCritical(abstactMainWindow, "%s",
|
||||
qUtf8Printable(tr("Unknown error happened, for instance a full partition "
|
||||
"prevented writing out the lock file.")));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
qApp->exit(V_EX_NOINPUT);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VAbstractMainWindow::WindowsLocale()
|
||||
{
|
||||
|
|
|
@ -45,7 +45,7 @@ public:
|
|||
virtual ~VAbstractMainWindow() Q_DECL_EQ_DEFAULT;
|
||||
|
||||
public slots:
|
||||
virtual void ShowToolTip(const QString &toolTip)=0;
|
||||
virtual void ShowToolTip(const QString &toolTip);
|
||||
virtual void UpdateVisibilityGroups();
|
||||
virtual void UpdateDetailsList();
|
||||
virtual void ZoomFitBestCurrent();
|
||||
|
@ -66,11 +66,15 @@ protected:
|
|||
|
||||
QString CSVFilePath();
|
||||
|
||||
virtual void ExportToCSVData(const QString &fileName, bool withHeader, int mib, const QChar &separator)=0;
|
||||
virtual void ExportToCSVData(const QString &fileName, bool withHeader, int mib, const QChar &separator);
|
||||
|
||||
virtual QStringList RecentFileList() const =0;
|
||||
void UpdateRecentFileActions();
|
||||
|
||||
static bool CheckFilePermissions(const QString &path, QWidget *messageBoxParent=nullptr);
|
||||
|
||||
bool IgnoreLocking(int error, const QString &path, bool guiMode);
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(VAbstractMainWindow)
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue
Block a user