Merge branch 'dev' into 'hotfix-history'

# Conflicts:
#   src/Layer/PaintingArea.h
This commit is contained in:
Jonas Mucke
2020-01-30 17:25:39 +00:00
29 changed files with 1079 additions and 1216 deletions

View File

@@ -5,7 +5,7 @@
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = IntelliPhoto
PROJECT_NUMBER = 0.6
PROJECT_NUMBER = 0.7
PROJECT_BRIEF =
PROJECT_LOGO =
OUTPUT_DIRECTORY = docs

View File

@@ -1,94 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
viewBox="0 0 67.733332 67.733335"
version="1.1"
id="svg8"
sodipodi:docname="circle-tool.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient36">
<stop
style="stop-color:#d40000;stop-opacity:1;"
offset="0"
id="stop32" />
<stop
style="stop-color:#d40000;stop-opacity:0;"
offset="1"
id="stop34" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient36"
id="linearGradient38"
x1="147.98735"
y1="176.19795"
x2="-13.131983"
y2="106.49742"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="166.94289"
inkscape:cy="125.27289"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-229.26665)">
<circle
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.85208333;stroke-miterlimit:4;stroke-dasharray:none"
id="circle4578"
cx="33.78162"
cy="263.02939"
r="2.5985863" />
<circle
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.11666656;stroke-miterlimit:4;stroke-dasharray:none"
id="path4602"
cx="33.781624"
cy="263.50183"
r="26.316593" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -1,109 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
viewBox="0 0 67.733332 67.733335"
version="1.1"
id="svg8"
sodipodi:docname="eraser-tool.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
inkscape:export-filename="C:\Users\pauln\tool1.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient36">
<stop
style="stop-color:#d40000;stop-opacity:1;"
offset="0"
id="stop32" />
<stop
style="stop-color:#d40000;stop-opacity:0;"
offset="1"
id="stop34" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient36"
id="linearGradient38"
x1="147.98735"
y1="176.19795"
x2="-13.131983"
y2="106.49742"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="154.79235"
inkscape:cy="136.37674"
inkscape:document-units="mm"
inkscape:current-layer="g4716"
showgrid="false"
units="px"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-229.26665)">
<g
id="g4716">
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.54304647;stroke-miterlimit:4;stroke-dasharray:none"
id="rect4775"
width="59.058777"
height="57.168896"
x="4.2522316"
y="234.16145" />
<path
style="fill:none;stroke:#ffffff;stroke-width:16.96439552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 64.539433,248.9069 -8.315476,0.24173 c 0,0 -13.890625,31.06218 -29.576635,22.72253"
id="path4777"
inkscape:connector-curvature="0" />
<rect
style="fill:#000000;fill-opacity:1;stroke:#ffaaaa;stroke-width:19.02600098;stroke-miterlimit:4;stroke-dasharray:none"
id="rect4779"
width="3.5923276"
height="18.439137"
x="100.56355"
y="236.22752"
transform="matrix(0.96477278,0.26308456,-0.30397854,0.95267888,0,0)" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -1,194 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
viewBox="0 0 67.733332 67.733335"
version="1.1"
id="svg8"
sodipodi:docname="flood-fill-tool.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient4746">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4742" />
<stop
style="stop-color:#ff0000;stop-opacity:1"
offset="1"
id="stop4744" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient36">
<stop
style="stop-color:#d40000;stop-opacity:1;"
offset="0"
id="stop32" />
<stop
style="stop-color:#d40000;stop-opacity:0;"
offset="1"
id="stop34" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient36"
id="linearGradient38"
x1="147.98735"
y1="176.19795"
x2="-13.131983"
y2="106.49742"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4746"
id="linearGradient4748"
x1="278.75943"
y1="55.545975"
x2="278.70905"
y2="102.68295"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="178.00664"
inkscape:cy="120.50274"
inkscape:document-units="mm"
inkscape:current-layer="g4716"
showgrid="false"
units="px"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-229.26665)">
<g
id="g4716">
<rect
style="fill:url(#linearGradient4748);fill-opacity:1;stroke:#000000;stroke-width:2.54346728;stroke-miterlimit:4;stroke-dasharray:none"
id="rect4736"
width="20.992056"
height="38.493938"
x="268.06161"
y="65.299561"
transform="matrix(0.37877425,0.9254891,-0.96183685,0.2736236,0,0)" />
<rect
y="199.89908"
x="116.56168"
height="29.387648"
width="34.49033"
id="rect4710"
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.11666656;stroke-miterlimit:4;stroke-dasharray:none"
transform="rotate(22.139383)" />
<ellipse
ry="3.6608384"
rx="17.12623"
cy="229.80646"
cx="133.85408"
id="path4712"
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.07105064;stroke-miterlimit:4;stroke-dasharray:none"
transform="rotate(22.139383)" />
<rect
style="fill:#ff2a2a;fill-opacity:1;stroke:none;stroke-width:0.57643586;stroke-miterlimit:4;stroke-dasharray:none"
id="rect4722"
width="6.4093542"
height="5.9942107"
x="106.55282"
y="220.71335"
transform="matrix(0.89502052,0.44602497,-0.31493366,0.94911369,0,0)"
ry="2.9971054" />
<rect
ry="4.9373565"
transform="matrix(0.76230952,0.64721263,-0.19117303,0.98155635,0,0)"
y="211.36087"
x="91.973289"
height="9.8747129"
width="7.5251632"
id="rect4726"
style="fill:#ff2a2a;fill-opacity:1;stroke:none;stroke-width:0.80167449;stroke-miterlimit:4;stroke-dasharray:none" />
<rect
style="fill:#ff2a2a;fill-opacity:1;stroke:none;stroke-width:0.68775666;stroke-miterlimit:4;stroke-dasharray:none"
id="rect4728"
width="6.9141498"
height="7.9099746"
x="106.98909"
y="208.27184"
transform="matrix(0.82967592,0.55824535,-0.238658,0.97110368,0,0)"
ry="3.9549873" />
<rect
style="fill:#ff2a2a;fill-opacity:1;stroke:none;stroke-width:0.83867002;stroke-miterlimit:4;stroke-dasharray:none"
id="rect4732"
width="7.7389083"
height="10.508647"
x="99.318977"
y="206.74135"
transform="matrix(0.74125487,0.67122367,-0.1796405,0.98373233,0,0)"
ry="5.2543235" />
<rect
ry="4.9687924"
transform="matrix(0.76020136,0.64968753,-0.18996354,0.98179115,0,0)"
y="213.06801"
x="82.413681"
height="9.9375849"
width="7.5460315"
id="rect4734"
style="fill:#ff2a2a;fill-opacity:1;stroke:none;stroke-width:0.80533689;stroke-miterlimit:4;stroke-dasharray:none" />
<rect
ry="2.9971054"
transform="matrix(0.89502052,0.44602497,-0.31493366,0.94911369,0,0)"
y="219.89731"
x="128.72516"
height="5.9942107"
width="6.4093542"
id="rect4738"
style="fill:#ff2a2a;fill-opacity:1;stroke:none;stroke-width:0.57643586;stroke-miterlimit:4;stroke-dasharray:none" />
<rect
style="fill:#ff2a2a;fill-opacity:1;stroke:none;stroke-width:0.61344987;stroke-miterlimit:4;stroke-dasharray:none"
id="rect4740"
width="6.5649834"
height="6.6277919"
x="107.49622"
y="215.86592"
transform="matrix(0.87380318,0.48627976,-0.28482771,0.95857873,0,0)"
ry="3.3138959" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -1,169 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
viewBox="0 0 67.733332 67.733335"
version="1.1"
id="svg8"
sodipodi:docname="magic-wand-tool.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient36">
<stop
style="stop-color:#d40000;stop-opacity:1;"
offset="0"
id="stop32" />
<stop
style="stop-color:#d40000;stop-opacity:0;"
offset="1"
id="stop34" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient36"
id="linearGradient38"
x1="147.98735"
y1="176.19795"
x2="-13.131983"
y2="106.49742"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="154.79235"
inkscape:cy="122.64559"
inkscape:document-units="mm"
inkscape:current-layer="g4716"
showgrid="false"
units="px"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-229.26665)">
<g
id="g4716">
<g
id="g4767"
transform="translate(-4.5357143,7.0870536)">
<rect
transform="rotate(45)"
ry="1.889881"
y="137.33192"
x="203.35738"
height="53.483627"
width="10.299852"
id="rect4758"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:3.7175684;stroke-miterlimit:4;stroke-dasharray:none" />
<rect
transform="rotate(45)"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.8319869;stroke-miterlimit:4;stroke-dasharray:none"
id="rect4760"
width="9.7328882"
height="2.8348179"
x="203.64085"
y="148.6712" />
<rect
transform="rotate(45)"
y="141.20618"
x="203.64085"
height="2.8348179"
width="9.7328882"
id="rect4762"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.8319869;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
<path
sodipodi:type="star"
style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:2.11666656;stroke-miterlimit:4;stroke-dasharray:none"
id="path4769"
sodipodi:sides="5"
sodipodi:cx="44.223213"
sodipodi:cy="239.92558"
sodipodi:r1="8.624361"
sodipodi:r2="4.3121805"
sodipodi:arg1="1.0040671"
sodipodi:arg2="1.6323856"
inkscape:flatsided="false"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 48.853421,247.20162 -4.895624,-2.97203 -5.223697,2.348 1.313744,-5.57442 -3.847298,-4.24246 5.707563,-0.47315 2.845937,-4.96999 2.213724,5.28201 5.606183,1.17083 -4.339406,3.73761 z"
inkscape:transform-center-x="2.6385383"
inkscape:transform-center-y="1.2565374"
transform="rotate(-21.763247,66.493886,211.70978)" />
<path
transform="matrix(-0.16940831,-0.61726905,0.61726905,-0.16940831,-99.981719,307.02239)"
inkscape:transform-center-y="1.5995691"
inkscape:transform-center-x="-0.47805579"
d="m 48.853421,247.20162 -4.895624,-2.97203 -5.223697,2.348 1.313744,-5.57442 -3.847298,-4.24246 5.707563,-0.47315 2.845937,-4.96999 2.213724,5.28201 5.606183,1.17083 -4.339406,3.73761 z"
inkscape:randomized="0"
inkscape:rounded="0"
inkscape:flatsided="false"
sodipodi:arg2="1.6323856"
sodipodi:arg1="1.0040671"
sodipodi:r2="4.3121805"
sodipodi:r1="8.624361"
sodipodi:cy="239.92558"
sodipodi:cx="44.223213"
sodipodi:sides="5"
id="path4771"
style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:2.11666656;stroke-miterlimit:4;stroke-dasharray:none"
sodipodi:type="star" />
<path
sodipodi:type="star"
style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:2.11666656;stroke-miterlimit:4;stroke-dasharray:none"
id="path4773"
sodipodi:sides="5"
sodipodi:cx="44.223213"
sodipodi:cy="239.92558"
sodipodi:r1="8.624361"
sodipodi:r2="4.3121805"
sodipodi:arg1="1.0040671"
sodipodi:arg2="1.6323856"
inkscape:flatsided="false"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 48.853421,247.20162 -4.895624,-2.97203 -5.223697,2.348 1.313744,-5.57442 -3.847298,-4.24246 5.707563,-0.47315 2.845937,-4.96999 2.213724,5.28201 5.606183,1.17083 -4.339406,3.73761 z"
inkscape:transform-center-x="0.0027046201"
inkscape:transform-center-y="1.1149197"
transform="matrix(0.25199367,-0.58840415,0.58840415,0.25199367,-99.952707,231.42813)" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.0 KiB

