aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2018-12-05 15:37:27 -0800
committerAnders Broman <a.broman58@gmail.com>2019-01-08 04:48:26 +0000
commit3c372c7bac98d34d0342837007f3b86c3cba8ff8 (patch)
treeb444b502d5f7ae5f2ed75657d764b141fb9314e2
parent5d30fb5d1a05917648667c368be9f9dbd295b9b1 (diff)
Qt: Add syntax line edit feedback symbols.
Draw a circle+backslash or a warning triangle in the far right of the line edit entry for invalid and deprecated filters respectively. This should provide an additional clue for color blind users. Bug: 15326 Change-Id: I55a1e214834a340ccda3bfe8880bba12c5e274e9 Reviewed-on: https://code.wireshark.org/review/30936 Reviewed-by: Gerald Combs <gerald@wireshark.org> Petri-Dish: Gerald Combs <gerald@wireshark.org> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--image/stock_icons.qrc4
-rw-r--r--image/stock_icons/14x14/x-filter-deprecated.pngbin0 -> 316 bytes
-rw-r--r--image/stock_icons/14x14/x-filter-deprecated.svg99
-rw-r--r--image/stock_icons/14x14/x-filter-deprecated@2x.pngbin0 -> 402 bytes
-rw-r--r--image/stock_icons/14x14/x-filter-invalid.pngbin0 -> 211 bytes
-rw-r--r--image/stock_icons/14x14/x-filter-invalid.svg89
-rw-r--r--image/stock_icons/14x14/x-filter-invalid@2x.pngbin0 -> 445 bytes
-rwxr-xr-ximage/stock_icons/svg-to-png.sh4
-rw-r--r--ui/qt/main_window.cpp2
-rw-r--r--ui/qt/widgets/capture_filter_edit.cpp2
-rw-r--r--ui/qt/widgets/display_filter_edit.cpp11
-rw-r--r--ui/qt/widgets/display_filter_edit.h1
-rw-r--r--ui/qt/widgets/syntax_line_edit.cpp51
-rw-r--r--ui/qt/widgets/syntax_line_edit.h1
14 files changed, 253 insertions, 11 deletions
diff --git a/image/stock_icons.qrc b/image/stock_icons.qrc
index 555ffcc39f..577a03b024 100644
--- a/image/stock_icons.qrc
+++ b/image/stock_icons.qrc
@@ -45,8 +45,12 @@
<file>stock_icons/14x14/x-filter-clear.active@2x.png</file>
<file>stock_icons/14x14/x-filter-clear.selected.png</file>
<file>stock_icons/14x14/x-filter-clear.selected@2x.png</file>
+ <file>stock_icons/14x14/x-filter-deprecated.png</file>
+ <file>stock_icons/14x14/x-filter-deprecated@2x.png</file>
<file>stock_icons/14x14/x-filter-dropdown.png</file>
<file>stock_icons/14x14/x-filter-dropdown@2x.png</file>
+ <file>stock_icons/14x14/x-filter-invalid.png</file>
+ <file>stock_icons/14x14/x-filter-invalid@2x.png</file>
<file>stock_icons/14x14/x-filter-matching-bookmark.png</file>
<file>stock_icons/14x14/x-filter-matching-bookmark@2x.png</file>
<file>stock_icons/14x14/x-filter-matching-bookmark.active.png</file>
diff --git a/image/stock_icons/14x14/x-filter-deprecated.png b/image/stock_icons/14x14/x-filter-deprecated.png
new file mode 100644
index 0000000000..e2da3f0227
--- /dev/null
+++ b/image/stock_icons/14x14/x-filter-deprecated.png
Binary files differ
diff --git a/image/stock_icons/14x14/x-filter-deprecated.svg b/image/stock_icons/14x14/x-filter-deprecated.svg
new file mode 100644
index 0000000000..65b4258a0a
--- /dev/null
+++ b/image/stock_icons/14x14/x-filter-deprecated.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="28"
+ height="28"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
+ sodipodi:docname="x-filter-deprecated.svg"
+ inkscape:export-filename="x-filter-deprecated.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="17.817039"
+ inkscape:cx="16.589324"
+ inkscape:cy="13.703087"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1255"
+ inkscape:window-height="815"
+ inkscape:window-x="150"
+ inkscape:window-y="885"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid9515" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ <cc:license
+ rdf:resource="" />
+ <dc:description>Original font: DejaVu Serif</dc:description>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1024.3622)">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Helvetica;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ x="-34.648232"
+ y="28.228661"
+ id="text2997"
+ transform="translate(0,952.36218)"><tspan
+ sodipodi:role="line"
+ id="tspan2999"
+ x="-34.648232"
+ y="28.228661"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:1.25;font-family:'DejaVu Serif';-inkscape-font-specification:'DejaVu Serif'"> </tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="5.3898778"
+ y="1012.4372"
+ id="text42351"><tspan
+ sodipodi:role="line"
+ id="tspan42349"
+ x="5.3898778"
+ y="1024.6665" /></text>
+ <g
+ aria-label="⚠︎ "
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:100%;font-family:Helvetica;-inkscape-font-specification:'Helvetica, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.15383887px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text42355"
+ transform="matrix(0.86666657,0,0,0.86667772,-6.7144534,177.91184)">
+ <path
+ d="m 24.501295,997.48383 c 0.03333,-1.5 0.333333,-4.33329 0.633333,-5.99995 l 0.233333,-1.36667 c 0.06667,-0.3 0.06667,-0.56667 0.06667,-0.8 0,-0.8 -0.4,-1.06667 -1.533333,-1.06667 -1.066667,0 -1.466667,0.3 -1.466667,1.06667 0,0.2 0.03333,0.56667 0.06667,0.8 l 0.233333,1.36667 c 0.333333,1.7 0.6,4.49995 0.633333,5.99995 z m -0.6,1.1 c -0.8,0 -1.466667,0.7 -1.466667,1.49997 0,0.8667 0.666667,1.5334 1.533333,1.5334 0.833334,0 1.5,-0.7 1.5,-1.5334 0,-0.8333 -0.666666,-1.49997 -1.566666,-1.49997 z m 0.03333,-17.89995 -14.9999993,23.76662 H 38.934629 Z m 0,3.1 11.833334,18.99992 H 12.067961 Z"
+ style="stroke-width:1.15383887px"
+ id="path42357"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
diff --git a/image/stock_icons/14x14/x-filter-deprecated@2x.png b/image/stock_icons/14x14/x-filter-deprecated@2x.png
new file mode 100644
index 0000000000..5c206670aa
--- /dev/null
+++ b/image/stock_icons/14x14/x-filter-deprecated@2x.png
Binary files differ
diff --git a/image/stock_icons/14x14/x-filter-invalid.png b/image/stock_icons/14x14/x-filter-invalid.png
new file mode 100644
index 0000000000..9d28c93fb2
--- /dev/null
+++ b/image/stock_icons/14x14/x-filter-invalid.png
Binary files differ
diff --git a/image/stock_icons/14x14/x-filter-invalid.svg b/image/stock_icons/14x14/x-filter-invalid.svg
new file mode 100644
index 0000000000..27c68dfa71
--- /dev/null
+++ b/image/stock_icons/14x14/x-filter-invalid.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="28"
+ height="28"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
+ sodipodi:docname="x-filter-invalid.svg"
+ inkscape:export-filename="x-filter-invalid.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="19.25"
+ inkscape:cx="18.219345"
+ inkscape:cy="16"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1188"
+ inkscape:window-height="789"
+ inkscape:window-x="189"
+ inkscape:window-y="886"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid22528" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ <cc:license
+ rdf:resource="" />
+ <dc:description>Original font: DejaVu Serif</dc:description>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1024.3622)">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Helvetica;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ x="-34.648232"
+ y="28.228661"
+ id="text2997"
+ transform="translate(0,952.36218)"><tspan
+ sodipodi:role="line"
+ id="tspan2999"
+ x="-34.648232"
+ y="28.228661"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:1.25;font-family:'DejaVu Serif';-inkscape-font-specification:'DejaVu Serif'"> </tspan></text>
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.2, 0.2;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="path22530"
+ cx="14"
+ cy="1038.3622"
+ r="12" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 6,1029.942 c 16.420199,16.4202 16.420199,16.4202 16.420199,16.4202"
+ id="path22532"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/image/stock_icons/14x14/x-filter-invalid@2x.png b/image/stock_icons/14x14/x-filter-invalid@2x.png
new file mode 100644
index 0000000000..8bccd9443b
--- /dev/null
+++ b/image/stock_icons/14x14/x-filter-invalid@2x.png
Binary files differ
diff --git a/image/stock_icons/svg-to-png.sh b/image/stock_icons/svg-to-png.sh
index 39cbf9d1fb..3fb8ab87e1 100755
--- a/image/stock_icons/svg-to-png.sh
+++ b/image/stock_icons/svg-to-png.sh
@@ -61,7 +61,9 @@ ICONS="
x-filter-clear
x-filter-clear.active
x-filter-clear.selected
+ x-filter-deprecated
x-filter-dropdown
+ x-filter-invalid
x-filter-matching-bookmark
x-filter-matching-bookmark.active
x-filter-matching-bookmark.selected
@@ -119,7 +121,7 @@ for SIZE in 14x14 16x16 24x14 24x14 ; do
done
for QRC_FILE in $QRC_FILES ; do
- echo " <file>toolbar/${QRC_FILE}</file>"
+ echo " <file>stock_icons/${QRC_FILE}</file>"
done
#
diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp
index 17ca335aeb..f8a0a631f9 100644
--- a/ui/qt/main_window.cpp
+++ b/ui/qt/main_window.cpp
@@ -376,8 +376,6 @@ MainWindow::MainWindow(QWidget *parent) :
connect(df_edit, SIGNAL(pushFilterSyntaxStatus(const QString&)),
main_ui_->statusBar, SLOT(pushFilterStatus(const QString&)));
connect(df_edit, SIGNAL(popFilterSyntaxStatus()), main_ui_->statusBar, SLOT(popFilterStatus()));
- connect(df_edit, SIGNAL(pushFilterSyntaxWarning(const QString&)),
- main_ui_->statusBar, SLOT(pushTemporaryStatus(const QString&)));
connect(df_edit, SIGNAL(filterPackets(QString,bool)), this, SLOT(filterPackets(QString,bool)));
connect(df_edit, SIGNAL(showPreferencesDialog(QString)),
this, SLOT(showPreferencesDialog(QString)));
diff --git a/ui/qt/widgets/capture_filter_edit.cpp b/ui/qt/widgets/capture_filter_edit.cpp
index 351587f1b2..a00edbd80d 100644
--- a/ui/qt/widgets/capture_filter_edit.cpp
+++ b/ui/qt/widgets/capture_filter_edit.cpp
@@ -318,6 +318,7 @@ void CaptureFilterEdit::checkFilter(const QString& filter)
{
setSyntaxState(Busy);
popFilterSyntaxStatus();
+ setToolTip(QString());
bool empty = filter.isEmpty();
setConflict(false);
@@ -412,6 +413,7 @@ void CaptureFilterEdit::setFilterSyntaxState(QString filter, int state, QString
setSyntaxState((SyntaxState)state);
if (!err_msg.isEmpty()) {
emit pushFilterSyntaxStatus(err_msg);
+ setToolTip(err_msg);
}
}
diff --git a/ui/qt/widgets/display_filter_edit.cpp b/ui/qt/widgets/display_filter_edit.cpp
index e3e9599f16..a76ebfee3f 100644
--- a/ui/qt/widgets/display_filter_edit.cpp
+++ b/ui/qt/widgets/display_filter_edit.cpp
@@ -233,8 +233,10 @@ void DisplayFilterEdit::resizeEvent(QResizeEvent *)
void DisplayFilterEdit::focusOutEvent(QFocusEvent *event)
{
- if (syntaxState() == Valid)
+ if (syntaxState() == Valid) {
emit popFilterSyntaxStatus();
+ setToolTip(QString());
+ }
SyntaxLineEdit::focusOutEvent(event);
}
@@ -251,13 +253,15 @@ void DisplayFilterEdit::checkFilter(const QString& filter_text)
clear_button_->setVisible(!filter_text.isEmpty());
}
- popFilterSyntaxStatus();
+ emit popFilterSyntaxStatus();
+ setToolTip(QString());
checkDisplayFilter(filter_text);
switch (syntaxState()) {
case Deprecated:
{
- emit pushFilterSyntaxWarning(syntaxErrorMessage());
+ emit pushFilterSyntaxStatus(syntaxErrorMessage());
+ setToolTip(syntaxErrorMessage());
break;
}
case Invalid:
@@ -265,6 +269,7 @@ void DisplayFilterEdit::checkFilter(const QString& filter_text)
QString invalidMsg(tr("Invalid filter: "));
invalidMsg.append(syntaxErrorMessage());
emit pushFilterSyntaxStatus(invalidMsg);
+ setToolTip(invalidMsg);
break;
}
default:
diff --git a/ui/qt/widgets/display_filter_edit.h b/ui/qt/widgets/display_filter_edit.h
index 72eb8cfeca..9a89fbfe3a 100644
--- a/ui/qt/widgets/display_filter_edit.h
+++ b/ui/qt/widgets/display_filter_edit.h
@@ -72,7 +72,6 @@ private:
signals:
void pushFilterSyntaxStatus(const QString&);
void popFilterSyntaxStatus();
- void pushFilterSyntaxWarning(const QString&);
void filterPackets(QString new_filter, bool force);
void showPreferencesDialog(QString pane_name);
};
diff --git a/ui/qt/widgets/syntax_line_edit.cpp b/ui/qt/widgets/syntax_line_edit.cpp
index ae4e082548..feee60a8fe 100644
--- a/ui/qt/widgets/syntax_line_edit.cpp
+++ b/ui/qt/widgets/syntax_line_edit.cpp
@@ -16,21 +16,22 @@
#include <epan/dfilter/dfilter.h>
#include <epan/column-info.h>
+#include <wsutil/utf8_entities.h>
+
#include <ui/qt/widgets/syntax_line_edit.h>
#include <ui/qt/utils/color_utils.h>
+#include <ui/qt/utils/stock_icon.h>
#include <QAbstractItemView>
#include <QCompleter>
#include <QKeyEvent>
+#include <QPainter>
#include <QScrollBar>
#include <QStringListModel>
+#include <QStyleOptionFrame>
#include <limits>
-// To do:
-// - Add indicator icons for syntax states to make things more clear for
-// color blind people?
-
const int max_completion_items_ = 20;
SyntaxLineEdit::SyntaxLineEdit(QWidget *parent) :
@@ -350,6 +351,48 @@ void SyntaxLineEdit::focusOutEvent(QFocusEvent *event)
QLineEdit::focusOutEvent(event);
}
+// Add indicator icons for syntax states in order to make things more clear for
+// color blind people.
+void SyntaxLineEdit::paintEvent(QPaintEvent *event)
+{
+ QLineEdit::paintEvent(event);
+
+ QString si_name;
+
+ switch (syntax_state_) {
+ case Invalid:
+ si_name = "x-filter-invalid";
+ break;
+ case Deprecated:
+ si_name = "x-filter-deprecated";
+ break;
+ default:
+ return;
+ }
+
+ QStyleOptionFrame opt;
+ initStyleOption(&opt);
+ QRect cr = style()->subElementRect(QStyle::SE_LineEditContents, &opt, this);
+ QRect sir = QRect(0, 0, 14, 14); // QIcon::paint scales, which is not what we want.
+
+ if (fontMetrics().width(text()) + cr.height() > cr.width() || cr.height() < sir.height()) {
+ // No space to draw
+ return;
+ }
+
+ QIcon state_icon = StockIcon(si_name);
+ if (state_icon.isNull()) {
+ return;
+ }
+
+ int si_off = (cr.height() - sir.height()) / 2;
+ sir.moveTop(si_off);
+ sir.moveRight(cr.right() - si_off);
+ QPainter painter(this);
+ painter.setOpacity(0.25);
+ state_icon.paint(&painter, sir);
+}
+
void SyntaxLineEdit::insertFieldCompletion(const QString &completion_text)
{
if (!completer_) return;
diff --git a/ui/qt/widgets/syntax_line_edit.h b/ui/qt/widgets/syntax_line_edit.h
index 9244563c43..820795fd96 100644
--- a/ui/qt/widgets/syntax_line_edit.h
+++ b/ui/qt/widgets/syntax_line_edit.h
@@ -61,6 +61,7 @@ protected:
void completionKeyPressEvent(QKeyEvent *event);
void completionFocusInEvent(QFocusEvent *event);
virtual void focusOutEvent(QFocusEvent *event);
+ virtual void paintEvent(QPaintEvent *event);
private:
SyntaxState syntax_state_;