merge current gui work

Merge branch 'master' into proc
This commit is contained in:
Fischlurch 2008-10-11 03:04:48 +02:00
commit 8834e4e306
20 changed files with 2112 additions and 279 deletions

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 68 KiB

View file

@ -510,6 +510,89 @@
y1="-129.52815"
x2="252.00447"
y2="-135.47408" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10554"
id="linearGradient7968"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3333333,0,0,1.3333333,-251.3124,-500.60971)"
x1="240.9062"
y1="425.18195"
x2="248.28683"
y2="437.96558" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient124"
id="radialGradient7971"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1113546,0,0,1.5996493,-273.02082,-503.24197)"
cx="307.7507"
cy="361.47824"
fx="307.7507"
fy="361.47824"
r="12.509617" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient124"
id="linearGradient7974"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0594534,2.447176,-0.611794,0.2648633,-273.02082,-503.24198)"
x1="253.75711"
y1="-129.52815"
x2="252.00447"
y2="-135.47408" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient124"
id="radialGradient7979"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.833516,0,0,1.199737,-153.62497,-354.54654)"
cx="307.7507"
cy="361.47824"
fx="307.7507"
fy="361.47824"
r="12.509617" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient124"
id="linearGradient7982"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79459,1.835382,-0.4588455,0.1986475,-153.62497,-354.54654)"
x1="253.75711"
y1="-129.52815"
x2="252.00447"
y2="-135.47408" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10554"
id="linearGradient7986"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7041896,0,0,0.7041896,-40.406443,-220.43015)"
x1="240.9062"
y1="425.18195"
x2="248.28683"
y2="437.96558" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient124"
id="radialGradient7989"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.5869533,0,0,0.8448423,-51.871574,-221.82034)"
cx="307.7507"
cy="361.47824"
fx="307.7507"
fy="361.47824"
r="12.509617" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient124"
id="linearGradient7992"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.559542,1.292457,-0.3231142,0.1398855,-51.871571,-221.82034)"
x1="253.75711"
y1="-129.52815"
x2="252.00447"
y2="-135.47408" />
</defs>
<sodipodi:namedview
id="base"
@ -521,9 +604,9 @@
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568543"
inkscape:cx="64.614973"
inkscape:cy="46.534319"
inkscape:zoom="11.313709"
inkscape:cx="72.392021"
inkscape:cy="21.252905"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="true"
@ -571,57 +654,46 @@
id="path8771"
style="opacity:0.7;fill:url(#radialGradient14479);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
sodipodi:type="arc" />
<g
style="display:inline"
id="g79"
transform="translate(-156.06247,-331.09622)">
<path
sodipodi:nodetypes="cccccccc"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 258.57812,401.60617 L 258.57812,417.04968 L 263.125,414.04968 L 265.90625,420.48718 L 268.1875,419.48718 L 265.46875,413.20593 L 269.56185,412.76843 L 258.57812,401.60617 z"
id="rect16" />
<path
sodipodi:nodetypes="ccccccccc"
id="rect91"
d="M 481.01295,-78.954349 L 484.11717,-79.645589 L 484.52504,-78.954349 L 491.01295,-78.954349 L 491.01998,-77.463121 L 484.28372,-77.462474 L 483.9729,-76.666406 L 481.00254,-77.462159 L 481.01295,-78.954349 z"
style="fill:url(#linearGradient14475);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.24999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
transform="matrix(0.397295,0.917691,-0.917691,0.397295,0,0)" />
<path
style="fill:url(#radialGradient14477);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
d="M 268.45834,412.37995 L 264.03447,412.8429 L 259.08804,416.09773 L 259.07888,402.85299 L 268.45834,412.37995 z"
id="path15"
sodipodi:nodetypes="ccccc" />
</g>
<path
id="rect16"
d="M 102.51565,70.50995 L 102.51565,85.95346 L 107.06253,82.95346 L 109.84378,89.39096 L 112.12503,88.39096 L 109.40628,82.10971 L 113.49938,81.67221 L 102.51565,70.50995 z"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:nodetypes="cccccccc" />
<path
style="fill:url(#linearGradient7982);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.24999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
d="M 107.49727,78.956867 L 109.3649,81.530956 L 108.8926,82.17988 L 111.47022,88.133777 L 110.10452,88.732686 L 107.42765,82.551138 L 106.57361,82.582175 L 106.12376,79.540153 L 107.49727,78.956867 z"
id="rect91"
sodipodi:nodetypes="ccccccccc" />
<path
sodipodi:nodetypes="ccccc"
id="path15"
d="M 112.39587,81.28373 L 107.972,81.74668 L 103.02557,85.00151 L 103.01641,71.75677 L 112.39587,81.28373 z"
style="fill:url(#radialGradient7979);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
<path
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient14473);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
d="M 111.38437,80.978458 L 107.31977,81.366268 L 103.50867,84.146458 L 103.49998,72.973838 L 111.38437,80.978458 z"
id="path7947"
sodipodi:nodetypes="ccccc" />
<g
style="display:inline"
id="g14435"
transform="translate(-22.000014,29.000022)">
<path
sodipodi:nodetypes="cccccccc"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 150.5,48.5 L 150.5,59.5 L 153.5,57.5 L 155.5,61.5 L 157.5,60.5 L 155.5,56.5 L 158.5,56.5 L 150.5,48.5 z"
id="path14451" />
<path
sodipodi:nodetypes="ccccccccc"
id="path14453"
d="M 154.008,54.448252 L 155.59103,55.96514 L 155.06871,56.768088 L 156.83361,60.279957 L 155.71008,60.83563 L 154.0092,57.369925 L 153.22923,57.090442 L 153.04079,54.858996 L 154.008,54.448252 z"
style="fill:url(#linearGradient14467);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.24999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
<path
style="fill:url(#radialGradient14469);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
d="M 157.29014,55.997498 L 154.8557,55.999843 L 151.00417,58.559717 L 151.0033,49.735141 L 157.29014,55.997498 z"
id="path14455"
sodipodi:nodetypes="ccccc" />
<path
sodipodi:nodetypes="ccccc"
id="path14457"
d="M 156.09792,55.503506 L 154.63636,55.542223 L 151.51178,57.639513 L 151.50565,50.893522 L 156.09792,55.503506 z"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient14471);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
</g>
<path
id="path14451"
d="M 128.49999,77.500022 L 128.49999,88.500022 L 131.49999,86.500022 L 133.49999,90.500022 L 135.49999,89.500022 L 133.49999,85.500022 L 136.49999,85.500022 L 128.49999,77.500022 z"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:nodetypes="cccccccc" />
<path
style="fill:url(#linearGradient7992);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.24999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
d="M 132.00799,83.448274 L 133.59102,84.965162 L 133.0687,85.76811 L 134.8336,89.279979 L 133.71007,89.835652 L 132.00919,86.369947 L 131.22922,86.090464 L 131.04078,83.859018 L 132.00799,83.448274 z"
id="path14453"
sodipodi:nodetypes="ccccccccc" />
<path
sodipodi:nodetypes="ccccc"
id="path14455"
d="M 135.29013,84.99752 L 132.85569,84.999865 L 129.00416,87.559739 L 129.00329,78.735163 L 135.29013,84.99752 z"
style="fill:url(#radialGradient7989);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
<path
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient7986);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
d="M 134.09791,84.503528 L 132.63635,84.542245 L 129.51177,86.639535 L 129.50564,79.893544 L 134.09791,84.503528 z"
id="path14457"
sodipodi:nodetypes="ccccc" />
<g
inkscape:groupmode="layer"
id="layer4"
@ -663,41 +735,36 @@
x="8"
y="44" />
</g>
<g
style="display:inline"
id="g8787"
transform="translate(-31,31)">
<path
transform="matrix(1.3189,0,0,1.7540667,185.96524,13.868621)"
d="M -49.76264,24.296782 A 8.087534,1.9003495 0 1 1 -65.937708,24.296782 A 8.087534,1.9003495 0 1 1 -49.76264,24.296782 z"
sodipodi:ry="1.9003495"
sodipodi:rx="8.087534"
sodipodi:cy="24.296782"
sodipodi:cx="-57.850174"
id="path7938"
style="opacity:0.7;fill:url(#radialGradient8838);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
sodipodi:type="arc" />
<path
id="path7942"
d="M 99.5,32.5 L 99.5,53.5 L 105.5,49.5 L 109.5,57.5 L 112.5,56 L 108.5,48.5 L 114.5,47.5 L 99.5,32.5 z"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:nodetypes="cccccccc" />
<path
style="fill:url(#linearGradient8840);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 106.14218,43.762567 L 108.68314,47.878279 L 108.0534,48.743512 L 111.81444,55.783603 L 109.72399,56.828242 L 105.89701,49.207272 L 104.7583,49.248655 L 104.31084,44.540282 L 106.14218,43.762567 z"
id="path7944"
sodipodi:nodetypes="ccccccccc" />
<path
sodipodi:nodetypes="ccccc"
id="path7946"
d="M 113.46659,47.173634 L 106.30247,48.357306 L 100.0002,52.575985 L 99.998595,33.713208 L 113.46659,47.173634 z"
style="fill:url(#radialGradient8842);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8844);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
d="M 112.42262,46.84474 L 106.10081,47.889164 L 100.50373,51.642958 L 100.52338,34.953163 L 112.42262,46.84474 z"
id="path7948"
sodipodi:nodetypes="ccccc" />
</g>
<path
sodipodi:type="arc"
style="opacity:0.7;fill:url(#radialGradient8838);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
id="path7938"
sodipodi:cx="-57.850174"
sodipodi:cy="24.296782"
sodipodi:rx="8.087534"
sodipodi:ry="1.9003495"
d="M -49.76264,24.296782 A 8.087534,1.9003495 0 1 1 -65.937708,24.296782 A 8.087534,1.9003495 0 1 1 -49.76264,24.296782 z"
transform="matrix(1.3189,0,0,1.7540667,154.96524,44.868621)" />
<path
sodipodi:nodetypes="cccccccc"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 68.5,63.5 L 68.5,84.5 L 74.5,80.5 L 78.5,88.5 L 81.5,87 L 77.5,79.5 L 83.5,78.5 L 68.5,63.5 z"
id="path7942" />
<path
sodipodi:nodetypes="ccccccccc"
id="path7944"
d="M 75.14218,74.762567 L 77.68314,78.878279 L 77.0534,79.743512 L 80.81444,86.783603 L 78.72399,87.828242 L 74.89701,80.207272 L 73.7583,80.248655 L 73.31084,75.540282 L 75.14218,74.762567 z"
style="fill:url(#linearGradient7974);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
style="fill:url(#radialGradient7971);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 82.46659,78.173634 L 75.30247,79.357306 L 69.0002,83.575985 L 68.998595,64.713208 L 82.46659,78.173634 z"
id="path7946"
sodipodi:nodetypes="ccccc" />
<path
sodipodi:nodetypes="ccccc"
id="path7948"
d="M 81.42262,77.84474 L 75.10081,78.889164 L 69.50373,82.642958 L 69.52338,65.953163 L 81.42262,77.84474 z"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient7968);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
<path
transform="matrix(1.9783517,0,0,2.6311023,150.44787,21.072802)"
d="M -49.76264,24.296782 A 8.087534,1.9003495 0 1 1 -65.937708,24.296782 A 8.087534,1.9003495 0 1 1 -49.76264,24.296782 z"
@ -711,7 +778,7 @@
<path
id="path14359"
d="M 21.0313,49.019882 L 21.0313,79.906929 L 30.125067,73.906919 L 35.687572,86.781929 L 40.250076,84.781929 L 34.812571,72.219419 L 42.998778,71.344419 L 21.0313,49.019882 z"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
sodipodi:nodetypes="cccccccc" />
<path
style="fill:url(#linearGradient8861);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.24999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;display:inline"

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View file

