Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37560991
en ru br
Репозитории ALT

Группа :: Обучение
Пакет: OpenBoard

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: 0006-polygon_line_styles.patch
Скачать


From 1dfec70c06421a44452e8c0dc8033980a652be48 Mon Sep 17 00:00:00 2001
From: thomas_lucky13 <mkoul@mail.ru>
Date: Thu, 24 Nov 2022 15:41:04 +0400
Subject: [PATCH] polygon_line_styles
Adding a new characteristic for line tool for it style (it can be solid, dashed and dotted).
---
 resources/OpenBoard.qrc                 |   3 +
 resources/forms/mainWindow.ui           |  56 ++++++++-
 resources/images/toolbar/dashedLine.svg | 126 ++++++++++++++++++++
 resources/images/toolbar/dottedLine.svg | 145 +++++++++++++++++++++++
 resources/images/toolbar/solidLine.svg  | 126 ++++++++++++++++++++
 src/board/UBBoardController.cpp         |  23 ++++
 src/board/UBBoardController.h           |   1 +
 src/board/UBDrawingController.cpp       |   5 +
 src/board/UBDrawingController.h         |   1 +
 src/core/UB.h                           |  10 ++
 src/core/UBSettings.cpp                 |  32 ++++++
 src/core/UBSettings.h                   |   6 +
 src/domain/UBGraphicsPolygonItem.cpp    |  12 ++
 src/domain/UBGraphicsPolygonItem.h      |   1 +
 src/domain/UBGraphicsScene.cpp          |  19 ++-
 src/domain/UBGraphicsScene.h            |   1 +
 src/frameworks/UBGeometryUtils.cpp      | 146 ++++++++++++++++++++++++
 src/frameworks/UBGeometryUtils.h        |   6 +
 18 files changed, 717 insertions(+), 2 deletions(-)
 create mode 100644 resources/images/toolbar/dashedLine.svg
 create mode 100644 resources/images/toolbar/dottedLine.svg
 create mode 100644 resources/images/toolbar/solidLine.svg
diff --git a/resources/OpenBoard.qrc b/resources/OpenBoard.qrc
index d1a5661f..d655e4ac 100644
--- a/resources/OpenBoard.qrc
+++ b/resources/OpenBoard.qrc
@@ -628,5 +628,8 @@
         <file>images/toolbar/record.svg</file>
         <file>images/toolbar/updates.svg</file>
         <file>images/toolbar/tutorial.svg</file>
+        <file>images/toolbar/solidLine.svg</file>
+        <file>images/toolbar/dottedLine.svg</file>
+        <file>images/toolbar/dashedLine.svg</file>
     </qresource>
 </RCC>
diff --git a/resources/forms/mainWindow.ui b/resources/forms/mainWindow.ui
index a24810b4..66ac731d 100644
--- a/resources/forms/mainWindow.ui
+++ b/resources/forms/mainWindow.ui
@@ -1702,6 +1702,60 @@
     <string>Draw intermediate grid lines</string>
    </property>
   </action>
+  <action name="actionLineSolid">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="checked">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="../OpenBoard.qrc">
+     <normaloff>:/images/toolbar/solidLine.svg</normaloff>:/images/toolbar/solidLine.svg</iconset>
+   </property>
+   <property name="text">
+    <string>Line Style</string>
+   </property>
+   <property name="toolTip">
+    <string>Solid Line</string>
+   </property>
+  </action>
+  <action name="actionLineDashed">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="checked">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="../OpenBoard.qrc">
+     <normaloff>:/images/toolbar/dashedLine.svg</normaloff>:/images/toolbar/dashedLine.svg</iconset>
+   </property>
+   <property name="text">
+    <string>Line Style</string>
+   </property>
+   <property name="toolTip">
+    <string>Dashed Line</string>
+   </property>
+  </action>
+  <action name="actionLineDotted">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="checked">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="../OpenBoard.qrc">
+     <normaloff>:/images/toolbar/dottedLine.svg</normaloff>:/images/toolbar/dottedLine.svg</iconset>
+   </property>
+   <property name="text">
+    <string>Line Style</string>
+   </property>
+   <property name="toolTip">
+    <string>Dotted Line</string>
+   </property>
+  </action>
  </widget>
  <resources>
   <include location="../OpenBoard.qrc"/>