View File

@@ -1,105 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
viewBox="0 0 67.733332 67.733335"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="pen-tool.svg">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient36">
<stop
style="stop-color:#d40000;stop-opacity:1;"
offset="0"
id="stop32" />
<stop
style="stop-color:#d40000;stop-opacity:0;"
offset="1"
id="stop34" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient36"
id="linearGradient38"
x1="147.98735"
y1="176.19795"
x2="-13.131983"
y2="106.49742"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="376.91553"
inkscape:cy="52.667178"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-229.26665)">
<path
style="fill:#000000;fill-opacity:1;stroke-width:0.79907227"
inkscape:transform-center-x="2.1805457"
inkscape:transform-center-y="0.23135325"
d="m 64.660259,230.98439 c -1.469539,1.22623 -3.009608,0.3208 -4.479147,2.55438 l -35.355186,29.81232 20.997146,4.03437 16.236587,-28.5477 c 2.650564,-3.49373 1.675561,-4.59875 2.6006,-7.85337 z"
id="path16"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" />
<ellipse
style="fill:#000000;fill-opacity:1;stroke-width:0.2446842"
id="path19"
ry="4.8653927"
rx="10.959454"
cy="259.34927"
cx="70.703522"
transform="matrix(0.99175335,0.12816118,-0.13566218,0.99075515,0,0)" />
<path
style="fill:url(#linearGradient38);fill-opacity:1;stroke:none;stroke-width:1.1613673px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 19.935603,103.02103 C 11.487015,114.14384 3.7900432,116.38626 5.1066573,144.52297 7.9154345,204.54791 22.091131,264.29315 75.056641,251.85938 127.52071,239.54339 188.58555,194.70704 177.64844,158.85742 c -12.48014,3.63122 -34.362,10.63187 -51.541,8.65662 -12.43758,-1.43999 -33.957254,-24.02776 -43.821058,-27.9929 -2.739296,6.28676 5.637281,36.28371 -21.584814,27.90384 -62.9196406,-19.36876 11.109787,-93.171912 16.121057,-90.16515 0,0 -33.485263,-5.047889 -56.887022,25.7612 z"
transform="matrix(0.26458333,0,0,0.26458333,0,229.26665)"
id="path23"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ssccccscs" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -1,125 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
viewBox="0 0 67.733332 67.733335"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="plain-tool.svg">
<defs
id="defs2">
<marker
inkscape:stockid="DotM"
orient="auto"
refY="0.0"
refX="0.0"
id="DotM"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path907"
d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.4) translate(7.4, 1)" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="261.75556"
inkscape:cy="104.85714"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-229.26665)">
<g
id="g1146"
transform="translate(-0.34017738,0.11425859)">
<rect
y="241.43747"
x="17.575891"
height="41.388393"
width="33.828869"
id="rect839"
style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:1.39999998;stroke-miterlimit:4;stroke-dasharray:none" />
<path
inkscape:connector-curvature="0"
id="path841"
d="m 54.820853,239.89272 8.097875,-7.30482"
style="fill:none;stroke:#ffd42a;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path1123"
d="m 15.612022,286.57635 -8.0978753,7.30482"
style="fill:none;stroke:#ffd42a;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#ffd42a;stroke:#ffd42a;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 13.592835,239.89272 5.4949601,232.5879"
id="path1125"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#ffd42a;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 54.820853,285.50457 8.097875,7.30482"
id="path1127"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path1129"
d="M 56.318451,261.65921 H 63.31101"
style="fill:none;stroke:#ffd42a;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#ffd42a;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 6.0476177,261.65921 H 13.040177"
id="path1131"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path1133"
d="m 34.773809,286.79463 v 7.55952"
style="fill:#ffd42a;fill-opacity:1;stroke:#ffd42a;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#ffd42a;fill-opacity:1;stroke:#ffd42a;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 34.773809,231.04315 v 7.55952"
id="path1135"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -1,117 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
viewBox="0 0 67.733332 67.733335"
version="1.1"
id="svg8"
sodipodi:docname="polygon-tool.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient36">
<stop
style="stop-color:#d40000;stop-opacity:1;"
offset="0"
id="stop32" />
<stop
style="stop-color:#d40000;stop-opacity:0;"
offset="1"
id="stop34" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient36"
id="linearGradient38"
x1="147.98735"
y1="176.19795"
x2="-13.131983"
y2="106.49742"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="107.4786"
inkscape:cy="125.27289"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-229.26665)">
<path
style="fill:#ff0000;stroke:#000000;stroke-width:2.11666667;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:0"
d="M 6.7090773,250.6979 61.137648,243.51635 60.47619,288.87349 10.205357,286.13317 22.867559,260.33629 Z"
id="path4590"
inkscape:connector-curvature="0" />
<circle
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.85208333;stroke-miterlimit:4;stroke-dasharray:none"
id="path4572"
cx="4.5829611"
cy="249.98918"
r="2.5985863" />
<circle
r="2.5985863"
cy="243.5636"
cx="61.090405"
id="circle4574"
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.85208333;stroke-miterlimit:4;stroke-dasharray:none" />
<circle
r="2.5985863"
cy="260.38354"
cx="22.914806"
id="circle4576"
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.85208333;stroke-miterlimit:4;stroke-dasharray:none" />
<circle
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.85208333;stroke-miterlimit:4;stroke-dasharray:none"
id="circle4588"
cx="9.0241814"
cy="286.84189"
r="2.5985863" />
<circle
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.85208333;stroke-miterlimit:4;stroke-dasharray:none"
id="circle4578"
cx="60.523441"
cy="288.82626"
r="2.5985863" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,101 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
viewBox="0 0 67.733332 67.733335"
version="1.1"
id="svg8"
sodipodi:docname="rectangle-tool.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient36">
<stop
style="stop-color:#d40000;stop-opacity:1;"
offset="0"
id="stop32" />
<stop
style="stop-color:#d40000;stop-opacity:0;"
offset="1"
id="stop34" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient36"
id="linearGradient38"
x1="147.98735"
y1="176.19795"
x2="-13.131983"
y2="106.49742"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="107.4786"
inkscape:cy="125.27289"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-229.26665)">
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.85208333;stroke-miterlimit:4;stroke-dasharray:none"
id="rect56"
width="54.995537"
height="38.648064"
x="6.1421127"
y="243.04388" />
<circle
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.85208333;stroke-miterlimit:4;stroke-dasharray:none"
id="path4572"
cx="6.3783484"
cy="243.5636"
r="2.5985863" />
<circle
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.85208333;stroke-miterlimit:4;stroke-dasharray:none"
id="circle4578"
cx="61.090405"
cy="281.7392"
r="2.5985863" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -10,5 +10,6 @@
<file>icons/line-tool.svg</file>
<file>icons/flood-fill-tool.svg</file>
<file>icons/plain-tool.svg</file>
<file>icons/gradient-tool.svg</file>
</qresource>
</RCC>

View File

@@ -9,35 +9,119 @@
#include <QPushButton>
#include <QSpinBox>
/*!
* \brief The IntelliInputDialog class is a customized Input Dialog to get Integers
*/
class IntelliInputDialog : public QDialog
{
Q_OBJECT
public:
/*!
* \brief IntelliInputDialog is the baisc constructor to for the InputDialog
* \param Title - Title of the Input Dialog.
* \param Label - A Label for the Iput Dialog, to show further information.
* \param value - The standart value in the Input Box.
* \param minValue - The minimal value to read.
* \param maxValue - The maximal value to read.
* \param step - The step size of Values.
* \param ok - A check if the input was okay
*/
IntelliInputDialog(QString Title = nullptr, QString Label = nullptr, int value = 5, int minValue = -2147483647, int maxValue = 2147483647, int step = 1, bool* ok = nullptr);
/*!
* \brief getInt is a static funktion ´, which creates an Input Dialog and gets an Integer.
* \param Title - Title of the Input Dialog.
* \param Label - A Label for the Iput Dialog, to show further information.
* \param value - The standart value in the Input Box.
* \param minValue - The minimal value to read.
* \param maxValue - The maximal value to read.
* \param step - The step size of Values.
* \param ok - A check if the input was okay
* \return
*/
static int getInt(QString Title = nullptr, QString Label = nullptr, int value = 5, int minValue = -2147483647, int maxValue = 2147483647, int step = 1, bool* ok = nullptr);
public slots:
/*!
* \brief slotCloseEvent is a slot for catching the close Event.
*/
void slotCloseEvent();
/*!
* \brief slotEingabe is a slot for catching the Input Event.
*/
void slotEingabe();
private:
/*!
* \brief createInputBox creates an Input Box for reading values.
* \param Title - Title of the Input Dialog.
* \param Label - A Label for the Iput Dialog, to show further information.
* \param value - The standart value in the Input Box.
* \param minValue - The minimal value to read.
* \param maxValue - The maximal value to read.
* \param step - The step size of Values.
*/
void createInputBox(QString Title = nullptr, QString Label = nullptr, int value = 5, int minValue = -2147483647, int maxValue = 2147483647, int step = 1);
/*!
* \brief createConnections connects the close and Eingabe slot.
*/
void createConnections();
/*!
* \brief setInputBoxStyle
*/
void setInputBoxStyle();
/*!
* \brief valueInt the variable where the input is saved.
*/
int valueInt;
/*!
* \brief Layout to place als gui event onto.
*/
QGridLayout* Layout;
/*!
* \brief ButtonBox is a gui elment for the button.
*/
QDialogButtonBox* ButtonBox;
/*!
* \brief notClosed saves the value, if the InputDialog is closed.
*/
bool* notClosed;
/*!
* \brief Linesize to standarize the line size.
*/
const QSize Linesize = QSize(150,20);
/*!
* \brief Buttonsize to standarize the button size.
*/
const QSize Buttonsize = QSize(72,20);
/*!
* \brief InputLabel a gui element for a label.
*/
QLabel* InputLabel;
/*!
* \brief Input a gui element for a SpinBox.
*/
QSpinBox* Input;
/*!
* \brief okButton a gui element for the ok Button.
*/
QPushButton* okButton;
/*!
* \brief cancelButton a gui element for the cancel button.
*/
QPushButton* cancelButton;
};

View File