@ -554,20 +554,20 @@
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="135.70823"
inkscape:cy="18.300078"
inkscape:zoom="5.6568543"
inkscape:cx="72.876232"
inkscape:cy="57.176223"
inkscape:document-units="px"
inkscape:current-layer="layer4"
inkscape:current-layer="layer3"
showgrid="true"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
inkscape:snap-global="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1670"
inkscape:window-height="973"
inkscape:window-x="1285"
inkscape:window-width="1679"
inkscape:window-height="977"
inkscape:window-x="1281"
inkscape:window-y="48">
<inkscape:grid
type="xygrid"
@ -647,7 +647,7 @@
style="fill:#000000;fill-opacity:0.50196078;fill-rule:evenodd;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
</g>
<path
style="fill:#eeeeec;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
style="fill:#eeeeec;fill-rule:evenodd;stroke:#555753;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="M 104.5,71.505242 C 104,71.505242 103.5,72.005242 103.5,72.5 C 103.5,73.005242 104,73.505242 104.5,73.505242 L 105.5,73.505242 C 106,73.505242 106.5,74.005242 106.5,74.505242 L 106.5,85.5 C 106.5,86 106,86.5 105.5,86.5 L 104.5,86.5 C 104,86.5 103.5,87 103.5,87.5 C 103.5,88.008876 104,88.5 104.5,88.5 L 106.5,88.5 C 107.02152,88.521523 107.5,88 107.5,87.5 C 107.5,88 108,88.5 108.5,88.5 L 110.5,88.490485 C 110.99999,88.488106 111.5,87.990485 111.5,87.5 C 111.5,86.990485 110.99998,86.485728 110.5,86.490485 L 109.5,86.5 C 109,86.5 108.5,86 108.5,85.5 L 108.5,74.505242 C 108.5,74.005242 109,73.505242 109.5,73.505242 L 110.5,73.5 C 110.99999,73.497379 111.5,73 111.5,72.515625 C 111.5,72 111,71.49869 110.5,71.5 L 108.5,71.505242 C 108,71.505242 107.5,72.005242 107.5,72.505242 C 107.5,72.005242 107,71.505242 106.5,71.505242 L 104.5,71.505242 z"
id="path7969"
sodipodi:nodetypes="cssccccssscccsssccccssscccs" />
@ -655,7 +655,7 @@
sodipodi:nodetypes="cssccccssscccsssccccssscccs"
id="path7977"
d="M 130.5,77.5 C 129.99037,77.5 129.5,78 129.5,78.5 C 129.5,79 130,79.5 130.5,79.5 L 130.5,79.5 C 131,79.5 131.5,80 131.5,80.5 L 131.5,87.5 C 131.5,88 131,88.5 130.5,88.5 L 130.5,88.5 C 130,88.5 129.5,89 129.5,89.5 C 129.5,90 130,90.5 130.5,90.5 L 131.5,90.5 C 132,90.5 132.5,90 132.5,89.5 C 132.5,90 133,90.5 133.5,90.5 L 134.5,90.5 C 135,90.5 135.5,90 135.5,89.5 C 135.5,89 135,88.5 134.5,88.5 L 134.5,88.5 C 134,88.5 133.5,88 133.5,87.5 L 133.5,80.5 C 133.5,80 134,79.5 134.5,79.5 L 134.5,79.5 C 135,79.5 135.5,79 135.5,78.5 C 135.5,78 135,77.5 134.5,77.5 L 133.5,77.5 C 133,77.5 132.5,78 132.5,78.5 C 132.5,78 132,77.5 131.5,77.5 L 130.5,77.5 z"
style="fill:#eeeeec;fill-rule:evenodd;stroke:#888a85;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:#eeeeec;fill-rule:evenodd;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:type="arc"
style="opacity:0.7;fill:url(#radialGradient8778);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
@ -670,7 +670,7 @@
sodipodi:nodetypes="cssccccssscccsssccccssscccs"
id="path8765"
d="M 71.5,64.5 C 71,64.498835 70,65 70,66 C 70,67 71,67.5 71.5,67.5 L 73.5,67.5 C 74,67.5 74.5,68 74.5,68.506989 L 74.5,83.166666 C 74.5,83.833333 73.83333,84.5 73.16667,84.5 L 71.5,84.5 C 71,84.5 70,85 70,86 C 70,87 71,87.5 71.5,87.5 L 74.5,87.5 C 75.5,87.5 76,86.5 76,86 C 76,86.5 76.5,87.5 77.5,87.5 L 80.5,87.5 C 81,87.5 82,87 82,86 C 82,85 81,84.5 80.5,84.5 L 78.5,84.5 C 77.83333,84.5 77.5,83.826344 77.5,83.159677 L 77.5,68.5 C 77.5,68 78,67.5 78.5,67.5 L 80.5,67.5 C 81,67.5 82,67 82,66 C 82,65 81,64.5 80.5,64.5 L 77.5,64.5 C 76.5,64.5 76,65.5 76,66 C 76,65.5 75.5,64.5 74.5,64.506989 L 71.5,64.5 z"
style="fill:#eeeeec;fill-rule:evenodd;stroke:#888a85;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:#eeeeec;fill-rule:evenodd;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:type="arc"
style="opacity:0.7;fill:url(#radialGradient8788);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
@ -685,6 +685,6 @@
sodipodi:nodetypes="cssccccssscccsssccccssscccs"
id="path8786"
d="M 25.5,50.509196 C 24.5,50.509196 23.5,51.509196 23.5,52.498712 C 23.5,53.509196 24.5,54.509196 25.5,54.509196 L 27.5,54.509196 C 28.5,54.509196 29.5,55.509196 29.5,56.509196 L 29.5,78.498712 C 29.5,79.498712 28.5,80.498712 27.5,80.498712 L 25.5,80.498712 C 24.5,80.498712 23.5,81.498712 23.5,82.498712 C 23.5,83.516464 24.5,84.498712 25.5,84.498712 L 29.5,84.498712 C 30.54304,84.541758 31.5,83.498712 31.5,82.498712 C 31.5,83.498712 32.5,84.498712 33.5,84.498712 L 37.5,84.479682 C 38.49998,84.474924 39.5,83.479682 39.5,82.498712 C 39.5,81.479682 38.49996,80.470168 37.5,80.479682 L 35.5,80.498712 C 34.5,80.498712 33.5,79.498712 33.5,78.498712 L 33.5,56.509196 C 33.5,55.509196 34.5,54.509196 35.5,54.509196 L 37.5,54.498712 C 38.49998,54.49347 39.5,53.498712 39.5,52.529962 C 39.5,51.498712 38.5,50.496092 37.5,50.498712 L 33.5,50.509196 C 32.5,50.509196 31.5,51.509196 31.5,52.509196 C 31.5,51.509196 30.5,50.509196 29.5,50.509196 L 25.5,50.509196 z"
style="fill:#eeeeec;fill-rule:evenodd;stroke:#888a85;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:#eeeeec;fill-rule:evenodd;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View file