diff --git a/resources/images/toolbar/dashedLine.svg b/resources/images/toolbar/dashedLine.svg
new file mode 100644
index 00000000..b523d91e
--- /dev/null
+++ b/resources/images/toolbar/dashedLine.svg
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   width="42"
+   height="42"
+   viewBox="0 0 42 42"
+   version="1.1"
+   id="svg38508"
+   inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
+   sodipodi:docname="dashedLine.svg"
+   inkscape:export-filename="/home/dmitry/git/OpenBoard/resources/images/stylusPalette/arrow_svg.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <sodipodi:namedview
+     id="namedview38510"
+     pagecolor="#505050"
+     bordercolor="#eeeeee"
+     borderopacity="1"
+     inkscape:pageshadow="0"
+     inkscape:pageopacity="0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="px"
+     showgrid="true"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     units="px"
+     inkscape:zoom="11.313708"
+     inkscape:cx="18.870913"
+     inkscape:cy="20.903845"
+     inkscape:window-width="1920"
+     inkscape:window-height="1003"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g965"
+     inkscape:document-rotation="0"
+     inkscape:snap-others="true"
+     inkscape:snap-global="false"
+     inkscape:showpageshadow="2"
+     inkscape:deskcolor="#505050">
+    <inkscape:grid
+       type="xygrid"
+       id="grid7387"
+       dotted="false" />
+  </sodipodi:namedview>
+  <defs
+     id="defs38505">
+    <filter
+       style="color-interpolation-filters:sRGB"
+       id="filter37990-9-5"
+       inkscape:label="shadowFilter"
+       x="-0.067811772"
+       y="-0.07751945"
+       width="1.1356235"
+       height="1.1873387">
+      <feGaussianBlur
+         stdDeviation="0.29999999999999999"
+         id="feGaussianBlur37992-3-6" />
+      <feOffset
+         dx="0"
+         dy="0.29999999999999999"
+         id="feOffset37994-2-2" />
+    </filter>
+    <filter
+       style="color-interpolation-filters:sRGB"
+       id="filter37990-9-5-3"
+       inkscape:label="shadowFilter"
+       x="-0.067811772"
+       y="-0.07751945"
+       width="1.1356235"
+       height="1.1873387">
+      <feGaussianBlur
+         stdDeviation="0.29999999999999999"
+         id="feGaussianBlur37992-3-6-6" />
+      <feOffset
+         dx="0"
+         dy="0.29999999999999999"
+         id="feOffset37994-2-2-7" />
+    </filter>
+  </defs>
+  <g
+     inkscape:label="icon"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-152.84748,-194.2822)">
+    <g
+       id="g965"
+       inkscape:label="line">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:3.6;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:10.8,10.8;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 154.68586,234.52153 38.80777,-38.81827"
+         id="path963"
+         sodipodi:nodetypes="cc" />
+    </g>
+  </g>
+  <metadata
+     id="metadata854">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <cc:license
+           rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+</svg>
diff --git a/resources/images/toolbar/dottedLine.svg b/resources/images/toolbar/dottedLine.svg
new file mode 100644
index 00000000..7124cd1e
--- /dev/null
+++ b/resources/images/toolbar/dottedLine.svg
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   inkscape:export-ydpi="96"
+   inkscape:export-xdpi="96"
+   inkscape:export-filename="/home/dmitry/git/OpenBoard/resources/images/stylusPalette/arrow_svg.png"
+   sodipodi:docname="dottedLine.svg"
+   inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
+   id="svg38508"
+   version="1.1"
+   viewBox="0 0 42 42"
+   height="42"
+   width="42"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <sodipodi:namedview
+     id="namedview38510"
+     pagecolor="#505050"
+     bordercolor="#eeeeee"
+     borderopacity="1"
+     inkscape:pageshadow="0"
+     inkscape:pageopacity="0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="px"
+     showgrid="true"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     units="px"
+     inkscape:zoom="7.9999996"
+     inkscape:cx="41.437502"
+     inkscape:cy="-10.0625"
+     inkscape:window-width="1920"
+     inkscape:window-height="1003"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g965"
+     inkscape:document-rotation="0"
+     inkscape:snap-others="true"
+     inkscape:snap-global="false"
+     inkscape:showpageshadow="2"
+     inkscape:deskcolor="#505050">
+    <inkscape:grid
+       type="xygrid"
+       id="grid7387"
+       dotted="false" />
+  </sodipodi:namedview>
+  <defs
+     id="defs38505">
+    <filter
+       style="color-interpolation-filters:sRGB"
+       id="filter37990-9-5"
+       inkscape:label="shadowFilter"
+       x="-0.067811772"
+       y="-0.07751945"
+       width="1.1356235"
+       height="1.1873387">
+      <feGaussianBlur
+         stdDeviation="0.29999999999999999"
+         id="feGaussianBlur37992-3-6" />
+      <feOffset
+         dx="0"
+         dy="0.29999999999999999"
+         id="feOffset37994-2-2" />
+    </filter>
+    <filter
+       style="color-interpolation-filters:sRGB"
+       id="filter37990-9-5-3"
+       inkscape:label="shadowFilter"
+       x="-0.067811772"
+       y="-0.07751945"
+       width="1.1356235"
+       height="1.1873387">
+      <feGaussianBlur
+         stdDeviation="0.29999999999999999"
+         id="feGaussianBlur37992-3-6-6" />
+      <feOffset
+         dx="0"
+         dy="0.29999999999999999"
+         id="feOffset37994-2-2-7" />
+    </filter>
+  </defs>
+  <g
+     inkscape:label="icon"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-152.84748,-194.2822)">
+    <g
+       id="g965"
+       inkscape:label="line">
+      <circle
+         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.53588;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.878431;paint-order:stroke fill markers"
+         id="circle2549"
+         cx="157.40373"
+         cy="231.92728"
+         r="3.4577076" />
+      <circle
+         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.53588;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.878431;paint-order:stroke fill markers"
+         id="circle2587"
+         cx="168.27238"
+         cy="221.2583"
+         r="3.4577076" />
+      <circle
+         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.53588;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.878431;paint-order:stroke fill markers"
+         id="circle2589"
+         cx="179.28416"
+         cy="210.2368"
+         r="3.4577076" />
+      <circle
+         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.53588;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.878431;paint-order:stroke fill markers"
+         id="circle2591"
+         cx="190.15662"
+         cy="199.18091"
+         r="3.4577076" />
+    </g>
+  </g>
+  <metadata
+     id="metadata854">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <cc:license
+           rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+</svg>
diff --git a/resources/images/toolbar/solidLine.svg b/resources/images/toolbar/solidLine.svg
new file mode 100644
index 00000000..45e714e5
--- /dev/null
+++ b/resources/images/toolbar/solidLine.svg
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   width="42"
+   height="42"
+   viewBox="0 0 42 42"
+   version="1.1"
+   id="svg38508"
+   inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
+   sodipodi:docname="solidLine.svg"
+   inkscape:export-filename="/home/dmitry/git/OpenBoard/resources/images/stylusPalette/arrow_svg.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <sodipodi:namedview
+     id="namedview38510"
+     pagecolor="#505050"
+     bordercolor="#eeeeee"
+     borderopacity="1"
+     inkscape:pageshadow="0"
+     inkscape:pageopacity="0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="px"
+     showgrid="true"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     units="px"
+     inkscape:zoom="11.313708"
+     inkscape:cx="18.870913"
+     inkscape:cy="20.903845"
+     inkscape:window-width="1920"
+     inkscape:window-height="1003"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g965"
+     inkscape:document-rotation="0"
+     inkscape:snap-others="true"
+     inkscape:snap-global="false"
+     inkscape:showpageshadow="2"
+     inkscape:deskcolor="#505050">
+    <inkscape:grid
+       type="xygrid"
+       id="grid7387"
+       dotted="false" />
+  </sodipodi:namedview>
+  <defs
+     id="defs38505">
+    <filter
+       style="color-interpolation-filters:sRGB"
+       id="filter37990-9-5"
+       inkscape:label="shadowFilter"
+       x="-0.067811772"
+       y="-0.07751945"
+       width="1.1356235"
+       height="1.1873387">
+      <feGaussianBlur
+         stdDeviation="0.29999999999999999"
+         id="feGaussianBlur37992-3-6" />
+      <feOffset
+         dx="0"
+         dy="0.29999999999999999"
+         id="feOffset37994-2-2" />
+    </filter>
+    <filter
+       style="color-interpolation-filters:sRGB"
+       id="filter37990-9-5-3"
+       inkscape:label="shadowFilter"
+       x="-0.067811772"
+       y="-0.07751945"
+       width="1.1356235"
+       height="1.1873387">
+      <feGaussianBlur
+         stdDeviation="0.29999999999999999"
+         id="feGaussianBlur37992-3-6-6" />
+      <feOffset
+         dx="0"
+         dy="0.29999999999999999"
+         id="feOffset37994-2-2-7" />
+    </filter>
+  </defs>
+  <g
+     inkscape:label="icon"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-152.84748,-194.2822)">
+    <g
+       id="g965"
+       inkscape:label="line">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 155.10847,234.22611 192.7862,196.30525"
+         id="path963"
+         sodipodi:nodetypes="cc" />
+    </g>
+  </g>
+  <metadata
+     id="metadata854">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <cc:license
+           rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+</svg>
diff --git a/src/board/UBBoardController.cpp b/src/board/UBBoardController.cpp
index 080036ec..3c95cd4a 100644
--- a/src/board/UBBoardController.cpp
+++ b/src/board/UBBoardController.cpp
@@ -378,6 +378,25 @@ void UBBoardController::setupToolbar()
 
     mPropertyPaletteWidgets.insert(eraserWidth, newPropertyPaletteWidget);
     //-----------------------------------------------------------//
+    // Setup line style choice widget
+    QList<QAction *> lineStyleActions;
+    lineStyleActions.append(mMainWindow->actionLineSolid);
+    lineStyleActions.append(mMainWindow->actionLineDashed);
+    lineStyleActions.append(mMainWindow->actionLineDotted);
+
+    UBToolbarButtonGroup *lineStyleChoice =
+            new UBToolbarButtonGroup(mMainWindow->boardToolBar, lineStyleActions);
+
+    connect(settings->appToolBarDisplayText, SIGNAL(changed(QVariant)), lineStyleChoice, SLOT(displayText(QVariant)));
+
+    connect(lineStyleChoice, SIGNAL(activated(int)),
+    UBDrawingController::drawingController(), SLOT(setLineStyleIndex(int)));
+    lineStyleChoice->displayText(QVariant(settings->appToolBarDisplayText->get().toBool()));
+    newPropertyPaletteWidget = mMainWindow->boardToolBar->insertWidget(mMainWindow->actionBackgrounds, lineStyleChoice);
+    lineStyleChoice->setCurrentIndex(settings->lineStyleIndex());
+    lineStyleActions.at(settings->lineStyleIndex())->setChecked(true);
+    mPropertyPaletteWidgets.insert(lineStyle, newPropertyPaletteWidget);
+    //-----------------------------------------------------------//
 
     UBApplication::app()->insertSpaceToToolbarBeforeAction(mMainWindow->boardToolBar, mMainWindow->actionBackgrounds);
     UBApplication::app()->insertSpaceToToolbarBeforeAction(mMainWindow->boardToolBar, mMainWindow->actionBoard, 40);