@@ -7,6 +7,8 @@
#include <QCloseEvent>
#include <QDebug>
#include <string>
#include <QScreen>
#include <QGuiApplication>
// IntelliPhotoGui constructor
IntelliPhotoGui::IntelliPhotoGui(){
@@ -20,7 +22,7 @@ IntelliPhotoGui::IntelliPhotoGui(){
setIntelliStyle();
// Size the app
resize(600,600);
showMaximized();
showMaximized();
setDefaultValues();
}
@@ -143,7 +145,7 @@ void IntelliPhotoGui::slotChangeDim(){
// Change dimension
if (ok1&&ok2) {
paintingArea->setLayerDimensions(width,height);
paintingArea->setCanvasDimensions(width,height);
UpdateGui();
}
}
@@ -155,7 +157,7 @@ void IntelliPhotoGui::slotDeleteLayer(){
// "delete Layer" is the title of the window
// the next tr is the text to display
// Define the standard Value, min, max, step and ok button
int layerNumber = IntelliInputDialog::getInt("Delete Layer", "Number:", paintingArea->getNumberOfActiveLayer() + 1, 1, static_cast<int>(paintingArea->layerBundle.size()), 1, &ok1);
int layerNumber = IntelliInputDialog::getInt("Delete Layer", "Number:", paintingArea->getIndexOfActiveLayer() + 1, 1, static_cast<int>(paintingArea->layerBundle.size()), 1, &ok1);
// Create New Layer
if(ok1) {
@@ -172,7 +174,7 @@ void IntelliPhotoGui::slotSetActiveAlpha(){
// the next tr is the text to display
// Define the standard Value, min, max, step and ok button
int layer = IntelliInputDialog::getInt("Layer to set on", "Layer:", paintingArea->getNumberOfActiveLayer() + 1, 1, static_cast<int>(paintingArea->layerBundle.size()), 1, &ok1);
int layer = IntelliInputDialog::getInt("Layer to set on", "Layer:", paintingArea->getIndexOfActiveLayer() + 1, 1, static_cast<int>(paintingArea->layerBundle.size()), 1, &ok1);
// "New Alpha" is the title of the window
int alpha = IntelliInputDialog::getInt("Layer to set on", "Alpha:", 255, 0, 255, 1, &ok2);
@@ -191,7 +193,7 @@ void IntelliPhotoGui::slotSetPolygon(){
// "Layer to set on" is the title of the window
// the next tr is the text to display
// Define the standard Value, min, max, step and ok button
int layer = IntelliInputDialog::getInt("Layer to set on", "Layer:", paintingArea->getNumberOfActiveLayer() + 1, 1, static_cast<int>(paintingArea->layerBundle.size()), 1, &ok1);
int layer = IntelliInputDialog::getInt("Layer to set on", "Layer:", paintingArea->getIndexOfActiveLayer() + 1, 1, static_cast<int>(paintingArea->layerBundle.size()), 1, &ok1);
if (ok1)
{
@@ -243,15 +245,15 @@ void IntelliPhotoGui::slotSetActiveLayer(){
}
}
void IntelliPhotoGui::slotUpdateRenderSettingsOn(){
void IntelliPhotoGui::slotUpdateFastRenderSettingsOn(){
paintingArea->setRenderSettings(true);
FastRendererLabel->setText("Fast Render: On");
FastRendererLabel->setText("Fast Render: On");
UpdateGui();
}
void IntelliPhotoGui::slotUpdateRenderSettingsOff(){
void IntelliPhotoGui::slotUpdateFastRenderSettingsOff(){
paintingArea->setRenderSettings(false);
FastRendererLabel->setText("Fast Render: Off");
FastRendererLabel->setText("Fast Render: Off");
UpdateGui();
}
@@ -306,8 +308,8 @@ void IntelliPhotoGui::slotCreateFloodFillTool(){
}
void IntelliPhotoGui::slotCreateGradientTool(){
GradientButton->setChecked(true);
paintingArea->createGradientTool();
GradientButton->setChecked(true);
paintingArea->createGradientTool();
}
// Open an about dialog
@@ -330,9 +332,10 @@ void IntelliPhotoGui::slotEnterPressed(){
paintingArea->Toolsettings.setInnerAlpha(string.toInt());
}
void IntelliPhotoGui::slotResetTools(){
void IntelliPhotoGui::slotResetToolButtons(){
CircleButton->setChecked(false);
FloodFillButton->setChecked(false);
GradientButton->setChecked(false);
LineButton->setChecked(false);
PenButton->setChecked(false);
PlainButton->setChecked(false);
@@ -424,7 +427,7 @@ void IntelliPhotoGui::createActions(){
connect(actionCreateNewShapedLayer, SIGNAL(triggered()), this, SLOT(slotCreateNewShapedLayer()));
// Delete New Layer action and tie to IntelliPhotoGui::deleteLayer()
actionDeleteLayer = new QAction(tr("&Delete Layer..."), this);
actionDeleteLayer = new QAction(tr("&Delete Layer"), this);
actionDeleteLayer->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_D));
connect(actionDeleteLayer, SIGNAL(triggered()), this, SLOT(slotDeleteLayer()));
@@ -433,50 +436,50 @@ void IntelliPhotoGui::createActions(){
connect(actionChangeDim, SIGNAL(triggered()), this, SLOT(slotChangeDim()));
connect(dimCanvas, SIGNAL(clicked()), this, SLOT(slotChangeDim()));
actionSetActiveLayer = new QAction(tr("&set Active"), this);
actionSetActiveLayer = new QAction(tr("&Set Active"), this);
actionSetActiveLayer->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A));
connect(actionSetActiveLayer, SIGNAL(triggered()), this, SLOT(slotSetActiveLayer()));
actionSetActiveAlpha = new QAction(tr("&set Alpha"), this);
actionSetActiveAlpha = new QAction(tr("&Set Alpha"), this);
actionSetActiveAlpha->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_A));
connect(actionSetActiveAlpha, SIGNAL(triggered()), this, SLOT(slotSetActiveAlpha()));
actionSetPolygon = new QAction(tr("&set new Polygondata"), this);
actionSetPolygon = new QAction(tr("&Set Polygon Data"), this);
actionSetPolygon->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_P));
connect(actionSetPolygon, SIGNAL(triggered()), this, SLOT(slotSetPolygon()));
actionMovePositionUp = new QAction(tr("&move Up"), this);
actionMovePositionUp = new QAction(tr("&Move Up"), this);
actionMovePositionUp->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Up));
connect(actionMovePositionUp, SIGNAL(triggered()), this, SLOT(slotPositionMoveUp()));
actionMovePositionDown = new QAction(tr("&move Down"), this);
actionMovePositionDown = new QAction(tr("&Move Down"), this);
actionMovePositionDown->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Down));
connect(actionMovePositionDown, SIGNAL(triggered()), this, SLOT(slotPositionMoveDown()));
actionMovePositionLeft = new QAction(tr("&move Left"), this);
actionMovePositionLeft = new QAction(tr("&Move Left"), this);
actionMovePositionLeft->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Left));
connect(actionMovePositionLeft, SIGNAL(triggered()), this, SLOT(slotPositionMoveLeft()));
actionMovePositionRight = new QAction(tr("&move Right"), this);
actionMovePositionRight = new QAction(tr("&Move Right"), this);
actionMovePositionRight->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Right));
connect(actionMovePositionRight, SIGNAL(triggered()), this, SLOT(slotPositionMoveRight()));
actionMoveLayerUp = new QAction(tr("&move Layer Up"), this);
actionMoveLayerUp = new QAction(tr("&Move Forth"), this);
actionMoveLayerUp->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Up));
connect(actionMoveLayerUp, SIGNAL(triggered()), this, SLOT(slotMoveLayerUp()));
actionMoveLayerDown = new QAction(tr("&move Layer Down"), this);
actionMoveLayerDown = new QAction(tr("&Move Back"), this);
actionMoveLayerDown->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Down));
connect(actionMoveLayerDown, SIGNAL(triggered()), this, SLOT(slotMoveLayerDown()));
//Create Update RenderSettings Actions here
actionUpdateRenderSettingsOn = new QAction(tr("&On"), this);
actionUpdateRenderSettingsOn->setShortcut(QKeySequence(Qt::ALT + Qt::SHIFT + +Qt::Key_A));
connect(actionUpdateRenderSettingsOn, SIGNAL(triggered()),this, SLOT(slotUpdateRenderSettingsOn()));
actionUpdateFastRenderSettingsOn = new QAction(tr("&On"), this);
actionUpdateFastRenderSettingsOn->setShortcut(QKeySequence(Qt::ALT + Qt::SHIFT + +Qt::Key_A));
connect(actionUpdateFastRenderSettingsOn, SIGNAL(triggered()),this, SLOT(slotUpdateFastRenderSettingsOn()));
actionUpdateRenderSettingsOff = new QAction(tr("&Off"), this);
actionUpdateRenderSettingsOff->setShortcut(QKeySequence(Qt::ALT + Qt::SHIFT + +Qt::Key_D));
connect(actionUpdateRenderSettingsOff, SIGNAL(triggered()),this, SLOT(slotUpdateRenderSettingsOff()));
actionUpdateFastRenderSettingsOff = new QAction(tr("&Off"), this);
actionUpdateFastRenderSettingsOff->setShortcut(QKeySequence(Qt::ALT + Qt::SHIFT + +Qt::Key_D));
connect(actionUpdateFastRenderSettingsOff, SIGNAL(triggered()),this, SLOT(slotUpdateFastRenderSettingsOff()));
//Create Color Actions here
actionColorPickerFirstColor = new QAction(tr("&Main"), this);
@@ -497,79 +500,78 @@ void IntelliPhotoGui::createActions(){
//Create Tool actions down here
actionCreatePlainTool = new QAction(tr("&Plain"), this);
actionCreatePlainTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT + Qt::Key_P));
connect(actionCreatePlainTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
connect(actionCreatePlainTool, SIGNAL(triggered()), this, SLOT(slotResetToolButtons()));
connect(actionCreatePlainTool, SIGNAL(triggered()), this, SLOT(slotCreatePlainTool()));
actionCreatePenTool = new QAction(tr("&Pen"),this);
actionCreatePenTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT + Qt::Key_S));
connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotResetToolButtons()));
connect(actionCreatePenTool, SIGNAL(triggered()), this, SLOT(slotCreatePenTool()));
actionCreateLineTool = new QAction(tr("&Line"), this);
actionCreateLineTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT + Qt::Key_L));
connect(actionCreateLineTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
connect(actionCreateLineTool, SIGNAL(triggered()), this, SLOT(slotResetToolButtons()));
connect(actionCreateLineTool, SIGNAL(triggered()), this, SLOT(slotCreateLineTool()));
actionCreateCircleTool = new QAction(tr("&Circle"), this);
actionCreateCircleTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT + Qt::Key_C));
connect(actionCreateCircleTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
connect(actionCreateCircleTool, SIGNAL(triggered()), this, SLOT(slotResetToolButtons()));
connect(actionCreateCircleTool, SIGNAL(triggered()), this, SLOT(slotCreateCircleTool()));
actionCreateRectangleTool = new QAction(tr("&Rectangle"), this);
actionCreateRectangleTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT + Qt::Key_R));
connect(actionCreateRectangleTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
connect(actionCreateRectangleTool, SIGNAL(triggered()), this, SLOT(slotResetToolButtons()));
connect(actionCreateRectangleTool, SIGNAL(triggered()), this, SLOT(slotCreateRectangleTool()));
actionCreatePolygonTool = new QAction(tr("&Polygon"), this);
actionCreatePolygonTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT + Qt::Key_V));
connect(actionCreatePolygonTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
connect(actionCreatePolygonTool, SIGNAL(triggered()), this, SLOT(slotResetToolButtons()));
connect(actionCreatePolygonTool, SIGNAL(triggered()), this, SLOT(slotCreatePolygonTool()));
actionCreateFloodFillTool = new QAction(tr("&FloodFill"), this);
actionCreateFloodFillTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT + Qt::Key_F));
connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotResetToolButtons()));
connect(actionCreateFloodFillTool, SIGNAL(triggered()), this, SLOT(slotCreateFloodFillTool()));
actionCreateGradientTool = new QAction(tr("&Gradient"),this);
connect(actionCreateGradientTool, SIGNAL(triggered()), this, SLOT(slotResetTools()));
connect(actionCreateGradientTool, SIGNAL(triggered()), this, SLOT(slotCreateGradientTool()));
actionCreateGradientTool = new QAction(tr("&Gradient"),this);
actionCreateGradientTool->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::SHIFT + Qt::Key_G));
connect(actionCreateGradientTool, SIGNAL(triggered()), this, SLOT(slotResetToolButtons()));
connect(actionCreateGradientTool, SIGNAL(triggered()), this, SLOT(slotCreateGradientTool()));
// Create about action and tie to IntelliPhotoGui::about()
actionAboutDialog = new QAction(tr("&About"), this);
actionAboutDialog->setShortcut(Qt::Key_F2);
actionAboutDialog = new QAction(tr("&About"), this);
connect(actionAboutDialog, SIGNAL(triggered()), this, SLOT(slotAboutDialog()));
// Create about Qt action and tie to IntelliPhotoGui::aboutQt()
actionAboutQtDialog = new QAction(tr("About &Qt"), this);
actionAboutQtDialog->setShortcut(Qt::Key_F3);
actionAboutQtDialog = new QAction(tr("About &Qt"), this);
connect(actionAboutQtDialog, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
connect(EditLineWidth, SIGNAL(returnPressed()), this, SLOT(slotEnterPressed()));
connect(EditLineInnerAlpha, SIGNAL(returnPressed()), this, SLOT(slotEnterPressed()));
connect(CircleButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
connect(CircleButton,SIGNAL(pressed()), this, SLOT(slotResetToolButtons()));
connect(CircleButton, SIGNAL(clicked()), this, SLOT(slotCreateCircleTool()));
connect(FloodFillButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
connect(FloodFillButton,SIGNAL(pressed()), this, SLOT(slotResetToolButtons()));
connect(FloodFillButton, SIGNAL(clicked()), this, SLOT(slotCreateFloodFillTool()));
connect(GradientButton, SIGNAL(pressed()), this, SLOT(slotResetTools()));
connect(GradientButton, SIGNAL(clicked()), this, SLOT(slotCreateGradientTool()));
connect(GradientButton, SIGNAL(pressed()), this, SLOT(slotResetToolButtons()));
connect(GradientButton, SIGNAL(clicked()), this, SLOT(slotCreateGradientTool()));
connect(LineButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
connect(LineButton,SIGNAL(pressed()), this, SLOT(slotResetToolButtons()));
connect(LineButton, SIGNAL(clicked()), this, SLOT(slotCreateLineTool()));
connect(PenButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
connect(PenButton,SIGNAL(pressed()), this, SLOT(slotResetToolButtons()));
connect(PenButton, SIGNAL(clicked()), this, SLOT(slotCreatePenTool()));
connect(PlainButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
connect(PlainButton,SIGNAL(pressed()), this, SLOT(slotResetToolButtons()));
connect(PlainButton, SIGNAL(clicked()), this, SLOT(slotCreatePlainTool()));
connect(PolygonButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
connect(PolygonButton,SIGNAL(pressed()), this, SLOT(slotResetToolButtons()));
connect(PolygonButton, SIGNAL(clicked()), this, SLOT(slotCreatePolygonTool()));
connect(RectangleButton,SIGNAL(pressed()), this, SLOT(slotResetTools()));
connect(RectangleButton,SIGNAL(pressed()), this, SLOT(slotResetToolButtons()));
connect(RectangleButton, SIGNAL(clicked()), this, SLOT(slotCreateRectangleTool()));
actionSetWidth = new QAction(tr("&Set Width"),this);
@@ -580,11 +582,11 @@ void IntelliPhotoGui::createActions(){
actionSetInnerAlpha->setShortcut(QKeySequence(Qt::ALT + Qt::Key_A));
connect(actionSetInnerAlpha, SIGNAL(triggered()), this, SLOT(slotSetInnerAlpha()));
actionGoBack = new QAction(tr("&Go back"),this);
actionGoBack = new QAction(tr("&Undo"),this);
actionGoBack->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Z));
connect(actionGoBack, SIGNAL(triggered()), this, SLOT(slotGoBack()));
actionGoForward = new QAction(tr("&Go forward"),this);
actionGoForward = new QAction(tr("&Redo"),this);
actionGoForward->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Y));
connect(actionGoForward, SIGNAL(triggered()), this, SLOT(slotGoForward()));
}
@@ -603,13 +605,13 @@ void IntelliPhotoGui::createMenus(){
fileMenu->addSeparator();
fileMenu->addAction(actionExit);
//Attach all actions to Render Settings
// Attach all actions to Render Settings
renderMenu = new QMenu(tr("&Fast Renderer"), this);
renderMenu->addAction(actionUpdateRenderSettingsOn);
renderMenu->addAction(actionUpdateRenderSettingsOff);
renderMenu->addAction(actionUpdateFastRenderSettingsOn);
renderMenu->addAction(actionUpdateFastRenderSettingsOff);
//Attach all Layer Creations to Menu
layerCreationMenu = new QMenu(tr("&Create new Layer"), this);
// Attach all Layer Creations to Menu
layerCreationMenu = new QMenu(tr("&Create Layer"), this);
layerCreationMenu->addAction(actionCreateNewRasterLayer);
layerCreationMenu->addAction(actionCreateNewShapedLayer);
@@ -630,41 +632,37 @@ void IntelliPhotoGui::createMenus(){
layerMenu->addSeparator();
layerMenu->addAction(actionDeleteLayer);
//Attach all Color Options
// Attach all Color Options
colorMenu = new QMenu(tr("&Color"), this);
colorMenu->addAction(actionColorPickerFirstColor);
colorMenu->addAction(actionColorPickerSecondColor);
colorMenu->addAction(actionColorSwap);
//Attach all Tool Creation Actions
toolCreationMenu = new QMenu(tr("&Drawingtools"), this);
// Attach all Tool Creation Actions
toolCreationMenu = new QMenu(tr("&Tool Selection"), this);
toolCreationMenu->addAction(actionCreateCircleTool);
toolCreationMenu->addAction(actionCreateFloodFillTool);
toolCreationMenu->addAction(actionCreateGradientTool);
toolCreationMenu->addAction(actionCreateFloodFillTool);
toolCreationMenu->addAction(actionCreateGradientTool);
toolCreationMenu->addAction(actionCreateLineTool);
toolCreationMenu->addAction(actionCreatePenTool);
toolCreationMenu->addAction(actionCreatePlainTool);
toolCreationMenu->addAction(actionCreatePolygonTool);
toolCreationMenu->addAction(actionCreateRectangleTool);
//Attach all Tool Setting Actions
toolSettingsMenu = new QMenu(tr("&Toolsettings"), this);
// Attach all Tool Setting Actions
toolSettingsMenu = new QMenu(tr("&Tool Settings"), this);
toolSettingsMenu->addAction(actionSetWidth);
toolSettingsMenu->addAction(actionSetInnerAlpha);
//Attach all Tool Options
// Attach all Tool Options
toolMenu = new QMenu(tr("&Tools"), this);
toolMenu->addMenu(toolCreationMenu);
toolMenu->addMenu(toolSettingsMenu);
toolMenu->addSeparator();
toolMenu->addMenu(colorMenu);
toolMenu->addMenu(toolSettingsMenu);
// Attach all actions to Options
optionMenu = new QMenu(tr("&Options"), this);
optionMenu->addAction(actionGoBack);
optionMenu->addAction(actionGoForward);
optionMenu->addMenu(layerMenu);
optionMenu->addMenu(toolMenu);
optionMenu->addAction(actionGoForward);
optionMenu->addSeparator();
optionMenu->addMenu(renderMenu);
optionMenu->addAction(actionChangeDim);
@@ -677,6 +675,9 @@ void IntelliPhotoGui::createMenus(){
// Add menu items to the menubar
menuBar()->addMenu(fileMenu);
menuBar()->addMenu(optionMenu);
menuBar()->addMenu(layerMenu);
menuBar()->addMenu(toolMenu);
menuBar()->addMenu(colorMenu);
menuBar()->addMenu(helpMenu);
}
@@ -694,6 +695,11 @@ void IntelliPhotoGui::createGui(){
paintingArea = new PaintingArea(1280, 720);
paintingArea->guiReference = this;
QScreen *screen = QGuiApplication::primaryScreen();
QRect screenGeometry = screen->geometry();
Buttonsize.setWidth(screenGeometry.width()/20);
Buttonsize.setHeight(screenGeometry.height()/20);
preview = QPixmap(":/Icons/Buttons/icons/circle-tool.svg");
CircleButton = new QPushButton();
CircleButton->setFixedSize(Buttonsize);
@@ -708,7 +714,7 @@ void IntelliPhotoGui::createGui(){
FloodFillButton->setIconSize(Buttonsize);
FloodFillButton->setCheckable(true);
preview = QPixmap(":/Icons/Buttons/icons/icon.png");
preview = QPixmap(":/Icons/Buttons/icons/gradient-tool.svg");
GradientButton = new QPushButton();
GradientButton->setFixedSize(Buttonsize);
GradientButton->setIcon(preview);
@@ -786,10 +792,10 @@ void IntelliPhotoGui::createGui(){
SwitchColorButton->setIcon(preview);
SwitchColorButton->setIconSize(QSize(Buttonsize.width() * 2,Buttonsize.height()));
ActiveLayerLine = new QLabel();
QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer() + 1);
ActiveLayerLine->setText(string);
ActiveLayerLine->setFixedSize(Buttonsize.width() * 2 + 10,(Buttonsize.height() * 2) / 3);
ActiveLayerLabel = new QLabel();
QString string = QString("Active Layer: %1").arg(paintingArea->getIndexOfActiveLayer() + 1);
ActiveLayerLabel->setText(string);
ActiveLayerLabel->setFixedSize(Buttonsize.width() * 2 + 10,(Buttonsize.height() * 2) / 3);
IntelliImage* activePicture = paintingArea->getImageOfActiveLayer();
if(activePicture) {
@@ -813,9 +819,9 @@ void IntelliPhotoGui::createGui(){
QString String = QString("%1x%2").arg(paintingArea->Canvas->width()).arg(paintingArea->Canvas->height());
dimCanvas->setText(String);
FastRendererLabel = new QLabel();
FastRendererLabel->setFixedSize(Buttonsize.width() * 2 + 15,(Buttonsize.height() * 2) / 3);
FastRendererLabel->setText("Fast Render: On");
FastRendererLabel = new QLabel();
FastRendererLabel->setFixedSize(Buttonsize.width() * 2 + 15,(Buttonsize.height() * 2) / 3);
FastRendererLabel->setText("Fast Render: On");
ScrollArea = new QScrollArea(this);
ScrollArea->setBackgroundRole(QPalette::Dark);
@@ -832,7 +838,7 @@ void IntelliPhotoGui::createGui(){
mainLayout->addWidget(PlainButton,3,2,1,1);
mainLayout->addWidget(PolygonButton,3,3,1,1);
mainLayout->addWidget(RectangleButton,4,2,1,1);
mainLayout->addWidget(GradientButton,4,3,1,1);
mainLayout->addWidget(GradientButton,4,3,1,1);
mainLayout->addWidget(WidthLine,5,2,1,2);
mainLayout->addWidget(EditLineWidth,6,2,1,2);
mainLayout->addWidget(innerAlphaLine,7,2,1,2);
@@ -840,11 +846,11 @@ void IntelliPhotoGui::createGui(){
mainLayout->addWidget(FirstColorButton,9,2,1,1);
mainLayout->addWidget(SecondColorButton,9,3,1,1);
mainLayout->addWidget(SwitchColorButton,10,2,1,2);
mainLayout->addWidget(ActiveLayerLine,11,2,1,2);
mainLayout->addWidget(ActiveLayerLabel,11,2,1,2);
mainLayout->addWidget(ActiveLayerImageLabel,12,2,1,2);
mainLayout->addWidget(dimActive,13,2,1,2);
mainLayout->addWidget(dimCanvas,14,2,1,2);
mainLayout->addWidget(FastRendererLabel,15,2,1,2);
mainLayout->addWidget(FastRendererLabel,15,2,1,2);
mainLayout->setHorizontalSpacing(0);
}
@@ -925,8 +931,8 @@ void IntelliPhotoGui::setToolWidth(int value){
}
void IntelliPhotoGui::UpdateGui(){
QString string = QString("Active Layer: %1").arg(paintingArea->getNumberOfActiveLayer() + 1);
ActiveLayerLine->setText(string);
QString string = QString("Active Layer: %1").arg(paintingArea->getIndexOfActiveLayer() + 1);
ActiveLayerLabel->setText(string);
IntelliImage* activePicture = paintingArea->getImageOfActiveLayer();
if(activePicture) {
@@ -950,8 +956,8 @@ void IntelliPhotoGui::UpdateGui(){
if(paintingArea->layerBundle.size() != 0) {
string = QString("%1x%2").arg(paintingArea->layerBundle[static_cast<size_t>
(paintingArea->getNumberOfActiveLayer())].width).arg(paintingArea->layerBundle[static_cast<size_t>
(paintingArea->getNumberOfActiveLayer())].height);
(paintingArea->getIndexOfActiveLayer())].width).arg(paintingArea->layerBundle[static_cast<size_t>
(paintingArea->getIndexOfActiveLayer())].height);
dimActive->setText(string);
}
else{

View File

@@ -43,8 +43,15 @@ public:
*/
IntelliPhotoGui();
/*!
* \brief UpdateGui a function to update all gui elements.
*/
void UpdateGui();
/*!
* \brief setToolWidth stes a width to the tool
* \param value - the width of the tool
*/
void setToolWidth(int value);
protected:
@@ -54,182 +61,591 @@ protected:
void closeEvent(QCloseEvent*event) override;
private slots:
/*!
* \brief slotOpen opens a new image
*/
void slotOpen();
/*!
* \brief slotSave saves the current canvas
*/
void slotSave();
// layer slots here
/*!
* \brief slotCreateNewRasterLayer creates a new rasterImage
*/
void slotCreateNewRasterLayer();
/*!
* \brief slotCreateNewShapedLayer creates a new shapedImage
*/
void slotCreateNewShapedLayer();
/*!
* \brief slotDeleteLayer deletes a layer
*/
void slotDeleteLayer();
/*!
* \brief slotSetActiveLayer sets a layer to be active
*/
void slotSetActiveLayer();
/*!
* \brief slotSetActiveAlpha stes the alpha value of the active layer
*/
void slotSetActiveAlpha();
/*!
* \brief slotSetPolygon sets a polygon to the active layer
*/
void slotSetPolygon();
/*!
* \brief slotPositionMoveUp moves the current layer to the front
*/
void slotPositionMoveUp();
/*!
* \brief slotPositionMoveDown moves the crrent layer to the back
*/
void slotPositionMoveDown();
/*!
* \brief slotPositionMoveLeft moves the current layer left
*/
void slotPositionMoveLeft();
/*!
* \brief slotPositionMoveRight moves the current layer right
*/
void slotPositionMoveRight();
/*!
* \brief slotMoveLayerUp moves the current layer up
*/
void slotMoveLayerUp();
/*!
* \brief slotMoveLayerDown moves the current layer down
*/
void slotMoveLayerDown();
void slotUpdateRenderSettingsOn();
void slotUpdateRenderSettingsOff();
/*!
* \brief slotUpdateFastRenderSettingsOn activates the fast renderer
*/
void slotUpdateFastRenderSettingsOn();
/*!
* \brief slotUpdateFastRenderSettingsOff deactivates the fast render
*/
void slotUpdateFastRenderSettingsOff();
/*!
* \brief slotSetFirstColor sets the first color
*/
void slotSetFirstColor();
/*!
* \brief slotSetSecondColor sets the second color
*/
void slotSetSecondColor();
/*!
* \brief slotSwapColor swaps first and second color
*/
void slotSwapColor();
/*!
* \brief slotCreatePenTool creates the pen tool
*/
void slotCreatePenTool();
/*!
* \brief slotCreatePlainTool creates the plain tool
*/
void slotCreatePlainTool();
/*!
* \brief slotCreateLineTool creates the line tool
*/
void slotCreateLineTool();
/*!
* \brief slotCreateRectangleTool creates the rectangle tool
*/
void slotCreateRectangleTool();
/*!
* \brief slotCreateCircleTool creates the cricle tool
*/
void slotCreateCircleTool();
/*!
* \brief slotCreatePolygonTool creates the polygon tool
*/
void slotCreatePolygonTool();
/*!
* \brief slotCreateFloodFillTool creates the floodfill tool
*/
void slotCreateFloodFillTool();
/*!
* \brief slotCreateGradientTool creates the gradient tool
*/
void slotCreateGradientTool();
/*!
* \brief slotAboutDialog displays the about dialog
*/
void slotAboutDialog();
/*!
* \brief slotChangeDim changes the dimension of the canvas
*/
void slotChangeDim();
/*!
* \brief slotEnterPressed read current input of input boxes, and adjusts settings
*/
void slotEnterPressed();
/*!
* \brief slotSetWidth sets the width of the tool
*/
void slotSetWidth();
/*!
* \brief slotSetInnerAlpha sets the inner alpha of the tool
*/
void slotSetInnerAlpha();
void slotResetTools();
/*!
* \brief slotResetTools resets all tool Buttons to unclikced
*/
void slotResetToolButtons();
/*!
* \brief slotGoBack undoes the last action
*/
void slotGoBack();
/*!
* \brief slotGoForward redoes the last action
*/
void slotGoForward();
private:
//setup functions for gui
/*!
* \brief createActions creates all actions
*/
void createActions();
/*!
* \brief createMenus creates all menus
*/
void createMenus();
/*!
* \brief createGui sets up the gui
*/
void createGui();
/*!
* \brief setIntelliStyle sets the stylesheet of the gui
*/
void setIntelliStyle();
// Will check if changes have occurred since last save
/*!
* \brief maybeSave chekcs if the canvas has unsaved work
* \return return true if there is unsaved work, false otherwise
*/
bool maybeSave();
// Opens the Save dialog and saves
/*!
* \brief saveFile saves the canvas
* \param fileFormat the ileformat to save into
* \return true if saving worked, false otherwise
*/
bool saveFile(const QByteArray &fileFormat);
//basic to set tool values to begin
/*!
* \brief setDefaultValues sets basic tool values
*/
void setDefaultValues();
// What we'll draw on
/*!
* \brief paintingArea the logic manager of the backbone
*/
PaintingArea* paintingArea;
//used to display a preview of the active layer
/*!
* \brief preview a small pixmap to show the active layer
*/
QPixmap preview;
//size of all buttons
const QSize Buttonsize = QSize(35,35);
/*!
* \brief Buttonsize the size of all standard buttons
*/
QSize Buttonsize;
//buttons used for gui
/*!
* \brief CircleButton for creating a circle Tool
*/
QPushButton* CircleButton;
/*!
* \brief FloodFillButton for creating a floodfill Tool
*/
QPushButton* FloodFillButton;
/*!
* \brief GradientButton for creating a gradient Tool
*/
QPushButton* GradientButton;
/*!
* \brief LineButton for creating a line Tool.
*/
QPushButton* LineButton;
/*!
* \brief PenButton for creating a pen tool.
*/
QPushButton* PenButton;
/*!
* \brief PlainButton for creating a plain Tool.
*/
QPushButton* PlainButton;
/*!
* \brief PolygonButton for creating a Polygon Tool.
*/
QPushButton* PolygonButton;
/*!
* \brief RectangleButton for creating a Rectangle Tool.
*/
QPushButton* RectangleButton;
/*!
* \brief FirstColorButton for setting the First color.
*/
QPushButton* FirstColorButton;
/*!
* \brief SecondColorButton for setting the Second color.
*/
QPushButton* SecondColorButton;
/*!
* \brief SwitchColorButton for switching second and first color
*/
QPushButton* SwitchColorButton;
/*!
* \brief dimActive for displaying the dimesnion of the active layer
*/
QPushButton* dimActive;
/*!
* \brief dimCanvas for displaying the dimension of the canvas
*/
QPushButton* dimCanvas;
//labels used for gui
/*!
* \brief WidthLine to indicate the line width
*/
QLabel* WidthLine;
/*!
* \brief innerAlphaLine to indicate the inner alpha
*/
QLabel* innerAlphaLine;
QLabel* ActiveLayerLine;
/*!
* \brief ActiveLayerLine to indicate the active Layer
*/
QLabel* ActiveLayerLabel;
/*!
* \brief ActiveLayerImageLabel to indicate the active Image
*/
QLabel* ActiveLayerImageLabel;
/*!
* \brief FastRendererLabel to indicate render settings
*/
QLabel* FastRendererLabel;
//scroll area to display canvas
/*!
* \brief ScrollArea to scroll the painting area on
*/
QScrollArea* ScrollArea;
//line edits used for gui
/*!
* \brief EditLineWidth to get the input of the line width
*/
QLineEdit* EditLineWidth;
/*!
* \brief EditLineInnerAlpha to get the input of the inner alpha
*/
QLineEdit* EditLineInnerAlpha;
//int validator used for gui
/*!
* \brief ValidatorLineWidth to limit input
*/
QIntValidator* ValidatorLineWidth;
/*!
* \brief ValidatorInnerAlpha to limit input
*/
QIntValidator* ValidatorInnerAlpha;
// The menu widgets
/*!
* \brief saveAsMenu to display save options
*/
QMenu* saveAsMenu;
/*!
* \brief fileMenu to display file options
*/
QMenu* fileMenu;
/*!
* \brief renderMenu to display render options
*/
QMenu* renderMenu;
/*!
* \brief optionMenu to display general options
*/
QMenu* optionMenu;
/*!
* \brief layerCreationMenu to display layer creation options
*/
QMenu* layerCreationMenu;
/*!
* \brief layerMenu to display layer options
*/
QMenu* layerMenu;
/*!
* \brief colorMenu to display color options
*/
QMenu* colorMenu;
/*!
* \brief toolCreationMenu to display tool creation options
*/
QMenu* toolCreationMenu;
/*!
* \brief toolSettingsMenu to display settings options
*/
QMenu* toolSettingsMenu;
/*!
* \brief toolMenu to display tool options
*/
QMenu* toolMenu;
/*!
* \brief helpMenu to display the help options
*/
QMenu* helpMenu;
// All the actions that can occur
// meta image actions (need further modularisation)
/*!
* \brief actionOpen to open a project
*/
QAction* actionOpen;
/*!
* \brief actionExit to exit the project
*/
QAction* actionExit;
//Rendersetting actions
QAction*actionUpdateRenderSettingsOn;
QAction*actionUpdateRenderSettingsOff;
/*!
* \brief actionUpdateFastRenderSettingsOn to set fast render settings to on
*/
QAction* actionUpdateFastRenderSettingsOn;
// color Picker actions
/*!
* \brief actionUpdateFastRenderSettingsOff to set fast render settings to false;
*/
QAction* actionUpdateFastRenderSettingsOff;
/*!
* \brief actionColorPickerFirstColor to set the first color
*/
QAction* actionColorPickerFirstColor;
/*!
* \brief actionColorPickerSecondColor to set the second color
*/
QAction* actionColorPickerSecondColor;
/*!
* \brief actionColorSwap to swap first and second color
*/
QAction* actionColorSwap;
// tool actions
/*!
* \brief actionCreatePenTool to create a pen tool
*/
QAction* actionCreatePenTool;
/*!
* \brief actionCreatePlainTool to create a plain tool
*/
QAction* actionCreatePlainTool;
/*!
* \brief actionCreateLineTool to create a line tool
*/
QAction* actionCreateLineTool;
/*!
* \brief actionCreateRectangleTool to create a rectangle tool
*/
QAction* actionCreateRectangleTool;
/*!
* \brief actionCreateCircleTool to create a circle tool
*/
QAction* actionCreateCircleTool;
/*!
* \brief actionCreatePolygonTool to create a polygon tool
*/
QAction* actionCreatePolygonTool;
/*!
* \brief actionCreateFloodFillTool to create a floodfill tool
*/
QAction* actionCreateFloodFillTool;
/*!
* \brief actionCreateGradientTool to create a gradient tool
*/
QAction* actionCreateGradientTool;
// dimension actions
/*!
* \brief actionChangeDim
*/
QAction* actionChangeDim;
/*!
* \brief actionSetWidth to set the width
*/
QAction* actionSetWidth;
/*!
* \brief actionSetInnerAlpha to set the inner alha
*/
QAction* actionSetInnerAlpha;
// dialog actions
/*!
* \brief actionAboutDialog to show the
*/
QAction* actionAboutDialog;
/*!
* \brief actionAboutQtDialog to show the qt input dialog
*/
QAction* actionAboutQtDialog;
// layer change actions
/*!
* \brief actionCreateNewRasterLayer creates a raster image
*/
QAction* actionCreateNewRasterLayer;
/*!
* \brief actionCreateNewShapedLayer creates a shaped image
*/
QAction* actionCreateNewShapedLayer;
/*!
* \brief actionDeleteLayer deletes a layer
*/
QAction* actionDeleteLayer;
/*!
* \brief actionSetActiveLayer sets a layer to active
*/
QAction* actionSetActiveLayer;
/*!
* \brief actionSetActiveAlpha sets the alpha of the active layer
*/
QAction* actionSetActiveAlpha;
/*!
* \brief actionSetPolygon sets the polygon data to the image
*/
QAction* actionSetPolygon;
/*!
* \brief actionMovePositionUp moves the image up
*/
QAction* actionMovePositionUp;
/*!
* \brief actionMovePositionDown moves the image down
*/
QAction* actionMovePositionDown;
/*!
* \brief actionMovePositionLeft moves the image left
*/
QAction* actionMovePositionLeft;
/*!
* \brief actionMovePositionRight moves the image right
*/
QAction* actionMovePositionRight;
/*!
* \brief actionMoveLayerUp moves the layer to the front
*/
QAction* actionMoveLayerUp;
/*!
* \brief actionMoveLayerDown moves the layer to the back
*/
QAction* actionMoveLayerDown;
// actions tied to specific file formats
/*!
* \brief actionSaveAs saves the project as
*/
QList<QAction*> actionSaveAs;
// history actions
/*!
* \brief actionGoBack does a undo action
*/
QAction* actionGoBack;
/*!
* \brief actionGoForward does a redo action
*/
QAction* actionGoForward;
// main GUI elements
/*!
* \brief centralGuiWidget the main gui widget to place all others on
*/
QWidget* centralGuiWidget;
/*!
* \brief mainLayout the layout to order all gui elements
*/
QGridLayout* mainLayout;
};

View File

@@ -115,13 +115,13 @@ void IntelliImage::drawLine(const QPoint &p1, const QPoint& p2, const QColor& co
}
void IntelliImage::drawPlain(const QColor& color){
if(fastRenderering) {
this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32);
}
if(fastRenderering) {
this->imageData = this->imageData.convertToFormat(QImage::Format_ARGB32);
}
imageData.fill(color);
if(fastRenderering) {
this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8);
}
if(fastRenderering) {
this->imageData = this->imageData.convertToFormat(QImage::Format_Indexed8);
}
}
QColor IntelliImage::getPixelColor(QPoint& point){

View File

@@ -171,10 +171,22 @@ virtual QImage getImageData();
*/
virtual void setImageData(const QImage& newData);
/*!
* \brief getWidth returns the width of the Image.
* \return The width of the Image in pixel.
*/
virtual int getWidth() const;
/*!
* \brief getHeight returns the height of the Image.
* \return The height of the Image in pixel.
*/
virtual int getHeight() const;
/*!
* \brief isFastRendering returns if the Image is in fast rendering mode.
* \return True if the Image is fast rendered, flase otherwiese.
*/
virtual bool isFastRendering() const;
};

View File

@@ -23,7 +23,7 @@ IntelliRasterImage::~IntelliRasterImage(){
}
IntelliImage* IntelliRasterImage::getDeepCopy(){
IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height(), this->fastRenderering);
IntelliRasterImage* raster = new IntelliRasterImage(imageData.width(), imageData.height(), false);
raster->imageData.fill(Qt::transparent);
raster->TypeOfImage = ImageType::RASTERIMAGE;
return raster;

View File

@@ -12,7 +12,7 @@ IntelliShapedImage::IntelliShapedImage(int width, int height, bool fastRendererO
IntelliShapedImage* IntelliShapedImage::copy(const IntelliShapedImage& image){
this->TypeOfImage = ImageType::SHAPEDIMAGE;
IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height(), this->fastRenderering);
IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height(), this->fastRenderering);
shaped->imageData.copy(0,0,image.getWidth(),image.getWidth());
return shaped;
}
@@ -26,7 +26,7 @@ QImage IntelliShapedImage::getDisplayable(int alpha){
}
IntelliImage* IntelliShapedImage::getDeepCopy(){
IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height(), this->fastRenderering);
IntelliShapedImage* shaped = new IntelliShapedImage(imageData.width(), imageData.height(), false);
shaped->setPolygon(this->polygonData);
shaped->imageData.fill(Qt::transparent);
shaped->TypeOfImage = ImageType::SHAPEDIMAGE;

View File

@@ -61,7 +61,7 @@ bool IntelliDatamanager::loadProject(PaintingArea* Canvas, QString filePath){
in >> widthCanvas >> heightCanvas;
in >> numberOffLayers;
Canvas->setLayerDimensions(widthCanvas, heightCanvas);
Canvas->setCanvasDimensions(widthCanvas, heightCanvas);
for(int i = 0; i<numberOffLayers; i++) {
int width, height, widthOffset, heightOffset, alpha;
in >> width >> height >> widthOffset >> heightOffset >> alpha;
@@ -88,7 +88,7 @@ bool IntelliDatamanager::loadProject(PaintingArea* Canvas, QString filePath){
for(int k = 0; k<width; k++) {
int red, green, blue, alpha;
in >> red >> green >> blue >> alpha;
Canvas->setPixelToActive(QColor(red, green, blue, alpha), QPoint(j, k));
Canvas->drawPixelOntoActive(QColor(red, green, blue, alpha), QPoint(j, k));
}
}
}

View File

@@ -8,7 +8,20 @@ class PaintingArea;
namespace IntelliDatamanager {
/*!
* \brief loadProject loads a project from a file, closes current project.
* \param Canvas - Reference to the used Canvas.
* \param filePath - Filepath to the project which should be opened.
* \return True if everything worked, false otherwise.
*/
bool loadProject(PaintingArea* Canvas, QString filePath = "unnamed.idf");
/*!
* \brief saveProject saves the current project to a file.
* \param Canvas - Reference to the used Canvas.
* \param filePath - Filepath to the project which should be saved.
* \return True if everything worked, false otherwise.
*/
bool saveProject(PaintingArea* Canvas, QString filePath = "unnamed.idf");
}

View File

@@ -4,7 +4,9 @@
//for unit testing
class UnitTest;
/*!
* \brief The IntelliRenderSettings class which manages the render Settings.
*/
class IntelliRenderSettings
{
friend UnitTest;
@@ -23,6 +25,9 @@ void setFastRendering(bool Updatedsetting);
bool isFastRenderering() const;
private:
/*!
* \brief fastRenderering the state of the project, in relation the the render setting.
*/
bool fastRenderering = true;
};

View File

@@ -3,21 +3,56 @@
//for unit testing
class UnitTest;
/*!
* \brief The IntelliToolsettings class managing the settings of the tools, independent of an existing tool.
*/
class IntelliToolsettings {
friend UnitTest;
public:
/*!
* \brief IntelliToolsettings - basic constructor of the IntelliToolsettings, initializing the basics.
*/
IntelliToolsettings();
/*!
* \brief ~IntelliToolsettings - basic destructor.
*/
virtual ~IntelliToolsettings();
/*!
* \brief getLineWidth returns the width attribute of the line.
* \return returns the width attribute as integer.
*/
int getLineWidth() const;
/*!
* \brief setLineWidth sets the width attribute of the line.
* \param LineWidth - the future width of the line
*/
void setLineWidth(int LineWidth);
/*!
* \brief getInnerAlpha returns the inner alpha value.
* \return returns the inner alpha attribute as integer.
*/
int getInnerAlpha() const;
/*!
* \brief setInnerAlpha sets the inner alpha attribute of the Tool.
* \param innerAlpha - the future inner alpha of the Tool.
*/
void setInnerAlpha(int innerAlpha);
private:
/*!
* \brief lineWidth attribute of a Tool.
*/
int lineWidth;
/*!
* \brief innerAlpha aattribute of a Tool.
*/
int innerAlpha;
};

View File

@@ -24,6 +24,7 @@ SOURCES += tst_unittest.cpp \
Tool/IntelliTool.cpp \
Tool/IntelliToolCircle.cpp \
Tool/IntelliToolFloodFill.cpp \
Tool/IntelliToolGradient.cpp \
Tool/IntelliToolLine.cpp \
Tool/IntelliToolPen.cpp \
Tool/IntelliToolPlain.cpp \
@@ -35,6 +36,7 @@ DISTFILES += \
icons/circle-tool.svg \
icons/eraser-tool.svg \
icons/flood-fill-tool.svg \
icons/gradient-tool.svg \
icons/icon.png \
icons/line-tool.svg \
icons/pen-tool.svg \
@@ -57,6 +59,7 @@ HEADERS += \
Tool/IntelliTool.h \
Tool/IntelliToolCircle.h \
Tool/IntelliToolFloodFill.h \
Tool/IntelliToolGradient.h \
Tool/IntelliToolLine.h \
Tool/IntelliToolPen.h \
Tool/IntelliToolPlain.h \

View File

@@ -40,7 +40,7 @@ LayerObject::LayerObject(const LayerObject& layer){
PaintingArea::PaintingArea(int maxWidth, int maxHeight, QWidget*parent)
: QLabel(parent){
this->Tool = nullptr;
this->setLayerDimensions(maxWidth, maxHeight);
this->setCanvasDimensions(maxWidth, maxHeight);
activeLayer = -1;
}
@@ -69,7 +69,7 @@ bool PaintingArea::getRenderSettings(){
return this->renderSettings.isFastRenderering();
}
void PaintingArea::setLayerDimensions(int maxWidth, int maxHeight){
void PaintingArea::setCanvasDimensions(int maxWidth, int maxHeight){
//set standart parameter
this->maxWidth = maxWidth;
this->maxHeight = maxHeight;
@@ -83,7 +83,7 @@ void PaintingArea::setLayerDimensions(int maxWidth, int maxHeight){
}
void PaintingArea::setPixelToActive(QColor color, QPoint point){
void PaintingArea::drawPixelOntoActive(QColor color, QPoint point){
layerBundle[static_cast<size_t>(activeLayer)].image->drawPixel(point, color);
}
@@ -295,11 +295,11 @@ int PaintingArea::getMaxHeight(){
return this->maxHeight;
}
ImageType PaintingArea::getTypeOfImageRealLayer(){
ImageType PaintingArea::getTypeOfImageActiveLayer(){
return this->layerBundle[static_cast<size_t>(activeLayer)].image->getTypeOfImage();
}
std::vector<QPoint> PaintingArea::getPolygonDataOfRealLayer(){
std::vector<QPoint> PaintingArea::getPolygonDataOfActiveLayer(){
return this->layerBundle[static_cast<size_t>(activeLayer)].image->getPolygonData();
}
@@ -462,7 +462,7 @@ IntelliTool* PaintingArea::copyActiveTool(){
}
}
int PaintingArea::getNumberOfActiveLayer(){
int PaintingArea::getIndexOfActiveLayer(){
return activeLayer;
}
@@ -509,14 +509,18 @@ void PaintingArea::updateTools(){
void PaintingArea::historyadd(){
if (++historyPresent == 100) {
historyPresent++;
if (historyPresent == 100) {
historyPresent = 0;
}
historyMaxFuture = historyPresent;
if (historyPresent == historyMaxPast)
if (++historyMaxPast == 100)
if (historyPresent == historyMaxPast){
historyMaxPast++;
if (historyMaxPast == 100){
historyMaxPast = 0;
history[static_cast<size_t>(historyPresent)] = layerBundle;
}
}
history[static_cast<size_t>(historyPresent)] = layerBundle;
}
void PaintingArea::historyGoBack(){

View File

@@ -176,36 +176,91 @@ void colorPickerSetSecondColor();
*/
void colorPickerSwapColors();
/*!
* \brief createPenTool creates a Pen Tool.
*/
void createPenTool();
/*!
* \brief createPlainTool creates a Plain Tool.
*/
void createPlainTool();
/*!
* \brief createLineTool creates a Line Tool.
*/
void createLineTool();
/*!
* \brief createRectangleTool creates a Rectangle Tool.
*/
void createRectangleTool();
/*!
* \brief createCircleTool creates a Circle Tool.
*/
void createCircleTool();
/*!
* \brief createPolygonTool creates a Polygon Tool.
*/
void createPolygonTool();
/*!
* \brief createFloodFillTool creates a Floodfill Tool.
*/
void createFloodFillTool();
/*!
* \brief createGradientTool creates a Gradient Tool.
*/
void createGradientTool();
/*!
* \brief The getWidthOfActive gets the horizontal dimensions of the active layer
* \return Returns the horizontal pixle count of the active layer
* \brief The getWidthOfActive gets the horizontal dimensions of the active layer.
* \return Returns the horizontal pixle count of the active layer.
*/
int getWidthOfActive();
/*!
* \brief The getHeightOfActive gets the vertical dimensions of the active layer
* \return Returns the vertical pixle count of the active layer
* \brief The getHeightOfActive gets the vertical dimensions of the active layer.
* \return Returns the vertical pixle count of the active layer.
*/
int getHeightOfActive();
/*!
* \brief getMaxWidth gets the max width of the Canvas.
* \return return the width of the Canvas.
*/
int getMaxWidth();
/*!
* \brief getMaxHeight gets the max height of the Canvas.
* \return return the height of the Canvas.
*/
int getMaxHeight();
ImageType getTypeOfImageRealLayer();
/*!
* \brief getTypeOfImageActiveLayer get the type of the active Layer.
* \return returns the image type of the active layer.
*/
ImageType getTypeOfImageActiveLayer();
std::vector<QPoint> getPolygonDataOfRealLayer();
/*!
* \brief getPolygonDataOfActiveLayer get the polygon data of the active Layer.
* \return return the polygon data of the active Layer.
*/
std::vector<QPoint> getPolygonDataOfActiveLayer();
int getNumberOfActiveLayer();
/*!
* \brief getIndexOfActiveLayer returns the index of athe active Layer.
* \return return the index of the active Layer.
*/
int getIndexOfActiveLayer();
/*!
* \brief getImageOfActiveLayer returns the image of the active Layer.
* \return return the image of the active Layer.
*/
IntelliImage* getImageOfActiveLayer();
/*!
@@ -220,17 +275,42 @@ QImage getImageDataOfActiveLayer();
*/
std::vector<LayerObject>* getLayerBundle();
/*!
* \brief Toolsettings - a class to manage Tool settings.
*/
IntelliToolsettings Toolsettings;
/*!
* \brief colorPicker a class to manage Tool color.
*/
IntelliColorPicker colorPicker;
void historyadd();
void historyGoBack();
/*!
* \brief historyGoForward a function to undo the return of the previous state of the project.
*/
void historyGoForward();
void setLayerDimensions(int maxWidth, int maxHeight);
/*!
* \brief setCanvasDimensions sets the dimension of the Canvas
* \param maxWidth - the width of the Canvas.
* \param maxHeight - the height of the Canvas.
*/
void setCanvasDimensions(int maxWidth, int maxHeight);
void setPixelToActive(QColor color, QPoint point);
/*!
* \brief drawPixelOntoActive draws a pixel onto the image data of the active Layer.
* \param color - the color of the Pixel, which should be created.
* \param point - the Pixelposition.
*/
void drawPixelOntoActive(QColor color, QPoint point);
/*!
* \brief setPolygonDataToActive sets polygondata to the active Layer.
* \param points - the points of the polygon data.
*/
void setPolygonDataToActive(std::vector<QPoint> points);
public slots:
/*!
@@ -244,46 +324,149 @@ void slotActivateLayer(int a);
void slotDeleteActiveLayer();
protected:
/*!
* \brief mousePressEvent handles a mouse pressed event.
* \param event - the specific mouse event.
*/
void mousePressEvent(QMouseEvent*event) override;
/*!
* \brief mouseMoveEvent handles a mouse moved event
* \param event - the specific mouse event.
*/
void mouseMoveEvent(QMouseEvent*event) override;
/*!
* \brief mouseReleaseEvent handles a mouse released event
* \param event - the specific mouse event.
*/
void mouseReleaseEvent(QMouseEvent*event) override;
/*!
* \brief wheelEvent handles a mouse wheel event
* \param event - the specific mouse event.
*/
void wheelEvent(QWheelEvent*event) override;
/*!
* \brief paintEvent handles a painting event
* \param event - the specific paint event.
*/
void paintEvent(QPaintEvent*event) override;
private:
//offset for the displayable
/*!
* \brief offsetXDimension - Offset for drawing the image.
*/
int offsetXDimension;
/*!
* \brief offsetYDimension - Offset for drawing the image.
*/
int offsetYDimension;
/*!
* \brief selectLayerUp moves the active Layer one Up.
*/
void selectLayerUp();
/*!
* \brief selectLayerDown moves the active Layer one Down.
*/
void selectLayerDown();
/*!
* \brief copyActiveTool copys the activ tool [allocated].
* \return returns a allocates copy of the current tool.
*/
IntelliTool* copyActiveTool();
/*!
* \brief Canvas the underlying Image to display on.
*/
QImage* Canvas;
/*!
* \brief ScaledCanvas the Canvas saved for output
*/
QImage ScaledCanvas;
/*!
* \brief maxWidth is the width of the canvas
*/
int maxWidth;
/*!
* \brief maxHeight is the height of the canvas
*/
int maxHeight;
/*!
* \brief isSettingPolygon for checking the state of the drawing.
*/
bool isSettingPolygon = false;
/*!
* \brief renderSettings a class to manage the render settings.
*/
IntelliRenderSettings renderSettings;
/*!
* \brief Tool a class to manage the Tool.
*/
IntelliTool* Tool;
/*!
* \brief guiReference to manage communication with the gui.
*/
IntelliPhotoGui* guiReference;
/*!
* \brief layerBundle a container to save all layers.
*/
std::vector<LayerObject> layerBundle;
/*!
* \brief activeLayer the index of the active Layer.
*/
int activeLayer = -1;
/*!
* \brief drawLayers draws the Layers to the Canvas
* \param forSaving an indecate if drawing for saving.
*/
void drawLayers(bool forSaving = false);
/*!
* \brief createTempTopLayer creates a temporary Layer on top of the Layer.
* \param idx - the Layer which should get a temp Layer.
* \return True if it workes, false otherwise.
*/
bool createTempTopLayer(int idx);
/*!
* \brief updateTools resets the Tools.
*/
void updateTools();
/*!
* \brief history - an array out of containers to save history actions.
*/
std::vector<LayerObject> history[100] = {layerBundle};
/*!
* \brief historyMaxPast a indicator how many steps you can go into the past.
*/
int historyMaxPast = 0;
/*!
* \brief historyMaxPast a indicator how many steps you can go into the future.
*/
int historyMaxFuture = 0;
/*!
* \brief historyPresent a indicator where the present is.
*/
int historyPresent = 0;
};

View File

@@ -17,9 +17,13 @@ class PaintingArea;
class IntelliTool {
friend UnitTest;
public:
/*!
* \brief The Tooltype enum categorising the toosl.
*/
enum class Tooltype {
CIRCLE,
FLOODFILL,
GRADIENT,
LINE,
PEN,
PLAIN,
@@ -49,6 +53,9 @@ protected:
*/
PaintingArea* Area;
/*!
* \brief ActiveType the type of the active tool.
*/
Tooltype ActiveType;
/*!
@@ -56,6 +63,9 @@ Tooltype ActiveType;
*/
IntelliColorPicker* colorPicker;
/*!
* \brief Toolsettings a refrence to the tool settings
*/
IntelliToolsettings* Toolsettings;
/*!
@@ -127,8 +137,16 @@ virtual void onWheelScrolled(int value);
*/
virtual void onMouseMoved(int x, int y);
/*!
* \brief getTooltype returns the tools type
* \return returns the tool type of the current tool.
*/
Tooltype getTooltype() const;
/*!
* \brief getIsDrawing returns if the tool is currently drawing
* \return returns if the tool is currently drawing
*/
bool getIsDrawing() const;
};

View File

@@ -5,6 +5,7 @@
IntelliToolGradient::IntelliToolGradient(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings)
: IntelliTool(Area, colorPicker, Toolsettings){
this->ActiveType = Tooltype::GRADIENT;
this->LineColor = QColor(0,0,0,255);
this->hasMoved = false;
}
@@ -15,13 +16,13 @@ IntelliToolGradient::~IntelliToolGradient(){
void IntelliToolGradient::onMouseLeftPressed(int x, int y){
IntelliTool::onMouseLeftPressed(x,y);
doubleA[0] = static_cast<double>(x);
doubleA[1] = static_cast<double>(y);
A = QPoint(x,y);
B = QPoint(x,y);
VectorAB[0] = 0;
VectorAB[1] = 0;
Canvas->image->drawPixel(A,LineColor);
doubleStartPoint[0] = static_cast<double>(x);
doubleStartPoint[1] = static_cast<double>(y);
startPoint = QPoint(x,y);
endPoint = QPoint(x,y);
VectorStartEnd[0] = 0;
VectorStartEnd[1] = 0;
Canvas->image->drawPixel(startPoint,LineColor);
}
void IntelliToolGradient::onMouseRightPressed(int x, int y){
@@ -42,15 +43,15 @@ void IntelliToolGradient::onMouseRightReleased(int x, int y){
void IntelliToolGradient::onMouseMoved(int x, int y){
if(this->isDrawing){
hasMoved = true;
B = QPoint(x,y);
VectorAB[0] = static_cast<float>(B.x() - A.x());
VectorAB[1] = static_cast<float>(B.y() - A.y());
NormalVector[0] = VectorAB[1];
NormalVector[1] = (-1*VectorAB[0]);
endPoint = QPoint(x,y);
VectorStartEnd[0] = static_cast<float>(endPoint.x() - startPoint.x());
VectorStartEnd[1] = static_cast<float>(endPoint.y() - startPoint.y());
NormalVector[0] = VectorStartEnd[1];
NormalVector[1] = (-1*VectorStartEnd[0]);
NormalDotNormal = dotProduct(NormalVector,NormalVector);
this->Canvas->image->drawPlain(Qt::transparent);
computeGradientLayer();
Canvas->image->drawLine(A,B,LineColor,1);
Canvas->image->drawLine(startPoint,endPoint,LineColor,1);
}
IntelliTool::onMouseMoved(x,y);
}
@@ -59,23 +60,23 @@ void IntelliToolGradient::onWheelScrolled(int value){
IntelliTool::onWheelScrolled(value);
}
void IntelliToolGradient::computePixelColor(QPoint Point){
void IntelliToolGradient::computeAndDrawPixelColor(QPoint Point){
double doublePoint[2];
doublePoint[0] = static_cast<double>(Point.x());
doublePoint[1] = static_cast<double>(Point.y());
double doublePointSubA[2];
doublePointSubA[0] = doublePoint[0] - doubleA[0];
doublePointSubA[1] = doublePoint[1] - doubleA[1];
doublePointSubA[0] = doublePoint[0] - doubleStartPoint[0];
doublePointSubA[1] = doublePoint[1] - doubleStartPoint[1];
double Perpendicular[2];
double PointSubADotNormal = dotProduct(doublePointSubA,NormalVector);
Perpendicular[0] = doublePoint[0] - (PointSubADotNormal / NormalDotNormal) * NormalVector[0];
Perpendicular[1] = doublePoint[1] - (PointSubADotNormal / NormalDotNormal) * NormalVector[1];
double VectorAPoint[2];
VectorAPoint[0] = static_cast<double>(Perpendicular[0] - doubleA[0]);
VectorAPoint[1] = static_cast<double>(Perpendicular[1] - doubleA[1]);
VectorAPoint[0] = static_cast<double>(Perpendicular[0] - doubleStartPoint[0]);
VectorAPoint[1] = static_cast<double>(Perpendicular[1] - doubleStartPoint[1]);
double ratio;
if(((VectorAPoint[0] < 0 && VectorAB[0] < 0) || (VectorAPoint[0] > 0 && VectorAB[0] > 0)) && ((VectorAPoint[1] < 0 && VectorAB[1] < 0) || (VectorAPoint[1] > 0 && VectorAB[1] > 0)))
ratio = lenghtVector(VectorAPoint)/lenghtVector(VectorAB);
if(((VectorAPoint[0] < 0 && VectorStartEnd[0] < 0) || (VectorAPoint[0] > 0 && VectorStartEnd[0] > 0)) && ((VectorAPoint[1] < 0 && VectorStartEnd[1] < 0) || (VectorAPoint[1] > 0 && VectorStartEnd[1] > 0)))
ratio = lenghtVector(VectorAPoint)/lenghtVector(VectorStartEnd);
else{
ratio = -1;
}
@@ -110,7 +111,7 @@ double IntelliToolGradient::dotProduct(double Vector1[2], double Vector2[2]){
}
double IntelliToolGradient::lenghtVector(double Vector[2]){
return static_cast<double>((std::sqrt(Vector[0] * Vector[0] + Vector[1] * Vector[1])));
return static_cast<double>((sqrt(Vector[0] * Vector[0] + Vector[1] * Vector[1])));
}
void IntelliToolGradient::computeGradientLayer(){
@@ -121,7 +122,7 @@ void IntelliToolGradient::computeGradientLayer(){
}
for(int i = 0; i < activeLayer->height; i++){
for(int j = 0; j < activeLayer->width; j++){
computePixelColor(QPoint(j,i));
computeAndDrawPixelColor(QPoint(j,i));
}
}
if(switched){

View File

@@ -1,12 +1,23 @@
#ifndef INTELLITOOLGRADIENT_H
#define INTELLITOOLGRADIENT_H
#include "IntelliTool.h"
/*!
* \brief The IntelliToolGradient class that represents a gradient call
*/
class IntelliToolGradient : public IntelliTool{
public:
/*!
* \brief IntelliToolGradient basic constructor of the gradient tool.
* \param Area - a reference to the paintingArea
* \param colorPicker - a reference to the colorpicker
* \param Toolsettings - a regerence to the Toolsettings
*/
IntelliToolGradient(PaintingArea* Area, IntelliColorPicker* colorPicker, IntelliToolsettings* Toolsettings);
/*!
* \brief ~IntelliToolGradient basic destructor.
*/
virtual ~IntelliToolGradient() override;
/*!
@@ -51,21 +62,70 @@ public:
virtual void onMouseMoved(int x, int y) override;
private:
QPoint A;
QPoint B;
double doubleA[2];
double VectorAB[2];
/*!
* \brief startPoint of the line
*/
QPoint startPoint;
/*!
* \brief endPoint of the line
*/
QPoint endPoint;
/*!
* \brief doubleStartPoint startPoint as double Values
*/
double doubleStartPoint[2];
/*!
* \brief VectorStartEnd a vector between start and end point.
*/
double VectorStartEnd[2];
/*!
* \brief NormalVector of the VectorStartEnd
*/
double NormalVector[2];
/*!
* \brief NormalDotNormal dot product of Normal*Normal
*/
double NormalDotNormal;
/*!
* \brief LineColor color of th line.
*/
QColor LineColor;
/*!
* \brief hasMoved indicates a movement
*/
bool hasMoved;
void computePixelColor(QPoint Point);
/*!
* \brief computeAndDrawPixelColor computes the pixelcolor for a given point and sets it to the image.
* \param Point the point which shoud be computed
*/
void computeAndDrawPixelColor(QPoint Point);
/*!
* \brief dotProduct calculates the dot product of 2 vetors.
* \param Vector1 - first argument
* \param Vector2 - second argument
* \return returns the dot product.
*/
double dotProduct(double Vector1[2], double Vector2[2]);
/*!
* \brief lenghtVector returns the length of a vector
* \param Vector - Vector to calculate the length
* \return returns the length of the vector
*/
double lenghtVector(double Vector[2]);
/*!
* \brief computeGradientLayer computes the gradient over all pixels in the image.
*/
void computeGradientLayer();
};

View File

@@ -24,9 +24,9 @@ IntelliToolPolygon::~IntelliToolPolygon(){
}
void IntelliToolPolygon::onMouseLeftPressed(int x, int y){
if(!drawingOfPolygon && Area->getTypeOfImageRealLayer() == ImageType::SHAPEDIMAGE && x > 0 && y > 0 && x<Area->getWidthOfActive() && y<Area->getHeightOfActive()) {
if(Area->getPolygonDataOfRealLayer().size()>2) {
std::vector<Triangle> Triangles = IntelliTriangulation::calculateTriangles(Area->getPolygonDataOfRealLayer());
if(!drawingOfPolygon && Area->getTypeOfImageActiveLayer() == ImageType::SHAPEDIMAGE && x > 0 && y > 0 && x<Area->getWidthOfActive() && y<Area->getHeightOfActive()) {
if(Area->getPolygonDataOfActiveLayer().size()>2) {
std::vector<Triangle> Triangles = IntelliTriangulation::calculateTriangles(Area->getPolygonDataOfActiveLayer());
QPoint Point(x,y);
isInside = IntelliTriangulation::isInPolygon(Triangles,Point);
}
@@ -37,7 +37,7 @@ void IntelliToolPolygon::onMouseLeftPressed(int x, int y){
isInside = true;
}
}
else if(!drawingOfPolygon && Area->getTypeOfImageRealLayer() == ImageType::RASTERIMAGE && x >= 0 && y >= 0 && x<Area->getWidthOfActive() && y<Area->getHeightOfActive()) {
else if(!drawingOfPolygon && Area->getTypeOfImageActiveLayer() == ImageType::RASTERIMAGE && x >= 0 && y >= 0 && x<Area->getWidthOfActive() && y<Area->getHeightOfActive()) {
isInside = true;
}

View File

@@ -15,10 +15,34 @@
viewBox="0 0 67.733332 67.733335"
version="1.1"
id="svg8"
sodipodi:docname="line-tool.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
sodipodi:docname="gradient-tool.svg"
inkscape:version="0.92.4 (f8dce91, 2019-08-02)">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient108">
<stop
style="stop-color:#00ff00;stop-opacity:1"
offset="0"
id="stop104" />
<stop
id="stop114"
offset="0.26227671"
style="stop-color:#ffcc00;stop-opacity:1" />
<stop
id="stop112"
offset="0.49107137"
style="stop-color:#ff6600;stop-opacity:1" />
<stop
style="stop-color:#d40000;stop-opacity:1"
offset="0.66964281"
id="stop116" />
<stop
style="stop-color:#00ffff;stop-opacity:1"
offset="1"
id="stop106" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient36">
@@ -40,6 +64,15 @@
x2="-13.131983"
y2="106.49742"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient108"
id="linearGradient110"
x1="0"
y1="296.99997"
x2="67.73333"
y2="229.26665"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
@@ -49,18 +82,19 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="107.4786"
inkscape:cy="125.27289"
inkscape:cx="105.15717"
inkscape:cy="134.5586"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
inkscape:window-width="1853"
inkscape:window-height="1025"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:snap-page="true" />
<metadata
id="metadata5">
<rdf:RDF>
@@ -78,17 +112,19 @@
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-229.26665)">
<rect
style="fill:url(#linearGradient110);fill-opacity:1;stroke-width:0.26458332"
id="rect102"
width="67.73333"
height="67.73333"
x="0"
y="229.26665"
ry="3.6852665" />
<path
style="fill:none;stroke:#000000;stroke-width:2.117;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 7.8430058,289.81843 60.854166,236.80727"
id="path845"
inkscape:connector-curvature="0" />
<circle
r="2.5985863"
cy="236.66553"
cx="60.712429"
id="circle4574"
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.85208333;stroke-miterlimit:4;stroke-dasharray:none" />
<circle
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.85208333;stroke-miterlimit:4;stroke-dasharray:none"
id="path4572"

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB