Add buttons for switching control line type

This commit is contained in:
Lawrence Lee
2020-06-10 11:41:15 -07:00
parent 5e5a86f513
commit dd4364fab3
6 changed files with 617 additions and 24 deletions

View File

@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
sodipodi:docname="bidirectional-arrow-horizontal-hicontrast.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
inkscape:export-ydpi="96"
inkscape:export-xdpi="96"
inkscape:export-filename="/tmp/template.png"
id="SVGRoot"
version="1.1"
viewBox="0 0 24 24"
height="24px"
width="24px">
<sodipodi:namedview
inkscape:snap-page="true"
inkscape:snap-text-baseline="true"
inkscape:snap-center="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-midpoints="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:bbox-paths="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-nodes="true"
inkscape:object-paths="true"
inkscape:document-rotation="0"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-grids="true"
inkscape:object-nodes="true"
inkscape:snap-others="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox="true"
inkscape:pagecheckerboard="false"
inkscape:grid-bbox="true"
inkscape:window-maximized="1"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:window-height="1041"
inkscape:window-width="1920"
showgrid="true"
inkscape:current-layer="layer1"
inkscape:document-units="px"
inkscape:cy="11.292624"
inkscape:cx="11.864052"
inkscape:zoom="29.288994"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
borderopacity="1.0"
bordercolor="#666768"
pagecolor="#E0E1E2"
id="base">
<inkscape:grid
dotted="false"
empspacing="11"
originy="1"
originx="1"
id="grid1374"
type="xygrid" />
</sodipodi:namedview>
<defs
id="defs815" />
<metadata
id="metadata818">
<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>
<dc:creator>
<cc:Agent>
<dc:title>Lawrence</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:rights>
<dc:description>RawTherapee icon.</dc:description>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
sodipodi:nodetypes="ccccc"
id="path857"
d="m 4.75,13.5 h 14.5 v -3 H 4.75 Z"
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
id="path853"
d="m 5.5,13.5 v 2.25 L 0.5,12 5.5,8.25 v 2.25"
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" />
<path
id="path855"
d="m 18.5,13.5 v 2.25 l 5,-3.75 -5,-3.75 v 2.25"
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
sodipodi:docname="bidirectional-arrow-horizontal-prelight.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
inkscape:export-ydpi="96"
inkscape:export-xdpi="96"
inkscape:export-filename="/tmp/template.png"
id="SVGRoot"
version="1.1"
viewBox="0 0 24 24"
height="24px"
width="24px">
<sodipodi:namedview
inkscape:snap-page="true"
inkscape:snap-text-baseline="true"
inkscape:snap-center="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-midpoints="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:bbox-paths="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-nodes="true"
inkscape:object-paths="true"
inkscape:document-rotation="0"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-grids="true"
inkscape:object-nodes="true"
inkscape:snap-others="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox="true"
inkscape:pagecheckerboard="false"
inkscape:grid-bbox="true"
inkscape:window-maximized="1"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:window-height="1041"
inkscape:window-width="1920"
showgrid="true"
inkscape:current-layer="layer1"
inkscape:document-units="px"
inkscape:cy="11.292624"
inkscape:cx="11.864052"
inkscape:zoom="29.288994"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
borderopacity="1.0"
bordercolor="#666768"
pagecolor="#E0E1E2"
id="base">
<inkscape:grid
dotted="false"
empspacing="11"
originy="1"
originx="1"
id="grid1374"
type="xygrid" />
</sodipodi:namedview>
<defs
id="defs815" />
<metadata
id="metadata818">
<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>
<dc:creator>
<cc:Agent>
<dc:title>Lawrence</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:rights>
<dc:description>RawTherapee icon.</dc:description>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
sodipodi:nodetypes="ccccc"
id="path857"
d="m 4.75,13.5 h 14.5 v -3 H 4.75 Z"
style="fill:#ff6400;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
id="path853"
d="m 5.5,13.5 v 2.25 L 0.5,12 5.5,8.25 v 2.25"
style="fill:#ff6400;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" />
<path
id="path855"
d="m 18.5,13.5 v 2.25 l 5,-3.75 -5,-3.75 v 2.25"
style="fill:#ff6400;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
sodipodi:docname="bidirectional-arrow-vertical-hicontrast.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
inkscape:export-ydpi="96"
inkscape:export-xdpi="96"
inkscape:export-filename="/tmp/template.png"
id="SVGRoot"
version="1.1"
viewBox="0 0 24 24"
height="24px"
width="24px">
<sodipodi:namedview
inkscape:snap-page="true"
inkscape:snap-text-baseline="true"
inkscape:snap-center="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-midpoints="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:bbox-paths="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-nodes="true"
inkscape:object-paths="true"
inkscape:document-rotation="0"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-grids="true"
inkscape:object-nodes="true"
inkscape:snap-others="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox="true"
inkscape:pagecheckerboard="false"
inkscape:grid-bbox="true"
inkscape:window-maximized="1"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:window-height="1041"
inkscape:window-width="1920"
showgrid="true"
inkscape:current-layer="layer1"
inkscape:document-units="px"
inkscape:cy="11.292624"
inkscape:cx="11.864052"
inkscape:zoom="29.288994"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
borderopacity="1.0"
bordercolor="#666768"
pagecolor="#E0E1E2"
id="base">
<inkscape:grid
dotted="false"
empspacing="11"
originy="1"
originx="1"
id="grid1374"
type="xygrid" />
</sodipodi:namedview>
<defs
id="defs815" />
<metadata
id="metadata818">
<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>
<dc:creator>
<cc:Agent>
<dc:title>Lawrence</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:rights>
<dc:description>RawTherapee icon.</dc:description>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
sodipodi:nodetypes="ccccc"
id="path857"
d="m 10.5,4.75 0,14.5 h 3 l 0,-14.5 z"
style="fill:#ffffff;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
id="path853"
d="m 10.5,5.5 -2.25,0 3.75,-5 3.75,5 H 13.5"
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" />
<path
id="path855"
d="M 10.5,18.5 H 8.25 l 3.75,5 3.75,-5 H 13.5"
style="fill:#ffffff;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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="24px"
height="24px"
viewBox="0 0 24 24"
version="1.1"
id="SVGRoot"
inkscape:export-filename="/tmp/template.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="bidirectional-arrow-vertical-prelight.svg">
<sodipodi:namedview
id="base"
pagecolor="#E0E1E2"
bordercolor="#666768"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="29.288994"
inkscape:cx="11.864052"
inkscape:cy="11.292624"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="1920"
inkscape:window-height="1041"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true"
inkscape:pagecheckerboard="false"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:snap-others="true"
inkscape:object-nodes="true"
inkscape:snap-grids="true"
inkscape:snap-bbox-midpoints="true"
inkscape:document-rotation="0"
inkscape:object-paths="true"
inkscape:snap-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:bbox-paths="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-text-baseline="true"
inkscape:snap-page="true">
<inkscape:grid
type="xygrid"
id="grid1374"
originx="1"
originy="1"
empspacing="11"
dotted="false" />
</sodipodi:namedview>
<defs
id="defs815" />
<metadata
id="metadata818">
<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>
<dc:creator>
<cc:Agent>
<dc:title>Lawrence</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:rights>
<dc:description>RawTherapee icon.</dc:description>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1">
<path
style="fill:#ff6400;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 10.5,4.75 0,14.5 h 3 l 0,-14.5 z"
id="path857"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#ff6400;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1"
d="m 10.5,5.5 -2.25,0 3.75,-5 3.75,5 H 13.5"
id="path853"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#ff6400;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1"
d="M 10.5,18.5 H 8.25 l 3.75,5 3.75,-5 H 13.5"
id="path855" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -20,6 +20,7 @@
#include "perspective.h" #include "perspective.h"
#include "rtimage.h" #include "rtimage.h"
#include "rtsurface.h"
#include "../rtengine/procparams.h" #include "../rtengine/procparams.h"
@@ -704,14 +705,22 @@ ControlLineManager::ControlLineManager():
canvas_area->filled = true; canvas_area->filled = true;
canvas_area->topLeft = Coord(0, 0); canvas_area->topLeft = Coord(0, 0);
mouseOverGeometry.push_back(canvas_area); mouseOverGeometry.push_back(canvas_area);
line_icon_h = Cairo::RefPtr<RTSurface>(new RTSurface("bidirectional-arrow-horizontal-hicontrast.png"));
line_icon_v = Cairo::RefPtr<RTSurface>(new RTSurface("bidirectional-arrow-vertical-hicontrast.png"));
line_icon_h_prelight = Cairo::RefPtr<RTSurface>(new RTSurface("bidirectional-arrow-horizontal-prelight.png"));
line_icon_v_prelight = Cairo::RefPtr<RTSurface>(new RTSurface("bidirectional-arrow-vertical-prelight.png"));
} }
ControlLineManager::~ControlLineManager() ControlLineManager::~ControlLineManager()
{ {
for (auto i = mouseOverGeometry.begin(); i != mouseOverGeometry.end(); i++) { delete canvas_area;
delete *i;
}
for (auto i = control_lines.begin(); i != control_lines.end(); i++) { for (auto i = control_lines.begin(); i != control_lines.end(); i++) {
delete (*i)->begin;
delete (*i)->end;
delete (*i)->line;
delete (*i)->icon_h;
delete (*i)->icon_v;
delete *i; delete *i;
} }
} }
@@ -780,15 +789,19 @@ bool ControlLineManager::button1Pressed(int modifierKey)
const int object = dataProvider->getObject(); const int object = dataProvider->getObject();
if (object > 0) { // A control line. if (object > 0) { // A control line.
selected_object = object; if (object % ::ControlLine::OBJ_COUNT == 2) { // Icon.
action = Action::DRAGGING; action = Action::PICKING;
} else {
selected_object = object;
action = Action::DRAGGING;
}
} else if (draw_mode && (modifierKey & GDK_CONTROL_MASK)) { // Add new line. } else if (draw_mode && (modifierKey & GDK_CONTROL_MASK)) { // Add new line.
addLine(dataProvider->posImage, dataProvider->posImage); addLine(dataProvider->posImage, dataProvider->posImage);
selected_object = mouseOverGeometry.size() - 1; // Select endpoint. selected_object = mouseOverGeometry.size() - 1; // Select endpoint.
action = Action::DRAGGING; action = Action::DRAGGING;
} }
return false; return true;
} }
bool ControlLineManager::button1Released(void) bool ControlLineManager::button1Released(void)
@@ -812,6 +825,42 @@ bool ControlLineManager::button3Pressed(int modifierKey)
return false; return false;
} }
bool ControlLineManager::pick1(bool picked)
{
action = Action::NONE;
if (!picked) {
return false;
}
EditDataProvider* provider = getEditProvider();
if (!provider || provider->getObject() % ::ControlLine::OBJ_COUNT != 2) {
return false;
}
// Change line type.
int object_id = provider->getObject();
auto line = control_lines[(object_id - 1) / ::ControlLine::OBJ_COUNT];
if (line->type == rtengine::ControlLine::HORIZONTAL) {
line->icon = line->icon_v;
line->type = rtengine::ControlLine::VERTICAL;
} else if (line->type == rtengine::ControlLine::VERTICAL) {
line->icon = line->icon_h;
line->type = rtengine::ControlLine::HORIZONTAL;
}
visibleGeometry[object_id - 1] = line->icon;
auto state = calcLineState(*line);
line->begin->state = state;
line->end->state = state;
line->line->state = state;
return true;
}
bool ControlLineManager::pick3(bool picked) bool ControlLineManager::pick3(bool picked)
{ {
if (!picked) { if (!picked) {
@@ -824,7 +873,7 @@ bool ControlLineManager::pick3(bool picked)
return false; return false;
} }
removeLine((provider->getObject() - 1) / 3); removeLine((provider->getObject() - 1) / ::ControlLine::OBJ_COUNT);
return false; return false;
} }
@@ -836,8 +885,8 @@ bool ControlLineManager::drag1(int modifierKey)
return false; return false;
} }
::ControlLine* control_line = control_lines[(selected_object - 1) / 3]; ::ControlLine* control_line = control_lines[(selected_object - 1) / ::ControlLine::OBJ_COUNT];
int component = selected_object % 3; // 0 == end, 1 == line, 2 == begin int component = selected_object % ::ControlLine::OBJ_COUNT; // 0 == end, 1 == line, 2 == icon, 3 == begin
Coord mouse = provider->posImage + provider->deltaImage; Coord mouse = provider->posImage + provider->deltaImage;
Coord delta = provider->deltaImage - drag_delta; Coord delta = provider->deltaImage - drag_delta;
int ih, iw; int ih, iw;
@@ -850,7 +899,8 @@ bool ControlLineManager::drag1(int modifierKey)
control_line->line->end = control_line->end->center; control_line->line->end = control_line->end->center;
control_line->end->state = Geometry::DRAGGED; control_line->end->state = Geometry::DRAGGED;
break; break;
case (1): { // line case (1):
case (2): { // line
// Constrain delta so the end stays above the image. // Constrain delta so the end stays above the image.
Coord new_delta = control_line->end->center + delta; Coord new_delta = control_line->end->center + delta;
new_delta.clip(iw, ih); new_delta.clip(iw, ih);
@@ -868,7 +918,7 @@ bool ControlLineManager::drag1(int modifierKey)
control_line->line->state = Geometry::DRAGGED; control_line->line->state = Geometry::DRAGGED;
break; break;
} }
case (2): // begin case (3): // begin
control_line->begin->center = mouse; control_line->begin->center = mouse;
control_line->begin->center.clip(iw, ih); control_line->begin->center.clip(iw, ih);
control_line->line->begin = control_line->begin->center; control_line->line->begin = control_line->begin->center;
@@ -876,6 +926,12 @@ bool ControlLineManager::drag1(int modifierKey)
break; break;
} }
control_line->icon_h->position.x = (control_line->begin->center.x + control_line->end->center.x) / 2;
control_line->icon_h->position.y = (control_line->begin->center.y + control_line->end->center.y) / 2;
control_line->icon_v->position.x = control_line->icon_h->position.x;
control_line->icon_v->position.y = control_line->icon_h->position.y;
return false; return false;
} }
@@ -902,19 +958,22 @@ bool ControlLineManager::mouseOver(int modifierKey)
} }
} else if (cur_obj < 0) { // Nothing } else if (cur_obj < 0) { // Nothing
cursor = CSArrow; cursor = CSArrow;
} else if (cur_obj % ::ControlLine::OBJ_COUNT == 2) { // Icon
visibleGeometry[cur_obj - 1]->state = Geometry::PRELIGHT;
cursor = CSArrow;
} else { // Object } else { // Object
visibleGeometry[cur_obj - 1]->state = Geometry::PRELIGHT; visibleGeometry[cur_obj - 1]->state = Geometry::PRELIGHT;
cursor = CSMove2D; cursor = CSMove2D;
} }
if (prev_obj != cur_obj && prev_obj > 0) { if (prev_obj != cur_obj && prev_obj > 0) {
auto state = calcLineState(*control_lines[(prev_obj - 1) / 3]); auto state = calcLineState(*control_lines[(prev_obj - 1) / ::ControlLine::OBJ_COUNT]);
visibleGeometry[prev_obj - 1]->state = state; visibleGeometry[prev_obj - 1]->state = state;
} }
prev_obj = cur_obj; prev_obj = cur_obj;
return false; return true;
} }
void ControlLineManager::switchOffEditMode(void) void ControlLineManager::switchOffEditMode(void)
@@ -934,6 +993,7 @@ void ControlLineManager::addLine(Coord begin, Coord end)
constexpr int line_width = 2; constexpr int line_width = 2;
constexpr int handle_radius = 6; constexpr int handle_radius = 6;
Line* line; Line* line;
OPIcon *icon_h, *icon_v;
Circle *begin_c, *end_c; Circle *begin_c, *end_c;
line = new Line(); line = new Line();
@@ -942,6 +1002,16 @@ void ControlLineManager::addLine(Coord begin, Coord end)
line->begin = begin; line->begin = begin;
line->end = end; line->end = end;
const Cairo::RefPtr<RTSurface> null_surface = Cairo::RefPtr<RTSurface>(nullptr);
icon_h = new OPIcon(line_icon_h, null_surface, line_icon_h_prelight,
null_surface, null_surface, Geometry::DP_CENTERCENTER);
icon_h->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2);
icon_v = new OPIcon(line_icon_v, null_surface, line_icon_v_prelight,
null_surface, null_surface, Geometry::DP_CENTERCENTER);
icon_v->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2);
begin_c = new Circle(); begin_c = new Circle();
begin_c->datum = Geometry::IMAGE; begin_c->datum = Geometry::IMAGE;
begin_c->filled = true; begin_c->filled = true;
@@ -954,20 +1024,29 @@ void ControlLineManager::addLine(Coord begin, Coord end)
end_c->radius = handle_radius; end_c->radius = handle_radius;
end_c->center = begin; end_c->center = begin;
::ControlLine* control_line = new ::ControlLine();
control_line->begin = begin_c;
control_line->end = end_c;
control_line->icon_h = icon_h;
control_line->icon_v = icon_v;
if (draw_line_type == rtengine::ControlLine::HORIZONTAL) {
control_line->icon = icon_h;
} else if (draw_line_type == rtengine::ControlLine::VERTICAL) {
control_line->icon = icon_v;
}
control_line->line = line;
control_line->type = draw_line_type;
control_lines.push_back(control_line);
EditSubscriber::visibleGeometry.push_back(line); EditSubscriber::visibleGeometry.push_back(line);
EditSubscriber::visibleGeometry.push_back(control_line->icon);
EditSubscriber::visibleGeometry.push_back(begin_c); EditSubscriber::visibleGeometry.push_back(begin_c);
EditSubscriber::visibleGeometry.push_back(end_c); EditSubscriber::visibleGeometry.push_back(end_c);
EditSubscriber::mouseOverGeometry.push_back(line); EditSubscriber::mouseOverGeometry.push_back(line);
EditSubscriber::mouseOverGeometry.push_back(control_line->icon);
EditSubscriber::mouseOverGeometry.push_back(begin_c); EditSubscriber::mouseOverGeometry.push_back(begin_c);
EditSubscriber::mouseOverGeometry.push_back(end_c); EditSubscriber::mouseOverGeometry.push_back(end_c);
::ControlLine* control_line = new ::ControlLine();
control_line->begin = begin_c;
control_line->end = end_c;
control_line->line = line;
control_line->type = draw_line_type;
control_lines.push_back(control_line);
} }
void ControlLineManager::removeLine(size_t line_id) void ControlLineManager::removeLine(size_t line_id)
@@ -982,10 +1061,10 @@ void ControlLineManager::removeLine(size_t line_id)
delete line->line; delete line->line;
delete line; delete line;
control_lines.erase(control_lines.begin() + line_id); control_lines.erase(control_lines.begin() + line_id);
visibleGeometry.erase(visibleGeometry.begin() + 3 * line_id, visibleGeometry.erase(visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id,
visibleGeometry.begin() + 3 * line_id + 3); visibleGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT);
mouseOverGeometry.erase(mouseOverGeometry.begin() + 3 * line_id + 1, mouseOverGeometry.erase(mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + 1,
mouseOverGeometry.begin() + 3 * line_id + 4); mouseOverGeometry.begin() + ::ControlLine::OBJ_COUNT * line_id + ::ControlLine::OBJ_COUNT + 1);
} }
rtengine::ControlLine* ControlLineManager::toControlLines(void) const rtengine::ControlLine* ControlLineManager::toControlLines(void) const

View File

@@ -30,7 +30,10 @@
struct ControlLine struct ControlLine
{ {
static constexpr int OBJ_COUNT = 4;
Line* line; Line* line;
OPIcon* icon;
OPIcon *icon_h, *icon_v;
Circle *begin, *end; Circle *begin, *end;
rtengine::ControlLine::Type type; rtengine::ControlLine::Type type;
}; };
@@ -47,6 +50,8 @@ protected:
std::vector<ControlLine*> control_lines; std::vector<ControlLine*> control_lines;
CursorShape cursor; CursorShape cursor;
bool draw_mode; bool draw_mode;
Cairo::RefPtr<RTSurface> line_icon_h, line_icon_v;
Cairo::RefPtr<RTSurface> line_icon_h_prelight, line_icon_v_prelight;
int prev_obj; int prev_obj;
int selected_object; int selected_object;
@@ -89,6 +94,7 @@ public:
bool button1Pressed (int modifierKey) override; bool button1Pressed (int modifierKey) override;
bool button1Released (void) override; bool button1Released (void) override;
bool button3Pressed (int modifierKey) override; bool button3Pressed (int modifierKey) override;
bool pick1 (bool picked) override;
bool pick3 (bool picked) override; bool pick3 (bool picked) override;
bool drag1 (int modifierKey) override; bool drag1 (int modifierKey) override;
CursorShape getCursor (int objectID) const override; CursorShape getCursor (int objectID) const override;