@@ -2211,23 +2230,27 @@ void UBBoardController::stylusToolChanged(int tool)
             mPropertyPaletteWidgets[color]->setVisible(true);
             mPropertyPaletteWidgets[lineWidth]->setVisible(true);
             mPropertyPaletteWidgets[eraserWidth]->setVisible(false);
+            mPropertyPaletteWidgets[lineStyle]->setVisible(false);
         } else
         if (eTool == UBStylusTool::Eraser)
         {
             mPropertyPaletteWidgets[color]->setVisible(false);
             mPropertyPaletteWidgets[lineWidth]->setVisible(false);
             mPropertyPaletteWidgets[eraserWidth]->setVisible(true);
+            mPropertyPaletteWidgets[lineStyle]->setVisible(false);
         } else
         if (eTool == UBStylusTool::Line)
         {
             mPropertyPaletteWidgets[color]->setVisible(true);
             mPropertyPaletteWidgets[lineWidth]->setVisible(true);
             mPropertyPaletteWidgets[eraserWidth]->setVisible(false);
+            mPropertyPaletteWidgets[lineStyle]->setVisible(true);
         } else
         {
             mPropertyPaletteWidgets[color]->setVisible(false);
             mPropertyPaletteWidgets[lineWidth]->setVisible(false);
             mPropertyPaletteWidgets[eraserWidth]->setVisible(false);
+            mPropertyPaletteWidgets[lineStyle]->setVisible(false);
         }
 
 }