@ -126,6 +126,7 @@ style "timeline_body"
gtkmm__CustomObject_TimelineBody::background = "#7E838B"
gtkmm__CustomObject_TimelineBody::selection = "#2D2D90"
gtkmm__CustomObject_TimelineBody::selection_alpha = 0.5
gtkmm__CustomObject_TimelineBody::playback_point = "#006000"
}
style "timeline_ruler" = "default_base"
@ -140,10 +141,15 @@ style "timeline_ruler" = "default_base"
gtkmm__CustomObject_TimelineRuler::min_division_width = 100
gtkmm__CustomObject_TimelineRuler::mouse_chevron_size = 5
gtkmm__CustomObject_TimelineRuler::selection_chevron_size = 5
gtkmm__CustomObject_TimelineRuler::playback_arrow_colour = "#2D2D90"
gtkmm__CustomObject_TimelineRuler::playback_arrow_alpha = 0.5
gtkmm__CustomObject_TimelineRuler::playback_arrow_size = 10
gtkmm__CustomObject_TimelineRuler::playback_arrow_stem_size = 3
gtkmm__CustomObject_TimelineRuler::playback_point_colour = "#006000"
gtkmm__CustomObject_TimelineRuler::playback_point_alpha = 0.5
gtkmm__CustomObject_TimelineRuler::playback_point_size = 12
gtkmm__CustomObject_TimelineRuler::playback_period_arrow_colour = "#2D2D90"
gtkmm__CustomObject_TimelineRuler::playback_period_arrow_alpha = 0.5
gtkmm__CustomObject_TimelineRuler::playback_period_arrow_size = 10
gtkmm__CustomObject_TimelineRuler::playback_period_arrow_stem_size = 3
}
style "timeline_header_base" = "default_base"

View file

@ -39,6 +39,12 @@ const int TimelinePanel::ZoomToolSteps = 2; // 2 seems comfortable
TimelinePanel::TimelinePanel() :
Panel("timeline", _("Timeline"), "panel_timeline"),
previousButton(Stock::MEDIA_PREVIOUS),
rewindButton(Stock::MEDIA_REWIND),
playPauseButton(Stock::MEDIA_PLAY),
stopButton(Stock::MEDIA_STOP),
forwardButton(Stock::MEDIA_FORWARD),
nextButton(Stock::MEDIA_NEXT),
arrowTool(Gtk::StockID("tool_arrow")),
iBeamTool(Gtk::StockID("tool_i_beam")),
zoomIn(Stock::ZOOM_IN),
@ -49,18 +55,32 @@ TimelinePanel::TimelinePanel() :
// Setup the widget
timelineWidget.mouse_hover_signal().connect(
mem_fun(this, &TimelinePanel::on_mouse_hover));
timelineWidget.playback_period_drag_released_signal().connect(
mem_fun(this, &TimelinePanel::on_playback_period_drag_released));
// Setup the toolbar
timeIndicatorButton.set_label_widget(timeIndicator);
toolbar.append(timeIndicatorButton);
toolbar.append(previousButton);
toolbar.append(rewindButton);
toolbar.append(playPauseButton,
mem_fun(this, &TimelinePanel::on_play_pause));
toolbar.append(stopButton,
mem_fun(this, &TimelinePanel::on_stop));
toolbar.append(forwardButton);
toolbar.append(nextButton);
toolbar.append(seperator1);
toolbar.append(arrowTool, mem_fun(this,
&TimelinePanel::on_arrow_tool));
toolbar.append(iBeamTool, mem_fun(this,
&TimelinePanel::on_ibeam_tool));
toolbar.append(arrowTool,
mem_fun(this, &TimelinePanel::on_arrow_tool));
toolbar.append(iBeamTool,
mem_fun(this, &TimelinePanel::on_ibeam_tool));
toolbar.append(seperator2);
toolbar.append(zoomIn, mem_fun(this, &TimelinePanel::on_zoom_in));
toolbar.append(zoomOut, mem_fun(this, &TimelinePanel::on_zoom_out));
@ -78,6 +98,33 @@ TimelinePanel::TimelinePanel() :
show_time(0);
}
void
TimelinePanel::on_play_pause()
{
// TEST CODE!
if(!is_playing())
{
play();
}
else
{
frameEvent.disconnect();
}
update_playback_buttons();
}
void
TimelinePanel::on_stop()
{
// TEST CODE!
timelineWidget.set_playback_point(GAVL_TIME_UNDEFINED);
frameEvent.disconnect();
show_time(timelineWidget.get_playback_period_start());
update_playback_buttons();
}
void
TimelinePanel::on_arrow_tool()
{
@ -112,7 +159,26 @@ TimelinePanel::on_zoom_out()
void
TimelinePanel::on_mouse_hover(gavl_time_t time)
{
show_time(time);
}
void
TimelinePanel::on_playback_period_drag_released()
{
//----- TEST CODE - this needs to set the playback point via the
// real backend
timelineWidget.set_playback_point(
timelineWidget.get_playback_period_start());
//----- END TEST CODE
play();
}
void
TimelinePanel::update_playback_buttons()
{
playPauseButton.set_stock_id(is_playing() ?
Stock::MEDIA_PAUSE : Stock::MEDIA_PLAY);
}
void
@ -136,12 +202,49 @@ TimelinePanel::update_zoom_buttons()
TimelineWidget::MaxScale);
}
void
TimelinePanel::play()
{
if(timelineWidget.get_playback_point() == GAVL_TIME_UNDEFINED)
timelineWidget.set_playback_point(
timelineWidget.get_playback_period_start());
frameEvent = Glib::signal_timeout().connect(
sigc::mem_fun(this, &TimelinePanel::on_frame),
1000 / 25);
}
bool
TimelinePanel::is_playing() const
{
// TEST CODE! - this should be hooked up to the real playback control
return frameEvent.connected();
}
void
TimelinePanel::show_time(gavl_time_t time)
{
timeIndicator.set_text(lumiera_tmpbuf_print_time(time));
}
bool
TimelinePanel::on_frame()
{
// TEST CODE!
const gavl_time_t point = timelineWidget.get_playback_point()
+ GAVL_TIME_SCALE / 25;
if(point < timelineWidget.get_playback_period_end())
{
show_time(point);
timelineWidget.set_playback_point(point);
}
else
on_stop();
return true;
}
} // namespace panels
} // namespace gui
} // namespace lumiera

