add brightness controls (#888)

Closes #860
This commit is contained in:
Stefan Breunig 2022-06-12 19:01:41 +02:00 committed by GitHub
parent 861fbe9a2b
commit e2d758f540
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 350 additions and 4 deletions

View File

@ -34,6 +34,7 @@ from libs.shape import Shape, DEFAULT_LINE_COLOR, DEFAULT_FILL_COLOR
from libs.stringBundle import StringBundle from libs.stringBundle import StringBundle
from libs.canvas import Canvas from libs.canvas import Canvas
from libs.zoomWidget import ZoomWidget from libs.zoomWidget import ZoomWidget
from libs.lightWidget import LightWidget
from libs.labelDialog import LabelDialog from libs.labelDialog import LabelDialog
from libs.colorDialog import ColorDialog from libs.colorDialog import ColorDialog
from libs.labelFile import LabelFile, LabelFileError, LabelFileFormat from libs.labelFile import LabelFile, LabelFileError, LabelFileFormat
@ -180,10 +181,12 @@ class MainWindow(QMainWindow, WindowMixin):
self.file_dock.setWidget(file_list_container) self.file_dock.setWidget(file_list_container)
self.zoom_widget = ZoomWidget() self.zoom_widget = ZoomWidget()
self.light_widget = LightWidget(get_str('lightWidgetTitle'))
self.color_dialog = ColorDialog(parent=self) self.color_dialog = ColorDialog(parent=self)
self.canvas = Canvas(parent=self) self.canvas = Canvas(parent=self)
self.canvas.zoomRequest.connect(self.zoom_request) self.canvas.zoomRequest.connect(self.zoom_request)
self.canvas.lightRequest.connect(self.light_request)
self.canvas.set_drawing_shape_to_square(settings.get(SETTING_DRAW_SQUARE, False)) self.canvas.set_drawing_shape_to_square(settings.get(SETTING_DRAW_SQUARE, False))
scroll = QScrollArea() scroll = QScrollArea()
@ -326,6 +329,26 @@ class MainWindow(QMainWindow, WindowMixin):
self.MANUAL_ZOOM: lambda: 1, self.MANUAL_ZOOM: lambda: 1,
} }
light = QWidgetAction(self)
light.setDefaultWidget(self.light_widget)
self.light_widget.setWhatsThis(
u"Brighten or darken current image. Also accessible with"
" %s and %s from the canvas." % (format_shortcut("Ctrl+Shift+[-+]"),
format_shortcut("Ctrl+Shift+Wheel")))
self.light_widget.setEnabled(False)
light_brighten = action(get_str('lightbrighten'), partial(self.add_light, 10),
'Ctrl+Shift++', 'light_lighten', get_str('lightbrightenDetail'), enabled=False)
light_darken = action(get_str('lightdarken'), partial(self.add_light, -10),
'Ctrl+Shift+-', 'light_darken', get_str('lightdarkenDetail'), enabled=False)
light_org = action(get_str('lightreset'), partial(self.set_light, 50),
'Ctrl+Shift+=', 'light_reset', get_str('lightresetDetail'), checkable=True, enabled=False)
light_org.setChecked(True)
# Group light controls into a list for easier toggling.
light_actions = (self.light_widget, light_brighten,
light_darken, light_org)
edit = action(get_str('editLabel'), self.edit_label, edit = action(get_str('editLabel'), self.edit_label,
'Ctrl+E', 'edit', get_str('editLabelDetail'), 'Ctrl+E', 'edit', get_str('editLabelDetail'),
enabled=False) enabled=False)
@ -364,6 +387,8 @@ class MainWindow(QMainWindow, WindowMixin):
zoom=zoom, zoomIn=zoom_in, zoomOut=zoom_out, zoomOrg=zoom_org, zoom=zoom, zoomIn=zoom_in, zoomOut=zoom_out, zoomOrg=zoom_org,
fitWindow=fit_window, fitWidth=fit_width, fitWindow=fit_window, fitWidth=fit_width,
zoomActions=zoom_actions, zoomActions=zoom_actions,
lightBrighten=light_brighten, lightDarken=light_darken, lightOrg=light_org,
lightActions=light_actions,
fileMenuActions=( fileMenuActions=(
open, open_dir, save, save_as, close, reset_all, quit), open, open_dir, save, save_as, close, reset_all, quit),
beginner=(), advanced=(), beginner=(), advanced=(),
@ -411,7 +436,8 @@ class MainWindow(QMainWindow, WindowMixin):
labels, advanced_mode, None, labels, advanced_mode, None,
hide_all, show_all, None, hide_all, show_all, None,
zoom_in, zoom_out, zoom_org, None, zoom_in, zoom_out, zoom_org, None,
fit_window, fit_width)) fit_window, fit_width, None,
light_brighten, light_darken, light_org))
self.menus.file.aboutToShow.connect(self.update_file_menu) self.menus.file.aboutToShow.connect(self.update_file_menu)
@ -424,7 +450,8 @@ class MainWindow(QMainWindow, WindowMixin):
self.tools = self.toolbar('Tools') self.tools = self.toolbar('Tools')
self.actions.beginner = ( self.actions.beginner = (
open, open_dir, change_save_dir, open_next_image, open_prev_image, verify, save, save_format, None, create, copy, delete, None, open, open_dir, change_save_dir, open_next_image, open_prev_image, verify, save, save_format, None, create, copy, delete, None,
zoom_in, zoom, zoom_out, fit_window, fit_width) zoom_in, zoom, zoom_out, fit_window, fit_width, None,
light_brighten, light, light_darken, light_org)
self.actions.advanced = ( self.actions.advanced = (
open, open_dir, change_save_dir, open_next_image, open_prev_image, save, save_format, None, open, open_dir, change_save_dir, open_next_image, open_prev_image, save, save_format, None,
@ -500,6 +527,7 @@ class MainWindow(QMainWindow, WindowMixin):
# Callbacks: # Callbacks:
self.zoom_widget.valueChanged.connect(self.paint_canvas) self.zoom_widget.valueChanged.connect(self.paint_canvas)
self.light_widget.valueChanged.connect(self.paint_canvas)
self.populate_mode_actions() self.populate_mode_actions()
@ -601,6 +629,8 @@ class MainWindow(QMainWindow, WindowMixin):
"""Enable/Disable widgets which depend on an opened image.""" """Enable/Disable widgets which depend on an opened image."""
for z in self.actions.zoomActions: for z in self.actions.zoomActions:
z.setEnabled(value) z.setEnabled(value)
for z in self.actions.lightActions:
z.setEnabled(value)
for action in self.actions.onLoadActive: for action in self.actions.onLoadActive:
action.setEnabled(value) action.setEnabled(value)
@ -1032,6 +1062,9 @@ class MainWindow(QMainWindow, WindowMixin):
h_bar.setValue(new_h_bar_value) h_bar.setValue(new_h_bar_value)
v_bar.setValue(new_v_bar_value) v_bar.setValue(new_v_bar_value)
def light_request(self, delta):
self.add_light(5*delta // (8 * 15))
def set_fit_window(self, value=True): def set_fit_window(self, value=True):
if value: if value:
self.actions.fitWidth.setChecked(False) self.actions.fitWidth.setChecked(False)
@ -1044,6 +1077,15 @@ class MainWindow(QMainWindow, WindowMixin):
self.zoom_mode = self.FIT_WIDTH if value else self.MANUAL_ZOOM self.zoom_mode = self.FIT_WIDTH if value else self.MANUAL_ZOOM
self.adjust_scale() self.adjust_scale()
def set_light(self, value):
self.actions.lightOrg.setChecked(int(value) == 50)
# Arithmetic on scaling factor often results in float
# Convert to int to avoid type errors
self.light_widget.setValue(int(value))
def add_light(self, increment=10):
self.set_light(self.light_widget.value() + increment)
def toggle_polygons(self, value): def toggle_polygons(self, value):
for item, shape in self.items_to_shapes.items(): for item, shape in self.items_to_shapes.items():
item.setCheckState(Qt.Checked if value else Qt.Unchecked) item.setCheckState(Qt.Checked if value else Qt.Unchecked)
@ -1172,6 +1214,7 @@ class MainWindow(QMainWindow, WindowMixin):
def paint_canvas(self): def paint_canvas(self):
assert not self.image.isNull(), "cannot paint null image" assert not self.image.isNull(), "cannot paint null image"
self.canvas.scale = 0.01 * self.zoom_widget.value() self.canvas.scale = 0.01 * self.zoom_widget.value()
self.canvas.overlay_color = self.light_widget.color()
self.canvas.label_font_size = int(0.02 * max(self.image.width(), self.image.height())) self.canvas.label_font_size = int(0.02 * max(self.image.width(), self.image.height()))
self.canvas.adjustSize() self.canvas.adjustSize()
self.canvas.update() self.canvas.update()

View File

@ -23,6 +23,7 @@ CURSOR_GRAB = Qt.OpenHandCursor
class Canvas(QWidget): class Canvas(QWidget):
zoomRequest = pyqtSignal(int) zoomRequest = pyqtSignal(int)
lightRequest = pyqtSignal(int)
scrollRequest = pyqtSignal(int, int) scrollRequest = pyqtSignal(int, int)
newShape = pyqtSignal() newShape = pyqtSignal()
selectionChanged = pyqtSignal(bool) selectionChanged = pyqtSignal(bool)
@ -47,6 +48,7 @@ class Canvas(QWidget):
self.prev_point = QPointF() self.prev_point = QPointF()
self.offsets = QPointF(), QPointF() self.offsets = QPointF(), QPointF()
self.scale = 1.0 self.scale = 1.0
self.overlay_color = None
self.label_font_size = 8 self.label_font_size = 8
self.pixmap = QPixmap() self.pixmap = QPixmap()
self.visible = {} self.visible = {}
@ -503,7 +505,15 @@ class Canvas(QWidget):
p.scale(self.scale, self.scale) p.scale(self.scale, self.scale)
p.translate(self.offset_to_center()) p.translate(self.offset_to_center())
p.drawPixmap(0, 0, self.pixmap) temp = self.pixmap
if self.overlay_color:
temp = QPixmap(self.pixmap)
painter = QPainter(temp)
painter.setCompositionMode(painter.CompositionMode_Overlay)
painter.fillRect(temp.rect(), self.overlay_color)
painter.end()
p.drawPixmap(0, 0, temp)
Shape.scale = self.scale Shape.scale = self.scale
Shape.label_font_size = self.label_font_size Shape.label_font_size = self.label_font_size
for shape in self.shapes: for shape in self.shapes:
@ -607,7 +617,9 @@ class Canvas(QWidget):
v_delta = delta.y() v_delta = delta.y()
mods = ev.modifiers() mods = ev.modifiers()
if Qt.ControlModifier == int(mods) and v_delta: if int(Qt.ControlModifier) | int(Qt.ShiftModifier) == int(mods) and v_delta:
self.lightRequest.emit(v_delta)
elif Qt.ControlModifier == int(mods) and v_delta:
self.zoomRequest.emit(v_delta) self.zoomRequest.emit(v_delta)
else: else:
v_delta and self.scrollRequest.emit(v_delta, Qt.Vertical) v_delta and self.scrollRequest.emit(v_delta, Qt.Vertical)

33
libs/lightWidget.py Normal file
View File

@ -0,0 +1,33 @@
try:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
except ImportError:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class LightWidget(QSpinBox):
def __init__(self, title, value=50):
super(LightWidget, self).__init__()
self.setButtonSymbols(QAbstractSpinBox.NoButtons)
self.setRange(0, 100)
self.setSuffix(' %')
self.setValue(value)
self.setToolTip(title)
self.setStatusTip(self.toolTip())
self.setAlignment(Qt.AlignCenter)
def minimumSizeHint(self):
height = super(LightWidget, self).minimumSizeHint().height()
fm = QFontMetrics(self.font())
width = fm.width(str(self.maximum()))
return QSize(width, height)
def color(self):
if self.value() == 50:
return None
strength = int(self.value()/100 * 255 + 0.5)
return QColor(strength, strength, strength)

View File

@ -27,6 +27,9 @@
<file alias="zoom">resources/icons/zoom.png</file> <file alias="zoom">resources/icons/zoom.png</file>
<file alias="zoom-in">resources/icons/zoom-in.png</file> <file alias="zoom-in">resources/icons/zoom-in.png</file>
<file alias="zoom-out">resources/icons/zoom-out.png</file> <file alias="zoom-out">resources/icons/zoom-out.png</file>
<file alias="light_reset">resources/icons/light_reset.png</file>
<file alias="light_lighten">resources/icons/light_lighten.png</file>
<file alias="light_darken">resources/icons/light_darken.png</file>
<file alias="delete">resources/icons/cancel.png</file> <file alias="delete">resources/icons/cancel.png</file>
<file alias="next">resources/icons/next.png</file> <file alias="next">resources/icons/next.png</file>
<file alias="prev">resources/icons/prev.png</file> <file alias="prev">resources/icons/prev.png</file>

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="62.630001mm"
height="62.630001mm"
viewBox="0 0 62.630001 62.630001"
version="1.1"
id="svg5304"
inkscape:export-xdpi="9.7749033"
inkscape:export-ydpi="9.7749033"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
sodipodi:docname="light_brighten.svg"
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">
<sodipodi:namedview
id="namedview5306"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.557211"
inkscape:cx="34.998468"
inkscape:cy="107.88519"
inkscape:window-width="1916"
inkscape:window-height="1046"
inkscape:window-x="0"
inkscape:window-y="14"
inkscape:window-maximized="1"
inkscape:current-layer="layer1"
showguides="true"
inkscape:guide-bbox="true">
<sodipodi:guide
position="31.348111,32.811064"
orientation="1,0"
id="guide1684" />
<sodipodi:guide
position="40.947939,31.281888"
orientation="0,-1"
id="guide1686" />
<sodipodi:guide
position="7.3908081,55.253208"
orientation="0.70710678,0.70710678"
id="guide1688"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15.758196,15.75491"
orientation="-0.70710678,0.70710678"
id="guide1690"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
</sodipodi:namedview>
<defs
id="defs5301" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-203.83832,-71.309715)">
<circle
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.23761;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"
id="path936"
cx="235.19633"
cy="102.68153"
r="10.674651" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 235.18643,85.591175 V 73.397669"
id="path1269" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 235.18643,132.01987 V 119.82636"
id="path1269-3" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 247.31125,114.76863 8.62212,8.62211"
id="path1269-6" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 214.45899,81.916379 8.62212,8.62211"
id="path1269-6-3" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 252.29226,102.65783 h 12.19352"
id="path1269-7" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 205.84546,102.65783 h 12.19352"
id="path1269-7-5" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 255.86336,81.91796 -8.62211,8.62212"
id="path1269-6-5" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 223.05193,114.72939 -8.62211,8.62212"
id="path1269-6-5-6" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 B

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="62.228001mm"
height="62.228001mm"
viewBox="0 0 62.228001 62.228001"
version="1.1"
id="svg5125"
inkscape:export-xdpi="9.7962332"
inkscape:export-ydpi="9.7962332"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
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">
<sodipodi:namedview
id="namedview5127"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.7786055"
inkscape:cx="285.76731"
inkscape:cy="139.99387"
inkscape:window-width="1916"
inkscape:window-height="1046"
inkscape:window-x="0"
inkscape:window-y="14"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs5122" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-29.373413,-111.60912)">
<path
id="path3811"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:5.23083;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill"
d="m 59.434186,113.30847 a 29.762751,29.762751 0 0 0 -14.233875,3.64581 24.884542,24.226615 0 0 1 7.144983,-1.02718 24.884542,24.226615 0 0 1 24.884111,24.22658 24.884542,24.226615 0 0 1 -24.884111,24.22726 24.884542,24.226615 0 0 1 -20.79296,-10.93947 29.762751,29.762751 0 0 0 27.881852,19.39275 29.762751,29.762751 0 0 0 29.762545,-29.76321 29.762751,29.762751 0 0 0 -29.762545,-29.76254 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 B

View File

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="62.630001mm"
height="62.630001mm"
viewBox="0 0 62.630001 62.630001"
version="1.1"
id="svg9023"
inkscape:export-xdpi="9.7299995"
inkscape:export-ydpi="9.7299995"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
sodipodi:docname="light_reset.svg"
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">
<sodipodi:namedview
id="namedview9025"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="2.2022289"
inkscape:cx="78.783817"
inkscape:cy="145.30733"
inkscape:window-width="1916"
inkscape:window-height="1058"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs9020" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-75.546089,-129.8161)">
<path
id="path936-2"
style="stroke-width:0.893163;stroke-linecap:round;stroke-linejoin:round;paint-order:markers stroke fill"
d="M 118.64258 78.96875 A 40.125506 40.125506 0 0 0 78.517578 119.09375 A 40.125506 40.125506 0 0 0 80.337891 130.81641 L 153.37891 99.007812 A 40.125506 40.125506 0 0 0 118.64258 78.96875 z "
transform="matrix(0.26458333,0,0,0.26458333,75.546089,129.8161)" />
<path
id="rect8031-9"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:5.36721;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill"
d="m 133.84074,148.31878 -9.60962,4.19947 a 24.226615,24.884542 89.927756 0 1 0.89687,6.36385 24.226615,24.884542 89.927756 0 1 -24.85372,24.25881 24.226615,24.884542 89.927756 0 1 -20.806298,-10.91315 29.762751,29.762751 0 0 0 27.905948,19.35743 29.762751,29.762751 0 0 0 29.72496,-29.80052 29.762751,29.762751 0 0 0 -3.25814,-13.46589 z" />
<path
style="fill:none;stroke:#000000;stroke-width:0.258714px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 75.612466,173.64974 138.37433,146.19963"
id="path8580"
sodipodi:nodetypes="cc" />
<path
id="path936"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.898054;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"
d="M 118.50195 78.773438 A 40.345138 40.345138 0 0 0 78.15625 119.11914 A 40.345138 40.345138 0 0 0 79.972656 130.99609 L 153.33984 98.779297 A 40.345138 40.345138 0 0 0 118.50195 78.773438 z "
transform="matrix(0.26458333,0,0,0.26458333,75.546089,129.8161)" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 106.88976,144.24271 V 132.0492"
id="path1269" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 86.162341,140.56791 8.62212,8.62211"
id="path1269-6-3" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 77.548811,161.30936 h 12.19352"
id="path1269-7-5" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 127.56669,140.56949 -8.62211,8.62212"
id="path1269-6-5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -52,6 +52,13 @@ fitWin=Fit Window
fitWinDetail=Zoom follows window size fitWinDetail=Zoom follows window size
fitWidth=Fit Width fitWidth=Fit Width
fitWidthDetail=Zoom follows window width fitWidthDetail=Zoom follows window width
lightbrighten=Brighten
lightbrightenDetail=Increase Image Brightness
lightdarken=Darken
lightdarkenDetail=Decrease Image Brightness
lightreset=Original Brightness
lightresetDetail=Restore original brightness
lightWidgetTitle=Image Brightness
editLabel=Edit Label editLabel=Edit Label
editLabelDetail=Modify the label of the selected Box editLabelDetail=Modify the label of the selected Box
shapeLineColor=Shape Line Color shapeLineColor=Shape Line Color