diff --git a/src/board/UBBoardController.h b/src/board/UBBoardController.h
index 0ad946aa..8e6618f2 100644
--- a/src/board/UBBoardController.h
+++ b/src/board/UBBoardController.h
@@ -326,6 +326,7 @@ class UBBoardController : public UBDocumentContainer
         {
             color,
             lineWidth,
+            lineStyle,
             eraserWidth
         };
         QMap<PropertyPalette, QAction*> mPropertyPaletteWidgets;
diff --git a/src/board/UBDrawingController.cpp b/src/board/UBDrawingController.cpp
index 705e1d18..ab6b39d4 100644
--- a/src/board/UBDrawingController.cpp
+++ b/src/board/UBDrawingController.cpp
@@ -279,6 +279,11 @@ void UBDrawingController::setEraserWidthIndex(int index)
     UBSettings::settings()->setEraserWidthIndex(index);
 }
 
+void UBDrawingController::setLineStyleIndex(int index)
+{
+    UBSettings::settings()->setLineStyleIndex(index);
+}
+
 void UBDrawingController::setPenColor(bool onDarkBackground, const QColor& color, int pIndex)
 {
     if (onDarkBackground)
diff --git a/src/board/UBDrawingController.h b/src/board/UBDrawingController.h
index 01c11187..617bc824 100644
--- a/src/board/UBDrawingController.h
+++ b/src/board/UBDrawingController.h
@@ -80,6 +80,7 @@ class UBDrawingController : public QObject
         void setLineWidthIndex(int index);
         void setColorIndex(int index);
         void setEraserWidthIndex(int index);
+        void setLineStyleIndex(int index);
 
     signals:
         void stylusToolChanged(int tool, int previousTool = -1);
diff --git a/src/core/UB.h b/src/core/UB.h
index 8b9b1c7f..9c5552b4 100644
--- a/src/core/UB.h
+++ b/src/core/UB.h
@@ -84,6 +84,16 @@ struct UBWidth
     };
 };
 
+struct UBLineStyle
+{
+    enum Enum
+    {
+        Solid = 0,
+        Dashed = 1,
+        Dotted = 2
+    };
+};
+
 struct UBZoom
 {
     enum Enum
diff --git a/src/core/UBSettings.cpp b/src/core/UBSettings.cpp
index 663c5582..994b51d8 100644
--- a/src/core/UBSettings.cpp
+++ b/src/core/UBSettings.cpp
@@ -785,6 +785,38 @@ qreal UBSettings::currentEraserWidth()
     return width;
 }
 
+//----------------------------------------//
+// line
+int UBSettings::lineStyleIndex()
+{
+    return value("Board/LineStyleIndex", 0).toInt();
+}
+
+void UBSettings::setLineStyleIndex(int index)
+{
+    setValue("Board/LineStyleIndex", index);
+}
+
+UBLineStyle::Enum UBSettings::currentLineStyle()
+{
+    Qt::PenStyle style = Qt::SolidLine;
+
+    switch (lineStyleIndex())
+    {
+        case UBLineStyle::Solid:
+            return UBLineStyle::Solid;
+        case UBLineStyle::Dotted:
+            return UBLineStyle::Dotted;
+        case UBLineStyle::Dashed:
+            return UBLineStyle::Dashed;
+        default:
+            Q_ASSERT(false);
+            style = Qt::SolidLine;
+            break;
+    }
+
+    return UBLineStyle::Solid;
+}
 bool UBSettings::isDarkBackground()
 {
     return value("Board/DarkBackground", 0).toBool();
diff --git a/src/core/UBSettings.h b/src/core/UBSettings.h
index 8d5909a3..02a5366f 100644
--- a/src/core/UBSettings.h
+++ b/src/core/UBSettings.h
@@ -85,6 +85,10 @@ class UBSettings : public QObject
         qreal eraserStrongWidth();
         qreal currentEraserWidth();
 
+        // Line related
+        int lineStyleIndex();
+        UBLineStyle::Enum currentLineStyle();
+
         // Background related
         bool isDarkBackground();
         UBPageBackground pageBackground();
@@ -443,6 +447,8 @@ class UBSettings : public QObject
         void setEraserMediumWidth(qreal width);
         void setEraserStrongWidth(qreal width);
 
+        void setLineStyleIndex(int index);
+
          void setStylusPaletteVisible(bool visible);
 
         void setPenPressureSensitive(bool sensitive);
diff --git a/src/domain/UBGraphicsPolygonItem.cpp b/src/domain/UBGraphicsPolygonItem.cpp
index bdd22757..65820f30 100644
--- a/src/domain/UBGraphicsPolygonItem.cpp
+++ b/src/domain/UBGraphicsPolygonItem.cpp
@@ -73,6 +73,18 @@ UBGraphicsPolygonItem::UBGraphicsPolygonItem (const QLineF& pLine, qreal pWidth)
     initialize();
 }
 