View file

@ -49,6 +49,10 @@ public:
private:
//----- Event Handlers -----//
void on_play_pause();
void on_stop();
void on_arrow_tool();
void on_ibeam_tool();
@ -58,11 +62,16 @@ private:
void on_time_pressed();
void on_mouse_hover(gavl_time_t time);
void on_playback_period_drag_released();
private:
void update_playback_buttons();
void update_tool_buttons();
void update_zoom_buttons();
void play();
bool is_playing() const;
void show_time(gavl_time_t time);
private:
@ -75,6 +84,17 @@ private:
TimelineWidget timelineWidget;
// Toolbar Widgets
Gtk::Label timeIndicator;
Gtk::ToolButton timeIndicatorButton;
Gtk::ToolButton previousButton;
Gtk::ToolButton rewindButton;
Gtk::ToolButton playPauseButton;
Gtk::ToolButton stopButton;
Gtk::ToolButton forwardButton;
Gtk::ToolButton nextButton;
Gtk::ToggleToolButton arrowTool;
Gtk::ToggleToolButton iBeamTool;
@ -84,14 +104,17 @@ private:
Gtk::ToolButton zoomOut;
Gtk::SeparatorToolItem seperator2;
Gtk::Label timeIndicator;
Gtk::ToolButton timeIndicatorButton;
// Internals
bool updatingToolbar;
private:
// TEST CODE
bool on_frame();
sigc::connection frameEvent;
//----- Constants -----//
private:
static const int ZoomToolSteps;
};

View file

@ -31,20 +31,11 @@ namespace gui {
namespace panels {
ViewerPanel::ViewerPanel() :
Panel("viewer", _("Viewer"), "panel_viewer"),
previousButton(Stock::MEDIA_PREVIOUS),
rewindButton(Stock::MEDIA_REWIND),
playPauseButton(Stock::MEDIA_PLAY),
forwardButton(Stock::MEDIA_FORWARD),
nextButton(Stock::MEDIA_NEXT)
Panel("viewer", _("Viewer"), "panel_viewer")
{
//----- Set up the Tool Bar -----//
// Add the commands
toolBar.append(previousButton);
toolBar.append(rewindButton);
toolBar.append(playPauseButton);
toolBar.append(forwardButton);
toolBar.append(nextButton);
// Configure the toolbar
toolBar.set_toolbar_style(TOOLBAR_ICONS);

View file

@ -31,9 +31,6 @@
#include "panel.hpp"
#include "../widgets/video-display-widget.hpp"
using namespace lumiera::gui::widgets;
using namespace Gtk;
namespace lumiera {
namespace gui {
namespace panels {
@ -45,14 +42,8 @@ namespace panels {
protected:
ToolButton previousButton;
ToolButton rewindButton;
ToolButton playPauseButton;
ToolButton forwardButton;
ToolButton nextButton;
VideoDisplayWidget display;
Toolbar toolBar;
lumiera::gui::widgets::VideoDisplayWidget display;
Gtk::Toolbar toolBar;
};
} // namespace panels

View file

@ -48,6 +48,7 @@ TimelineWidget::TimelineWidget() :
selectionEnd(0),
playbackPeriodStart(0),
playbackPeriodEnd(0),
playbackPoint(GAVL_TIME_UNDEFINED),
horizontalScroll(horizontalAdjustment),
verticalScroll(verticalAdjustment)
{
@ -248,6 +249,20 @@ TimelineWidget::set_playback_period(gavl_time_t start, gavl_time_t end)
body->queue_draw();
}
void
TimelineWidget::set_playback_point(gavl_time_t point)
{
playbackPoint = point;
ruler->queue_draw();
body->queue_draw();
}
gavl_time_t
TimelineWidget::get_playback_point() const
{
return playbackPoint;
}
ToolType
TimelineWidget::get_tool() const
{
@ -274,6 +289,12 @@ TimelineWidget::mouse_hover_signal() const
return mouseHoverSignal;
}
sigc::signal<void>
TimelineWidget::playback_period_drag_released_signal() const
{
return playbackPeriodDragReleasedSignal;
}
void
TimelineWidget::on_scroll()
{
@ -372,6 +393,12 @@ TimelineWidget::on_motion_in_body_notify_event(GdkEventMotion *event)
return true;
}
void
TimelineWidget::on_playback_period_drag_released()
{
playbackPeriodDragReleasedSignal.emit();
}
} // namespace widgets
} // namespace gui
} // namespace lumiera

View file

@ -52,8 +52,14 @@ namespace timeline {}
class TimelineWidget : public Gtk::Table
{
public:
/**
* Constructor
*/
TimelineWidget();
/**
* Destructor
*/
~TimelineWidget();
/* ===== Data Access ===== */
@ -145,6 +151,20 @@ public:
*/
void set_playback_period(gavl_time_t start, gavl_time_t end);
/**
* Sets the time which is currenty being played back.
* @param point The time index being played. This value may be
* GAVL_TIME_UNDEFINED, if there is no playback point.
*/
void set_playback_point(gavl_time_t point);
/**
* Gets the current playback point.
* @return The time index of the playback point. This value may be
* GAVL_TIME_UNDEFINED, if there is no playback point.
*/
gavl_time_t get_playback_point() const;
/**
* Gets the type of the tool currently active.
*/
@ -160,6 +180,8 @@ public:
sigc::signal<void> view_changed_signal() const;
sigc::signal<void, gavl_time_t> mouse_hover_signal() const;
sigc::signal<void> playback_period_drag_released_signal() const;
/* ===== Events ===== */
protected:
@ -183,6 +205,8 @@ private:
int get_y_scroll_offset() const;
bool on_motion_in_body_notify_event(GdkEventMotion *event);
void on_playback_period_drag_released();
protected:
@ -195,6 +219,7 @@ protected:
gavl_time_t selectionEnd;
gavl_time_t playbackPeriodStart;
gavl_time_t playbackPeriodEnd;
gavl_time_t playbackPoint;
int totalHeight;
@ -202,6 +227,7 @@ protected:
timeline::Track video2;
std::vector<timeline::Track*> tracks;
// Child Widgets
timeline::HeaderContainer *headerContainer;
timeline::TimelineBody *body;
timeline::TimelineRuler *ruler;
@ -213,6 +239,8 @@ protected:
// Signals
sigc::signal<void> viewChangedSignal;
sigc::signal<void, gavl_time_t> mouseHoverSignal;
sigc::signal<void>
playbackPeriodDragReleasedSignal;
/* ===== Constants ===== */
public:

View file

@ -132,8 +132,6 @@ TimelineBody::on_realize()
bool
TimelineBody::on_expose_event(GdkEventExpose* event)
{
Cairo::Matrix view_matrix;
REQUIRE(event != NULL);
REQUIRE(timelineWidget != NULL);
@ -146,78 +144,18 @@ TimelineBody::on_expose_event(GdkEventExpose* event)
read_styles();
// Prepare to render via cairo
Glib::RefPtr<Style> style = get_style();
const Allocation allocation = get_allocation();
Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context();
REQUIRE(style);
REQUIRE(cr);
// Translate the view by the scroll distance
cr->translate(0, -get_vertical_offset());
cr->get_matrix(view_matrix);
// Interate drawing each track
BOOST_FOREACH( Track* track, timelineWidget->tracks )
{
ASSERT(track != NULL);
const int height = track->get_height();
ASSERT(height >= 0);
// Draw the track background
cr->rectangle(0, 0, allocation.get_width(), height);
gdk_cairo_set_source_color(cr->cobj(), &backgroundColour);
cr->fill();
// Render the track
cr->save();
track->draw_track(cr);
cr->restore();
// Shift for the next track
cr->translate(0, height + TimelineWidget::TrackPadding);
}
//----- Draw the selection -----//
const int start_x = timelineWidget->time_to_x(
timelineWidget->get_selection_start());
const int end_x = timelineWidget->time_to_x(
timelineWidget->get_selection_end());
cr->set_matrix(view_matrix);
// Draw the cover
if(end_x > 0 && start_x < allocation.get_width())
{
cr->set_source_rgba(
(float)selectionColour.red / 0xFFFF,
(float)selectionColour.green / 0xFFFF,
(float)selectionColour.blue / 0xFFFF,
selectionAlpha);
cr->rectangle(start_x + 0.5, 0,
end_x - start_x, allocation.get_height());
cr->fill();
}
gdk_cairo_set_source_color(cr->cobj(), &selectionColour);
cr->set_line_width(1);
// Draw the start
if(start_x >= 0 && start_x < allocation.get_width())
{
cr->move_to(start_x + 0.5, 0);
cr->line_to(start_x + 0.5, allocation.get_height());
cr->stroke_preserve();
}
// Draw the end
if(end_x >= 0 && end_x < allocation.get_width())
{
cr->move_to(end_x + 0.5, 0);
cr->line_to(end_x + 0.5, allocation.get_height());
cr->stroke_preserve();
}
// Draw the view
draw_tracks(cr);
draw_selection(cr);
draw_playback_point(cr);
return true;
}
@ -322,6 +260,120 @@ TimelineBody::on_motion_notify_event(GdkEventMotion *event)
return false;
}
void
TimelineBody::draw_tracks(Cairo::RefPtr<Cairo::Context> cr)
{
REQUIRE(cr);
REQUIRE(timelineWidget != NULL);
// Prepare
const Allocation allocation = get_allocation();
// Save the view matrix
Cairo::Matrix view_matrix;
cr->get_matrix(view_matrix);
// Interate drawing each track
BOOST_FOREACH( Track* track, timelineWidget->tracks )
{
ASSERT(track != NULL);
const int height = track->get_height();
ASSERT(height >= 0);
// Draw the track background
cr->rectangle(0, 0, allocation.get_width(), height);
gdk_cairo_set_source_color(cr->cobj(), &backgroundColour);
cr->fill();
// Render the track
cr->save();
track->draw_track(cr);
cr->restore();
// Shift for the next track
cr->translate(0, height + TimelineWidget::TrackPadding);
}
// Restore the view matrix
cr->set_matrix(view_matrix);
}
void
TimelineBody::draw_selection(Cairo::RefPtr<Cairo::Context> cr)
{
REQUIRE(cr);
REQUIRE(timelineWidget != NULL);
// Prepare
const Allocation allocation = get_allocation();
const int start_x = timelineWidget->time_to_x(
timelineWidget->get_selection_start());
const int end_x = timelineWidget->time_to_x(
timelineWidget->get_selection_end());
// Draw the cover
if(end_x > 0 && start_x < allocation.get_width())
{
cr->set_source_rgba(
(float)selectionColour.red / 0xFFFF,
(float)selectionColour.green / 0xFFFF,
(float)selectionColour.blue / 0xFFFF,
selectionAlpha);
cr->rectangle(start_x + 0.5, 0,
end_x - start_x, allocation.get_height());
cr->fill();
}
gdk_cairo_set_source_color(cr->cobj(), &selectionColour);
cr->set_line_width(1);
// Draw the start
if(start_x >= 0 && start_x < allocation.get_width())
{
cr->move_to(start_x + 0.5, 0);
cr->line_to(start_x + 0.5, allocation.get_height());
cr->stroke();
}
// Draw the end
if(end_x >= 0 && end_x < allocation.get_width())
{
cr->move_to(end_x + 0.5, 0);
cr->line_to(end_x + 0.5, allocation.get_height());
cr->stroke();
}
}
void
TimelineBody::draw_playback_point(Cairo::RefPtr<Cairo::Context> cr)
{
REQUIRE(cr);
REQUIRE(timelineWidget != NULL);
// Prepare
const Allocation allocation = get_allocation();
const gavl_time_t point = timelineWidget->get_playback_point();
if(point == GAVL_TIME_UNDEFINED)
return;
const int x = timelineWidget->time_to_x(point);
// Set source
gdk_cairo_set_source_color(cr->cobj(), &playbackPointColour);
cr->set_line_width(1);
// Draw
if(x >= 0 && x < allocation.get_width())
{
cr->move_to(x + 0.5, 0);
cr->line_to(x + 0.5, allocation.get_height());
cr->stroke();
}
}
void
TimelineBody::begin_shift_drag()
{
@ -361,6 +413,11 @@ TimelineBody::register_styles() const
g_param_spec_float("selection_alpha", "Selection Alpha",
"The transparency of the selection marque.",
0, 1.0, 0.5, G_PARAM_READABLE));
gtk_widget_class_install_style_property(klass,
g_param_spec_boxed("playback_point", "Playback Point",
"The colour of the playback marker line",
GDK_TYPE_COLOR, G_PARAM_READABLE));
}
void
@ -368,10 +425,13 @@ TimelineBody::read_styles()
{
backgroundColour = WindowManager::read_style_colour_property(
*this, "background", 0, 0, 0);
selectionColour = WindowManager::read_style_colour_property(
*this, "selection", 0, 0, 0);
get_style_property("selection_alpha", selectionAlpha);
playbackPointColour = WindowManager::read_style_colour_property(
*this, "playback_point", 0, 0, 0);
}
} // namespace timeline

