Make StockIconToolButton independent.

A recent set of changes replaced the "dfilter_erase_" images with an
"x-filter-clear" stock icon set.

Move StockIconToolButton to its own compilation unit. Use it in
CaptureFilterEdit and ProgressFrame to load the "x-filter-clear" icon.

Bug: 11516
Change-Id: I5d5864d089fb56827d130d493d53e7de6a7c03b5
Reviewed-on: https://code.wireshark.org/review/10475
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
This commit is contained in:
Gerald Combs 2015-09-10 14:42:07 -07:00
parent 5a3ad8fe06
commit b55ae49ba1
11 changed files with 250 additions and 188 deletions

View File

@ -125,6 +125,7 @@ set(WIRESHARK_QT_HEADERS
stats_tree_dialog.h
service_response_time_dialog.h
simple_statistics_dialog.h
stock_icon_tool_button.h
syntax_line_edit.h
tap_parameter_dialog.h
tcp_stream_dialog.h
@ -259,6 +260,7 @@ set(WIRESHARK_QT_SRC
splash_overlay.cpp
sparkline_delegate.cpp
stock_icon.cpp
stock_icon_tool_button.cpp
syntax_line_edit.cpp
tap_parameter_dialog.cpp
tcp_stream_dialog.cpp

View File

@ -244,6 +244,7 @@ MOC_HDRS = \
sparkline_delegate.h \
splash_overlay.h \
stats_tree_dialog.h \
stock_icon_tool_button.h \
syntax_line_edit.h \
tap_parameter_dialog.h \
tcp_stream_dialog.h \
@ -483,6 +484,7 @@ WIRESHARK_QT_SRC = \
sparkline_delegate.cpp \
splash_overlay.cpp \
stock_icon.cpp \
stock_icon_tool_button.cpp \
syntax_line_edit.cpp \
tap_parameter_dialog.cpp \
tcp_stream_dialog.cpp \

View File

@ -641,6 +641,7 @@ HEADERS += \
sequence_dialog.h \
simple_dialog.h \
sparkline_delegate.h \
stock_icon_tool_button.h \
syntax_line_edit.h \
tap_parameter_dialog.h \
time_shift_dialog.h \
@ -760,6 +761,7 @@ SOURCES += \
splash_overlay.cpp \
stats_tree_dialog.cpp \
stock_icon.cpp \
stock_icon_tool_button.cpp \
syntax_line_edit.cpp \
tap_parameter_dialog.cpp \
tcp_stream_dialog.cpp \

View File

@ -33,6 +33,7 @@
#include "capture_filter_edit.h"
#include "capture_filter_syntax_worker.h"
#include "stock_icon_tool_button.h"
#include "wireshark_application.h"
#include <QComboBox>
@ -124,90 +125,54 @@ CaptureFilterEdit::CaptureFilterEdit(QWidget *parent, bool plain) :
setPlaceholderText(placeholder_text_);
#endif
// DFCombo
// Bookmark (star)
// DispalyFilterEdit
// Clear button
// Apply (right arrow) + Cancel (x) + Reload (arrowed circle)
// Combo drop-down
// XXX - Move bookmark and apply buttons to the toolbar a la Firefox, Chrome & Safari?
// XXX - Use native buttons on OS X?
// These are fully implemented in DisplayFilterEdit but not here.
if (!plain_) {
bookmark_button_ = new QToolButton(this);
bookmark_button_ = new StockIconToolButton(this, "x-filter-bookmark");
bookmark_button_->setCursor(Qt::ArrowCursor);
bookmark_button_->setStyleSheet(QString(
"QToolButton { /* all types of tool button */"
" border 0 0 0 0;"
#ifdef Q_OS_MAC
" border-right: %1px solid gray;"
#else
" border-right: %1px solid palette(shadow);"
#endif
" border-top-left-radius: 3px;"
" border-bottom-left-radius: 3px;"
" padding-left: 1px;"
" image: url(:/dfilter/dfilter_bookmark_normal.png) center;"
"}"
"QToolButton:hover {"
" image: url(:/dfilter/dfilter_bookmark_hover.png) center;"
"}"
"QToolButton:pressed {"
" image: url(:/dfilter/dfilter_bookmark_pressed.png) center;"
"}"
"QToolButton:disabled {"
" image: url(:/dfilter/dfilter_bookmark_disabled.png) center;"
"}"
).arg(plain_ ? 0 : 1)
bookmark_button_->setPopupMode(QToolButton::InstantPopup);
bookmark_button_->setToolTip(tr("Manage saved bookmarks."));
bookmark_button_->setIconSize(QSize(14, 14));
bookmark_button_->setStyleSheet(
"QToolButton {"
" border: none;"
" background: transparent;" // Disables platform style on Windows.
" padding: 0 0 0 0;"
"}"
"QToolButton::menu-indicator { image: none; }"
);
connect(bookmark_button_, SIGNAL(clicked()), this, SLOT(bookmarkClicked()));
}
if (!plain_) {
clear_button_ = new QToolButton(this);
clear_button_ = new StockIconToolButton(this, "x-filter-clear");
clear_button_->setCursor(Qt::ArrowCursor);
clear_button_->setToolTip(QString());
clear_button_->setIconSize(QSize(14, 14));
clear_button_->setStyleSheet(
"QToolButton {"
" image: url(:/dfilter/dfilter_erase_normal.png) center;"
" border: none;"
" width: 16px;"
"}"
"QToolButton:hover {"
" image: url(:/dfilter/dfilter_erase_active.png) center;"
"}"
"QToolButton:pressed {"
" image: url(:/dfilter/dfilter_erase_selected.png) center;"
"}"
);
clear_button_->hide();
"QToolButton {"
" border: none;"
" background: transparent;" // Disables platform style on Windows.
" padding: 0 0 0 0;"
" margin-left: 1px;"
"}"
);
connect(clear_button_, SIGNAL(clicked()), this, SLOT(clear()));
}
connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(checkFilter(const QString&)));
if (!plain_) {
apply_button_ = new QToolButton(this);
apply_button_ = new StockIconToolButton(this, "x-filter-apply");
apply_button_->setCursor(Qt::ArrowCursor);
apply_button_->setEnabled(false);
apply_button_->setToolTip(tr("Apply this filter string to the display."));
apply_button_->setIconSize(QSize(24, 14));
apply_button_->setStyleSheet(
"QToolButton { /* all types of tool button */"
" border 0 0 0 0;"
" border-top-right-radius: 3px;"
" border-bottom-right-radius: 3px;"
" padding-right: 1px;"
" image: url(:/dfilter/dfilter_apply_normal.png) center;"
"}"
"QToolButton:hover {"
" image: url(:/dfilter/dfilter_apply_hover.png) center;"
"}"
"QToolButton:pressed {"
" image: url(:/dfilter/dfilter_apply_pressed.png) center;"
"}"
"QToolButton:disabled {"
" image: url(:/dfilter/dfilter_apply_disabled.png) center;"
"QToolButton {"
" border: none;"
" background: transparent;" // Disables platform style on Windows.
" padding: 0 0 0 0;"
"}"
);
connect(apply_button_, SIGNAL(clicked()), this, SLOT(applyCaptureFilter()));
@ -244,6 +209,8 @@ CaptureFilterEdit::CaptureFilterEdit(QWidget *parent, bool plain) :
this, SLOT(setFilterSyntaxState(QString,bool,QString)));
connect(syntax_thread, SIGNAL(finished()), syntax_worker_, SLOT(deleteLater()));
syntax_thread->start();
checkFilter();
}
#if QT_VERSION < QT_VERSION_CHECK(4, 7, 0)
@ -285,14 +252,17 @@ void CaptureFilterEdit::resizeEvent(QResizeEvent *)
if (clear_button_) {
clear_button_->move(contentsRect().right() - frameWidth - cbsz.width() - apsz.width(),
contentsRect().top());
clear_button_->setMinimumHeight(contentsRect().height());
clear_button_->setMaximumHeight(contentsRect().height());
}
if (apply_button_) {
apply_button_->move(contentsRect().right() - frameWidth - apsz.width(),
contentsRect().top());
apply_button_->setMinimumHeight(contentsRect().height());
apply_button_->setMaximumHeight(contentsRect().height());
}
if (bookmark_button_) {
bookmark_button_->setMinimumHeight(contentsRect().height());
bookmark_button_->setMaximumHeight(contentsRect().height());
}
}

