Improved status message filtering

* avoid re-init of widget if already initialized
* allow icons instead of text for severity radio buttons
* changing severity filter directly triggers new filtering
* use icon for new button
* init this->showFilterBar() as default (otherwise not functional)
* widths for filter bar buttons
This commit is contained in:
Klaus Basan
2017-03-20 16:35:47 +01:00
committed by Mathew Sutcliffe
parent 3575eed37b
commit 6825524025
11 changed files with 84 additions and 33 deletions

View File

@@ -55,6 +55,7 @@ namespace BlackGui
ui->tvp_StatusMessages->setAutoResizeFrequency(3); ui->tvp_StatusMessages->setAutoResizeFrequency(3);
ui->tvp_StatusMessages->setCustomMenu(new CLogMenu(this)); ui->tvp_StatusMessages->setCustomMenu(new CLogMenu(this));
ui->tvp_StatusMessages->menuAddItems(CStatusMessageView::MenuSave); ui->tvp_StatusMessages->menuAddItems(CStatusMessageView::MenuSave);
this->showFilterBar(); // default
} }
CLogComponent::~CLogComponent() CLogComponent::~CLogComponent()
@@ -89,6 +90,11 @@ namespace BlackGui
ui->filter_LogMessages->show(); ui->filter_LogMessages->show();
} }
void CLogComponent::filterUseRadioButtonDescriptiveIcons(bool oneCharacterText)
{
ui->filter_LogMessages->useRadioButtonDescriptiveIcons(oneCharacterText);
}
void CLogComponent::clear() void CLogComponent::clear()
{ {
ui->tvp_StatusMessages->clear(); ui->tvp_StatusMessages->clear();

View File

@@ -75,6 +75,9 @@ namespace BlackGui
//! Show a filter bar //! Show a filter bar
void showFilterBar(); void showFilterBar();
//! Set fi
void filterUseRadioButtonDescriptiveIcons(bool oneLetterText);
//! Clear //! Clear
void clear(); void clear();

View File

@@ -26,7 +26,7 @@ namespace BlackGui
connect(ui->tb_ClearForm, &QToolButton::clicked, this, &CFilterBarButtons::ps_buttonClicked); connect(ui->tb_ClearForm, &QToolButton::clicked, this, &CFilterBarButtons::ps_buttonClicked);
connect(ui->tb_Filter, &QToolButton::clicked, this, &CFilterBarButtons::ps_buttonClicked); connect(ui->tb_Filter, &QToolButton::clicked, this, &CFilterBarButtons::ps_buttonClicked);
connect(ui->tb_RemoveFilter, &QToolButton::clicked, this, &CFilterBarButtons::ps_buttonClicked); connect(ui->tb_RemoveFilter, &QToolButton::clicked, this, &CFilterBarButtons::ps_buttonClicked);
connect(ui->pb_New, &QToolButton::clicked, this, &CFilterBarButtons::ps_buttonClicked); connect(ui->tb_New, &QToolButton::clicked, this, &CFilterBarButtons::ps_buttonClicked);
} }
CFilterBarButtons::~CFilterBarButtons() CFilterBarButtons::~CFilterBarButtons()
@@ -43,7 +43,7 @@ namespace BlackGui
if (sender == ui->tb_ClearForm) { emit buttonClicked(ClearForm); } if (sender == ui->tb_ClearForm) { emit buttonClicked(ClearForm); }
else if (sender == ui->tb_Filter) { emit buttonClicked(Filter); } else if (sender == ui->tb_Filter) { emit buttonClicked(Filter); }
else if (sender == ui->tb_RemoveFilter) { emit buttonClicked(RemoveFilter); } else if (sender == ui->tb_RemoveFilter) { emit buttonClicked(RemoveFilter); }
else if (sender == ui->pb_New) else if (sender == ui->tb_New)
{ {
emit buttonClicked(RemoveFilter); emit buttonClicked(RemoveFilter);
emit buttonClicked(ClearForm); emit buttonClicked(ClearForm);

View File

@@ -2,9 +2,17 @@
<ui version="4.0"> <ui version="4.0">
<class>CFilterBarButtons</class> <class>CFilterBarButtons</class>
<widget class="QFrame" name="CFilterBarButtons"> <widget class="QFrame" name="CFilterBarButtons">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>211</width>
<height>23</height>
</rect>
</property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>140</width> <width>150</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
@@ -31,13 +39,13 @@
<widget class="QLineEdit" name="le_Count"> <widget class="QLineEdit" name="le_Count">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>40</width> <width>30</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>40</width> <width>75</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
@@ -49,7 +57,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item alignment="Qt::AlignLeft"> <item>
<widget class="QToolButton" name="tb_Filter"> <widget class="QToolButton" name="tb_Filter">
<property name="toolTip"> <property name="toolTip">
<string>filter</string> <string>filter</string>
@@ -63,7 +71,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item alignment="Qt::AlignLeft"> <item>
<widget class="QToolButton" name="tb_RemoveFilter"> <widget class="QToolButton" name="tb_RemoveFilter">
<property name="toolTip"> <property name="toolTip">
<string>remove filter</string> <string>remove filter</string>
@@ -77,7 +85,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item alignment="Qt::AlignLeft"> <item>
<widget class="QToolButton" name="tb_ClearForm"> <widget class="QToolButton" name="tb_ClearForm">
<property name="toolTip"> <property name="toolTip">
<string>clear form</string> <string>clear form</string>
@@ -95,16 +103,17 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="pb_New"> <widget class="QToolButton" name="tb_New">
<property name="maximumSize"> <property name="toolTip">
<size> <string>new (clear + remove filter)</string>
<width>30</width>
<height>16777215</height>
</size>
</property> </property>
<property name="text"> <property name="text">
<string>new</string> <string>new</string>
</property> </property>
<property name="icon">
<iconset resource="../../blackmisc/blackmisc.qrc">
<normaloff>:/diagona/icons/diagona/icons/cross-button.png</normaloff>:/diagona/icons/diagona/icons/cross-button.png</iconset>
</property>
</widget> </widget>
</item> </item>
<item> <item>
@@ -112,9 +121,6 @@
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>10</width> <width>10</width>

View File

@@ -20,6 +20,7 @@ namespace BlackGui
{ {
CFilterWidget::CFilterWidget(QWidget *parent) : QFrame(parent) CFilterWidget::CFilterWidget(QWidget *parent) : QFrame(parent)
{ {
Q_ASSERT_X(sGui, Q_FUNC_INFO, "sGui missing");
this->setWindowTitle("Filter widget"); this->setWindowTitle("Filter widget");
ps_onStyleSheetChanged(); ps_onStyleSheetChanged();
connect(sGui, &CGuiApplication::styleSheetsChanged, this, &CFilterWidget::ps_onStyleSheetChanged); connect(sGui, &CGuiApplication::styleSheetsChanged, this, &CFilterWidget::ps_onStyleSheetChanged);

View File

@@ -29,6 +29,10 @@ namespace BlackGui
connect(ui->le_Category, &QLineEdit::returnPressed, this, &CFilterWidget::triggerFilter); connect(ui->le_Category, &QLineEdit::returnPressed, this, &CFilterWidget::triggerFilter);
connect(ui->le_MessageText, &QLineEdit::returnPressed, this, &CFilterWidget::triggerFilter); connect(ui->le_MessageText, &QLineEdit::returnPressed, this, &CFilterWidget::triggerFilter);
connect(ui->rb_Error, &QRadioButton::released, this, &CStatusMessageFilterBar::radioButtonChanged);
connect(ui->rb_Info, &QRadioButton::released, this, &CStatusMessageFilterBar::radioButtonChanged);
connect(ui->rb_Warning, &QRadioButton::released, this, &CStatusMessageFilterBar::radioButtonChanged);
ui->le_Category->setCompleter(new QCompleter(CLogPattern::allHumanReadableNames(), this)); ui->le_Category->setCompleter(new QCompleter(CLogPattern::allHumanReadableNames(), this));
// reset form // reset form
@@ -43,6 +47,25 @@ namespace BlackGui
CStatusMessageFilterBar::~CStatusMessageFilterBar() CStatusMessageFilterBar::~CStatusMessageFilterBar()
{ } { }
void CStatusMessageFilterBar::useRadioButtonDescriptiveIcons(bool oneCharacterText)
{
CStatusMessage msg;
msg.setSeverity(CStatusMessage::SeverityError);
ui->rb_Error->setIcon(msg.toIcon().toQIcon());
ui->rb_Error->setToolTip(msg.getSeverityAsString());
ui->rb_Error->setText(oneCharacterText ? msg.getSeverityAsString().left(1) : "");
msg.setSeverity(CStatusMessage::SeverityWarning);
ui->rb_Warning->setIcon(msg.toIcon().toQIcon());
ui->rb_Warning->setToolTip(msg.getSeverityAsString());
ui->rb_Warning->setText(oneCharacterText ? msg.getSeverityAsString().left(1) : "");
msg.setSeverity(CStatusMessage::SeverityInfo);
ui->rb_Info->setIcon(msg.toIcon().toQIcon());
ui->rb_Info->setToolTip(msg.getSeverityAsString());
ui->rb_Info->setText(oneCharacterText ? msg.getSeverityAsString().left(1) : "");
}
std::unique_ptr<BlackGui::Models::IModelFilter<BlackMisc::CStatusMessageList> > CStatusMessageFilterBar::createModelFilter() const std::unique_ptr<BlackGui::Models::IModelFilter<BlackMisc::CStatusMessageList> > CStatusMessageFilterBar::createModelFilter() const
{ {
return std::make_unique<CStatusMessageFilter>( return std::make_unique<CStatusMessageFilter>(
@@ -64,6 +87,11 @@ namespace BlackGui
ui->rb_Info->setChecked(true); ui->rb_Info->setChecked(true);
} }
void CStatusMessageFilterBar::radioButtonChanged()
{
this->triggerFilter();
}
CStatusMessage::StatusSeverity CStatusMessageFilterBar::getSelectedSeverity() const CStatusMessage::StatusSeverity CStatusMessageFilterBar::getSelectedSeverity() const
{ {
if (ui->rb_Error->isChecked()) { return CStatusMessage::SeverityError; } if (ui->rb_Error->isChecked()) { return CStatusMessage::SeverityError; }

View File

@@ -41,6 +41,9 @@ namespace BlackGui
//! Destructor //! Destructor
virtual ~CStatusMessageFilterBar(); virtual ~CStatusMessageFilterBar();
//! Use icons with radio buttons
void useRadioButtonDescriptiveIcons(bool oneCharacterText);
//! \copydoc Models::IModelFilterProvider::createModelFilter //! \copydoc Models::IModelFilterProvider::createModelFilter
virtual std::unique_ptr<BlackGui::Models::IModelFilter<BlackMisc::CStatusMessageList>> createModelFilter() const override; virtual std::unique_ptr<BlackGui::Models::IModelFilter<BlackMisc::CStatusMessageList>> createModelFilter() const override;
@@ -55,6 +58,9 @@ namespace BlackGui
private: private:
QScopedPointer<Ui::CStatusMessageFilterBar> ui; QScopedPointer<Ui::CStatusMessageFilterBar> ui;
//! Radio button was changed
void radioButtonChanged();
//! Get the selected severity //! Get the selected severity
BlackMisc::CStatusMessage::StatusSeverity getSelectedSeverity() const; BlackMisc::CStatusMessage::StatusSeverity getSelectedSeverity() const;
}; };

View File

@@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>324</width> <width>359</width>
<height>58</height> <height>58</height>
</rect> </rect>
</property> </property>
@@ -33,7 +33,7 @@
<number>3</number> <number>3</number>
</property> </property>
<property name="leftMargin"> <property name="leftMargin">
<number>0</number> <number>10</number>
</property> </property>
<property name="topMargin"> <property name="topMargin">
<number>0</number> <number>0</number>
@@ -75,16 +75,10 @@
<widget class="BlackGui::Filters::CFilterBarButtons" name="filter_Buttons"> <widget class="BlackGui::Filters::CFilterBarButtons" name="filter_Buttons">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>50</width> <width>75</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
</widget> </widget>
</item> </item>
<item row="0" column="2"> <item row="0" column="2">

View File

@@ -136,6 +136,8 @@ namespace BlackGui
void CViewBaseNonTemplate::setFilterWidgetImpl(QWidget *filterWidget) void CViewBaseNonTemplate::setFilterWidgetImpl(QWidget *filterWidget)
{ {
if (filterWidget == this->m_filterWidget) { return; }
// dialog or filter widget // dialog or filter widget
if (this->m_filterWidget) if (this->m_filterWidget)
{ {
@@ -154,6 +156,7 @@ namespace BlackGui
void CViewBaseNonTemplate::setFilterDialog(CFilterDialog *filterDialog) void CViewBaseNonTemplate::setFilterDialog(CFilterDialog *filterDialog)
{ {
if (filterDialog == this->m_filterWidget) { return; }
this->setFilterWidgetImpl(filterDialog); this->setFilterWidgetImpl(filterDialog);
if (filterDialog) if (filterDialog)
{ {
@@ -165,6 +168,7 @@ namespace BlackGui
void CViewBaseNonTemplate::setFilterWidget(CFilterWidget *filterWidget) void CViewBaseNonTemplate::setFilterWidget(CFilterWidget *filterWidget)
{ {
if (filterWidget == this->m_filterWidget) { return; }
this->setFilterWidgetImpl(filterWidget); this->setFilterWidgetImpl(filterWidget);
if (filterWidget) if (filterWidget)
{ {

View File

@@ -128,7 +128,7 @@ void CSwiftLauncher::ps_displayLatestNews(QNetworkReply *reply)
{ {
const QString html = nwReply->readAll().trimmed(); const QString html = nwReply->readAll().trimmed();
if (html.isEmpty()) { return; } if (html.isEmpty()) { return; }
ui->tbr_LatestNews->setHtml(html); ui->tbr_LatestNews->setHtml(html); // causes QFSFileEngine::open: No file name specified
constexpr qint64 newNews = 72 * 3600 * 1000; constexpr qint64 newNews = 72 * 3600 * 1000;
const qint64 deltaT = CNetworkUtils::lastModifiedSinceNow(nwReply.data()); const qint64 deltaT = CNetworkUtils::lastModifiedSinceNow(nwReply.data());
if (deltaT > 0 && deltaT < newNews) if (deltaT > 0 && deltaT < newNews)
@@ -149,7 +149,7 @@ void CSwiftLauncher::init()
m_mwaOverlayFrame = ui->fr_SwiftLauncherMain; m_mwaOverlayFrame = ui->fr_SwiftLauncherMain;
m_mwaStatusBar = nullptr; m_mwaStatusBar = nullptr;
m_mwaLogComponent = ui->fr_SwiftLauncherLog; m_mwaLogComponent = ui->comp_SwiftLauncherLog;
ui->lbl_NewVersionUrl->setTextFormat(Qt::RichText); ui->lbl_NewVersionUrl->setTextFormat(Qt::RichText);
ui->lbl_NewVersionUrl->setTextInteractionFlags(Qt::TextBrowserInteraction); ui->lbl_NewVersionUrl->setTextInteractionFlags(Qt::TextBrowserInteraction);
@@ -231,6 +231,9 @@ void CSwiftLauncher::initLogDisplay()
CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo) CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo)
); );
logHandler->subscribe(this, &CSwiftLauncher::ps_appendLogMessage); logHandler->subscribe(this, &CSwiftLauncher::ps_appendLogMessage);
ui->comp_SwiftLauncherLog->showFilterBar();
ui->comp_SwiftLauncherLog->filterUseRadioButtonDescriptiveIcons(false);
} }
void CSwiftLauncher::startSwiftCore() void CSwiftLauncher::startSwiftCore()
@@ -495,7 +498,7 @@ void CSwiftLauncher::ps_showStatusMessage(const CStatusMessage &msg)
void CSwiftLauncher::ps_appendLogMessage(const CStatusMessage &message) void CSwiftLauncher::ps_appendLogMessage(const CStatusMessage &message)
{ {
ui->fr_SwiftLauncherLog->appendStatusMessageToList(message); ui->comp_SwiftLauncherLog->appendStatusMessageToList(message);
if (message.getSeverity() == CStatusMessage::SeverityError) if (message.getSeverity() == CStatusMessage::SeverityError)
{ {
this->ps_showStatusMessage(message); this->ps_showStatusMessage(message);
@@ -504,7 +507,7 @@ void CSwiftLauncher::ps_appendLogMessage(const CStatusMessage &message)
void CSwiftLauncher::ps_appendLogMessages(const CStatusMessageList &messages) void CSwiftLauncher::ps_appendLogMessages(const CStatusMessageList &messages)
{ {
ui->fr_SwiftLauncherLog->appendStatusMessagesToList(messages); ui->comp_SwiftLauncherLog->appendStatusMessagesToList(messages);
if (messages.hasErrorMessages()) if (messages.hasErrorMessages())
{ {
this->ps_showStatusMessage(messages.getErrorMessages().toSingleMessage()); this->ps_showStatusMessage(messages.getErrorMessages().toSingleMessage());

View File

@@ -38,7 +38,7 @@
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>1</number>
</property> </property>
<widget class="QWidget" name="pg_SwiftLauncherMain"> <widget class="QWidget" name="pg_SwiftLauncherMain">
<layout class="QVBoxLayout" name="wl_SwiftLauncherMainPage"> <layout class="QVBoxLayout" name="wl_SwiftLauncherMainPage">
@@ -879,7 +879,7 @@ p, li { white-space: pre-wrap; }
<number>3</number> <number>3</number>
</property> </property>
<item> <item>
<widget class="BlackGui::Components::CLogComponent" name="fr_SwiftLauncherLog"> <widget class="BlackGui::Components::CLogComponent" name="comp_SwiftLauncherLog">
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::StyledPanel</enum> <enum>QFrame::StyledPanel</enum>
</property> </property>
@@ -935,8 +935,8 @@ p, li { white-space: pre-wrap; }
</customwidget> </customwidget>
</customwidgets> </customwidgets>
<resources> <resources>
<include location="swiftlauncher.qrc"/>
<include location="../blackmisc/blackmisc.qrc"/> <include location="../blackmisc/blackmisc.qrc"/>
<include location="swiftlauncher.qrc"/>
</resources> </resources>
<connections/> <connections/>
<buttongroups> <buttongroups>