+UBGraphicsPolygonItem::UBGraphicsPolygonItem (const QLineF& pLine, qreal pWidth, UBLineStyle::Enum style)
+    : QGraphicsPolygonItem(UBGeometryUtils::lineToPolygon(pLine, pWidth, style))
+    , mOriginalLine(pLine)
+    , mOriginalWidth(pWidth)
+    , mIsNominalLine(true)
+    , mStroke(0)
+    , mpGroup(NULL)
+{
+    // NOOP
+    initialize();
+}
+
 UBGraphicsPolygonItem::UBGraphicsPolygonItem (const QLineF& pLine, qreal pStartWidth, qreal pEndWidth)
     : QGraphicsPolygonItem(UBGeometryUtils::lineToPolygon(pLine, pStartWidth, pEndWidth))
     , mOriginalLine(pLine)
diff --git a/src/domain/UBGraphicsPolygonItem.h b/src/domain/UBGraphicsPolygonItem.h
index fc146c9c..fb7bdf9f 100644
--- a/src/domain/UBGraphicsPolygonItem.h
+++ b/src/domain/UBGraphicsPolygonItem.h
@@ -45,6 +45,7 @@ class UBGraphicsPolygonItem : public QGraphicsPolygonItem, public UBItem
     public:
 
         UBGraphicsPolygonItem(QGraphicsItem * parent = 0 );
+        UBGraphicsPolygonItem(const QLineF& line, qreal pWidth, UBLineStyle::Enum style);
         UBGraphicsPolygonItem(const QLineF& line, qreal pWidth);
         UBGraphicsPolygonItem(const QLineF& pLine, qreal pStartWidth, qreal pEndWidth);
         UBGraphicsPolygonItem(const QPolygonF & polygon, QGraphicsItem * parent = 0);
diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp
index e6ef1b3b..bccf4679 100644
--- a/src/domain/UBGraphicsScene.cpp
+++ b/src/domain/UBGraphicsScene.cpp
@@ -943,7 +943,15 @@ void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &startWid
         mAddedItems.clear();
     }
 