View File

@ -27,6 +27,7 @@
#include "syntax_line_edit.h"
class CaptureFilterSyntaxWorker;
class StockIconToolButton;
class CaptureFilterEdit : public SyntaxLineEdit
{
@ -56,9 +57,9 @@ private:
bool plain_;
bool field_name_only_;
QString placeholder_text_;
QToolButton *bookmark_button_;
QToolButton *clear_button_;
QToolButton *apply_button_;
StockIconToolButton *bookmark_button_;
StockIconToolButton *clear_button_;
StockIconToolButton *apply_button_;
CaptureFilterSyntaxWorker *syntax_worker_;
void buildCompletionList(const QString& primitive_word);

View File

@ -31,23 +31,17 @@
#include "display_filter_edit.h"
#include "filter_dialog.h"
#include "stock_icon.h"
#include "stock_icon_tool_button.h"
#include "syntax_line_edit.h"
#include <QAction>
#include <QAbstractItemView>
#include <QApplication>
#include <QComboBox>
#include <QCompleter>
#include <QEvent>
#include <QIcon>
#include <QPixmap>
#include <QMenu>
#include <QMouseEvent>
#include <QPainter>
#include <QStringListModel>
#include <QStyleOptionFrame>
#include <QToolButton>
#include "ui/utf8_entities.h"
@ -57,94 +51,6 @@
// - Add a separator or otherwise distinguish between recent items and fields
// in the completion dropdown.
// We want nice icons that render correctly, and that are responsive
// when the user hovers and clicks them.
// Using setIcon renders correctly on normal and retina displays. It is
// not completely responsive, particularly on OS X.
// Calling setStyleSheet is responsive, but does not render correctly on
// retina displays: https://bugreports.qt.io/browse/QTBUG-36825
// Subclass QToolButton, which lets us catch events and set icons as needed.
class StockIconToolButton : public QToolButton
{
public:
explicit StockIconToolButton(QWidget * parent = 0, QString stock_icon_name = QString()) :
QToolButton(parent),
leave_timer_(0)
{
if (!stock_icon_name.isEmpty()) {
setStockIcon(stock_icon_name);
}
}
void setIconMode(QIcon::Mode mode = QIcon::Normal) {
QIcon mode_icon;
QList<QIcon::State> states = QList<QIcon::State>() << QIcon::Off << QIcon::On;
foreach (QIcon::State state, states) {
foreach (QSize size, base_icon_.availableSizes(mode, state)) {
mode_icon.addPixmap(base_icon_.pixmap(size, mode, state), mode, state);
}
}
setIcon(mode_icon);
}
void setStockIcon(QString icon_name) {
base_icon_ = StockIcon(icon_name);
setIconMode();
}
protected:
virtual bool event(QEvent *event) {
switch (event->type()) {
case QEvent::Enter:
if (isEnabled()) {
setIconMode(QIcon::Active);
if (leave_timer_ > 0) killTimer(leave_timer_);
leave_timer_ = startTimer(leave_interval_);
}
break;
case QEvent::MouseButtonPress:
if (isEnabled()) {
setIconMode(QIcon::Selected);
}
break;
case QEvent::Leave:
if (leave_timer_ > 0) killTimer(leave_timer_);
leave_timer_ = 0;
case QEvent::MouseButtonRelease:
setIconMode();
break;
case QEvent::Timer:
{
// We can lose QEvent::Leave, QEvent::HoverLeave and underMouse()
// if a tooltip appears, at least OS X:
// https://bugreports.qt.io/browse/QTBUG-46379
// Work around the issue by periodically checking the mouse
// position and scheduling a fake leave event when the mouse
// moves away.
QTimerEvent *te = (QTimerEvent *) event;
bool under_mouse = rect().contains(mapFromGlobal(QCursor::pos()));
if (te->timerId() == leave_timer_ && !under_mouse) {
killTimer(leave_timer_);
leave_timer_ = 0;
QMouseEvent *me = new QMouseEvent(QEvent::Leave, mapFromGlobal(QCursor::pos()), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
QApplication::postEvent(this, me);
}
break;
}
default:
break;
}
return QToolButton::event(event);
}
private:
QIcon base_icon_;
int leave_timer_;
static const int leave_interval_ = 500; // ms
};
#if defined(Q_OS_MAC) && 0
// http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSImage_Class/Reference/Reference.html
// http://www.virtualbox.org/svn/vbox/trunk/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaSpecialControls.mm

View File

@ -31,7 +31,7 @@
#include <QBoxLayout>
#include <QPropertyAnimation>
#include "stock_icon.h"
#include "stock_icon_tool_button.h"
#include "wireshark_application.h"
// To do:
@ -126,26 +126,20 @@ ProgressFrame::ProgressFrame(QWidget *parent) :
" background: transparent;"
"}"));
int one_em = fontMetrics().height();
ui->pushButton->setIconSize(QSize(one_em, one_em));
ui->pushButton->setStyleSheet(QString(
"QPushButton {"
" image: url(:/dfilter/dfilter_erase_normal.png) center;"
ui->stopButton->setStockIcon("x-filter-clear");
ui->stopButton->setIconSize(QSize(14, 14));
ui->stopButton->setStyleSheet(
"QToolButton {"
" border: none;"
" background: transparent;" // Disables platform style on Windows.
" padding: 0px;"
" margin: 0px;"
" min-height: 0.8em;"
" max-height: 1em;"
" min-width: 0.8em;"
" max-width: 1em;"
" border: 0px;"
" padding: 0px;"
" margin: 0px;"
" background: transparent;"
"}"
"QPushButton:hover {"
" image: url(:/dfilter/dfilter_erase_active.png) center;"
"}"
"QPushButton:pressed {"
" image: url(:/dfilter/dfilter_erase_selected.png) center;"
"}"));
);
connect(this, SIGNAL(showRequested(bool,bool,gboolean*)),
this, SLOT(show(bool,bool,gboolean*)));
hide();
@ -267,7 +261,7 @@ void ProgressFrame::hide()
#endif
}
void ProgressFrame::on_pushButton_clicked()
void ProgressFrame::on_stopButton_clicked()
{
emit stopLoading();
}
@ -279,9 +273,9 @@ void ProgressFrame::show(bool animate, bool terminate_is_stop, gboolean *stop_fl
stop_flag_ = stop_flag;
if (stop_flag) {
ui->pushButton->show();
ui->stopButton->show();
} else {
ui->pushButton->hide();
ui->stopButton->hide();
}
#if !defined(Q_OS_MAC) || QT_VERSION > QT_VERSION_CHECK(5, 0, 0)

View File

@ -71,8 +71,8 @@ signals:
void setHidden();
void stopLoading();
#if !defined(Q_OS_MAC) || QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
protected:
#if !defined(Q_OS_MAC) || QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
void timerEvent(QTimerEvent *event);
#endif
@ -93,7 +93,7 @@ private:
#endif
private slots:
void on_pushButton_clicked();
void on_stopButton_clicked();
void show(bool animate, bool terminate_is_stop, gboolean *stop_flag);
void setMaximumValue(int value);

View File

@ -40,7 +40,7 @@
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton">
<widget class="StockIconToolButton" name="stopButton">
<property name="text">
<string/>
</property>
@ -50,13 +50,17 @@
<height>12</height>
</size>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>StockIconToolButton</class>
<extends>QToolButton</extends>
<header>stock_icon_tool_button.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,123 @@
/* stock_icon_tool_button.cpp
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "stock_icon_tool_button.h"
#include "stock_icon.h"
#include <QApplication>
#include <QEvent>
#include <QMenu>
#include <QMouseEvent>
// We want nice icons that render correctly, and that are responsive
// when the user hovers and clicks them.
// Using setIcon renders correctly on normal and retina displays. It is
// not completely responsive, particularly on OS X.
// Calling setStyleSheet is responsive, but does not render correctly on
// retina displays: https://bugreports.qt.io/browse/QTBUG-36825
// Subclass QToolButton, which lets us catch events and set icons as needed.
StockIconToolButton::StockIconToolButton(QWidget * parent, QString stock_icon_name) :
QToolButton(parent),
leave_timer_(0)
{
if (!stock_icon_name.isEmpty()) {
setStockIcon(stock_icon_name);
}
}
void StockIconToolButton::setIconMode(QIcon::Mode mode)
{
QIcon mode_icon;
QList<QIcon::State> states = QList<QIcon::State>() << QIcon::Off << QIcon::On;
foreach (QIcon::State state, states) {
foreach (QSize size, base_icon_.availableSizes(mode, state)) {
mode_icon.addPixmap(base_icon_.pixmap(size, mode, state), mode, state);
}
}
setIcon(mode_icon);
}
void StockIconToolButton::setStockIcon(QString icon_name)
{
base_icon_ = StockIcon(icon_name);
setIconMode();
}
bool StockIconToolButton::event(QEvent *event)
{
switch (event->type()) {
case QEvent::Enter:
if (isEnabled()) {
setIconMode(QIcon::Active);
if (leave_timer_ > 0) killTimer(leave_timer_);
leave_timer_ = startTimer(leave_interval_);
}
break;
case QEvent::MouseButtonPress:
if (isEnabled()) {
setIconMode(QIcon::Selected);
}
break;
case QEvent::Leave:
if (leave_timer_ > 0) killTimer(leave_timer_);
leave_timer_ = 0;
case QEvent::MouseButtonRelease:
setIconMode();
break;
case QEvent::Timer:
{
// We can lose QEvent::Leave, QEvent::HoverLeave and underMouse()
// on OS X if a tooltip appears:
// https://bugreports.qt.io/browse/QTBUG-46379
// Work around the issue by periodically checking the mouse
// position and scheduling a fake leave event when the mouse
// moves away.
QTimerEvent *te = (QTimerEvent *) event;
bool under_mouse = rect().contains(mapFromGlobal(QCursor::pos()));
if (te->timerId() == leave_timer_ && !under_mouse) {
killTimer(leave_timer_);
leave_timer_ = 0;
QMouseEvent *me = new QMouseEvent(QEvent::Leave, mapFromGlobal(QCursor::pos()), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
QApplication::postEvent(this, me);
}
break;
}
default:
break;
}
return QToolButton::event(event);
}
/*
* Editor modelines
*
* Local Variables:
* c-basic-offset: 4
* tab-width: 8
* indent-tabs-mode: nil
* End:
*
* ex: set shiftwidth=4 tabstop=8 expandtab:
* :indentSize=4:tabSize=8:noTabs=true:
*/

View File

@ -0,0 +1,58 @@
/* stock_icon_tool_button.h
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef STOCKICONTOOLBUTTON_H
#define STOCKICONTOOLBUTTON_H
#include <QToolButton>
class StockIconToolButton : public QToolButton
{
Q_OBJECT
public:
explicit StockIconToolButton(QWidget * parent = 0, QString stock_icon_name = QString());
void setIconMode(QIcon::Mode mode = QIcon::Normal);
void setStockIcon(QString icon_name);
protected:
virtual bool event(QEvent *event);
private:
QIcon base_icon_;
int leave_timer_;
static const int leave_interval_ = 500; // ms
};
#endif // STOCKICONTOOLBUTTON_H
/*
* Editor modelines
*
* Local Variables:
* c-basic-offset: 4
* tab-width: 8
* indent-tabs-mode: nil
* End:
*
* ex: set shiftwidth=4 tabstop=8 expandtab:
* :indentSize=4:tabSize=8:noTabs=true:
*/