View file

@ -105,6 +105,25 @@ protected:
/* ===== Internals ===== */
private:
/**
* Draws the timeline tracks.
* @param cr The cairo context to draw into.
*/
void draw_tracks(Cairo::RefPtr<Cairo::Context> cr);
/**
* Draws the selected timeline period.
* @param cr The cairo context to draw into.
*/
void draw_selection(Cairo::RefPtr<Cairo::Context> cr);
/**
* Draws the current playback point, if any.
* @param cr The cairo context to draw into.
*/
void draw_playback_point(Cairo::RefPtr<Cairo::Context> cr);
void begin_shift_drag();
int get_vertical_offset() const;
@ -142,6 +161,7 @@ private:
GdkColor backgroundColour;
GdkColor selectionColour;
float selectionAlpha;
GdkColor playbackPointColour;
lumiera::gui::widgets::TimelineWidget *timelineWidget;

View file

@ -56,9 +56,11 @@ TimelineRuler::TimelineRuler(
minDivisionWidth(100),
mouseChevronSize(5),
selectionChevronSize(5),
playbackArrowAlpha(0.5f),
playbackArrowSize(10),
playbackArrowStemSize(3),
playbackPointAlpha(0.5f),
playbackPointSize(12),
playbackPeriodArrowAlpha(0.5f),
playbackPeriodArrowSize(10),
playbackPeriodArrowStemSize(3),
timelineWidget(timeline_widget)
{
REQUIRE(timelineWidget != NULL);
@ -143,11 +145,11 @@ TimelineRuler::on_expose_event(GdkEventExpose* event)
draw_mouse_chevron(cr, allocation);
draw_selection(cr, allocation);
draw_playback_period(cr, allocation);
draw_playback_point(cr, allocation);
return true;
}
bool
TimelineRuler::on_button_press_event(GdkEventButton* event)
{
@ -166,10 +168,14 @@ bool
TimelineRuler::on_button_release_event(GdkEventButton* event)
{
REQUIRE(event != NULL);
REQUIRE(timelineWidget != NULL);
if(event->button == 1)
{
isDragging = false;
timelineWidget->on_playback_period_drag_released();
}
return true;
}
@ -364,7 +370,7 @@ TimelineRuler::draw_playback_period(Cairo::RefPtr<Cairo::Context> cr,
REQUIRE(timelineWidget != NULL);
// Calculate coordinates
const float halfSize = playbackArrowSize / 2;
const float halfSize = playbackPeriodArrowSize / 2;
const float a = timelineWidget->time_to_x(
timelineWidget->playbackPeriodStart) + 1 + 0.5f;
@ -373,15 +379,18 @@ TimelineRuler::draw_playback_period(Cairo::RefPtr<Cairo::Context> cr,
timelineWidget->playbackPeriodEnd) + 0.5f;
const float c = d - halfSize;
const float e = ruler_rect.get_height() - playbackArrowSize - 0.5f;
const float f = e + (playbackArrowSize - playbackArrowStemSize) / 2;
const float g = ruler_rect.get_height() - playbackArrowSize / 2
const float e = ruler_rect.get_height() - playbackPeriodArrowSize
- 0.5f;
const float f = e + (playbackPeriodArrowSize -
playbackPeriodArrowStemSize) / 2;
const float g = ruler_rect.get_height() - playbackPeriodArrowSize / 2
- 0.5f;
const float i = ruler_rect.get_height() - 0.5f;
const float h = i - (playbackArrowSize - playbackArrowStemSize) / 2;
const float h = i - (playbackPeriodArrowSize -
playbackPeriodArrowStemSize) / 2;
// Contruct the path
if(d - a >= playbackArrowSize)
if(d - a >= playbackPeriodArrowSize)
{
// Draw an arrow: <===>
cr->move_to(a, g);
@ -394,30 +403,65 @@ TimelineRuler::draw_playback_period(Cairo::RefPtr<Cairo::Context> cr,
cr->line_to(c, h);
cr->line_to(b, h);
cr->line_to(b, i);
cr->line_to(a, g);
cr->close_path();
}
else
{
// The space is too narrow for an arrow, so draw calipers: > <
cr->move_to(a, g);
cr->rel_line_to(-halfSize, -halfSize);
cr->rel_line_to(0, playbackArrowSize);
cr->rel_line_to(0, playbackPeriodArrowSize);
cr->close_path();
cr->move_to(d, g);
cr->rel_line_to(halfSize, -halfSize);
cr->rel_line_to(0, playbackArrowSize);
cr->rel_line_to(0, playbackPeriodArrowSize);
cr->close_path();
}
// Fill
cr->set_source_rgba(
(float)playbackArrowColour.red / 0xFFFF,
(float)playbackArrowColour.green / 0xFFFF,
(float)playbackArrowColour.blue / 0xFFFF,
playbackArrowAlpha);
(float)playbackPeriodArrowColour.red / 0xFFFF,
(float)playbackPeriodArrowColour.green / 0xFFFF,
(float)playbackPeriodArrowColour.blue / 0xFFFF,
playbackPeriodArrowAlpha);
cr->fill_preserve();
// Stroke
gdk_cairo_set_source_color(cr->cobj(), &playbackArrowColour);
gdk_cairo_set_source_color(cr->cobj(), &playbackPeriodArrowColour);
cr->set_line_width(1);
cr->stroke();
}
void
TimelineRuler::draw_playback_point(Cairo::RefPtr<Cairo::Context> cr,
const Gdk::Rectangle ruler_rect)
{
REQUIRE(cr);
REQUIRE(ruler_rect.get_width() > 0);
REQUIRE(ruler_rect.get_height() > 0);
REQUIRE(timelineWidget != NULL);
const gavl_time_t point = timelineWidget->get_playback_point();
if(point == GAVL_TIME_UNDEFINED)
return;
const int x = timelineWidget->time_to_x(point);
cr->move_to(x + 0.5, ruler_rect.get_height());
cr->rel_line_to(0, -playbackPointSize);
cr->rel_line_to(playbackPointSize / 2.0, playbackPointSize / 2.0);
cr->close_path();
// Fill
cr->set_source_rgba(
(float)playbackPointColour.red / 0xFFFF,
(float)playbackPointColour.green / 0xFFFF,
(float)playbackPointColour.blue / 0xFFFF,
playbackPointAlpha);
cr->fill_preserve();
// Stroke
gdk_cairo_set_source_color(cr->cobj(), &playbackPointColour);
cr->set_line_width(1);
cr->stroke();
}
@ -526,25 +570,47 @@ TimelineRuler::register_styles() const
"The height of the selection chevrons in pixels.",
0, G_MAXINT, 5, G_PARAM_READABLE));
// ----- Playback Marker Styling ----- //
gtk_widget_class_install_style_property(klass,
g_param_spec_boxed("playback_arrow_colour",
"End lines of a selection",
"The colour of selection limit lines",
g_param_spec_boxed("playback_point_colour",
"Playback Marker Colour",
"The colour of playback marker",
GDK_TYPE_COLOR, G_PARAM_READABLE));
gtk_widget_class_install_style_property(klass,
g_param_spec_float("playback_arrow_alpha", "Playback Arrow Alpha",
g_param_spec_float("playback_point_alpha", "Playback Arrow Alpha",
"The transparency of the playback marker.",
0, 1.0, 0.5, G_PARAM_READABLE));
gtk_widget_class_install_style_property(klass,
g_param_spec_int("playback_point_size",
"Playback Marker Size",
"The height of the playback marker in pixels.",
0, G_MAXINT, 12, G_PARAM_READABLE));
// ----- Playback Period Arrow Styling ----- //
gtk_widget_class_install_style_property(klass,
g_param_spec_boxed("playback_period_arrow_colour",
"Playback Period Arrow Colour",
"The colour of the playback period arrow",
GDK_TYPE_COLOR, G_PARAM_READABLE));
gtk_widget_class_install_style_property(klass,
g_param_spec_float("playback_period_arrow_alpha",
"Playback Period Arrow Alpha",
"The transparency of the playback period arrow.",
0, 1.0, 0.5, G_PARAM_READABLE));
gtk_widget_class_install_style_property(klass,
g_param_spec_int("playback_arrow_size",
g_param_spec_int("playback_period_arrow_size",
"Playback Arrow Head Size",
"The height of the playback arrow head in pixels.",
0, G_MAXINT, 10, G_PARAM_READABLE));
gtk_widget_class_install_style_property(klass,
g_param_spec_int("playback_arrow_stem_size",
g_param_spec_int("playback_period_arrow_stem_size",
"Playback Arrow Stem Size",
"The height of the playback arrow head in pixels.",
0, G_MAXINT, 3, G_PARAM_READABLE));
@ -561,13 +627,21 @@ TimelineRuler::read_styles()
get_style_property("min_division_width", minDivisionWidth);
get_style_property("mouse_chevron_size", mouseChevronSize);
get_style_property("selection_chevron_size", selectionChevronSize);
playbackArrowColour = WindowManager::read_style_colour_property(
*this, "playback_arrow_colour", 0, 0, 0);
get_style_property("playback_arrow_alpha", playbackArrowAlpha);
get_style_property("playback_arrow_size", playbackArrowSize);
get_style_property("playback_arrow_stem_size",
playbackArrowStemSize);
playbackPointColour = WindowManager::read_style_colour_property(
*this, "playback_point_colour", 0, 0, 0);
get_style_property("playback_point_alpha", playbackPointAlpha);
get_style_property("playback_point_size", playbackPointSize);
playbackPeriodArrowColour =
WindowManager::read_style_colour_property(
*this, "playback_period_arrow_colour", 0, 0, 0);
get_style_property("playback_period_arrow_alpha",
playbackPeriodArrowAlpha);
get_style_property("playback_period_arrow_size",
playbackPeriodArrowSize);
get_style_property("playback_period_arrow_stem_size",
playbackPeriodArrowStemSize);
}
} // namespace timeline

View file

@ -144,6 +144,14 @@ private:
*/
void draw_playback_period(Cairo::RefPtr<Cairo::Context> cr,
const Gdk::Rectangle ruler_rect);
/**
* Overlays the current playback point.
* @param cr The cairo context to draw the period into.
* @param ruler_rect The area of the ruler widget.
*/
void draw_playback_point(Cairo::RefPtr<Cairo::Context> cr,
const Gdk::Rectangle ruler_rect);
/**
* Given the current zoom, this function calculates the preiod
@ -196,10 +204,15 @@ private:
int minDivisionWidth;
int mouseChevronSize;
int selectionChevronSize;
GdkColor playbackArrowColour;
float playbackArrowAlpha;
int playbackArrowSize;
int playbackArrowStemSize;
GdkColor playbackPointColour;
float playbackPointAlpha;
int playbackPointSize;
GdkColor playbackPeriodArrowColour;
float playbackPeriodArrowAlpha;
int playbackPeriodArrowSize;
int playbackPeriodArrowStemSize;
/**
* The owner widget
@ -210,7 +223,7 @@ private:
* The caches image of the ruler, over which the chevrons etc. will
* be drawn.
* @remarks This backdrop is cached because it changes relatively
* infrequently in comparison to the chevrons, thus improving
* infrequently in comparison to the overlays, thus improving
* performance somewhat.
*/
Cairo::RefPtr<Cairo::ImageSurface> rulerImage;

View file

@ -27,9 +27,12 @@ using namespace Glib;
namespace lumiera {
namespace gui {
IconSize WindowManager::giantIconSize = ICON_SIZE_INVALID;
WindowManager::WindowManager()
{
register_giant_icon_size();
register_stock_items();
}
@ -73,23 +76,30 @@ WindowManager::read_style_colour_property(
}
}
void
WindowManager::register_giant_icon_size()
{
if(giantIconSize == ICON_SIZE_INVALID)
giantIconSize = IconSize::register_new ("giant", 48, 48);
}
void
WindowManager::register_stock_items()
{
RefPtr<IconFactory> factory = IconFactory::create();
add_stock_item_set(factory, "panel-assets", "panel_assets", _("_Assets"));
add_stock_item_set(factory, "panel-timeline", "panel_timeline", _("_Timeline"));
add_stock_item_set(factory, "panel-viewer", "panel_viewer", _("_Viewer"));
add_stock_icon_set(factory, "panel-assets", "panel_assets", _("_Assets"));
add_stock_icon_set(factory, "panel-timeline", "panel_timeline", _("_Timeline"));
add_stock_icon_set(factory, "panel-viewer", "panel_viewer", _("_Viewer"));
add_stock_item_set(factory, "tool-arrow", "tool_arrow", _("_Arrow"));
add_stock_item_set(factory, "tool-i-beam", "tool_i_beam", _("_I-Beam"));
add_stock_icon_set(factory, "tool-arrow", "tool_arrow", _("_Arrow"));
add_stock_icon_set(factory, "tool-i-beam", "tool_i_beam", _("_I-Beam"));
factory->add_default(); //Add factory to list of factories.
}
bool
WindowManager::add_stock_item_set(
WindowManager::add_stock_icon_set(
const Glib::RefPtr<IconFactory>& factory,
const Glib::ustring& icon_name,
const Glib::ustring& id,
@ -97,37 +107,46 @@ WindowManager::add_stock_item_set(
{
Gtk::IconSet icon_set;
add_stock_icon(icon_set, icon_name, 16);
add_stock_icon(icon_set, icon_name, 22);
add_stock_icon(icon_set, icon_name, 24);
add_stock_icon(icon_set, icon_name, 32);
add_stock_icon(icon_set, icon_name, 48);
// Load all the sizes, wildcarding the first, largest icon to be
// loaded
bool no_icons = true;
no_icons &= !add_stock_icon(
icon_set, icon_name, giantIconSize, no_icons);
no_icons &= !add_stock_icon(
icon_set, icon_name, ICON_SIZE_BUTTON, no_icons);
no_icons &= !add_stock_icon(
icon_set, icon_name, ICON_SIZE_MENU, no_icons);
no_icons &= !add_stock_icon(
icon_set, icon_name, ICON_SIZE_LARGE_TOOLBAR, no_icons);
no_icons &= !add_stock_icon(
icon_set, icon_name, ICON_SIZE_SMALL_TOOLBAR, no_icons);
if(!icon_set.get_sizes().empty())
if(no_icons)
{
const Gtk::StockID stock_id(id);
factory->add(stock_id, icon_set);
Gtk::Stock::add(Gtk::StockItem(stock_id, label));
return true;
// No icons were loaded
ERROR(gui, "Unable to load icon \"%s\"", icon_name.c_str());
return false;
}
ERROR(gui, "Unable to load icon \"%s\"", icon_name.c_str());
return false;
// Add the icon set to the icon factory
const Gtk::StockID stock_id(id);
factory->add(stock_id, icon_set);
Gtk::Stock::add(Gtk::StockItem(stock_id, label));
return true;
}
bool
WindowManager::add_stock_icon(Gtk::IconSet &icon_set,
const Glib::ustring& icon_name, int size)
const Glib::ustring& icon_name, Gtk::IconSize size, bool wildcard)
{
// Try the ~/.lumiera/icons folder
if(add_stock_icon_source(icon_set, ustring::compose("%1/%2",
GtkLumiera::get_home_data_path(), ustring("icons")),
icon_name, size))
icon_name, size, wildcard))
return true;
if(add_stock_icon_source(
icon_set, get_current_dir(), icon_name, size))
icon_set, get_current_dir(), icon_name, size, wildcard))
return true;
return false;
@ -136,28 +155,33 @@ WindowManager::add_stock_icon(Gtk::IconSet &icon_set,
bool
WindowManager::add_stock_icon_source(Gtk::IconSet &icon_set,
const Glib::ustring& base_dir, const Glib::ustring& icon_name,
int size)
Gtk::IconSize size, bool wildcard)
{
ustring path;
Gtk::IconSource source;
int width = 0, height = 0;
if(!IconSize::lookup(size, width, height))
return false;
try
{
ustring path = ustring::compose("%1/%2x%2/%3.png",
base_dir, size, icon_name);
ustring path = ustring::compose("%1/%2x%3/%4.png",
base_dir, width, height, icon_name);
g_message("%s", path.c_str());
INFO(gui, "Attempting to load icon: %s", path.c_str());
// This throws an exception if the file is not found:
source.set_pixbuf(Gdk::Pixbuf::create_from_file(path));
}
catch(const Glib::Exception& ex)
{
g_message("Failed");
INFO(gui, "Failed to load icon: %s", path.c_str());
return false;
}
source.set_size(IconSize(size));
//source.set_size_wildcarded(); // Icon may be scaled.
source.set_size(size);
source.set_size_wildcarded(wildcard);
icon_set.add_source(source);

View file

@ -20,8 +20,7 @@
*/
/** @file window-manager.hpp
** This file contains the defintion of global UI Manager class
** user actions.
** This file contains the defintion of global UI Manager class.
** @see window-manager.cpp
** @see gtk-lumiera.hpp
*/
@ -34,35 +33,100 @@
namespace lumiera {
namespace gui {
/**
* The centralised manager of all lumiera-gui's windows.
**/
class WindowManager
{
public:
/**
* Default constructor
**/
WindowManager();
/**
* Sets the theme of the lumiera-gui's.
* @param path This string must specify a path where a GTK stylesheet
* will be found.
**/
bool set_theme(Glib::ustring path);
/**
* A utility function which reads a colour style from the GTK Style.
* @param widget The widget to load the style out of.
* @param property_name The name of the style property to load.
* @param red The fallback red intensity.
* @param green The fallback green intensity.
* @param blue The fallback blue intensity.
* @return The loaded colour.
**/
static GdkColor read_style_colour_property(
Gtk::Widget &widget, const gchar *property_name,
guint16 red, guint16 green, guint16 blue);
private:
/**
* Registers the extra large icon size.
**/
static void register_giant_icon_size();
/**
* Registers application stock items: icons and
* labels associated with IDs */
* labels associated with IDs
**/
static void register_stock_items();
static bool add_stock_item_set(
/**
* Adds an icon (in different sizes) to the icon factory.
* @param factory The factory to add the icon to.
* @param icon_name The file name of the icon to add.
* @param id The id name of the icon.
* @param label The user readable icon name for this icon.
* @return Returns true if the icon was successfully loaded, returns
* false otherwise.
**/
static bool add_stock_icon_set(
const Glib::RefPtr<Gtk::IconFactory>& factory,
const Glib::ustring& icon_name,
const Glib::ustring& id,
const Glib::ustring& label);
/**
* Loads an icon, searching standard icon locations,
* and adds it to an icon set.
* @param icon_set The icon set to add the icon to.
* @param icon_name The file name of the icon to load.
* @param size The size of the icon to load.
* @param wildcard This value is set to true if this icon is
* wildcarded.
* @return Returns true if the icon was loaded successfully.
**/
static bool add_stock_icon(Gtk::IconSet &icon_set,
const Glib::ustring& icon_name, int size);
const Glib::ustring& icon_name, Gtk::IconSize size, bool wildcard);
/**
* Loads an icon from a specific path and adds it to an icon set.
* @param icon_set The icon set to add the icon to.
* @param base_dir The root icons directory to load from.
* @param icon_name The file name of the icon to load.
* @param size The size of the icon to load.
* @param wildcard This value is set to true if this icon is
* wildcarded.
* @return Returns true if the icon was loaded successfully.
**/
static bool add_stock_icon_source(Gtk::IconSet &icon_set,
const Glib::ustring& base_dir,
const Glib::ustring& icon_name, int size);
const Glib::ustring& base_dir, const Glib::ustring& icon_name,
Gtk::IconSize size, bool wildcard);
private:
/**
* The registered icon size for giant 48x48 px icons.
* @remarks This value is set to BuiltinIconSize::ICON_SIZE_INVALID
* until register_giant_icon_size is called.
**/
static Gtk::IconSize giantIconSize;
};
} // namespace gui

View file

@ -30,7 +30,7 @@ export LC_ALL=C
arg0="$0"
srcdir="$(dirname "$arg0")"
ulimit -S -t 1 -v 524288
ulimit -S -t 2 -v 524288
valgrind=""
if [ "$VALGRINDFLAGS" = 'DISABLE' ]; then
echo "valgrind explicit disabled"

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -802,12 +802,14 @@ for __Running__</pre>
<pre>LumieraWiki
ShortCuts</pre>
</div>
<div title="DesignDocumentation" modifier="CehTeh" modified="200707030409" created="200706181207" tags="process policy" changecount="6">
<div title="DesignDocumentation" modifier="Ichthyostega" modified="200810050447" created="200706181207" tags="process policy" changecount="7">
<pre>* There is a [[Manifest]] explaining the vision of the Lumiera project
* The foundation how we work together is defined in LumieraDesignProcess
* There is a description how the git repository is set up in RepositorySetup
* we decided to write code in GNU style, with no tabs (use spaces)
</pre>
!basic decisions
* TimeHandling</pre>
</div>
<div title="FullScreenPlugin" modifier="CehTeh" modified="200706110313" created="200607241016" tags="systemConfig lewcidExtension" server.type="file" server.host="file:///home/ct/.homepage/home.html" server.page.revision="200706110313">
<pre>/***
@ -4602,6 +4604,77 @@ Thus no server and no network connection is needed. Simply open the file in your
* see [[Homepage|http://tiddlywiki.com]], [[Wiki-Markup|http://tiddlywiki.com/#MainFeatures]]
</pre>
</div>
<div title="TimeHandling" modifier="Ichthyostega" modified="200810050506" created="200810050456" changecount="8">
<pre>/%||'''State'''||''Final''||%/
||'''State'''||''Draft''||
||'''Date'''||[[Date(2007-06-21T05:12:03Z)]]||
||'''Proprosed by'''||[&quot;Ichthyostega&quot;]||
!time handling
how to handle time values in the code and which policy to aply to the &quot;current&quot; position
!!Description
# Representation of time values
#* we use an uniform time type. Time is time, not frames, samples etc.
#* all timings in Lumiera are based on integral datatypes
#* we use a fixed, very fine grid, something of the sort of microseconds
#* the internal representation is based on a {{{typedef int64_t gavl_time_t}}}
#* we use a set of library routines and convenience-methods to
#** get time in different formats (fractional seconds, frame counts)
#** calculate with time values (overloaded operators)
#* time measurement is zero based (of course :-P )
# Quantizing to a frame index or similar
#* quantizing/rounding shall happen only once at a defined point in the calculation chain and, if in doubt, be done always as late as possible.
#* values needing to be quantized to time (grid) positions are calculated by half-way rounding, but the result should not depend on the actual zero-point of the scale (i.e. {{{floor(0.5+val)}}}, thus quant(0.5) yields 1, quant(0.49) yields 0, quant(-0.5) yields 0 )
# Position of frames[&gt;img[draw/FramePositions1.png]]
#* frame numbers are zero based and Frame 0 starts at time=0 (or whatever the nominal start time is)
#* each frame starts when the locator hits its lower border (inclusively) and ends when the locator is on its upper border (exclusively)
#** when the locator snaps to frames this means it can be placed on the start positions of the frames solely
#** when the locator is placed on such a start position, this means //always// displaying the frame starting at this position, irrespective of playback direction.
# Current position for keyframe nodes and automation[&gt;img[draw/FramePositions2.png]]
#* when parameter values for plugins/automation need to be retrieved on a per frame base (which normally is the case), for each frame there is a well defined __//point of evalutation//__ time position, irrespective of the playback direction
#* there is no single best choice where to put this &quot;POE&quot;, thus we provide a switch
#** //point of evalutation// of the automation is in the middle of the timespan covered by a frame
#** //point of evalutation// is on the lower bound of each frame
#** maybe additional position or fraction (?)
#* moreover, we provide an option to snap the keyframe nodes to the //point of evalutation// within each frame or to be able to move them arbitrarily
#* when keyframes are set by tweaking of parameters, they are located at the //point of evalutation// position.
!!!!Tasks
* figure out what has to be done when switching the &quot;current position&quot; policy on a existing project
!!!Alternatives
Leave everything as in Cinelerra2, i.e. show frames after the locator has passed over them, behave differnt when playing backwards and set the keyframes on the position of the locator but use them on the frame actually to be shown (which differs according to the playback direction but is always &quot;one off&quot;).
Why not? because it makes frame-precise working with keyframes a real pain and even creates contradictory situations when you
switch back and forward while tweaking.
Similar for the issues with quantized values. At first sight, e.g. directly using the frame numbers as coordinates (as Cinelerra does) seems to be clever, but on the long run we get lots of case distinctions scattered all over the code. Thus better use one uniform scheme and work with precise time values as long as possible and only quantize for rendering a given frame.
!!Rationale
The intention is to make time handling and calculations as uniform and &quot;rational&quot; as possible. We try to stick to the precise mathematical values and let the calculations just yield an result in an uniform manner, instead of sticking to &quot;simple&quot; values like frame counts or even a session-wide frame rate
# time and interval calculations are tricky. Solve this question once and be done.
# rounding is always dangerous, rounded values are not the more &quot;clean&quot; values. The floor-rounding rule is chosen, because the length of an interval after quantizion should not depend on the position in relation to the zero point. The usual mathematical rounding behaves &quot;symmetrical&quot; to the zero point, which could yield a different length after quantizion if an interval contains the zero point
# this is based on the analoy with real film running through a film projector (or the usual fencepost problem)
# while using the actual position of the locator as the &quot;current&quot; position for keyframes seems more natural at first, it crates problems when mixing footage with different framerate or when using a low-framerate proxy footage
!Comments
This is the summary of a discussion cehteh, Plouj and ichthyo just had on irc.
-- [&quot;Ichthyostega&quot;] //2007-06-21T05:12:03Z//
We use Gavl now
-- [&quot;ct&quot;] //2008-03-05T16:19:22Z//
I've tidied up this old design proposal, we could make it final now. I've changed the rounding rule, please check if it's OK. In the original proposal, we wanted to use the common mathematical rounding rule, i.e. round(-x) = - round(x) . I changed this, because of the danger of interval lengts or alignment to &quot;jump&quot; dependant on the position in relation to the time zero point.
-- [&quot;Ichthyostega&quot;] //2008-10-04T22:47:54Z//
</pre>
</div>
<div title="whatInBOUML" modifier="Ichthyostega" modified="200708051535" created="200706260559" tags="discuss policy" changecount="3">
<pre>The question to find out about is: how much of the coding to do with the help of BOUML. Basically, BOUML is capable to permanently support the coding; you can define all entities, fields and methods in the UML model an just develop the method bodies //conventionally// with a text editor.