-    UBGraphicsPolygonItem *polygonItem = lineToPolygonItem(QLineF(mPreviousPoint, pEndPoint), initialWidth, endWidth);
+    UBGraphicsPolygonItem *polygonItem;
+
+    if(UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line)
+    {
+        polygonItem = lineToPolygonItem(QLineF(mPreviousPoint, pEndPoint), endWidth, UBSettings::settings()->currentLineStyle());
+    } else
+    {
+         polygonItem = lineToPolygonItem(QLineF(mPreviousPoint, pEndPoint), initialWidth, endWidth);
+    }
     addPolygonItemToCurrentStroke(polygonItem);
 
     if (!bLineStyle) {
@@ -1238,6 +1246,15 @@ UBGraphicsPolygonItem* UBGraphicsScene::lineToPolygonItem(const QLineF &pLine, c
     return polygonItem;
 }
 
+UBGraphicsPolygonItem* UBGraphicsScene::lineToPolygonItem(const QLineF &pLine, const qreal &pWidth, UBLineStyle::Enum style)
+{
+    UBGraphicsPolygonItem *polygonItem = new UBGraphicsPolygonItem(pLine, pWidth, style);
+
+    initPolygonItem(polygonItem);
+
+    return polygonItem;
+}
+
 void UBGraphicsScene::initPolygonItem(UBGraphicsPolygonItem* polygonItem)
 {
     QColor colorOnDarkBG;
diff --git a/src/domain/UBGraphicsScene.h b/src/domain/UBGraphicsScene.h
index 9e66d662..3d934b53 100644
--- a/src/domain/UBGraphicsScene.h
+++ b/src/domain/UBGraphicsScene.h
@@ -395,6 +395,7 @@ public slots:
 
         UBGraphicsPolygonItem* lineToPolygonItem(const QLineF& pLine, const qreal& pWidth);
         UBGraphicsPolygonItem* lineToPolygonItem(const QLineF &pLine, const qreal &pStartWidth, const qreal &pEndWidth);
+        UBGraphicsPolygonItem* lineToPolygonItem(const QLineF &pLine, const qreal &pWidth, UBLineStyle::Enum style);
 
         UBGraphicsPolygonItem* arcToPolygonItem(const QLineF& pStartRadius, qreal pSpanAngle, qreal pWidth);
         UBGraphicsPolygonItem* curveToPolygonItem(const QList<QPair<QPointF, qreal> > &points);
diff --git a/src/frameworks/UBGeometryUtils.cpp b/src/frameworks/UBGeometryUtils.cpp
index 30bd3c35..53a6de2f 100644
--- a/src/frameworks/UBGeometryUtils.cpp
+++ b/src/frameworks/UBGeometryUtils.cpp
@@ -49,6 +49,19 @@ UBGeometryUtils::~UBGeometryUtils()
     // NOOP
 }
 
+QPolygonF UBGeometryUtils::lineToPolygon(const QLineF& pLine, const qreal& pWidth, const UBLineStyle::Enum lineStyle)
+{
+    if (lineStyle == UBLineStyle::Dashed) //Dashed LineStyle
+    {
+        return dashedLineToPolygon(pLine, pWidth);
+    }
+    if (lineStyle == UBLineStyle::Dotted) //Dotted LineStyle
+    {
+        return dottedLineToPolygon(pLine, pWidth);
+    }
+    return lineToPolygon(pLine, pWidth);
+}
+
 QPolygonF UBGeometryUtils::lineToPolygon(const QLineF& pLine, const qreal& pWidth)
 {
     qreal x1 = pLine.x1();
@@ -467,3 +480,136 @@ QList<QPointF> UBGeometryUtils::quadraticBezier(const QPointF& p0, const QPointF
 
     return points;
 }
+
+QPolygonF UBGeometryUtils::dashedLineToPolygon(const QLineF& pLine, const qreal& pWidth)
+{
+
+    qreal partLength = pWidth*4;
+    QList<QPointF> linePoints;
+
+    int n = pLine.length()/partLength;
+    qreal partPrc;
+    if (n == 0)
+    {
+        partPrc = 0;
+    } else
+    {
+        partPrc = 1.0/n;
+    }
+    for (int i = 0; i < n; ++i)
+    {
+        linePoints.push_back(pLine.pointAt(i*partPrc));
+    }
+    linePoints.push_back(pLine.p2());
+
+    QPainterPath painterPath;
+
+    for(int i = 1; i < linePoints.count(); i+=2)
+    {
+        painterPath.addPolygon(lineToPolygon(QLineF(linePoints[i-1], linePoints[i]), pWidth));
+        painterPath.closeSubpath();
+    }
+
+    // Use convertLineToPolygon to fix a problem with erasing
+    return convertLineToPolygon(painterPath.toFillPolygon());
+}
+
+QPolygonF UBGeometryUtils::dottedLineToPolygon(const QLineF& pLine, const qreal& pWidth)
+{
+    qreal partLength = pWidth;
+    QList<QPointF> linePoints;
+
+    int n = pLine.length()/partLength;
+    qreal partPrc;
+    if (n == 0)
+    {
+        partPrc = 0;
+    } else
+    {
+        partPrc = 1.0/n;
+    }
+    for (int i = 0; i < n; ++i)
+    {
+        linePoints.push_back(pLine.pointAt(i*partPrc));
+    }
+    linePoints.push_back(pLine.p2());
+
+    QPainterPath painterPath;
+
+    for(int i = 1; i < linePoints.count(); i+=6)
+    {
+        painterPath.addEllipse(linePoints[i].x()-pWidth, linePoints[i].y()-pWidth, pWidth*2, pWidth*2);
+        painterPath.closeSubpath();
+    }
+    // Use convertLineToPolygon to fix a problem with erasing
+    return convertLineToPolygon(painterPath.toFillPolygon());
+}
+
+QPolygonF UBGeometryUtils::convertLineToPolygon(const QPolygonF& pLine)
+{
+    /*
+     * Use this function to fix problems with erasing dashed and dotted lines
+     * Without this will be erased extra parts, that should not
+     */
+    QPolygonF polygon = pLine;
+    int pointsCount = polygon.size();
+    QString* points = new QString();
+    if (pointsCount > 0)
+    {
+        QVector<QPointF> polygonPoints = polygon;
+        UBGeometryUtils::crashPointList(polygonPoints);
+
+        int PolygonPointsCount = polygonPoints.size();
+        QString* svgPoints = new QString();
+        int length = 0;
+        QString sBuf;
+        for(int j = 0; j < PolygonPointsCount; j++)
+        {
+            sBuf = "%1,%2 ";
+            const QPointF & point = polygonPoints.at(j);
+
+            QString temp1 =  "%1", temp2 = "%2";
+
+            temp1 = temp1.arg(point.x());
+            temp2 = temp2.arg(point.y());
+
+            QLocale loc(QLocale::C);
+            sBuf = sBuf.arg(loc.toFloat(temp1)).arg(loc.toFloat(temp2));
+
+            svgPoints->insert(length, sBuf);
+            length += sBuf.length();
+        }
+        points = svgPoints;
+    }
+    QStringRef svgPoints = QStringRef(points);
+
+    QPolygonF polygonRes;
+
+    if (!svgPoints.isNull())
+    {
+        QStringList ts = svgPoints.toString().split(QLatin1Char(' '), QString::SkipEmptyParts);
+
+        foreach(const QString sPoint, ts)
+        {
+            QStringList sCoord = sPoint.split(QLatin1Char(','), QString::SkipEmptyParts);
+
+            if (sCoord.size() == 2)
+            {
+                QPointF point;
+                point.setX(sCoord.at(0).toFloat());
+                point.setY(sCoord.at(1).toFloat());
+                polygonRes << point;
+            }
+            else if (sCoord.size() == 4){
+                //This is the case on system were the "," is used to seperate decimal
+                QPointF point;
+                QString x = sCoord.at(0) + "." + sCoord.at(1);
+                QString y = sCoord.at(2) + "." + sCoord.at(3);
+                point.setX(x.toFloat());
+                point.setY(y.toFloat());
+                polygonRes << point;
+            }
+        }
+    }
+    return polygonRes;
+}
diff --git a/src/frameworks/UBGeometryUtils.h b/src/frameworks/UBGeometryUtils.h
index f267f1f2..f2c70032 100644
--- a/src/frameworks/UBGeometryUtils.h
+++ b/src/frameworks/UBGeometryUtils.h
@@ -31,6 +31,7 @@
 #define UBGEOMETRYUTILS_H_
 
 #include <QtGui>
+#include "core/UB.h"
 
 class UBGeometryUtils
 {
@@ -39,10 +40,15 @@ class UBGeometryUtils
         virtual ~UBGeometryUtils();
 
     public:
+        static QPolygonF lineToPolygon(const QLineF& pLine, const qreal& pWidth, const UBLineStyle::Enum lineStyle);
         static QPolygonF lineToPolygon(const QLineF& pLine, const qreal& pWidth);
         static QPolygonF lineToPolygon(const QLineF& pLine, const qreal& pStartWidth, const qreal& pEndWidth);
         static QRectF lineToInnerRect(const QLineF& pLine, const qreal& pWidth);
 
+        static QPolygonF dashedLineToPolygon(const QLineF& pLine, const qreal& pWidth);
+        static QPolygonF dottedLineToPolygon(const QLineF& pLine, const qreal& pWidth);
+        static QPolygonF convertLineToPolygon(const QPolygonF& pLine);
+
         static QPolygonF arcToPolygon(const QLineF& startRadius, qreal spanAngle, qreal width);
 
         static QPolygonF lineToPolygon(const QPointF& pStart, const QPointF& pEnd,
-- 
2.33.0
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin